aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJan-Hendrik Willms <tleilax+studip@gmail.com>2024-09-26 13:46:56 +0000
committerJan-Hendrik Willms <tleilax+studip@gmail.com>2024-09-26 13:46:56 +0000
commit5e92c29834f3c8bdc504034c9545d6d41bbff786 (patch)
tree7c1c8256a4af8643ccb0a0931fae7ad0447c4f3e /lib
parent219e31dc8c8a78b2847845cbe4570547254fb096 (diff)
resurrect code for copying basic data, participants and groups of course, re #3209, re #3441, fixes #4637
Closes #4637 Merge request studip/studip!3452
Diffstat (limited to 'lib')
-rw-r--r--lib/classes/coursewizardsteps/BasicDataWizardStep.php178
1 files changed, 145 insertions, 33 deletions
diff --git a/lib/classes/coursewizardsteps/BasicDataWizardStep.php b/lib/classes/coursewizardsteps/BasicDataWizardStep.php
index e6f5518..bca6915 100644
--- a/lib/classes/coursewizardsteps/BasicDataWizardStep.php
+++ b/lib/classes/coursewizardsteps/BasicDataWizardStep.php
@@ -294,7 +294,7 @@ class BasicDataWizardStep implements CourseWizardStep
// Add default deputies if applicable.
if (Config::get()->DEPUTIES_ENABLE && Config::get()->DEPUTIES_DEFAULTENTRY_ENABLE) {
$values['deputies'] = array_merge($values['deputies'] ?: [],
- array_flip(array_keys(Request::option('lecturer_id'))));
+ array_flip(array_keys(Request::optionArray('lecturer_id'))));
}
}
// Remove a lecturer.
@@ -451,34 +451,31 @@ class BasicDataWizardStep implements CourseWizardStep
}
$institutes = Institute::findMany($institute_ids);
$course->institutes = $institutes;
- if ($course->isDirty()) {
- $course->store();
- }
+ $course->store();
+
if (isset($values['lecturers']) && is_array($values['lecturers'])) {
- foreach (array_keys($values['lecturers']) as $user_id) {
- $user = User::find($user_id);
- if (!$user) {
- continue;
- }
- try {
- $course->addMember($user, 'dozent');
- } catch (\Studip\Exception $e) {
- //Nothing here.
- }
- }
+ User::findEachMany(
+ function (User $user) use ($course) {
+ try {
+ $course->addMember($user, 'dozent');
+ } catch (\Studip\Exception $e) {
+ //Nothing here.
+ }
+ },
+ array_keys($values['lecturers'])
+ );
}
if (isset($values['tutors']) && is_array($values['tutors'])) {
- foreach (array_keys($values['tutors']) as $user_id) {
- $user = User::find($user_id);
- if (!$user) {
- continue;
- }
- try {
- $course->addMember($user, 'tutor');
- } catch (\Studip\Exception $e) {
- //Nothing here.
- }
- }
+ User::findEachMany(
+ function (User $user) use ($course) {
+ try {
+ $course->addMember($user, 'tutor');
+ } catch (\Studip\Exception $e) {
+ //Nothing here.
+ }
+ },
+ array_keys($values['tutors'])
+ );
}
if (Config::get()->DEPUTIES_ENABLE && isset($values['deputies']) && is_array($values['deputies'])) {
foreach ($values['deputies'] as $d => $assigned) {
@@ -490,6 +487,10 @@ class BasicDataWizardStep implements CourseWizardStep
CourseSet::addCourseToSet($course_set_id, $course->id);
}
+ if ($source_id && ($copy_participants || $copy_groups || $copy_members)) {
+ self::copyParticipantsAndGroups($course, $source_id, $copy_participants, $copy_groups, $copy_members);
+ }
+
return $course;
}
@@ -498,7 +499,7 @@ class BasicDataWizardStep implements CourseWizardStep
* to already given values. A good example are study areas which
* are only needed for certain sem_classes.
*
- * @param Array $values values specified from previous steps
+ * @param array $values values specified from previous steps
* @return bool Is the current step required for a new course?
*/
public function isRequired($values)
@@ -509,7 +510,7 @@ class BasicDataWizardStep implements CourseWizardStep
/**
* Copy values for basic data wizard step from given course.
* @param Course $course
- * @param Array $values
+ * @param array $values
*/
public function copy($course, $values)
{
@@ -542,17 +543,17 @@ class BasicDataWizardStep implements CourseWizardStep
* Fetches the default deputies for a given person if the necessary
* config options are set.
* @param $user_id user whose default deputies to get
- * @return Array Default deputy user_ids.
+ * @return array Default deputy user_ids.
*/
public function getDefaultDeputies($user_id)
{
if (Config::get()->DEPUTIES_ENABLE && Config::get()->DEPUTIES_DEFAULTENTRY_ENABLE) {
- return Deputy::findDeputies($user_id)->map(function($deputy) {
+ return Deputy::findDeputies($user_id)->map(function (Deputy $deputy) {
return ['id' => $deputy->user_id, 'name' => $deputy->getDeputyFullname()];
});
- } else {
- return [];
}
+
+ return [];
}
public function getSearch($course_type, $institute_ids, $exclude_lecturers = [],$exclude_tutors = [])
@@ -641,10 +642,121 @@ class BasicDataWizardStep implements CourseWizardStep
}
}
-
+ } else {
+ foreach ($indices as $index) {
+ $values[$index] = $values[$index] ?? '';
+ }
}
return $values;
}
+ private function copyBasicData(
+ Course $course,
+ string $source_id
+ ): void {
+ $source = Course::find($source_id);
+ $course->setData($source->toArray('untertitel ort sonstiges art teilnehmer vorrausetzungen lernorga leistungsnachweis ects admission_turnout modules'));
+ foreach ($source->datafields as $one) {
+ $df = $one->getTypedDatafield();
+ if ($df->isEditable()) {
+ $course->datafields->findOneBy('datafield_id', $one->datafield_id)->content = $one->content;
+ }
+ }
+ }
+
+ /**
+ * Copies participants and/or groups from one course to another.
+ */
+ public static function copyParticipantsAndGroups(
+ Course $course,
+ string $source_id,
+ bool $with_participants = true,
+ bool $with_groups = true,
+ bool $with_members = true,
+ bool|array $group_ids = false
+ ): void {
+ $source = Course::find($source_id);
+
+ if (!$with_participants && !$with_groups) {
+ return;
+ }
+
+ if ($with_participants || ($with_groups && $with_members)) {
+ $member_ids = false;
+ if (!$with_participants && $with_members) {
+ $member_ids = [];
+ $source->statusgruppen->filter(function (Statusgruppen $group) use ($group_ids): bool {
+ return $group_ids === false
+ || in_array($group->id, $group_ids);
+ })->each(function (Statusgruppen $group) use (&$member_ids): void {
+ $group->members->each(function (StatusgruppeUser $member) use (&$member_ids): void {
+ if (!in_array($member->user_id, $member_ids)) {
+ $member_ids[] = $member->user_id;
+ }
+ });
+ });
+ }
+
+ $source->getMembersWithStatus(['user', 'autor', 'tutor'], true)
+ ->filter(function (CourseMember $member) use ($course, $member_ids): bool {
+ return ($member_ids === false || in_array($member->user_id, $member_ids))
+ && !CourseMember::exists([$course->id, $member->user_id]);
+ })->each(function (CourseMember $member) use ($course): void {
+ CourseMember::insertCourseMember(
+ $course->id,
+ $member->user_id,
+ $member->status,
+ );
+ });
+ }
+
+ if (!$with_groups) {
+ return;
+ }
+
+ $source->statusgruppen->filter(function (Statusgruppen $group) use ($group_ids): bool {
+ return $group_ids === false
+ || in_array($group->id, $group_ids);
+ })->each(function (Statusgruppen $group) use ($course, $with_members, $group_ids): void {
+ $g = Statusgruppen::findOneBySQL(
+ 'range_id = ? AND name = ?',
+ [$course->id, $group->name]
+ );
+
+ if (!$g) {
+ $g = Statusgruppen::createOrUpdate(
+ null,
+ $group->name,
+ $group->position,
+ $course->id,
+ $group->size,
+ $group->selfassign,
+ $group->selfassign_start,
+ $group->selfassign_end,
+ $group->hasFolder(),
+ null,
+ $group->hasBlubber()
+ );
+ }
+
+ if (!$with_members) {
+ return;
+ }
+
+ $group->members->filter(function (StatusgruppeUser $member) use ($g): bool {
+ return !StatusgruppeUser::exists([$g->id, $member->user_id]);
+ })->each(function (StatusgruppeUser $member) use ($g): void {
+ StatusgruppeUser::create([
+ 'statusgruppe_id' => $g->id,
+ ...$member->toArray([
+ 'user_id',
+ 'position',
+ 'visible',
+ 'inherit',
+ ])
+ ]);
+ });
+ });
+ }
}