/**
  * Returns a query object with the basics all set up to get assignment stuff
  *
  * @global moodle_database $DB
  * @return block_ajax_marking_query_base
  */
 public function query_factory()
 {
     global $USER;
     $query = new block_ajax_marking_query_base($this);
     $query->add_from(array('table' => $this->modulename, 'alias' => 'moduletable'));
     $query->add_from(array('join' => 'INNER JOIN', 'table' => 'workshop_submissions', 'alias' => 'sub', 'on' => 'sub.workshopid = moduletable.id'));
     $query->add_from(array('join' => 'LEFT JOIN', 'table' => 'workshop_assessments', 'alias' => 'a', 'on' => 'sub.id = a.submissionid'));
     // Standard userid for joins.
     $query->add_select(array('table' => 'sub', 'column' => 'authorid', 'alias' => 'userid'));
     $query->add_select(array('table' => 'sub', 'column' => 'timemodified', 'alias' => 'timestamp'));
     // Assumes that we want to see stuff that has not been assessed by the current user yet. Perhaps
     // we have more than one assessor? Perhaps it's peer assessment only?
     $query->add_where(array('type' => 'AND', 'condition' => 'NOT EXISTS(
                                SELECT 1
                                  FROM {workshop_assessments} workshop_assessments
                                 WHERE workshop_assessments.submissionid = sub.id
                                   AND workshop_assessments.reviewerid = :workshopuserid
                                   AND workshop_assessments.grade != -1
                            )'));
     $query->add_where(array('type' => 'AND', 'condition' => 'moduletable.phase < ' . workshop::PHASE_CLOSED));
     // Do we want to only see stuff when the workshop has been put into a later phase?
     // If it has, a teacher will have done this manually and will know about the grading work.
     // Unless there are two teachers.
     $query->add_param('workshopuserid', $USER->id);
     return $query;
 }
 /**
  * Returns a query object with the basics all set up to get assignment stuff
  *
  * @global moodle_database $DB
  * @return block_ajax_marking_query_base
  */
 public function query_factory()
 {
     global $USER;
     $query = new block_ajax_marking_query_base($this);
     // This currently does a simple check for whether or not the current user has added a
     // rating or not. No scope for another teacher to do all the marking, or some of it.
     list($notmyratingsql, $notmyratingparams) = $this->get_teacher_sql();
     $query->add_params($notmyratingparams);
     $query->add_from(array('table' => 'forum_posts', 'alias' => 'sub'));
     $query->add_from(array('table' => 'forum_discussions', 'alias' => 'discussions', 'on' => 'sub.discussion = discussions.id'));
     $query->add_from(array('table' => $this->modulename, 'alias' => 'moduletable', 'on' => 'discussions.forum = moduletable.id'));
     // We need the context id to check the ratings table in the teacher SQL.
     $query->add_from(array('table' => 'course_modules', 'alias' => 'forumcoursemodules', 'on' => 'moduletable.id = forumcoursemodules.instance ' . 'AND forumcoursemodules.module = ' . $this->get_module_id()));
     $query->add_from(array('table' => 'context', 'alias' => 'forumcontext', 'on' => 'forumcoursemodules.id = forumcontext.instanceid ' . 'AND forumcontext.contextlevel = ' . CONTEXT_MODULE));
     // Standard userid for joins.
     $query->add_select(array('table' => 'sub', 'column' => 'userid'));
     $query->add_select(array('table' => 'sub', 'column' => 'modified', 'alias' => 'timestamp'));
     $query->add_where(array('type' => 'AND', 'condition' => 'sub.userid <> :forumuserid'));
     $query->add_where(array('type' => 'AND', 'condition' => 'moduletable.assessed > 0'));
     $query->add_where(array('type' => 'AND', 'condition' => " {$notmyratingsql} "));
     $query->add_where(array('type' => 'AND', 'condition' => '( (moduletable.assesstimestart = 0) OR
                                              (sub.created >= moduletable.assesstimestart) ) '));
     $query->add_where(array('type' => 'AND', 'condition' => '( (moduletable.assesstimefinish = 0) OR
                                              (sub.created <= moduletable.assesstimefinish) )'));
     $query->add_param('forumuserid', $USER->id);
     return $query;
 }
 /**
  * This is for when a courseid node is an ancestor of the node that has been
  * selected, so we just do a where.
  *
  * @param block_ajax_marking_query_base $query
  * @param int $courseid
  * @SuppressWarnings(PHPMD.UnusedPrivateMethod) Dynamic method names don't register
  */
 public static function configwhere_filter(block_ajax_marking_query_base $query, $courseid)
 {
     $conditions = array('type' => 'AND', 'condition' => 'course_modules.course = :courseidfiltercourseid');
     $query->add_where($conditions);
     $query->add_param('courseidfiltercourseid', $courseid);
 }
 /**
  * Returns a query object with the basics all set up to get assignment stuff
  *
  * @global moodle_database $DB
  * @return block_ajax_marking_query_base
  */
 public function query_factory()
 {
     global $DB, $USER;
     $query = new block_ajax_marking_query_base($this);
     $query->add_from(array('table' => 'assign', 'alias' => 'moduletable'));
     $query->add_from(array('join' => 'INNER JOIN', 'table' => 'assign_submission', 'alias' => 'sub', 'on' => 'sub.assignment = moduletable.id'));
     // LEFT JOIN, rather than NOT EXISTS because we may have an empty form saved, which
     // will create a grade record, but with a null grade. These should still count as ungraded.
     $query->add_from(array('join' => 'LEFT JOIN', 'table' => 'assign_grades', 'on' => 'assign_grades.assignment = moduletable.id AND
                                    assign_grades.userid = sub.userid AND
                                    assign_grades.grader = :assigngraderid'));
     $query->add_param('assigngraderid', $USER->id);
     // Standard user id for joins.
     $query->add_select(array('table' => 'sub', 'column' => 'userid'));
     $query->add_select(array('table' => 'sub', 'column' => 'timemodified', 'alias' => 'timestamp'));
     $statustext = $DB->sql_compare_text('sub.status');
     $query->add_where(array('type' => 'AND', 'condition' => $statustext . " = '" . ASSIGN_SUBMISSION_STATUS_SUBMITTED . "'"));
     $query->add_where(array('type' => 'AND', 'condition' => 'assign_grades.grade IS NULL'));
     // First bit: not graded
     // Second bit of first bit: has been resubmitted
     // Third bit: if it's advanced upload, only care about the first bit if 'send for marking'
     // was clicked.
     return $query;
 }