diff options
Diffstat (limited to 'lib/modules/GradebookModule.php')
| -rw-r--r-- | lib/modules/GradebookModule.php | 81 |
1 files changed, 49 insertions, 32 deletions
diff --git a/lib/modules/GradebookModule.php b/lib/modules/GradebookModule.php index 2a3be5c..34bf835 100644 --- a/lib/modules/GradebookModule.php +++ b/lib/modules/GradebookModule.php @@ -14,8 +14,10 @@ use Grading\Instance; * @author <mlunzena@uos.de> * @license http://www.gnu.org/licenses/gpl-2.0.html GPL version 2 */ -class GradebookModule extends CorePlugin implements SystemPlugin, StudipModule +class GradebookModule extends CorePlugin implements SystemPlugin, StudipModuleExtended { + use IconNavigationTrait; + public function __construct() { parent::__construct(); @@ -38,41 +40,56 @@ class GradebookModule extends CorePlugin implements SystemPlugin, StudipModule return null; } - /** - * {@inheritdoc} - * - * @SuppressWarnings(PHPMD.Superglobals) - */ - public function getIconNavigation($courseId, $lastVisit, $userId) + public function getManyIconNavigation(array $course_ids, ?string $user_id = null): array { - if ($userId === 'nobody') { - return null; + if ($user_id === 'nobody') { + return []; } + // split courses in student-perms and tutor-perms + $tutor_c_ids = []; + foreach ($course_ids as $course_id) { + if ($GLOBALS['perm']->have_studip_perm('tutor', $course_id, $user_id)) { + $tutor_c_ids[$course_id] = $course_id; + } + } + $results = DBManager::get()->fetchGrouped( + "SELECT gd.course_id, gi.user_id + FROM grading_instances gi + JOIN grading_definitions gd ON(gd.id = definition_id) + LEFT JOIN object_user_visits AS ouv + ON ouv.object_id = gd.course_id + AND ouv.user_id = :user_id + AND ouv.plugin_id = :plugin_id + WHERE gd.course_id IN (:course_ids) AND gi.chdate > IFNULL(ouv.visitdate, :threshold)", + [ + ':user_id' => $user_id, + ':plugin_id' => 0, // module doesnt write directly into ouv + ':course_ids' => $course_ids, + ':threshold' => object_get_visit_threshold(), + ] + ); $title = _('Gradebook'); - if ($GLOBALS['perm']->have_studip_perm('tutor', $courseId, $userId)) { - $changed = Instance::countBySQL( - 'INNER JOIN grading_definitions gd ON(gd.id = definition_id) '. - 'WHERE gd.course_id = ? AND grading_instances.chdate > ?', - [$courseId, $lastVisit] - ); - } else { - $changed = Instance::countBySQL( - 'INNER JOIN grading_definitions gd ON(gd.id = definition_id) '. - 'WHERE gd.course_id = ? AND grading_instances.chdate > ? AND user_id = ?', - [$courseId, $lastVisit, $userId] - ); + $navs = []; + foreach ($course_ids as $course_id) { + if (empty($results[$course_id])) { + $changed = false; + } elseif (isset($tutor_c_ids[$course_id])) { + $changed = count($results[$course_id]); + } else { + $filtered_results = array_filter($results[$course_id], fn ($fetched_user_id) => $fetched_user_id === $user_id); + $changed = !empty($filtered_results) ? count($filtered_results) : 0; + } + $icon = $changed + ? Icon::create('assessment', Icon::ROLE_ATTENTION) + : Icon::create('assessment'); + $navigation = new Navigation($title, 'dispatch.php/course/gradebook/overview'); + $navigation->setImage($icon); + $navigation->setLinkAttributes(['title' => $title]); + $navs[$course_id] = $navigation; } - $icon = $changed - ? Icon::create('gradebook', Icon::ROLE_NEW) - : Icon::create('gradebook'); - - $navigation = new Navigation($title, 'dispatch.php/course/gradebook/overview'); - $navigation->setImage($icon); - $navigation->setLinkAttributes(['title' => $title]); - - return $navigation; + return $navs; } /** @@ -157,8 +174,8 @@ class GradebookModule extends CorePlugin implements SystemPlugin, StudipModule 'description' => _('Dieses Modul ermöglicht die manuelle und automatische Erfassung von Noten und Leistungen.'), 'category' => _('Lehr- und Lernorganisation'), 'keywords' => _('automatische und manuelle Erfassung von gewichteten Leistungen;Export von Leistungen;persönliche Fortschrittskontrolle'), - 'icon' => Icon::create('gradebook', Icon::ROLE_INFO), - 'icon_clickable' => Icon::create('gradebook'), + 'icon' => Icon::create('assessment', Icon::ROLE_INFO), + 'icon_clickable' => Icon::create('assessment'), 'screenshots' => [ 'path' => 'assets/images/plus/screenshots/Gradebook', 'pictures' => [ |
