From e101286f8b543328ab4176f7885ab7ca9de16c19 Mon Sep 17 00:00:00 2001
From: Nathan Mares <nathan@catalyst-au.net>
Date: Fri, 13 Jul 2012 15:58:20 +1000
Subject: [PATCH] Only show activities in course completion status that a user
 has access to

---
 lib/completion/completion_criteria.php          |    6 +++++
 lib/completion/completion_criteria_activity.php |   25 +++++++++++++++++++++++
 lib/completionlib.php                           |    2 +
 3 files changed, 33 insertions(+), 0 deletions(-)

diff --git a/lib/completion/completion_criteria.php b/lib/completion/completion_criteria.php
index 31f5187..8b05ee2 100644
--- a/lib/completion/completion_criteria.php
+++ b/lib/completion/completion_criteria.php
@@ -254,4 +254,10 @@ abstract class completion_criteria extends data_object {
 
         return $review !== $completion->is_complete();
     }
+
+
+    /* Return true if this criteria applies to the given user */
+    public function is_applicable($user) {
+        return true;
+    }
 }
diff --git a/lib/completion/completion_criteria_activity.php b/lib/completion/completion_criteria_activity.php
index 375c966..bdd0cc0 100644
--- a/lib/completion/completion_criteria_activity.php
+++ b/lib/completion/completion_criteria_activity.php
@@ -286,4 +286,29 @@ class completion_criteria_activity extends completion_criteria {
 
         return $details;
     }
+
+
+    /* Return true if this criteria applies to the given user */
+    public function is_applicable($userid) {
+        global $CFG, $DB;
+        //stolen from lib/modinfolib.php...
+        $cm = $DB->get_record('course_modules', array('id' => $this->moduleinstance));
+        $course = $DB->get_record('course', array('id' => $this->course));
+        $modcontext = get_context_instance(CONTEXT_MODULE, $this->moduleinstance);
+
+        // Check group membership. The grouping option makes the activity
+        // completely invisible as it does not apply to the user at all.
+        if (!empty($CFG->enablegroupmembersonly) and !empty($cm->groupmembersonly)
+                and !has_capability('moodle/site:accessallgroups', $modcontext, $userid)) {
+            // If the activity has 'group members only' and you don't have accessallgroups...
+            $modinfo = new course_modinfo($course, $userid);
+            $groups = $modinfo->get_groups($cm->groupingid);
+            if (empty($groups)) {
+                // ...and you don't belong to a group, then set it so you can't see/access it
+                return false;
+            }
+        }
+
+        return true;
+    }
 }
diff --git a/lib/completionlib.php b/lib/completionlib.php
index 4df3bc0..5c4d969 100644
--- a/lib/completionlib.php
+++ b/lib/completionlib.php
@@ -298,6 +298,8 @@ class completion_info {
         $completions = array();
 
         foreach ($criterion as $criteria) {
+            if (!$criteria->is_applicable($user_id)) continue;
+
             $params = array(
                 'course'        => $this->course_id,
                 'userid'        => $user_id,
-- 
1.7.5.4

