Skip to content
Snippets Groups Projects
Commit 0bb23f9d authored by Jan-Hendrik Willms's avatar Jan-Hendrik Willms
Browse files

restore logging of institute changes and insert home institut back into seminar_inst, fixes #4751

Closes #4751

Merge request studip/studip!3546
parent 24bbb999
Branches
No related tags found
No related merge requests found
...@@ -130,12 +130,11 @@ class Course_BasicdataController extends AuthenticatedController ...@@ -130,12 +130,11 @@ class Course_BasicdataController extends AuthenticatedController
'locked' => LockRules::Check($course->id, 'Institut_id') 'locked' => LockRules::Check($course->id, 'Institut_id')
]; ];
$institute_ids = $course->institutes->pluck('id');
$this->institutional[] = [ $this->institutional[] = [
'title' => _('beteiligte Einrichtungen'), 'title' => _('beteiligte Einrichtungen'),
'name' => 'related_institutes[]', 'name' => 'related_institutes[]',
'type' => 'nested-select', 'type' => 'nested-select',
'value' => $institute_ids, 'value' => array_diff($course->institutes->pluck('id'), [$course->institut_id]),
'choices' => $this->instituteChoices($institutes), 'choices' => $this->instituteChoices($institutes),
'locked' => LockRules::Check($course->id, 'seminar_inst'), 'locked' => LockRules::Check($course->id, 'seminar_inst'),
'multiple' => true, 'multiple' => true,
...@@ -488,19 +487,18 @@ class Course_BasicdataController extends AuthenticatedController ...@@ -488,19 +487,18 @@ class Course_BasicdataController extends AuthenticatedController
} else { } else {
$invalid_datafields[] = $datafield->getName(); $invalid_datafields[] = $datafield->getName();
} }
} else if ($field['name'] == 'related_institutes[]') { } else if ($field['name'] === 'related_institutes[]') {
// only related_institutes supported for now // only related_institutes supported for now
$related_institute_ids = Request::optionArray('related_institutes'); $related_institute_ids = Request::optionArray('related_institutes');
if (is_array($related_institute_ids)) { $current_institute_ids = $course->institutes->pluck('id');
$institutes = Institute::findMany($related_institute_ids); $current_institute_ids = array_diff($current_institute_ids, [$course->institut_id]);
if ($institutes) {
$course->institutes = $institutes; $institutes_changed = count($related_institute_ids) !== count($current_institute_ids)
$changemade = $course->store(); || count(array_diff($current_institute_ids, $related_institute_ids)) > 0;
} else {
$this->msg['error'][] = _('Es muss mindestens ein Institut angegeben werden.'); if ($institutes_changed) {
} $course->institutes = Institute::findMany($related_institute_ids);
} else { $changemade = true;
$this->msg['error'][] = _('Es muss mindestens ein Institut angegeben werden.');
} }
} else { } else {
// format of input element name is "course_xxx" // format of input element name is "course_xxx"
......
...@@ -89,6 +89,11 @@ class Course extends SimpleORMap implements Range, PrivacyObject, StudipItem, Fe ...@@ -89,6 +89,11 @@ class Course extends SimpleORMap implements Range, PrivacyObject, StudipItem, Fe
*/ */
protected $initial_end_semester; protected $initial_end_semester;
/**
* @var array|null Currently assigned institutes, used for tracking changes
*/
protected $currently_assigned_institutes = null;
protected static function configure($config = []) protected static function configure($config = [])
{ {
$config['db_table'] = 'seminare'; $config['db_table'] = 'seminare';
...@@ -305,6 +310,7 @@ class Course extends SimpleORMap implements Range, PrivacyObject, StudipItem, Fe ...@@ -305,6 +310,7 @@ class Course extends SimpleORMap implements Range, PrivacyObject, StudipItem, Fe
$config['i18n_fields']['ort'] = true; $config['i18n_fields']['ort'] = true;
$config['registered_callbacks']['before_store'][] = 'logStore'; $config['registered_callbacks']['before_store'][] = 'logStore';
$config['registered_callbacks']['before_store'][] = 'handleInstitutes';
$config['registered_callbacks']['after_create'][] = 'setDefaultTools'; $config['registered_callbacks']['after_create'][] = 'setDefaultTools';
$config['registered_callbacks']['after_delete'][] = function (Course $course) { $config['registered_callbacks']['after_delete'][] = function (Course $course) {
CourseAvatar::getAvatar($course->id)->reset(); CourseAvatar::getAvatar($course->id)->reset();
...@@ -377,6 +383,12 @@ class Course extends SimpleORMap implements Range, PrivacyObject, StudipItem, Fe ...@@ -377,6 +383,12 @@ class Course extends SimpleORMap implements Range, PrivacyObject, StudipItem, Fe
parent::initRelation($relation); parent::initRelation($relation);
$this->initial_start_semester = $this->getStartSemester(); $this->initial_start_semester = $this->getStartSemester();
$this->initial_end_semester = $this->getEndSemester(); $this->initial_end_semester = $this->getEndSemester();
} elseif ($relation === 'institutes' && $this->currently_assigned_institutes === null) {
parent::initRelation($relation);
$this->currently_assigned_institutes = array_filter(
$this->relations['institutes']->pluck('id'),
fn($inst_id) => $inst_id !== $this->getPristineValue('institut_id')
);
} }
parent::initRelation($relation); parent::initRelation($relation);
} }
...@@ -392,6 +404,7 @@ class Course extends SimpleORMap implements Range, PrivacyObject, StudipItem, Fe ...@@ -392,6 +404,7 @@ class Course extends SimpleORMap implements Range, PrivacyObject, StudipItem, Fe
//Reset the flags for the start and end semester: //Reset the flags for the start and end semester:
$this->initial_start_semester = null; $this->initial_start_semester = null;
$this->initial_end_semester = null; $this->initial_end_semester = null;
$this->currently_assigned_institutes = null;
} }
/** /**
...@@ -2141,6 +2154,79 @@ class Course extends SimpleORMap implements Range, PrivacyObject, StudipItem, Fe ...@@ -2141,6 +2154,79 @@ class Course extends SimpleORMap implements Range, PrivacyObject, StudipItem, Fe
][$this->completion] ?? _('undefiniert'); ][$this->completion] ?? _('undefiniert');
} }
public function setValue($field, $value)
{
if (strtolower($field) === 'institut_id') {
$this->institutes = $this->institutes->filter(function (Institute $institute) {
return $institute->id !== $this->institut_id;
});
} elseif (strtolower($field) === 'institutes') {
$this->initRelation($field);
}
return parent::setValue($field, $value);
}
/**
* Handle all things related to storing the institutes
*/
protected function handleInstitutes(): void
{
if ($this->isFieldDirty('institut_id')) {
StudipLog::log(
'CHANGE_INSTITUTE_DATA',
$this->id,
$this->institut_id,
"Die Heimateinrichtung wurde zu \"{$this->home_institut->name}\" geändert."
);
}
if ($this->currently_assigned_institutes !== null) {
$assigned_ids = $this->institutes->pluck('id');
// Deleted
$deleted_ids = array_diff($this->currently_assigned_institutes, $assigned_ids);
Institute::findEachMany(
function (Institute $institute) {
StudipLog::log(
'CHANGE_INSTITUTE_DATA',
$this->id,
$institute->id,
"Die beteiligte Einrichtung \"{$institute->name}\" wurde gelöscht."
);
NotificationCenter::postNotification('SeminarInstitutionDidDelete', $institute->id, $this->id);
},
$deleted_ids
);
// Added
$added_ids = array_diff($assigned_ids, $this->currently_assigned_institutes);
Institute::findEachMany(
function (Institute $institute) {
StudipLog::log(
'CHANGE_INSTITUTE_DATA',
$this->id,
$institute->id,
"Die beteiligte Einrichtung \"{$institute->name}\" wurde hinzugefügt."
);
NotificationCenter::postNotification('SeminarInstitutionDidCreate', $institute->id, $this->id);
},
$added_ids
);
if (count($deleted_ids) > 0 || count($added_ids) > 0) {
NotificationCenter::postNotification('CourseDidChangeInstitutes', $this);
}
}
if (
$this->institut_id
&& !$this->institutes->find($this->institut_id)
) {
$this->institutes[] = $this->home_institut;
}
}
/** /**
* Generates a general log entry if the course were changed. * Generates a general log entry if the course were changed.
* Furthermore, this method emits notifications when the * Furthermore, this method emits notifications when the
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment