Proyectos de Subversion Moodle

Rev

Rev 1 | Mostrar el archivo completo | | | Autoría | Ultima modificación | Ver Log |

Rev 1 Rev 1441
Línea 206... Línea 206...
206
     * @param stdClass $dbrecord Workshop instance data from {workshop} table
206
     * @param stdClass $dbrecord Workshop instance data from {workshop} table
207
     * @param stdClass|cm_info $cm Course module record
207
     * @param stdClass|cm_info $cm Course module record
208
     * @param stdClass $course Course record from {course} table
208
     * @param stdClass $course Course record from {course} table
209
     * @param stdClass $context The context of the workshop instance
209
     * @param stdClass $context The context of the workshop instance
210
     */
210
     */
211
    public function __construct(stdclass $dbrecord, $cm, $course, stdclass $context=null) {
211
    public function __construct(stdclass $dbrecord, $cm, $course, ?stdclass $context=null) {
212
        $this->dbrecord = $dbrecord;
212
        $this->dbrecord = $dbrecord;
213
        foreach ($this->dbrecord as $field => $value) {
213
        foreach ($this->dbrecord as $field => $value) {
214
            if (property_exists('workshop', $field)) {
214
            if (property_exists('workshop', $field)) {
215
                $this->{$field} = $value;
215
                $this->{$field} = $value;
216
            }
216
            }
Línea 580... Línea 580...
580
     * @param int $limitfrom return a subset of records, starting at this point (optional, required if $limitnum is set)
580
     * @param int $limitfrom return a subset of records, starting at this point (optional, required if $limitnum is set)
581
     * @param int $limitnum return a subset containing this number of records (optional, required if $limitfrom is set)
581
     * @param int $limitnum return a subset containing this number of records (optional, required if $limitfrom is set)
582
     * @return array array[userid] => stdClass
582
     * @return array array[userid] => stdClass
583
     */
583
     */
584
    public function get_potential_authors($musthavesubmission=true, $groupid=0, $limitfrom=0, $limitnum=0) {
584
    public function get_potential_authors($musthavesubmission=true, $groupid=0, $limitfrom=0, $limitnum=0) {
585
        global $DB;
-
 
586
 
-
 
587
        list($sql, $params) = $this->get_users_with_capability_sql('mod/workshop:submit', $musthavesubmission, $groupid);
585
        return $this->get_users_with_capability(['mod/workshop:submit'], $musthavesubmission, $groupid, $limitfrom, $limitnum);
588
 
-
 
589
        if (empty($sql)) {
-
 
590
            return array();
-
 
591
        }
-
 
592
 
-
 
593
        list($sort, $sortparams) = users_order_by_sql('tmp');
-
 
594
        $sql = "SELECT *
-
 
595
                  FROM ($sql) tmp
-
 
596
              ORDER BY $sort";
-
 
597
 
-
 
598
        return $DB->get_records_sql($sql, array_merge($params, $sortparams), $limitfrom, $limitnum);
-
 
599
    }
586
    }
Línea 600... Línea 587...
600
 
587
 
601
    /**
588
    /**
602
     * Returns the total number of users that would be fetched by {@link self::get_potential_authors()}
589
     * Returns the total number of users that would be fetched by {@link self::get_potential_authors()}
603
     *
590
     *
604
     * @param bool $musthavesubmission if true, count only users who have already submitted
591
     * @param bool $musthavesubmission if true, count only users who have already submitted
605
     * @param int $groupid 0 means ignore groups, any other value limits the result by group id
592
     * @param int $groupid 0 means ignore groups, any other value limits the result by group id
606
     * @return int
593
     * @return int
607
     */
594
     */
608
    public function count_potential_authors($musthavesubmission=true, $groupid=0) {
-
 
609
        global $DB;
-
 
610
 
595
    public function count_potential_authors($musthavesubmission=true, $groupid=0) {
611
        list($sql, $params) = $this->get_users_with_capability_sql('mod/workshop:submit', $musthavesubmission, $groupid);
-
 
612
 
-
 
613
        if (empty($sql)) {
-
 
614
            return 0;
-
 
615
        }
-
 
616
 
-
 
617
        $sql = "SELECT COUNT(*)
-
 
618
                  FROM ($sql) tmp";
-
 
619
 
-
 
620
        return $DB->count_records_sql($sql, $params);
596
        return count($this->get_users_with_capability(['mod/workshop:submit'], $musthavesubmission, $groupid));
Línea 621... Línea 597...
621
    }
597
    }
622
 
598
 
623
    /**
599
    /**
Línea 631... Línea 607...
631
     * @param int $limitfrom return a subset of records, starting at this point (optional, required if $limitnum is set)
607
     * @param int $limitfrom return a subset of records, starting at this point (optional, required if $limitnum is set)
632
     * @param int $limitnum return a subset containing this number of records (optional, required if $limitfrom is set)
608
     * @param int $limitnum return a subset containing this number of records (optional, required if $limitfrom is set)
633
     * @return array array[userid] => stdClass
609
     * @return array array[userid] => stdClass
634
     */
610
     */
635
    public function get_potential_reviewers($musthavesubmission=false, $groupid=0, $limitfrom=0, $limitnum=0) {
611
    public function get_potential_reviewers($musthavesubmission=false, $groupid=0, $limitfrom=0, $limitnum=0) {
636
        global $DB;
-
 
637
 
-
 
638
        list($sql, $params) = $this->get_users_with_capability_sql('mod/workshop:peerassess', $musthavesubmission, $groupid);
612
        return $this->get_users_with_capability(['mod/workshop:peerassess'], $musthavesubmission, $groupid, $limitfrom, $limitnum);
639
 
-
 
640
        if (empty($sql)) {
-
 
641
            return array();
-
 
642
        }
-
 
643
 
-
 
644
        list($sort, $sortparams) = users_order_by_sql('tmp');
-
 
645
        $sql = "SELECT *
-
 
646
                  FROM ($sql) tmp
-
 
647
              ORDER BY $sort";
-
 
648
 
-
 
649
        return $DB->get_records_sql($sql, array_merge($params, $sortparams), $limitfrom, $limitnum);
-
 
650
    }
613
    }
Línea 651... Línea 614...
651
 
614
 
652
    /**
615
    /**
653
     * Returns the total number of users that would be fetched by {@link self::get_potential_reviewers()}
616
     * Returns the total number of users that would be fetched by {@link self::get_potential_reviewers()}
654
     *
617
     *
655
     * @param bool $musthavesubmission if true, count only users who have already submitted
618
     * @param bool $musthavesubmission if true, count only users who have already submitted
656
     * @param int $groupid 0 means ignore groups, any other value limits the result by group id
619
     * @param int $groupid 0 means ignore groups, any other value limits the result by group id
657
     * @return int
620
     * @return int
658
     */
621
     */
659
    public function count_potential_reviewers($musthavesubmission=false, $groupid=0) {
-
 
660
        global $DB;
-
 
661
 
622
    public function count_potential_reviewers($musthavesubmission=false, $groupid=0) {
662
        list($sql, $params) = $this->get_users_with_capability_sql('mod/workshop:peerassess', $musthavesubmission, $groupid);
-
 
663
 
-
 
664
        if (empty($sql)) {
-
 
665
            return 0;
-
 
Línea 666... Línea -...
666
        }
-
 
667
 
-
 
668
        $sql = "SELECT COUNT(*)
-
 
669
                  FROM ($sql) tmp";
-
 
670
 
623
        return count($this->get_users_with_capability(['mod/workshop:peerassess'], $musthavesubmission, $groupid));
Línea 671... Línea 624...
671
        return $DB->count_records_sql($sql, $params);
624
 
672
    }
625
    }
673
 
626
 
Línea 684... Línea 637...
684
     * @param int $limitfrom return a subset of records, starting at this point (optional, required if $limitnum is set)
637
     * @param int $limitfrom return a subset of records, starting at this point (optional, required if $limitnum is set)
685
     * @param int $limitnum return a subset containing this number of records (optional, required if $limitfrom is set)
638
     * @param int $limitnum return a subset containing this number of records (optional, required if $limitfrom is set)
686
     * @return array array[userid] => stdClass
639
     * @return array array[userid] => stdClass
687
     */
640
     */
688
    public function get_participants($musthavesubmission=false, $groupid=0, $limitfrom=0, $limitnum=0) {
641
    public function get_participants($musthavesubmission=false, $groupid=0, $limitfrom=0, $limitnum=0) {
689
        global $DB;
-
 
690
 
-
 
691
        list($sql, $params) = $this->get_participants_sql($musthavesubmission, $groupid);
-
 
692
        list($filteringsql, $filteringparams) = $this->get_users_with_initial_filtering_sql_where();
-
 
693
        $wheresql = "";
-
 
694
 
-
 
695
        if ($filteringsql) {
-
 
696
            $wheresql .= $filteringsql;
-
 
697
            $params = array_merge($params, $filteringparams);
-
 
698
        }
-
 
699
        if (empty($sql)) {
-
 
700
            return array();
-
 
701
        }
-
 
Línea 702... Línea 642...
702
 
642
 
-
 
643
        // Get any users who have either of these 2 capabilities on the activity.
703
        list($sort, $sortparams) = users_order_by_sql('tmp');
644
        return $this->get_users_with_capability(['mod/workshop:submit', 'mod/workshop:peerassess'],
Línea 704... Línea -...
704
        $sql = "SELECT * FROM ($sql) tmp";
-
 
705
 
-
 
706
        if ($wheresql) {
-
 
707
            $sql .= " WHERE $wheresql";
-
 
708
        }
-
 
709
        $sql .= " ORDER BY $sort";
-
 
710
 
645
            $musthavesubmission, $groupid, $limitfrom, $limitnum);
Línea 711... Línea 646...
711
        return $DB->get_records_sql($sql, array_merge($params, $sortparams), $limitfrom, $limitnum);
646
 
712
    }
647
    }
713
 
648
 
714
    /**
649
    /**
715
     * Returns the total number of records that would be returned by {@link self::get_participants()}
650
     * Returns the total number of records that would be returned by {@link self::get_participants()}
716
     *
651
     *
717
     * @param bool $musthavesubmission if true, return only users who have already submitted
652
     * @param bool $musthavesubmission if true, return only users who have already submitted
718
     * @param int $groupid 0 means ignore groups, any other value limits the result by group id
653
     * @param int $groupid 0 means ignore groups, any other value limits the result by group id
719
     * @return int
-
 
720
     */
-
 
721
    public function count_participants($musthavesubmission=false, $groupid=0) {
654
     * @return int
722
        global $DB;
-
 
723
 
-
 
724
        list($sql, $params) = $this->get_participants_sql($musthavesubmission, $groupid);
-
 
725
 
-
 
726
        if (empty($sql)) {
-
 
727
            return 0;
-
 
728
        }
-
 
729
 
-
 
730
        $sql = "SELECT COUNT(*)
-
 
731
                  FROM ($sql) tmp";
655
     */
Línea 732... Línea 656...
732
 
656
    public function count_participants($musthavesubmission=false, $groupid=0) {
733
        return $DB->count_records_sql($sql, $params);
657
        return count($this->get_participants($musthavesubmission, $groupid));
734
    }
658
    }
735
 
659
 
736
    /**
660
    /**
737
     * Checks if the given user is an actively enrolled participant in the workshop
661
     * Checks if the given user is an actively enrolled participant in the workshop
738
     *
662
     *
-
 
663
     * @param int $userid, defaults to the current $USER
739
     * @param int $userid, defaults to the current $USER
664
     * @return boolean
Línea 740... Línea 665...
740
     * @return boolean
665
     */
741
     */
666
    public function is_participant($userid=null) {
742
    public function is_participant($userid=null) {
667
 
Línea -... Línea 668...
-
 
668
        global $USER;
743
        global $USER, $DB;
669
 
-
 
670
        if (is_null($userid)) {
Línea 744... Línea -...
744
 
-
 
745
        if (is_null($userid)) {
-
 
746
            $userid = $USER->id;
-
 
747
        }
-
 
748
 
-
 
749
        list($sql, $params) = $this->get_participants_sql();
-
 
750
 
-
 
751
        if (empty($sql)) {
-
 
752
            return false;
-
 
753
        }
-
 
754
 
-
 
755
        $sql = "SELECT COUNT(*)
-
 
756
                  FROM {user} uxx
-
 
757
                  JOIN ({$sql}) pxx ON uxx.id = pxx.id
-
 
758
                 WHERE uxx.id = :uxxid";
-
 
759
        $params['uxxid'] = $userid;
671
            $userid = $USER->id;
Línea 760... Línea 672...
760
 
672
        }
761
        if ($DB->count_records_sql($sql, $params)) {
673
 
762
            return true;
674
        // Get the participants on this activity and see if the user exists in that array.
Línea 860... Línea 772...
860
        }
772
        }
Línea 861... Línea 773...
861
 
773
 
862
        return $DB->count_records_sql($sql, $params);
774
        return $DB->count_records_sql($sql, $params);
Línea -... Línea 775...
-
 
775
    }
-
 
776
 
-
 
777
    /**
-
 
778
     * Returns the total number of assessments in the workshop.
-
 
779
     *
-
 
780
     * @param bool $onlygraded If true, count only graded assessments
-
 
781
     * @param int|null $groupid If not null, return only assessments by reviewers in the specified group
-
 
782
     * @return int Number of assessments
-
 
783
     */
-
 
784
    public function count_assessments(bool $onlygraded = false, ?int $groupid = null): int {
-
 
785
        global $DB;
-
 
786
 
-
 
787
        $params = ['workshopid' => $this->id];
-
 
788
        $sql = "SELECT COUNT(s.id)
-
 
789
                  FROM {workshop_assessments} s
-
 
790
                  JOIN {workshop_submissions} ws ON (s.submissionid = ws.id)
-
 
791
                  JOIN {user} u ON (ws.authorid = u.id)
-
 
792
                  JOIN {workshop} w ON (ws.workshopid = w.id)";
-
 
793
 
-
 
794
        if ($groupid) {
-
 
795
            $sql .= " JOIN {groups_members} gm ON (gm.userid = u.id AND gm.groupid = :groupid)";
-
 
796
            $params['groupid'] = $groupid;
-
 
797
        }
-
 
798
 
-
 
799
        if ($onlygraded) {
-
 
800
            $sql .= " WHERE s.grade IS NOT NULL AND w.id = :workshopid";
-
 
801
        } else {
-
 
802
            $sql .= " WHERE w.id = :workshopid";
-
 
803
        }
-
 
804
 
-
 
805
        return $DB->count_records_sql($sql, $params);
Línea 863... Línea 806...
863
    }
806
    }
864
 
807
 
865
 
808
 
866
    /**
809
    /**
Línea 1798... Línea 1741...
1798
     * @param moodle_url $url absolute url as returned by {@see workshop::submission_url()} and friends
1741
     * @param moodle_url $url absolute url as returned by {@see workshop::submission_url()} and friends
1799
     * @param mixed $info additional info, usually id in a table
1742
     * @param mixed $info additional info, usually id in a table
1800
     * @param bool $return true to return the arguments for add_to_log.
1743
     * @param bool $return true to return the arguments for add_to_log.
1801
     * @return void|array array of arguments for add_to_log if $return is true
1744
     * @return void|array array of arguments for add_to_log if $return is true
1802
     */
1745
     */
1803
    public function log($action, moodle_url $url = null, $info = null, $return = false) {
1746
    public function log($action, ?moodle_url $url = null, $info = null, $return = false) {
1804
        debugging('The log method is now deprecated, please use event classes instead', DEBUG_DEVELOPER);
1747
        debugging('The log method is now deprecated, please use event classes instead', DEBUG_DEVELOPER);
Línea 1805... Línea 1748...
1805
 
1748
 
1806
        if (is_null($url)) {
1749
        if (is_null($url)) {
1807
            $url = $this->view_url();
1750
            $url = $this->view_url();
Línea 3445... Línea 3388...
3445
            }
3388
            }
3446
        }
3389
        }
3447
    }
3390
    }
Línea 3448... Línea 3391...
3448
 
3391
 
3449
    /**
3392
    /**
-
 
3393
     * This is a replacement for the old get_users_with_capability_sql method.
-
 
3394
     * The old method returned huge amounts of SQL for large courses, potentially 10s of thousands of lines
-
 
3395
     * with hundreds of UNIONS, which caused some poor performance. This new method aims to streamline it all
3450
     * Returns SQL to fetch all enrolled users with the given capability in the current workshop
3396
     * into one query.
3451
     *
-
 
3452
     * The returned array consists of string $sql and the $params array. Note that the $sql can be
3397
     *
3453
     * empty if a grouping is selected and it has no groups.
3398
     * Gets users with any of the specified capabilities on the workshop activity.
3454
     *
3399
     *
3455
     * The list is automatically restricted according to any availability restrictions
3400
     * The list is automatically restricted according to any availability restrictions
3456
     * that apply to user lists (e.g. group, grouping restrictions).
3401
     * that apply to user lists (e.g. group, grouping restrictions).
3457
     *
3402
     *
3458
     * @param string $capability the name of the capability
3403
     * @param array $capabilities array of capability names (If the user has ANY of them, it returns true for that user)
3459
     * @param bool $musthavesubmission ff true, return only users who have already submitted
3404
     * @param bool $musthavesubmission if true, return only users who have already submitted
-
 
3405
     * @param int $groupid 0 means ignore groups, any other value limits the result by group id
-
 
3406
     * @param int $limitfrom return a subset of records, starting at this point (optional, required if $limitnum is set)
3460
     * @param int $groupid 0 means ignore groups, any other value limits the result by group id
3407
     * @param int $limitnum return a subset containing this number of records (optional, required if $limitfrom is set)
3461
     * @return array of (string)sql, (array)params
3408
     * @return array of users
3462
     */
3409
     */
3463
    protected function get_users_with_capability_sql($capability, $musthavesubmission, $groupid) {
-
 
3464
        global $CFG;
-
 
3465
        /** @var int static counter used to generate unique parameter holders */
-
 
3466
        static $inc = 0;
-
 
3467
        $inc++;
-
 
3468
 
-
 
3469
        // If the caller requests all groups and we are using a selected grouping,
-
 
3470
        // recursively call this function for each group in the grouping (this is
-
 
3471
        // needed because get_enrolled_sql only supports a single group).
-
 
3472
        if (empty($groupid) and $this->cm->groupingid) {
-
 
3473
            $groupingid = $this->cm->groupingid;
-
 
3474
            $groupinggroupids = array_keys(groups_get_all_groups($this->cm->course, 0, $this->cm->groupingid, 'g.id'));
-
 
3475
            $sql = array();
-
 
3476
            $params = array();
-
 
3477
            foreach ($groupinggroupids as $groupinggroupid) {
-
 
3478
                if ($groupinggroupid > 0) { // just in case in order not to fall into the endless loop
-
 
3479
                    list($gsql, $gparams) = $this->get_users_with_capability_sql($capability, $musthavesubmission, $groupinggroupid);
-
 
3480
                    $sql[] = $gsql;
3410
    protected function get_users_with_capability(array $capabilities, bool $musthavesubmission, int $groupid,
3481
                    $params = array_merge($params, $gparams);
-
 
3482
                }
-
 
3483
            }
-
 
3484
            $sql = implode(PHP_EOL." UNION ".PHP_EOL, $sql);
-
 
3485
            return array($sql, $params);
-
 
Línea 3486... Línea 3411...
3486
        }
3411
            int $limitfrom = 0, int $limitnum = 0): array {
Línea 3487... Línea 3412...
3487
 
3412
 
3488
        list($esql, $params) = get_enrolled_sql($this->context, $capability, $groupid, true);
-
 
Línea -... Línea 3413...
-
 
3413
        global $CFG, $DB;
3489
 
3414
 
-
 
3415
        $params = [];
-
 
3416
 
-
 
3417
        // This is from enrollib.php:get_enrolled_join(). It says it's better for caching to use round.
-
 
3418
        $now = round(time(), -2);
3490
        $userfieldsapi = \core_user\fields::for_userpic();
3419
        $userfieldsapi = \core_user\fields::for_name()->with_userpic();
-
 
3420
 
-
 
3421
        $sqlarray = [];
3491
        $userfields = $userfieldsapi->get_sql('u', false, '', '', false)->selects;
3422
        $sqlarray['select'] = "SELECT DISTINCT u.id" . $userfieldsapi->get_sql('u')->selects;
-
 
3423
        $sqlarray['from'] = "FROM {user} u";
-
 
3424
        $sqlarray['join'] = [];
-
 
3425
        $sqlarray['join'][] = "JOIN {user_enrolments} ue ON ue.userid = u.id";
-
 
3426
        $sqlarray['join'][] = "JOIN {enrol} e ON e.id = ue.enrolid AND e.courseid = :courseid";
-
 
3427
        $sqlarray['where'] = [];
-
 
3428
        $sqlarray['where'][] = "WHERE u.deleted = 0";
-
 
3429
        $sqlarray['where'][] = "AND u.id <> :guestid";
-
 
3430
        $sqlarray['where'][] = "AND ue.status = :activestatus";
-
 
3431
        $sqlarray['where'][] = "AND e.status = :enabledstatus";
-
 
3432
        $sqlarray['where'][] = "AND ue.timestart < :timestart";
-
 
3433
        $sqlarray['where'][] = "AND (ue.timeend > :timeend OR ue.timeend = 0)";
-
 
3434
 
-
 
3435
        // Apply sorting.
-
 
3436
        [$sortby, $sortbyparams] = users_order_by_sql('u');
-
 
3437
        $sqlarray['sort'] = "ORDER BY {$sortby}";
-
 
3438
 
-
 
3439
        // Apply filtering.
-
 
3440
        [$filtersql, $filterparams] = $this->get_users_with_initial_filtering_sql_where('u');
-
 
3441
        if ($filtersql) {
-
 
3442
            $sqlarray['where'][] = "AND {$filtersql}";
-
 
3443
            $params = array_merge($params, $filterparams);
-
 
3444
        }
-
 
3445
 
-
 
3446
        $params['courseid'] = $this->context->get_course_context()->instanceid;
-
 
3447
        $params['timestart'] = $now;
Línea -... Línea 3448...
-
 
3448
        $params['timeend'] = $now;
3492
 
3449
        $params['guestid'] = $CFG->siteguest;
-
 
3450
        $params['activestatus'] = ENROL_USER_ACTIVE;
3493
        $sql = "SELECT $userfields
3451
        $params['enabledstatus'] = ENROL_INSTANCE_ENABLED;
3494
                  FROM {user} u
3452
 
3495
                  JOIN ($esql) je ON (je.id = u.id AND u.deleted = 0) ";
3453
        // If we are filtering by users who have submitted.
Línea 3496... Línea 3454...
3496
 
3454
        if ($musthavesubmission) {
-
 
3455
            $sqlarray['join'][] = "JOIN {workshop_submissions} ws ON
-
 
3456
                (ws.authorid = u.id AND ws.example = 0 AND ws.workshopid = :workshopid) ";
-
 
3457
            $params['workshopid'] = $this->id;
-
 
3458
        }
3497
        if ($musthavesubmission) {
3459
 
-
 
3460
        // Are we searching one specific group?
-
 
3461
        if ($groupid > 0) {
-
 
3462
            $sqlarray['join'][] = "JOIN {groups_members} gm ON (gm.userid = u.id AND gm.groupid = :groupid)";
-
 
3463
            $params['groupid'] = $groupid;
-
 
3464
        } else if ($this->cm->groupingid) {
-
 
3465
            // If not, is there a groupingid set on the activity?
3498
            $sql .= " JOIN {workshop_submissions} ws ON (ws.authorid = u.id AND ws.example = 0 AND ws.workshopid = :workshopid{$inc}) ";
3466
            $sqlarray['join'][] = "JOIN {groupings_groups} gg ON gg.groupingid = :groupingid";
3499
            $params['workshopid'.$inc] = $this->id;
3467
            $sqlarray['join'][] = "JOIN {groups_members} gm ON (gm.userid = u.id AND gm.groupid = gg.groupid)";
3500
        }
3468
            $params['groupingid'] = $this->cm->groupingid;
3501
 
3469
        }
3502
        // If the activity is restricted so that only certain users should appear
3470
 
3503
        // in user lists, integrate this into the same SQL.
3471
        // Is the activity restricted so only certain users can access it?
Línea -... Línea 3472...
-
 
3472
        $info = new \core_availability\info_module($this->cm);
-
 
3473
        [$listsql, $listparams] = $info->get_user_list_sql(false);
-
 
3474
        if ($listsql) {
-
 
3475
            $sqlarray['join'][] = " JOIN ($listsql) restricted ON restricted.id = u.id";
-
 
3476
            $params = array_merge($params, $listparams);
-
 
3477
        }
-
 
3478
 
-
 
3479
        // Join the role assignments to only return users with the right capabilities.
-
 
3480
        $capjoin = get_with_capability_join($this->context, $capabilities, 'u.id');
-
 
3481
        $sqlarray['join'][] = $capjoin->joins;
-
 
3482
 
-
 
3483
        // Convert the sql array into a string.
-
 
3484
        $sql = $this->build_sql($sqlarray);
-
 
3485
 
-
 
3486
        // We actually query the users here instead of returning SQL like it used to.
-
 
3487
        return $DB->get_records_sql($sql, $params, $limitfrom, $limitnum);
-
 
3488
 
-
 
3489
    }
-
 
3490
 
-
 
3491
    /**
-
 
3492
     * Build SQL string from array of clauses
-
 
3493
     *
-
 
3494
     * @param array $sqlarray ['select' => '', 'from' => '', 'join' => [], 'where' => [], 'sort' => '']
-
 
3495
     * @return string
-
 
3496
     */
-
 
3497
    protected function build_sql(array $sqlarray): string {
-
 
3498
 
-
 
3499
        $sql = "";
-
 
3500
        foreach ($sqlarray as $el) {
3504
        $info = new \core_availability\info_module($this->cm);
3501
            if (is_array($el)) {
-
 
3502
                $sql .= implode(" ", $el) . " ";
3505
        list ($listsql, $listparams) = $info->get_user_list_sql(false);
3503
            } else {
Línea 3506... Línea 3504...
3506
        if ($listsql) {
3504
                $sql .= " {$el} ";
3507
            $sql .= " JOIN ($listsql) restricted ON restricted.id = u.id ";
3505
            }
3508
            $params = array_merge($params, $listparams);
3506
        }
-
 
3507
 
3509
        }
3508
        return $sql;
3510
 
3509
 
3511
        return array($sql, $params);
3510
    }
3512
    }
3511
 
3513
 
3512
    /**
3514
    /**
3513
     * Returns SQL to fetch all enrolled users with the first name or last name.
3515
     * Returns SQL to fetch all enrolled users with the first name or last name.
3514
     *
3516
     *
3515
     * @param string $table Table alias for users table
3517
     * @return array
3516
     * @return array
3518
     */
3517
     */
3519
    protected function get_users_with_initial_filtering_sql_where(): array {
3518
    protected function get_users_with_initial_filtering_sql_where(string $table): array {
3520
        global $DB;
3519
        global $DB;
3521
        $conditions = [];
3520
        $conditions = [];
3522
        $params = [];
3521
        $params = [];
3523
        $ifirst = $this->get_initial_first();
3522
        $ifirst = $this->get_initial_first();
3524
        $ilast = $this->get_initial_last();
3523
        $ilast = $this->get_initial_last();
3525
        if ($ifirst) {
3524
        if ($ifirst) {
3526
            $conditions[] = $DB->sql_like('LOWER(tmp.firstname)', ':i_first' , false, false);
3525
            $conditions[] = $DB->sql_like('LOWER(' . $table . '.firstname)', ':i_first' , false, false);
Línea 3527... Línea 3526...
3527
            $params['i_first'] = $DB->sql_like_escape($ifirst) . '%';
3526
            $params['i_first'] = $DB->sql_like_escape($ifirst) . '%';
3528
        }
-
 
3529
        if ($ilast) {
-
 
3530
            $conditions[] = $DB->sql_like('LOWER(tmp.lastname)', ':i_last' , false, false);
-
 
3531
            $params['i_last'] = $DB->sql_like_escape($ilast) . '%';
-
 
3532
        }
-
 
3533
        return [implode(" AND ", $conditions), $params];
-
 
3534
    }
-
 
3535
 
-
 
3536
    /**
-
 
3537
     * Returns SQL statement that can be used to fetch all actively enrolled participants in the workshop
-
 
3538
     *
-
 
3539
     * @param bool $musthavesubmission if true, return only users who have already submitted
-
 
3540
     * @param int $groupid 0 means ignore groups, any other value limits the result by group id
-
 
3541
     * @return array of (string)sql, (array)params
-
 
3542
     */
-
 
3543
    protected function get_participants_sql($musthavesubmission=false, $groupid=0) {
-
 
3544
 
-
 
3545
        list($sql1, $params1) = $this->get_users_with_capability_sql('mod/workshop:submit', $musthavesubmission, $groupid);
-
 
3546
        list($sql2, $params2) = $this->get_users_with_capability_sql('mod/workshop:peerassess', $musthavesubmission, $groupid);
-
 
3547
 
-
 
3548
        if (empty($sql1) or empty($sql2)) {
-
 
3549
            if (empty($sql1) and empty($sql2)) {
-
 
3550
                return array('', array());
-
 
3551
            } else if (empty($sql1)) {
-
 
3552
                $sql = $sql2;
-
 
3553
                $params = $params2;
-
 
3554
            } else {
-
 
3555
                $sql = $sql1;
-
 
3556
                $params = $params1;
-
 
3557
            }
-
 
3558
        } else {
3527
        }
3559
            $sql = $sql1.PHP_EOL." UNION ".PHP_EOL.$sql2;
3528
        if ($ilast) {
3560
            $params = array_merge($params1, $params2);
3529
            $conditions[] = $DB->sql_like('LOWER(' . $table . '.lastname)', ':i_last' , false, false);
3561
        }
3530
            $params['i_last'] = $DB->sql_like_escape($ilast) . '%';
3562
 
3531
        }