1<?php
2// This file is part of Moodle - http://moodle.org/
3//
4// Moodle is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published by
6// the Free Software Foundation, either version 3 of the License, or
7// (at your option) any later version.
8//
9// Moodle is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12// GNU General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16
17/**
18 * This file contains the definition for the renderable classes for the assignment
19 *
20 * @package   mod_assign
21 * @copyright 2012 NetSpot {@link http://www.netspot.com.au}
22 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23 */
24
25defined('MOODLE_INTERNAL') || die();
26
27/**
28 * This class wraps the submit for grading confirmation page
29 * @package   mod_assign
30 * @copyright 2012 NetSpot {@link http://www.netspot.com.au}
31 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
32 */
33class assign_submit_for_grading_page implements renderable {
34    /** @var array $notifications is a list of notification messages returned from the plugins */
35    public $notifications = array();
36    /** @var int $coursemoduleid */
37    public $coursemoduleid = 0;
38    /** @var moodleform $confirmform */
39    public $confirmform = null;
40
41    /**
42     * Constructor
43     * @param string $notifications - Any mesages to display
44     * @param int $coursemoduleid
45     * @param moodleform $confirmform
46     */
47    public function __construct($notifications, $coursemoduleid, $confirmform) {
48        $this->notifications = $notifications;
49        $this->coursemoduleid = $coursemoduleid;
50        $this->confirmform = $confirmform;
51    }
52
53}
54
55/**
56 * Implements a renderable message notification
57 * @package   mod_assign
58 * @copyright 2012 NetSpot {@link http://www.netspot.com.au}
59 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
60 */
61class assign_gradingmessage implements renderable {
62    /** @var string $heading is the heading to display to the user */
63    public $heading = '';
64    /** @var string $message is the message to display to the user */
65    public $message = '';
66    /** @var int $coursemoduleid */
67    public $coursemoduleid = 0;
68    /** @var int $gradingerror should be set true if there was a problem grading */
69    public $gradingerror = null;
70
71    /**
72     * Constructor
73     * @param string $heading This is the heading to display
74     * @param string $message This is the message to display
75     * @param bool $gradingerror Set to true to display the message as an error.
76     * @param int $coursemoduleid
77     * @param int $page This is the current quick grading page
78     */
79    public function __construct($heading, $message, $coursemoduleid, $gradingerror = false, $page = null) {
80        $this->heading = $heading;
81        $this->message = $message;
82        $this->coursemoduleid = $coursemoduleid;
83        $this->gradingerror = $gradingerror;
84        $this->page = $page;
85    }
86
87}
88
89/**
90 * Implements a renderable grading options form
91 * @package   mod_assign
92 * @copyright 2012 NetSpot {@link http://www.netspot.com.au}
93 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
94 */
95class assign_form implements renderable {
96    /** @var moodleform $form is the edit submission form */
97    public $form = null;
98    /** @var string $classname is the name of the class to assign to the container */
99    public $classname = '';
100    /** @var string $jsinitfunction is an optional js function to add to the page requires */
101    public $jsinitfunction = '';
102
103    /**
104     * Constructor
105     * @param string $classname This is the class name for the container div
106     * @param moodleform $form This is the moodleform
107     * @param string $jsinitfunction This is an optional js function to add to the page requires
108     */
109    public function __construct($classname, moodleform $form, $jsinitfunction = '') {
110        $this->classname = $classname;
111        $this->form = $form;
112        $this->jsinitfunction = $jsinitfunction;
113    }
114
115}
116
117/**
118 * Implements a renderable user summary
119 * @package   mod_assign
120 * @copyright 2012 NetSpot {@link http://www.netspot.com.au}
121 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
122 */
123class assign_user_summary implements renderable {
124    /** @var stdClass $user suitable for rendering with user_picture and fullname(). */
125    public $user = null;
126    /** @var int $courseid */
127    public $courseid;
128    /** @var bool $viewfullnames */
129    public $viewfullnames = false;
130    /** @var bool $blindmarking */
131    public $blindmarking = false;
132    /** @var int $uniqueidforuser */
133    public $uniqueidforuser;
134    /** @var array $extrauserfields */
135    public $extrauserfields;
136    /** @var bool $suspendeduser */
137    public $suspendeduser;
138
139    /**
140     * Constructor
141     * @param stdClass $user
142     * @param int $courseid
143     * @param bool $viewfullnames
144     * @param bool $blindmarking
145     * @param int $uniqueidforuser
146     * @param array $extrauserfields
147     * @param bool $suspendeduser
148     */
149    public function __construct(stdClass $user,
150                                $courseid,
151                                $viewfullnames,
152                                $blindmarking,
153                                $uniqueidforuser,
154                                $extrauserfields,
155                                $suspendeduser = false) {
156        $this->user = $user;
157        $this->courseid = $courseid;
158        $this->viewfullnames = $viewfullnames;
159        $this->blindmarking = $blindmarking;
160        $this->uniqueidforuser = $uniqueidforuser;
161        $this->extrauserfields = $extrauserfields;
162        $this->suspendeduser = $suspendeduser;
163    }
164}
165
166/**
167 * Implements a renderable feedback plugin feedback
168 * @package   mod_assign
169 * @copyright 2012 NetSpot {@link http://www.netspot.com.au}
170 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
171 */
172class assign_feedback_plugin_feedback implements renderable {
173    /** @var int SUMMARY */
174    const SUMMARY                = 10;
175    /** @var int FULL */
176    const FULL                   = 20;
177
178    /** @var assign_submission_plugin $plugin */
179    public $plugin = null;
180    /** @var stdClass $grade */
181    public $grade = null;
182    /** @var string $view */
183    public $view = self::SUMMARY;
184    /** @var int $coursemoduleid */
185    public $coursemoduleid = 0;
186    /** @var string returnaction The action to take you back to the current page */
187    public $returnaction = '';
188    /** @var array returnparams The params to take you back to the current page */
189    public $returnparams = array();
190
191    /**
192     * Feedback for a single plugin
193     *
194     * @param assign_feedback_plugin $plugin
195     * @param stdClass $grade
196     * @param string $view one of feedback_plugin::SUMMARY or feedback_plugin::FULL
197     * @param int $coursemoduleid
198     * @param string $returnaction The action required to return to this page
199     * @param array $returnparams The params required to return to this page
200     */
201    public function __construct(assign_feedback_plugin $plugin,
202                                stdClass $grade,
203                                $view,
204                                $coursemoduleid,
205                                $returnaction,
206                                $returnparams) {
207        $this->plugin = $plugin;
208        $this->grade = $grade;
209        $this->view = $view;
210        $this->coursemoduleid = $coursemoduleid;
211        $this->returnaction = $returnaction;
212        $this->returnparams = $returnparams;
213    }
214
215}
216
217/**
218 * Implements a renderable submission plugin submission
219 * @package   mod_assign
220 * @copyright 2012 NetSpot {@link http://www.netspot.com.au}
221 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
222 */
223class assign_submission_plugin_submission implements renderable {
224    /** @var int SUMMARY */
225    const SUMMARY                = 10;
226    /** @var int FULL */
227    const FULL                   = 20;
228
229    /** @var assign_submission_plugin $plugin */
230    public $plugin = null;
231    /** @var stdClass $submission */
232    public $submission = null;
233    /** @var string $view */
234    public $view = self::SUMMARY;
235    /** @var int $coursemoduleid */
236    public $coursemoduleid = 0;
237    /** @var string returnaction The action to take you back to the current page */
238    public $returnaction = '';
239    /** @var array returnparams The params to take you back to the current page */
240    public $returnparams = array();
241
242    /**
243     * Constructor
244     * @param assign_submission_plugin $plugin
245     * @param stdClass $submission
246     * @param string $view one of submission_plugin::SUMMARY, submission_plugin::FULL
247     * @param int $coursemoduleid - the course module id
248     * @param string $returnaction The action to return to the current page
249     * @param array $returnparams The params to return to the current page
250     */
251    public function __construct(assign_submission_plugin $plugin,
252                                stdClass $submission,
253                                $view,
254                                $coursemoduleid,
255                                $returnaction,
256                                $returnparams) {
257        $this->plugin = $plugin;
258        $this->submission = $submission;
259        $this->view = $view;
260        $this->coursemoduleid = $coursemoduleid;
261        $this->returnaction = $returnaction;
262        $this->returnparams = $returnparams;
263    }
264}
265
266/**
267 * Renderable feedback status
268 * @package   mod_assign
269 * @copyright 2012 NetSpot {@link http://www.netspot.com.au}
270 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
271 */
272class assign_feedback_status implements renderable {
273
274    /** @var stding $gradefordisplay the student grade rendered into a format suitable for display */
275    public $gradefordisplay = '';
276    /** @var mixed the graded date (may be null) */
277    public $gradeddate = 0;
278    /** @var mixed the grader (may be null) */
279    public $grader = null;
280    /** @var array feedbackplugins - array of feedback plugins */
281    public $feedbackplugins = array();
282    /** @var stdClass assign_grade record */
283    public $grade = null;
284    /** @var int coursemoduleid */
285    public $coursemoduleid = 0;
286    /** @var string returnaction */
287    public $returnaction = '';
288    /** @var array returnparams */
289    public $returnparams = array();
290    /** @var bool canviewfullnames */
291    public $canviewfullnames = false;
292
293    /**
294     * Constructor
295     * @param string $gradefordisplay
296     * @param mixed $gradeddate
297     * @param mixed $grader
298     * @param array $feedbackplugins
299     * @param mixed $grade
300     * @param int $coursemoduleid
301     * @param string $returnaction The action required to return to this page
302     * @param array $returnparams The list of params required to return to this page
303     * @param bool $canviewfullnames
304     */
305    public function __construct($gradefordisplay,
306                                $gradeddate,
307                                $grader,
308                                $feedbackplugins,
309                                $grade,
310                                $coursemoduleid,
311                                $returnaction,
312                                $returnparams,
313                                $canviewfullnames) {
314        $this->gradefordisplay = $gradefordisplay;
315        $this->gradeddate = $gradeddate;
316        $this->grader = $grader;
317        $this->feedbackplugins = $feedbackplugins;
318        $this->grade = $grade;
319        $this->coursemoduleid = $coursemoduleid;
320        $this->returnaction = $returnaction;
321        $this->returnparams = $returnparams;
322        $this->canviewfullnames = $canviewfullnames;
323    }
324}
325
326/**
327 * Renderable submission status
328 * @package   mod_assign
329 * @copyright 2012 NetSpot {@link http://www.netspot.com.au}
330 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
331 */
332class assign_submission_status implements renderable {
333    /** @var int STUDENT_VIEW */
334    const STUDENT_VIEW     = 10;
335    /** @var int GRADER_VIEW */
336    const GRADER_VIEW      = 20;
337
338    /** @var int allowsubmissionsfromdate */
339    public $allowsubmissionsfromdate = 0;
340    /** @var bool alwaysshowdescription */
341    public $alwaysshowdescription = false;
342    /** @var stdClass the submission info (may be null) */
343    public $submission = null;
344    /** @var boolean teamsubmissionenabled - true or false */
345    public $teamsubmissionenabled = false;
346    /** @var stdClass teamsubmission the team submission info (may be null) */
347    public $teamsubmission = null;
348    /** @var stdClass submissiongroup the submission group info (may be null) */
349    public $submissiongroup = null;
350    /** @var array submissiongroupmemberswhoneedtosubmit list of users who still need to submit */
351    public $submissiongroupmemberswhoneedtosubmit = array();
352    /** @var bool submissionsenabled */
353    public $submissionsenabled = false;
354    /** @var bool locked */
355    public $locked = false;
356    /** @var bool graded */
357    public $graded = false;
358    /** @var int duedate */
359    public $duedate = 0;
360    /** @var int cutoffdate */
361    public $cutoffdate = 0;
362    /** @var array submissionplugins - the list of submission plugins */
363    public $submissionplugins = array();
364    /** @var string returnaction */
365    public $returnaction = '';
366    /** @var string returnparams */
367    public $returnparams = array();
368    /** @var int courseid */
369    public $courseid = 0;
370    /** @var int coursemoduleid */
371    public $coursemoduleid = 0;
372    /** @var int the view (STUDENT_VIEW OR GRADER_VIEW) */
373    public $view = self::STUDENT_VIEW;
374    /** @var bool canviewfullnames */
375    public $canviewfullnames = false;
376    /** @var bool canedit */
377    public $canedit = false;
378    /** @var bool cansubmit */
379    public $cansubmit = false;
380    /** @var int extensionduedate */
381    public $extensionduedate = 0;
382    /** @var context context */
383    public $context = 0;
384    /** @var bool blindmarking - Should we hide student identities from graders? */
385    public $blindmarking = false;
386    /** @var string gradingcontrollerpreview */
387    public $gradingcontrollerpreview = '';
388    /** @var string attemptreopenmethod */
389    public $attemptreopenmethod = 'none';
390    /** @var int maxattempts */
391    public $maxattempts = -1;
392    /** @var string gradingstatus */
393    public $gradingstatus = '';
394    /** @var bool preventsubmissionnotingroup */
395    public $preventsubmissionnotingroup = 0;
396    /** @var array usergroups */
397    public $usergroups = array();
398
399
400    /**
401     * Constructor
402     *
403     * @param int $allowsubmissionsfromdate
404     * @param bool $alwaysshowdescription
405     * @param stdClass $submission
406     * @param bool $teamsubmissionenabled
407     * @param stdClass $teamsubmission
408     * @param int $submissiongroup
409     * @param array $submissiongroupmemberswhoneedtosubmit
410     * @param bool $submissionsenabled
411     * @param bool $locked
412     * @param bool $graded
413     * @param int $duedate
414     * @param int $cutoffdate
415     * @param array $submissionplugins
416     * @param string $returnaction
417     * @param array $returnparams
418     * @param int $coursemoduleid
419     * @param int $courseid
420     * @param string $view
421     * @param bool $canedit
422     * @param bool $cansubmit
423     * @param bool $canviewfullnames
424     * @param int $extensionduedate - Any extension to the due date granted for this user
425     * @param context $context - Any extension to the due date granted for this user
426     * @param bool $blindmarking - Should we hide student identities from graders?
427     * @param string $gradingcontrollerpreview
428     * @param string $attemptreopenmethod - The method of reopening student attempts.
429     * @param int $maxattempts - How many attempts can a student make?
430     * @param string $gradingstatus - The submission status (ie. Graded, Not Released etc).
431     * @param bool $preventsubmissionnotingroup - Prevent submission if user is not in a group
432     * @param array $usergroups - Array containing all groups the user is assigned to
433     */
434    public function __construct($allowsubmissionsfromdate,
435                                $alwaysshowdescription,
436                                $submission,
437                                $teamsubmissionenabled,
438                                $teamsubmission,
439                                $submissiongroup,
440                                $submissiongroupmemberswhoneedtosubmit,
441                                $submissionsenabled,
442                                $locked,
443                                $graded,
444                                $duedate,
445                                $cutoffdate,
446                                $submissionplugins,
447                                $returnaction,
448                                $returnparams,
449                                $coursemoduleid,
450                                $courseid,
451                                $view,
452                                $canedit,
453                                $cansubmit,
454                                $canviewfullnames,
455                                $extensionduedate,
456                                $context,
457                                $blindmarking,
458                                $gradingcontrollerpreview,
459                                $attemptreopenmethod,
460                                $maxattempts,
461                                $gradingstatus,
462                                $preventsubmissionnotingroup,
463                                $usergroups) {
464        $this->allowsubmissionsfromdate = $allowsubmissionsfromdate;
465        $this->alwaysshowdescription = $alwaysshowdescription;
466        $this->submission = $submission;
467        $this->teamsubmissionenabled = $teamsubmissionenabled;
468        $this->teamsubmission = $teamsubmission;
469        $this->submissiongroup = $submissiongroup;
470        $this->submissiongroupmemberswhoneedtosubmit = $submissiongroupmemberswhoneedtosubmit;
471        $this->submissionsenabled = $submissionsenabled;
472        $this->locked = $locked;
473        $this->graded = $graded;
474        $this->duedate = $duedate;
475        $this->cutoffdate = $cutoffdate;
476        $this->submissionplugins = $submissionplugins;
477        $this->returnaction = $returnaction;
478        $this->returnparams = $returnparams;
479        $this->coursemoduleid = $coursemoduleid;
480        $this->courseid = $courseid;
481        $this->view = $view;
482        $this->canedit = $canedit;
483        $this->cansubmit = $cansubmit;
484        $this->canviewfullnames = $canviewfullnames;
485        $this->extensionduedate = $extensionduedate;
486        $this->context = $context;
487        $this->blindmarking = $blindmarking;
488        $this->gradingcontrollerpreview = $gradingcontrollerpreview;
489        $this->attemptreopenmethod = $attemptreopenmethod;
490        $this->maxattempts = $maxattempts;
491        $this->gradingstatus = $gradingstatus;
492        $this->preventsubmissionnotingroup = $preventsubmissionnotingroup;
493        $this->usergroups = $usergroups;
494    }
495}
496/**
497 * Renderable submission status
498 * @package   mod_assign
499 * @copyright 2016 Damyon Wiese
500 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
501 */
502class assign_submission_status_compact extends assign_submission_status implements renderable {
503    // Compact view of the submission status. Not in a table etc.
504}
505
506/**
507 * Used to output the attempt history for a particular assignment.
508 *
509 * @package mod_assign
510 * @copyright 2012 Davo Smith, Synergy Learning
511 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
512 */
513class assign_attempt_history implements renderable {
514
515    /** @var array submissions - The list of previous attempts */
516    public $submissions = array();
517    /** @var array grades - The grades for the previous attempts */
518    public $grades = array();
519    /** @var array submissionplugins - The list of submission plugins to render the previous attempts */
520    public $submissionplugins = array();
521    /** @var array feedbackplugins - The list of feedback plugins to render the previous attempts */
522    public $feedbackplugins = array();
523    /** @var int coursemoduleid - The cmid for the assignment */
524    public $coursemoduleid = 0;
525    /** @var string returnaction - The action for the next page. */
526    public $returnaction = '';
527    /** @var string returnparams - The params for the next page. */
528    public $returnparams = array();
529    /** @var bool cangrade - Does this user have grade capability? */
530    public $cangrade = false;
531    /** @var string useridlistid - Id of the useridlist stored in cache, this plus rownum determines the userid */
532    public $useridlistid = 0;
533    /** @var int rownum - The rownum of the user in the useridlistid - this plus useridlistid determines the userid */
534    public $rownum = 0;
535
536    /**
537     * Constructor
538     *
539     * @param array $submissions
540     * @param array $grades
541     * @param array $submissionplugins
542     * @param array $feedbackplugins
543     * @param int $coursemoduleid
544     * @param string $returnaction
545     * @param array $returnparams
546     * @param bool $cangrade
547     * @param int $useridlistid
548     * @param int $rownum
549     */
550    public function __construct($submissions,
551                                $grades,
552                                $submissionplugins,
553                                $feedbackplugins,
554                                $coursemoduleid,
555                                $returnaction,
556                                $returnparams,
557                                $cangrade,
558                                $useridlistid,
559                                $rownum) {
560        $this->submissions = $submissions;
561        $this->grades = $grades;
562        $this->submissionplugins = $submissionplugins;
563        $this->feedbackplugins = $feedbackplugins;
564        $this->coursemoduleid = $coursemoduleid;
565        $this->returnaction = $returnaction;
566        $this->returnparams = $returnparams;
567        $this->cangrade = $cangrade;
568        $this->useridlistid = $useridlistid;
569        $this->rownum = $rownum;
570    }
571}
572
573/**
574 * Used to output the attempt history chooser for a particular assignment.
575 *
576 * @package mod_assign
577 * @copyright 2016 Damyon Wiese
578 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
579 */
580class assign_attempt_history_chooser implements renderable, templatable {
581
582    /** @var array submissions - The list of previous attempts */
583    public $submissions = array();
584    /** @var array grades - The grades for the previous attempts */
585    public $grades = array();
586    /** @var int coursemoduleid - The cmid for the assignment */
587    public $coursemoduleid = 0;
588    /** @var int userid - The current userid */
589    public $userid = 0;
590
591    /**
592     * Constructor
593     *
594     * @param array $submissions
595     * @param array $grades
596     * @param int $coursemoduleid
597     * @param int $userid
598     */
599    public function __construct($submissions,
600                                $grades,
601                                $coursemoduleid,
602                                $userid) {
603        $this->submissions = $submissions;
604        $this->grades = $grades;
605        $this->coursemoduleid = $coursemoduleid;
606        $this->userid = $userid;
607    }
608
609    /**
610     * Function to export the renderer data in a format that is suitable for a
611     * mustache template.
612     *
613     * @param renderer_base $output Used to do a final render of any components that need to be rendered for export.
614     * @return stdClass|array
615     */
616    public function export_for_template(renderer_base $output) {
617        // Show newest to oldest.
618        $export = (object) $this;
619        $export->submissions = array_reverse($export->submissions);
620        $export->submissioncount = count($export->submissions);
621
622        foreach ($export->submissions as $i => $submission) {
623            $grade = null;
624            foreach ($export->grades as $onegrade) {
625                if ($onegrade->attemptnumber == $submission->attemptnumber) {
626                    $submission->grade = $onegrade;
627                    break;
628                }
629            }
630            if (!$submission) {
631                $submission = new stdClass();
632            }
633
634            $editbtn = '';
635
636            if ($submission->timemodified) {
637                $submissionsummary = userdate($submission->timemodified);
638            } else {
639                $submissionsummary = get_string('nosubmission', 'assign');
640            }
641
642            $attemptsummaryparams = array('attemptnumber' => $submission->attemptnumber + 1,
643                                          'submissionsummary' => $submissionsummary);
644            $submission->attemptsummary = get_string('attemptheading', 'assign', $attemptsummaryparams);
645            $submission->statussummary = get_string('submissionstatus_' . $submission->status, 'assign');
646
647        }
648
649        return $export;
650    }
651}
652
653/**
654 * Renderable header
655 * @package   mod_assign
656 * @copyright 2012 NetSpot {@link http://www.netspot.com.au}
657 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
658 */
659class assign_header implements renderable {
660    /** @var stdClass the assign record  */
661    public $assign = null;
662    /** @var mixed context|null the context record  */
663    public $context = null;
664    /** @var bool $showintro - show or hide the intro */
665    public $showintro = false;
666    /** @var int coursemoduleid - The course module id */
667    public $coursemoduleid = 0;
668    /** @var string $subpage optional subpage (extra level in the breadcrumbs) */
669    public $subpage = '';
670    /** @var string $preface optional preface (text to show before the heading) */
671    public $preface = '';
672    /** @var string $postfix optional postfix (text to show after the intro) */
673    public $postfix = '';
674
675    /**
676     * Constructor
677     *
678     * @param stdClass $assign  - the assign database record
679     * @param mixed $context context|null the course module context
680     * @param bool $showintro  - show or hide the intro
681     * @param int $coursemoduleid  - the course module id
682     * @param string $subpage  - an optional sub page in the navigation
683     * @param string $preface  - an optional preface to show before the heading
684     */
685    public function __construct(stdClass $assign,
686                                $context,
687                                $showintro,
688                                $coursemoduleid,
689                                $subpage='',
690                                $preface='',
691                                $postfix='') {
692        $this->assign = $assign;
693        $this->context = $context;
694        $this->showintro = $showintro;
695        $this->coursemoduleid = $coursemoduleid;
696        $this->subpage = $subpage;
697        $this->preface = $preface;
698        $this->postfix = $postfix;
699    }
700}
701
702/**
703 * Renderable header related to an individual subplugin
704 * @package   mod_assign
705 * @copyright 2014 Henning Bostelmann
706 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
707 */
708class assign_plugin_header implements renderable {
709    /** @var assign_plugin $plugin */
710    public $plugin = null;
711
712    /**
713     * Header for a single plugin
714     *
715     * @param assign_plugin $plugin
716     */
717    public function __construct(assign_plugin $plugin) {
718        $this->plugin = $plugin;
719    }
720}
721
722/**
723 * Renderable grading summary
724 * @package   mod_assign
725 * @copyright 2012 NetSpot {@link http://www.netspot.com.au}
726 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
727 */
728class assign_grading_summary implements renderable {
729    /** @var int participantcount - The number of users who can submit to this assignment */
730    public $participantcount = 0;
731    /** @var bool submissiondraftsenabled - Allow submission drafts */
732    public $submissiondraftsenabled = false;
733    /** @var int submissiondraftscount - The number of submissions in draft status */
734    public $submissiondraftscount = 0;
735    /** @var bool submissionsenabled - Allow submissions */
736    public $submissionsenabled = false;
737    /** @var int submissionssubmittedcount - The number of submissions in submitted status */
738    public $submissionssubmittedcount = 0;
739    /** @var int submissionsneedgradingcount - The number of submissions that need grading */
740    public $submissionsneedgradingcount = 0;
741    /** @var int duedate - The assignment due date (if one is set) */
742    public $duedate = 0;
743    /** @var int cutoffdate - The assignment cut off date (if one is set) */
744    public $cutoffdate = 0;
745    /** @var int coursemoduleid - The assignment course module id */
746    public $coursemoduleid = 0;
747    /** @var boolean teamsubmission - Are team submissions enabled for this assignment */
748    public $teamsubmission = false;
749    /** @var boolean warnofungroupedusers - Do we need to warn people that there are users without groups */
750    public $warnofungroupedusers = false;
751    /** @var boolean relativedatesmode - Is the course a relative dates mode course or not */
752    public $courserelativedatesmode = false;
753    /** @var int coursestartdate - start date of the course as a unix timestamp*/
754    public $coursestartdate;
755    /** @var boolean cangrade - Can the current user grade students? */
756    public $cangrade = false;
757    /** @var boolean isvisible - Is the assignment's context module visible to students? */
758    public $isvisible = true;
759
760    /** @var string no warning needed about group submissions */
761    const WARN_GROUPS_NO = false;
762    /** @var string warn about group submissions, as groups are required */
763    const WARN_GROUPS_REQUIRED = 'warnrequired';
764    /** @var string warn about group submissions, as some will submit as 'Default group' */
765    const WARN_GROUPS_OPTIONAL = 'warnoptional';
766
767    /**
768     * constructor
769     *
770     * @param int $participantcount
771     * @param bool $submissiondraftsenabled
772     * @param int $submissiondraftscount
773     * @param bool $submissionsenabled
774     * @param int $submissionssubmittedcount
775     * @param int $cutoffdate
776     * @param int $duedate
777     * @param int $coursemoduleid
778     * @param int $submissionsneedgradingcount
779     * @param bool $teamsubmission
780     * @param string $warnofungroupedusers
781     * @param bool $courserelativedatesmode true if the course is using relative dates, false otherwise.
782     * @param int $coursestartdate unix timestamp representation of the course start date.
783     * @param bool $cangrade
784     * @param bool $isvisible
785     */
786    public function __construct($participantcount,
787                                $submissiondraftsenabled,
788                                $submissiondraftscount,
789                                $submissionsenabled,
790                                $submissionssubmittedcount,
791                                $cutoffdate,
792                                $duedate,
793                                $coursemoduleid,
794                                $submissionsneedgradingcount,
795                                $teamsubmission,
796                                $warnofungroupedusers,
797                                $courserelativedatesmode,
798                                $coursestartdate,
799                                $cangrade = true,
800                                $isvisible = true) {
801        $this->participantcount = $participantcount;
802        $this->submissiondraftsenabled = $submissiondraftsenabled;
803        $this->submissiondraftscount = $submissiondraftscount;
804        $this->submissionsenabled = $submissionsenabled;
805        $this->submissionssubmittedcount = $submissionssubmittedcount;
806        $this->duedate = $duedate;
807        $this->cutoffdate = $cutoffdate;
808        $this->coursemoduleid = $coursemoduleid;
809        $this->submissionsneedgradingcount = $submissionsneedgradingcount;
810        $this->teamsubmission = $teamsubmission;
811        $this->warnofungroupedusers = $warnofungroupedusers;
812        $this->courserelativedatesmode = $courserelativedatesmode;
813        $this->coursestartdate = $coursestartdate;
814        $this->cangrade = $cangrade;
815        $this->isvisible = $isvisible;
816    }
817}
818
819/**
820 * Renderable course index summary
821 * @package   mod_assign
822 * @copyright 2012 NetSpot {@link http://www.netspot.com.au}
823 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
824 */
825class assign_course_index_summary implements renderable {
826    /** @var array assignments - A list of course module info and submission counts or statuses */
827    public $assignments = array();
828    /** @var boolean usesections - Does this course format support sections? */
829    public $usesections = false;
830    /** @var string courseformat - The current course format name */
831    public $courseformatname = '';
832
833    /**
834     * constructor
835     *
836     * @param boolean $usesections - True if this course format uses sections
837     * @param string $courseformatname - The id of this course format
838     */
839    public function __construct($usesections, $courseformatname) {
840        $this->usesections = $usesections;
841        $this->courseformatname = $courseformatname;
842    }
843
844    /**
845     * Add a row of data to display on the course index page
846     *
847     * @param int $cmid - The course module id for generating a link
848     * @param string $cmname - The course module name for generating a link
849     * @param string $sectionname - The name of the course section (only if $usesections is true)
850     * @param int $timedue - The due date for the assignment - may be 0 if no duedate
851     * @param string $submissioninfo - A string with either the number of submitted assignments, or the
852     *                                 status of the current users submission depending on capabilities.
853     * @param string $gradeinfo - The current users grade if they have been graded and it is not hidden.
854     */
855    public function add_assign_info($cmid, $cmname, $sectionname, $timedue, $submissioninfo, $gradeinfo) {
856        $this->assignments[] = array('cmid'=>$cmid,
857                               'cmname'=>$cmname,
858                               'sectionname'=>$sectionname,
859                               'timedue'=>$timedue,
860                               'submissioninfo'=>$submissioninfo,
861                               'gradeinfo'=>$gradeinfo);
862    }
863
864
865}
866
867
868/**
869 * An assign file class that extends rendererable class and is used by the assign module.
870 *
871 * @package   mod_assign
872 * @copyright 2012 NetSpot {@link http://www.netspot.com.au}
873 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
874 */
875class assign_files implements renderable {
876    /** @var context $context */
877    public $context;
878    /** @var string $context */
879    public $dir;
880    /** @var MoodleQuickForm $portfolioform */
881    public $portfolioform;
882    /** @var stdClass $cm course module */
883    public $cm;
884    /** @var stdClass $course */
885    public $course;
886
887    /**
888     * The constructor
889     *
890     * @param context $context
891     * @param int $sid
892     * @param string $filearea
893     * @param string $component
894     */
895    public function __construct(context $context, $sid, $filearea, $component) {
896        global $CFG;
897        $this->context = $context;
898        list($context, $course, $cm) = get_context_info_array($context->id);
899        $this->cm = $cm;
900        $this->course = $course;
901        $fs = get_file_storage();
902        $this->dir = $fs->get_area_tree($this->context->id, $component, $filearea, $sid);
903
904        $files = $fs->get_area_files($this->context->id,
905                                     $component,
906                                     $filearea,
907                                     $sid,
908                                     'timemodified',
909                                     false);
910
911        if (!empty($CFG->enableportfolios)) {
912            require_once($CFG->libdir . '/portfoliolib.php');
913            if (count($files) >= 1 && !empty($sid) &&
914                    has_capability('mod/assign:exportownsubmission', $this->context)) {
915                $button = new portfolio_add_button();
916                $callbackparams = array('cmid' => $this->cm->id,
917                                        'sid' => $sid,
918                                        'area' => $filearea,
919                                        'component' => $component);
920                $button->set_callback_options('assign_portfolio_caller',
921                                              $callbackparams,
922                                              'mod_assign');
923                $button->reset_formats();
924                $this->portfolioform = $button->to_html(PORTFOLIO_ADD_TEXT_LINK);
925            }
926
927        }
928
929        $this->preprocess($this->dir, $filearea, $component);
930    }
931
932    /**
933     * Preprocessing the file list to add the portfolio links if required.
934     *
935     * @param array $dir
936     * @param string $filearea
937     * @param string $component
938     * @return void
939     */
940    public function preprocess($dir, $filearea, $component) {
941        global $CFG;
942
943        foreach ($dir['subdirs'] as $subdir) {
944            $this->preprocess($subdir, $filearea, $component);
945        }
946        foreach ($dir['files'] as $file) {
947            $file->portfoliobutton = '';
948
949            $file->timemodified = userdate(
950                $file->get_timemodified(),
951                get_string('strftimedatetime', 'langconfig')
952            );
953
954            if (!empty($CFG->enableportfolios)) {
955                require_once($CFG->libdir . '/portfoliolib.php');
956                $button = new portfolio_add_button();
957                if (has_capability('mod/assign:exportownsubmission', $this->context)) {
958                    $portfolioparams = array('cmid' => $this->cm->id, 'fileid' => $file->get_id());
959                    $button->set_callback_options('assign_portfolio_caller',
960                                                  $portfolioparams,
961                                                  'mod_assign');
962                    $button->set_format_by_file($file);
963                    $file->portfoliobutton = $button->to_html(PORTFOLIO_ADD_ICON_LINK);
964                }
965            }
966            $path = '/' .
967                    $this->context->id .
968                    '/' .
969                    $component .
970                    '/' .
971                    $filearea .
972                    '/' .
973                    $file->get_itemid() .
974                    $file->get_filepath() .
975                    $file->get_filename();
976            $url = file_encode_url("$CFG->wwwroot/pluginfile.php", $path, true);
977            $filename = $file->get_filename();
978            $file->fileurl = html_writer::link($url, $filename, [
979                    'target' => '_blank',
980                ]);
981        }
982    }
983}
984