Skip to content
Snippets Groups Projects
Select Git revision
  • 7c2228c1a73b40caf8d2023497c6101800648982
  • master default protected
2 results

convert-tickets-to-issues.php

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    copy.php 18.39 KiB
    <?php
    
    class CopyController extends PluginController
    {
        public function info_action()
        {
            if (Request::getArray("c")) {
                PageLayout::setTitle(_("Wie soll kopiert werden?"));
                $this->dozentensearch = new SQLSearch(
                    "SELECT DISTINCT auth_user_md5.user_id, CONCAT(auth_user_md5.Vorname, \" \", auth_user_md5.Nachname), auth_user_md5.perms, auth_user_md5.username " .
                    "FROM auth_user_md5 LEFT JOIN user_info ON (user_info.user_id = auth_user_md5.user_id) " .
                    "WHERE (CONCAT(auth_user_md5.Vorname, \" \", auth_user_md5.Nachname) LIKE :input " .
                    "OR CONCAT(auth_user_md5.Nachname, \" \", auth_user_md5.Vorname) LIKE :input " .
                    "OR CONCAT(auth_user_md5.Nachname, \", \", auth_user_md5.Vorname) LIKE :input " .
                    "OR auth_user_md5.username LIKE :input) " .
                    "AND " . get_vis_query() . " " .
                    "AND auth_user_md5.perms = 'dozent' " .
                    "ORDER BY Vorname, Nachname", _("Lehrendennamen eingeben"), "user_id");
                $this->semesters = array_reverse(Semester::getAll());
                $this->semester = UserConfig::get($GLOBALS['user']->id)->COURSECOPY_SETTINGS_SEMESTER_ID
                    ? Semester::find(UserConfig::get($GLOBALS['user']->id)->COURSECOPY_SETTINGS_SEMESTER_ID)
                    : $this->semesters[0];
                if (Seminar_Perm::get()->have_perm('admin')) {
                    $this->have_coursegroups = true;
                }
                if (count(Request::getArray("c")) == 1) {
                    $this->single_course = Course::find(current(Request::getArray("c")));
                    $this->single_course_name = $this->single_course;
                }
            } else {
                throw new Trails_Exception(400);
            }
        }
    
        public function semester_start_und_ende_action($semester_id)
        {
            $this->semesters = array_reverse(Semester::getAll());
            $this->semester = Semester::find($semester_id);
        }
    
        public function process_action()
        {
            if (Request::isPost() && count(Request::getArray("c"))) {
                $params = [
                    "semester_id", "dozent_id", "lock_copied_courses",
                    "invisible_copied_courses", "cycles", "resource_assignments",
                    "week_offset", "end_offset", "copy_tutors", "copy_statusgruppen", "with_children",
                    "contents_scm", "contents_documents"
                ];
                foreach ($params as $param) {
                    $config_name = "COURSECOPY_SETTINGS_".strtoupper($param);
                    UserConfig::get($GLOBALS['user']->id)->store($config_name, Request::get($param));
                }
                if (!Request::get("dozent_id_parameter")) { //quicksearch-special
                    UserConfig::get($GLOBALS['user']->id)->store("COURSECOPY_SETTINGS_DOZENT_ID", "");
                }
    
                $dozent = null;
                if (UserConfig::get($GLOBALS['user']->id)->COURSECOPY_SETTINGS_DOZENT_ID) {
                    $dozent = User::find(UserConfig::get($GLOBALS['user']->id)->COURSECOPY_SETTINGS_DOZENT_ID);
                    if (!$dozent['perms'] === "dozent") {
                        $dozent = null;
                    }
                }
                $semester = Semester::find(Request::option("semester_id"));
                if ($semester) {
                    $lock_copied_courses = Request::get('lock_copied_courses');
                    $invisible_copied_courses = Request::get('invisible_copied_courses');
                    $single_course_name = Request::get('single_course_name');
                    $course_ids = Request::getArray("c");
                    if (Request::get("with_children")) {
                        $statement = DBManager::get()->prepare("
                            SELECT DISTINCT Seminar_id
                            FROM seminare
                            WHERE seminare.parent_course IN (?)
                        ");
                        $statement->execute([$course_ids]);
                        $course_ids = array_merge($course_ids, $statement->fetchAll(PDO::FETCH_COLUMN, 0));
                        $course_ids = array_unique($course_ids);
                        //remind that the children should now be at the end of the array
                    }
                    $copies = [];
                    foreach ($course_ids as $course_id) {
                        $oldcourse = Course::find($course_id);
    
                        if ($oldcourse
                                && Seminar_Perm::get()->have_studip_perm('dozent', $course_id)
                                && !LockRules::check($course_id, 'seminar_copy')) {
                            $newcourse = new Course();
                            $newcourse->setData($oldcourse->toArray());
                            if ($newcourse['parent_course']) {
                                $newcourse['parent_course'] = isset($copies[$newcourse['parent_course']])
                                    ? $copies[$newcourse['parent_course']]
                                    : null;
                            }
                            $newcourse['chdate'] = time();
                            $newcourse['mkdate'] = time();
                            $newcourse->setId($newcourse->getNewId());
                            $newcourse['start_time'] = $semester['beginn'];
                            $newcourse['duration_time'] = 0;
                            if ($invisible_copied_courses) {
                                $newcourse['visible'] = 0;
                            }
                            if ((count($course_ids) == 1) && ($single_course_name)) {
                                $newcourse['name'] = $single_course_name;
                            }
                            $newcourse->store();
                            $copies[$course_id] = $newcourse->getId();
    
                            //copy avatar
                            if (CourseAvatar::getAvatar($course_id)->is_customized()) {
                                CourseAvatar::getAvatar($newcourse->getId())->createFrom(
                                    CourseAvatar::getAvatar($course_id)->getFilename(Avatar::NORMAL)
                                );
                            }
    
                            //Check if the old course is in at least one course
                            //group ("LV-Gruppe") of the module managemeny system:
                            $course_groups = Lvgruppe::findBySeminar($course_id);
                            if ($course_groups) {
                                //Add the copied course to all found course groups:
                                foreach ($course_groups as $course_group) {
                                    $course_group->addSeminar($newcourse->id);
                                }
                            }
    
                            if ($lock_copied_courses) {
                                //Get the ID of the locked admission courseset:
                                $locked_admission_id = CourseSet::getGlobalLockedAdmissionSetId();
                                if ($locked_admission_id) {
                                    $locked_admission = new CourseSet($locked_admission_id);
                                    $locked_admission->addCourse($newcourse->id);
                                    $locked_admission->store();
                                }
                            }
    
                            //Dozenten
                            if ($dozent) {
                                $coursemember = new CourseMember();
                                $coursemember['user_id'] = $dozent->getId();
                                $coursemember['seminar_id'] = $newcourse->getId();
                                $coursemember['status'] = "dozent";
                                $coursemember->store();
                            } else {
                                foreach ($oldcourse->members->filter(function ($member) {
                                    return $member['status'] === "dozent";
                                }) as $dozentmember) {
                                    $coursemember = new CourseMember();
                                    $coursemember->setData($dozentmember->toArray());
                                    $coursemember['seminar_id'] = $newcourse->getId();
                                    $coursemember['mkdate'] = time();
                                    $coursemember->store();
                                }
                            }
    
                            //Tutor_innen
                            if (Request::get("copy_tutors")) {
                                foreach ($oldcourse->members->filter(function ($member) {
                                    return $member['status'] === "tutor";
                                }) as $tutormember) {
                                    $coursemember = new CourseMember();
                                    $coursemember->setData($tutormember->toArray());
                                    $coursemember['seminar_id'] = $newcourse->getId();
                                    $coursemember['mkdate'] = time();
                                    $coursemember->store();
                                }
                            }
    
                            //Statusgruppen
                            if (Request::get("copy_statusgruppen")) {
                                foreach ($oldcourse->statusgruppen as $statusgruppe) {
                                    $new_group = new Statusgruppen();
                                    $new_group->setData($statusgruppe->toArray());
                                    $new_group->setId($new_group->getNewId());
                                    $new_group['range_id'] = $newcourse->getId();
                                    $new_group['mkdate'] = time();
                                    $new_group->store();
                                }
                            }
    
                            //Studienbereiche
                            $statement = DBManager::get()->prepare("
                                INSERT IGNORE INTO seminar_sem_tree
                                SET seminar_id = :course_id,
                                    sem_tree_id = :sem_tree_id
                            ");
                            foreach ($oldcourse->study_areas as $studyarea) {
                                $statement->execute(array(
                                    'course_id' => $newcourse->getId(),
                                    'sem_tree_id' => $studyarea->getId()
                                ));
                            }
    
                            //Beteiligte Einrichtungen
                            $statement = DBManager::get()->prepare("
                                INSERT IGNORE INTO seminar_inst
                                SET seminar_id = :course_id,
                                    institut_id = :institut_id
                            ");
                            foreach ($oldcourse->institutes as $institute) {
                                $statement->execute(array(
                                    'course_id' => $newcourse->getId(),
                                    'institut_id' => $institute->getId()
                                ));
                            }
    
                            //Datenfelder
                            foreach ($oldcourse->datafields as $datafieldentry) {
                                $newentry = new DatafieldEntryModel();
                                $newentry->setData($datafieldentry->toArray());
                                $newentry['range_id'] = $newcourse->getId();
                                $newentry['mkdate'] = time();
                                $newentry['chdate'] = time();
                                $newentry->store();
                            }
    
                            $wanted_course_configs = array("KURSVORABINFO_INFO");
                            foreach ($wanted_course_configs as $config) {
                                if (CourseConfig::get($course_id)->$config) {
                                    CourseConfig::get($newcourse->getId())->store($config, CourseConfig::get($course_id)->$config);
                                }
                            }
    
    
                            if (Request::get("cycles")) {
                                $last_week = count($semester->getStartWeeks()) - 1;
                                foreach ($oldcourse->cycles as $cycledate) {
    
                                    $statement = DBManager::get()->prepare("
                                        SELECT date_typ
                                        FROM (
                                            SELECT termine.date_typ, COUNT(*) AS number
                                            FROM termine
                                            WHERE termine.metadate_id = :metadate_id
                                            GROUP BY termine.date_typ
                                        ) AS counter
                                        ORDER BY number DESC
                                        LIMIT 1
                                    ");
                                    $statement->execute(array('metadate_id' => $cycledate->getId()));
                                    $date_type = $statement->fetch(PDO::FETCH_COLUMN, 0);
    
                                    $newcycle = new SeminarCycleDate();
                                    $newcycle->setData($cycledate->toArray());
                                    $newcycle->setId($newcycle->getNewId());
                                    $newcycle['seminar_id'] = $newcourse->getId();
                                    $newcycle['week_offset'] = Request::int("week_offset");
                                    $newcycle['end_offset'] = Request::get('end_offset') == 'last' ? $last_week : Request::int("end_offset");
                                    $newcycle['mkdate'] = time();
                                    $newcycle['chdate'] = time();
                                    $newcycle->store();
    
                                    foreach ($newcycle->dates as $newdate) {
                                        $newdate['date_typ'] = $date_type;
                                        $newdate->store();
                                    }
    
                                    if (Request::get("resource_assignments")) {
                                        if (StudipVersion::newerThan("4.4.99")) {
                                            $statement = DBManager::get()->prepare("
                                                SELECT resource_id
                                                FROM (
                                                    SELECT resource_bookings.resource_id, COUNT(*) AS number
                                                    FROM termine
                                                        INNER JOIN resource_bookings ON (resource_bookings.range_id = termine.termin_id)
                                                    WHERE termine.metadate_id = :metadate_id
                                                    GROUP BY resource_bookings.resource_id
                                                ) AS counter
                                                ORDER BY number DESC
                                                LIMIT 1
                                            ");
                                        } else {
                                            $statement = DBManager::get()->prepare("
                                                SELECT resource_id
                                                FROM (
                                                    SELECT resource_id, COUNT(*) AS number
                                                    FROM termine
                                                        INNER JOIN resources_assign ON (resources_assign.assign_user_id = termine.termin_id)
                                                    WHERE termine.metadate_id = :metadate_id
                                                    GROUP BY resources_assign.resource_id
                                                ) AS counter
                                                ORDER BY number DESC
                                                LIMIT 1
                                            ");
                                        }
                                        $statement->execute(array('metadate_id' => $cycledate->getId()));
                                        $resource_id = $statement->fetch(PDO::FETCH_COLUMN, 0);
                                        if ($resource_id) {
                                            foreach ($newcycle->dates as $newdate) {
                                                $singledate = new SingleDate($newdate);
                                                $singledate->bookRoom($resource_id);
                                            }
                                        }
    
                                    }
                                }
                            }
    
                            //Inhalte:
                            if (Request::get("contents_scm")) {
                                foreach (StudipScmEntry::findByRange_id($oldcourse->getId(), 'ORDER BY position ASC') as $scm) {
                                    $new_scm = new StudipScmEntry();
                                    $new_scm->setData($scm->toRawArray());
                                    $new_scm->setId($new_scm->getNewId());
                                    $new_scm['range_id'] = $newcourse->getId();
                                    $new_scm->store();
                                }
                            }
                            if (Request::get("contents_documents")) {
                                $oldtopfolder = Folder::findTopFolder($oldcourse->getId());
                                $newtopfolder = Folder::findTopFolder($newcourse->getId());
                                foreach ($oldtopfolder->file_refs as $fileref) {
                                    if (StudipVersion::newerThan("4.6")) {
                                        FileManager::copyFile(
                                            $fileref->getFileType(),
                                            $newtopfolder->getTypedFolder(),
                                            User::findCurrent()
                                        );
                                    } else {
                                        FileManager::copyFileRef(
                                            $fileref,
                                            $newtopfolder->getTypedFolder(),
                                            User::findCurrent()
                                        );
                                    }
                                }
                                foreach ($oldtopfolder->subfolders as $subfolder) {
                                    FileManager::copyFolder(
                                        $subfolder->getTypedFolder(),
                                        $newtopfolder->getTypedFolder(),
                                        User::findCurrent()
                                    );
                                }
                            }
                        }
                    }
                    PageLayout::postSuccess(_("Die Veranstaltungen wurden erfolgreich kopiert."));
                }
            }
            $this->redirect(URLHelper::getURL("dispatch.php/admin/courses/index"));
        }
    }