diff --git a/db/migrations/5.5.14_cleanup_cw_tasks.php b/db/migrations/5.5.14_cleanup_cw_tasks.php new file mode 100644 index 0000000000000000000000000000000000000000..94ab0198946bc8c876b42431377e9fefef07e4a0 --- /dev/null +++ b/db/migrations/5.5.14_cleanup_cw_tasks.php @@ -0,0 +1,23 @@ +<?php + +final class CleanupCwTasks extends Migration +{ + public function description() + { + return 'deletes unlinked entries'; + } + + public function up() + { + DBManager::get()->exec(' + DELETE FROM `cw_tasks` + WHERE `solver_type` = "user" + AND `solver_id` NOT IN (SELECT `user_id` FROM `auth_user_md5`)' + ); + DBManager::get()->exec(' + DELETE FROM `cw_tasks` + WHERE `solver_type` = "group" + AND `solver_id` NOT IN (SELECT `statusgruppe_id` FROM `statusgruppen`)' + ); + } +} diff --git a/lib/classes/JsonApi/Schemas/Courseware/Task.php b/lib/classes/JsonApi/Schemas/Courseware/Task.php index a87d335b64ee4bac500ebd0d58ce0a79d8a54e00..a0605e609d86b7cf23518d382cff267c3ca01121 100644 --- a/lib/classes/JsonApi/Schemas/Courseware/Task.php +++ b/lib/classes/JsonApi/Schemas/Courseware/Task.php @@ -46,21 +46,23 @@ class Task extends SchemaProvider { $relationships = []; - $relationships[self::REL_FEEDBACK] = $resource->getFeedback() + $feedback = $resource->getFeedback(); + $relationships[self::REL_FEEDBACK] = $feedback ? [ self::RELATIONSHIP_LINKS => [ - Link::RELATED => $this->createLinkToResource($resource->getFeedback()), + Link::RELATED => $this->createLinkToResource($feedback), ], - self::RELATIONSHIP_DATA => $resource->getFeedback(), + self::RELATIONSHIP_DATA => $feedback, ] : [self::RELATIONSHIP_DATA => null]; - $relationships[self::REL_SOLVER] = $resource['solver_id'] + $solver = $resource->getSolver(); + $relationships[self::REL_SOLVER] = $solver ? [ self::RELATIONSHIP_LINKS => [ - Link::RELATED => $this->createLinkToResource($resource->getSolver()), + Link::RELATED => $this->createLinkToResource($solver), ], - self::RELATIONSHIP_DATA => $resource->getSolver(), + self::RELATIONSHIP_DATA => $solver, ] : [self::RELATIONSHIP_DATA => null]; diff --git a/lib/classes/UserManagement.class.php b/lib/classes/UserManagement.class.php index 498036e2f7dd23026600bab97e1f4e19524d7946..65ed310f5fa6be51c9d7013402ce5a7e869079ce 100644 --- a/lib/classes/UserManagement.class.php +++ b/lib/classes/UserManagement.class.php @@ -987,7 +987,10 @@ class UserManagement \Courseware\UserDataField::deleteBySQL('user_id = ?', [$this->user_data['auth_user_md5.user_id']]); \Courseware\UserProgress::deleteBySQL('user_id = ?', [$this->user_data['auth_user_md5.user_id']]); \Courseware\Bookmark::deleteBySQL('user_id = ?', [$this->user_data['auth_user_md5.user_id']]); - + \Courseware\Task::deleteBySQL( + '`solver_id` = ? AND `solver_type`= "user"', + [$this->user_data['auth_user_md5.user_id']] + ); // delete courseware elements in courses of this user if ($delete_courseware) { \Courseware\Unit::deleteBySQL('creator_id = ?', [$this->user_data['auth_user_md5.user_id']]); diff --git a/lib/models/Statusgruppen.php b/lib/models/Statusgruppen.php index fa620f5660207628c407b0fde251fb2f5364f12e..be4ee6a2ffb211d3be1b9df1c8f48ccef7940a03 100644 --- a/lib/models/Statusgruppen.php +++ b/lib/models/Statusgruppen.php @@ -104,7 +104,7 @@ class Statusgruppen extends SimpleORMap implements PrivacyObject $config['registered_callbacks']['before_store'][] = 'cbAddPosition'; $config['registered_callbacks']['after_delete'][] = 'cbReorderPositions'; - + $config['registered_callbacks']['after_delete'][] = 'cbRemoveTasks'; $config['i18n_fields']['name'] = true; $config['i18n_fields']['name_w'] = true; $config['i18n_fields']['name_m'] = true; @@ -701,6 +701,18 @@ class Statusgruppen extends SimpleORMap implements PrivacyObject self::reorderPositionsForRange($this->range_id); } + /** + * This callback is called after deleting a User. + * It removes courseware task entries that are associated with the group. + */ + public function cbRemoveTask() + { + \Courseware\Task::deleteBySQL( + '`solver_id` = ? AND `solver_type`= "group"', + [$this->id] + ); + } + /** * Export available data of a given user into a storage object * (an instance of the StoredUserData class) for that user.