Skip to content
Snippets Groups Projects
Select Git revision
  • b66896cdee96bb2d700383d6b38bbf3c81a9691c
  • main default protected
  • 5.5 protected
  • atlantis
  • 5.3 protected
  • 5.0 protected
  • issue-23
  • issue8-seat-logging-and-export
  • ticket-216
  • tickets-215-216-241-242
10 results

CoreParticipants.class.php

Blame
  • Forked from Stud.IP / Stud.IP
    Source project has a limited visibility.
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    CoreParticipants.class.php 9.09 KiB
    <?php
    
    /*
     *  Copyright (c) 2012  Rasmus Fuhse <fuhse@data-quest.de>
     *
     *  This program is free software; you can redistribute it and/or
     *  modify it under the terms of the GNU General Public License as
     *  published by the Free Software Foundation; either version 2 of
     *  the License, or (at your option) any later version.
     */
    
    class CoreParticipants extends CorePlugin implements StudipModule
    {
        /**
         * {@inheritdoc}
         */
        public function getIconNavigation($course_id, $last_visit, $user_id)
        {
            $auto_insert_perm = Config::get()->AUTO_INSERT_SEM_PARTICIPANTS_VIEW_PERM;
            // show the participants-icon only if the course is not an auto-insert-sem
            if (
                AutoInsert::checkSeminar($course_id)
                && (
                    ($GLOBALS['perm']->have_perm('admin', $user_id) && !$GLOBALS['perm']->have_perm($auto_insert_perm, $user_id))
                    || !$GLOBALS['perm']->have_studip_perm($auto_insert_perm, $course_id, $user_id)
                )
            ) {
                return null;
            }
    
            $course = Course::find($course_id);
    
            // Is the participants page hidden for students?
            if (!$GLOBALS['perm']->have_studip_perm('tutor', $course_id, $user_id) && $course->config->COURSE_MEMBERS_HIDE) {
                $tab_navigation = $this->getTabNavigation($course_id);
                if ($tab_navigation && count($tab_navigation['members']->getSubNavigation()) > 0) {
                    $sub_nav = $tab_navigation['members']->getSubNavigation();
                    $first_nav = reset($sub_nav);
    
                    $navigation = new Navigation($first_nav->getTitle(), $first_nav->getURL());
                    $navigation->setImage(Icon::create('persons', Icon::ROLE_CLICKABLE));
                    return $navigation;
    
                }
                return null;
            }
    
            // Determine url to redirect to
            if (!$course->getSemClass()->isGroup()) {
                $url = 'dispatch.php/course/members/index';
            } elseif (!$GLOBALS['perm']->have_studip_perm('tutor', $course_id, $user_id)) {
                return null;
            } else {
                $url = 'dispatch.php/course/grouping/members';
            }
    
            $navigation = new Navigation(_('Teilnehmende'), $url);
            $navigation->setImage(Icon::create('persons', Icon::ROLE_CLICKABLE));
    
            // Check permission, show no indicator if not at least tutor
            if (!$GLOBALS['perm']->have_studip_perm('tutor', $course_id, $user_id)) {
                return $navigation;
            }
    
            $query = "SELECT COUNT(tmp.user_id) as count,
                             COUNT(IF((tmp.mkdate > IFNULL(b.visitdate, :threshold) AND tmp.user_id != :user_id), tmp.user_id, NULL)) AS neue
                      FROM (
                          SELECT user_id, mkdate
                          FROM admission_seminar_user
                          WHERE seminar_id = :course_id
    
                          UNION ALL
    
                          SELECT user_id, mkdate
                          FROM seminar_user
                          WHERE seminar_id = :course_id
                      ) AS tmp
                      LEFT JOIN object_user_visits AS b
                        ON b.object_id = :course_id
                           AND b.user_id = :user_id
                           AND b.plugin_id = :plugin_id";
            $statement = DBManager::get()->prepare($query);
            $statement->bindValue(':user_id', $user_id);
            $statement->bindValue(':course_id', $course_id);
            $statement->bindValue(':threshold', $last_visit);
            $statement->bindValue(':plugin_id', $this->getPluginId());
    
            $statement->execute();
            $result = $statement->fetch(PDO::FETCH_ASSOC);
    
            if ($result['neue']) {
                $navigation->setImage(Icon::create('persons', Icon::ROLE_ATTENTION), [
                    'title' => sprintf(
                        ngettext(
                            '%1$d Teilnehmende/r, %2$d neue/r',
                            '%1$d Teilnehmende, %2$d neue',
                            $result['count']
                        ),
                        $result['count'],
                        $result['neue']
                    )
                ]);
                $navigation->setBadgeNumber($result['neue']);
            } elseif ($result['count']) {
                $navigation->setLinkAttributes([
                    'title' => sprintf(
                        ngettext(
                            '%d Teilnehmende/r',
                            '%d Teilnehmende',
                            $result['count']
                        ),
                        $result['count']
                    )
                ]);
            }
    
            return $navigation;
        }
    
        /**
         * {@inheritdoc}
         */
        public function getTabNavigation($course_id)
        {
            $navigation = new Navigation(_('Teilnehmende'));
            $navigation->setImage(Icon::create('persons', Icon::ROLE_INFO_ALT));
            $navigation->setActiveImage(Icon::create('persons', Icon::ROLE_INFO));
    
            $course = Course::find($course_id);
    
            // Only courses without children have a regular member list and statusgroups.
            if (!$course->getSemClass()->isGroup()) {
                if ($GLOBALS['perm']->have_studip_perm('tutor', $course_id) || !$course->config->COURSE_MEMBERS_HIDE) {
                    $navigation->addSubNavigation('view', new Navigation(_('Teilnehmende'), 'dispatch.php/course/members'));
                    $navigation->addSubNavigation('statusgroups', new Navigation(_('Gruppen'), 'dispatch.php/course/statusgroups'));
                }
            } else {
                if ($GLOBALS['perm']->have_studip_perm('tutor', $course_id)) {
                    $navigation->addSubNavigation('children', new Navigation(_('Teilnehmende in Unterveranstaltungen'), 'dispatch.php/course/grouping/members'));
                }
            }
    
            if ($course->aux_lock_rule) {
                $navigation->addSubNavigation('additional', new Navigation(_('Zusatzangaben'), 'dispatch.php/course/members/additional'));
            }
    
            return count($navigation->getSubNavigation()) > 0 ? ['members' => $navigation] : null;
        }
    
        /**
         * {@inheritdoc}
         */
        public function getMetadata()
        {
            return [
                'summary' => _('Liste aller Teilnehmenden einschließlich Nachrichtenfunktionen'),
                'description' => _('Die Teilnehmenden werden gruppiert nach ihrer '.
                    'jeweiligen Funktion in einer Tabelle gelistet. Für Lehrende '.
                    'werden sowohl das Anmeldedatum als auch der Studiengang mit '.
                    'Semesterangabe dargestellt. Die Liste kann in verschiedene '.
                    'Formate exportiert werden. Außerdem gibt es die '.
                    'Möglichkeiten, eine Rundmail an alle zu schreiben (nur '.
                    'Lehrende) bzw. einzelne Teilnehmende separat anzuschreiben.'),
                'displayname' => _('Teilnehmende'),
                'keywords' => _('Rundmail an einzelne, mehrere oder alle Teilnehmenden;
                                Gruppierung nach Lehrenden, Tutor/-innen und Studierenden (Autor/-innen);
                                Aufnahme neuer Studierender (Autor/-innen) und Tutor/-innen;
                                Import einer Teilnehmendenliste;
                                Export der Teilnehmendenliste;
                                Einrichten von Gruppen;
                                Anzeige Studiengang und Fachsemester'),
                'descriptionshort' => _('Liste aller Teilnehmenden einschließlich Nachrichtenfunktionen'),
                'descriptionlong' => _('Die Teilnehmenden werden gruppiert nach ihrer jeweiligen Rolle in '.
                                       'einer Tabelle gelistet. Für Lehrende werden sowohl das Anmeldedatum '.
                                       'als auch der Studiengang mit Semesterangabe der Studierenden dargestellt. '.
                                       'Die Liste kann in verschiedene Formate exportiert werden. Außerdem gibt '.
                                       'es die Möglichkeiten für Lehrende, allen eine Rundmail zukommen zu lassen '.
                                       'bzw. einzelne Teilnehmende separat anzuschreiben.'),
                'category' => _('Lehr- und Lernorganisation'),
                'icon' => Icon::create('persons', Icon::ROLE_INFO),
                'screenshots' => [
                    'path' => 'assets/images/plus/screenshots/TeilnehmerInnen',
                    'pictures' => [
                        ['source' => 'Liste_aller_Teilnehmenden_einer_Veranstaltung.jpg', 'title' => _('Liste aller Teilnehmenden einer Veranstaltung')],
                        ['source' => 'Rundmail_an_alle_TeilnehmerInnen_einer_Veranstaltung.jpg', 'title' => _('Rundmail an alle Teilnehmdenden einer Veranstaltung')],
                    ]
                ],
            ];
        }
    
        protected function getCourseStatus(Course $course, $user_id)
        {
            $member = CourseMember::find([$course->id, $user_id]);
            if ($member) {
                return $member->status;
            }
    
            if (Config::get()->DEPUTIES_ENABLE && Deputy::isDeputy($user_id, $course->id)) {
                return 'dozent';
            }
    
            return false;
        }
    
        public function getInfoTemplate($course_id)
        {
            // TODO: Implement getInfoTemplate() method.
            return null;
        }
    
        public function isActivatableForContext(Range $context)
        {
            return $context->getRangeType() === 'course';
        }
    }