/blocks/analytics/service/model/model.php

https://github.com/jarednipper/HSU-common-code · PHP · 307 lines · 208 code · 59 blank · 40 comment · 9 complexity · 3348ba844473da49b23775e9e139c595 MD5 · raw file

  1. <?php
  2. require_once dirname(dirname(dirname(dirname(dirname(__FILE__))))) . '/config.php';
  3. class analytics_model{
  4. private $current_record = 0;
  5. /*
  6. *
  7. */
  8. function __construct(){
  9. global $CFG;
  10. if(!empty($CFG->block_analytics_current_record)){
  11. $this->current_record = $CFG->block_analytics_current_record;
  12. } else {
  13. $sql = "SELECT MIN(id) 'min' FROM {$CFG->prefix}log";
  14. $min_record = array_pop(get_records_sql($sql));
  15. $this->current_record = $min_record->min;
  16. }
  17. }
  18. /*
  19. *
  20. */
  21. function process($offset=null, $limit=10000){
  22. global $CFG;
  23. // This may take a long time depending on the data processing limit
  24. // So increase the memory and remove script timeout
  25. set_time_limit(0);
  26. raise_memory_limit('512M');
  27. if(empty($offset)){
  28. $offset = $this->current_record;
  29. }
  30. $upper_limit = $offset + $limit;
  31. $sql = "SELECT id, WEEK(FROM_UNIXTIME(time)) as week, course, userid user, COUNT(id) as count
  32. FROM (SELECT * FROM {$CFG->prefix}log WHERE id > $offset AND id <= $upper_limit) as log
  33. GROUP BY userid, course, week
  34. ORDER BY userid, course, week";
  35. $activity_counts = get_records_sql($sql);
  36. if(!empty($activity_counts)){
  37. foreach ($activity_counts as $activity_count){
  38. if($record = get_record('block_analytics_user', 'course', $activity_count->course, 'week', $activity_count->week, 'user', $activity_count->user)){
  39. $record->count += $activity_count->count;
  40. update_record('block_analytics_user', $record);
  41. } else {
  42. insert_record('block_analytics_user', $activity_count);
  43. }
  44. }
  45. $max_sql = "SELECT MAX(id) max FROM (SELECT * FROM {$CFG->prefix}log WHERE id > $offset AND id <= $upper_limit) as log";
  46. $max_record = array_pop(get_records_sql($max_sql));
  47. $max = $max_record->max;
  48. $this->update_current_record($max);
  49. }
  50. }
  51. /*
  52. *
  53. */
  54. function get_top_courses($limit = 10, $week = null, $min_activity=1){
  55. global $CFG;
  56. $courses_sql = "SELECT course, SUM(count) as total ";
  57. $courses_sql .= "FROM {$CFG->prefix}block_analytics_user bac ";
  58. $courses_sql .= "WHERE course > 1 ";
  59. $courses_sql .= (!empty($week))? "AND week=$week ": "";
  60. $courses_sql .= "GROUP BY course ";
  61. $courses_sql .= "ORDER BY total DESC";
  62. $sql = "SELECT c.fullname, top_c.total FROM {$CFG->prefix}course c
  63. INNER JOIN ($courses_sql) as top_c ON top_c.course = c.id
  64. WHERE top_c.total >= $min_activity
  65. LIMIT $limit ";
  66. $top_courses = get_records_sql($sql);
  67. return $top_courses;
  68. }
  69. /*
  70. *
  71. */
  72. function get_num_active_courses($min_activity=1){
  73. global $CFG;
  74. $sql="SELECT COUNT(course) 'count'
  75. FROM (SELECT course, SUM(count) as 'count'
  76. FROM {$CFG->prefix}block_analytics_user
  77. GROUP BY course) as courses
  78. WHERE count >= $min_activity";
  79. $num_courses_record = get_record_sql($sql);
  80. return $num_courses_record->count;
  81. }
  82. /*
  83. *
  84. */
  85. // If roleid is null, returns num of active users in a course
  86. // If roleid is specified, returns num of active users of that role in a course
  87. function get_num_active_users($min_activity=1, $roleid=null){
  88. global $CFG;
  89. // Get users by roleid, if specified
  90. $user_sql = "SELECT bau.user, SUM(bau.count) total ";
  91. $user_sql .= "FROM {$CFG->prefix}block_analytics_user bau ";
  92. $user_sql .= "INNER JOIN {$CFG->prefix}role_assignments ra ON bau.user = ra.userid ";
  93. $user_sql .= "INNER JOIN {$CFG->prefix}context ctxt ON ra.contextid=ctxt.id ";
  94. $user_sql .= "WHERE ctxt.contextlevel=". CONTEXT_COURSE ." AND ctxt.instanceid = bau.course ";
  95. $user_sql .= (!empty($roleid))? "AND ra.roleid=$roleid " : "";
  96. $user_sql .= "GROUP BY bau.user ";
  97. $user_sql .= "ORDER BY bau.user ";
  98. //Count number of users
  99. $sql="SELECT COUNT(users.user) as count FROM ($user_sql) AS users WHERE users.total >= $min_activity";
  100. $num_users_record = get_record_sql($sql);
  101. return $num_users_record->count;
  102. }
  103. /*
  104. *
  105. */
  106. function get_num_active_instructors($min_activity=1){
  107. global $CFG;
  108. $sql="SELECT COUNT(user) 'count'
  109. FROM (SELECT user, SUM(count) as 'count'
  110. FROM {$CFG->prefix}block_analytics_user
  111. GROUP BY user) as users
  112. WHERE count >= $min_activity";
  113. $num_users_record = get_record_sql($sql);
  114. return $num_users_record->count;
  115. }
  116. /*
  117. *
  118. */
  119. function get_current_record(){
  120. global $CFG;
  121. //$sql = "SELECT i FROM {$CFG->prefix}log WHERE id=$CFG->block_analytics_current_record}";
  122. $current_record = get_record('log', 'id', $CFG->block_analytics_current_record);
  123. return $current_record;
  124. }
  125. /*
  126. *
  127. */
  128. function update_current_record($id){
  129. if(!empty($id)){
  130. set_config('block_analytics_current_record', $id);
  131. }
  132. }
  133. /*
  134. *
  135. */
  136. function reset(){
  137. global $CFG;
  138. delete_records('block_analytics_user');
  139. $sql = "SELECT MIN(id) 'min' FROM {$CFG->prefix}log";
  140. $min_record = array_pop(get_records_sql($sql));
  141. $min = $min_record->min;
  142. set_config('block_analytics_current_record', $min);
  143. }
  144. /*
  145. *
  146. */
  147. function get_activity_info($category_id = null){
  148. global $CFG;
  149. $activity_info = array();
  150. //Assignment
  151. $assignment_info = new stdClass;
  152. $assignment_info->name = 'Assignment';
  153. $sql = "SELECT COUNT(a.id) count FROM {$CFG->prefix}assignment a ";
  154. $sql .= "INNER JOIN {$CFG->prefix}course c ON a.course = c.id ";
  155. $sql .= (!empty($category_id)) ? "WHERE c.category=$category_id" : "";
  156. $assignment_info->num_placed = number_format(array_pop(get_records_sql($sql))->count);
  157. $sql = "SELECT COUNT(assignments.id) as count FROM ";
  158. $sql .= "(SELECT a.id FROM {$CFG->prefix}assignment a ";
  159. $sql .= "INNER JOIN {$CFG->prefix}assignment_submissions asub ON a.id = asub.assignment ";
  160. $sql .= "INNER JOIN {$CFG->prefix}course c ON a.course = c.id ";
  161. $sql .= (!empty($category_id)) ? "WHERE c.category=$category_id " : "";
  162. $sql .= "GROUP BY a.id) as assignments";
  163. $assignment_info->num_used = number_format(array_pop(get_records_sql($sql))->count);
  164. $sql = "SELECT COUNT(assignment_submissions.id) as count FROM ";
  165. $sql .= "(SELECT asub.id FROM {$CFG->prefix}assignment a ";
  166. $sql .= "INNER JOIN {$CFG->prefix}assignment_submissions asub ON a.id = asub.assignment ";
  167. $sql .= "INNER JOIN {$CFG->prefix}course c ON a.course = c.id ";
  168. $sql .= (!empty($category_id)) ? "WHERE c.category=$category_id " : "";
  169. $sql .= ") as assignment_submissions";
  170. $assignment_info->usage = number_format(array_pop(get_records_sql($sql))->count) . " submissions";
  171. $activity_info[] = $assignment_info;
  172. //Forums
  173. $forum_info = new stdClass;
  174. $forum_info->name = 'Forum';
  175. $sql = "SELECT COUNT(f.id) count FROM {$CFG->prefix}forum f ";
  176. $sql .= "INNER JOIN {$CFG->prefix}course c ON f.course = c.id ";
  177. $sql .= (!empty($category_id)) ? "WHERE c.category=$category_id" : "";
  178. $forum_info->num_placed = number_format(array_pop(get_records_sql($sql))->count);
  179. $sql = "SELECT COUNT(forums.id) as count FROM ";
  180. $sql .= "(SELECT f.id FROM {$CFG->prefix}forum f ";
  181. $sql .= "INNER JOIN {$CFG->prefix}forum_discussions fd ON f.id = fd.forum ";
  182. $sql .= "INNER JOIN {$CFG->prefix}forum_posts fp ON fp.discussion = fd.id ";
  183. $sql .= "INNER JOIN {$CFG->prefix}course c ON f.course = c.id ";
  184. $sql .= (!empty($category_id)) ? "WHERE c.category=$category_id " : "";
  185. $sql .= "GROUP BY f.id) as forums";
  186. $forum_info->num_used = number_format(array_pop(get_records_sql($sql))->count);
  187. $sql = "SELECT COUNT(forum_posts.id) as count FROM ";
  188. $sql .= "(SELECT fp.id FROM {$CFG->prefix}forum f ";
  189. $sql .= "INNER JOIN {$CFG->prefix}forum_discussions fd ON f.id = fd.forum ";
  190. $sql .= "INNER JOIN {$CFG->prefix}forum_posts fp ON fp.discussion = fd.id ";
  191. $sql .= "INNER JOIN {$CFG->prefix}course c ON f.course = c.id ";
  192. $sql .= (!empty($category_id)) ? "WHERE c.category=$category_id " : "";
  193. $sql .= ") as forum_posts";
  194. $forum_info->usage = number_format(array_pop(get_records_sql($sql))->count) . " posts";
  195. $activity_info[] = $forum_info;
  196. //Quiz
  197. $quiz_info = new stdClass;
  198. $quiz_info->name = 'Quiz';
  199. $sql = "SELECT COUNT(q.id) count FROM {$CFG->prefix}quiz q ";
  200. $sql .= "INNER JOIN {$CFG->prefix}course c ON q.course = c.id ";
  201. $sql .= (!empty($category_id)) ? "WHERE c.category=$category_id" : "";
  202. $quiz_info->num_placed = number_format(array_pop(get_records_sql($sql))->count);
  203. $sql = "SELECT COUNT(quizzes.id) as count FROM ";
  204. $sql .= "(SELECT q.id FROM {$CFG->prefix}quiz q ";
  205. $sql .= "INNER JOIN {$CFG->prefix}quiz_attempts qa ON q.id = qa.quiz ";
  206. $sql .= "INNER JOIN {$CFG->prefix}course c ON q.course = c.id ";
  207. $sql .= (!empty($category_id)) ? "WHERE c.category=$category_id " : "";
  208. $sql .= "GROUP BY q.id) as quizzes";
  209. $quiz_info->num_used = number_format(array_pop(get_records_sql($sql))->count);
  210. $sql = "SELECT COUNT(quiz_attempts.id) as count FROM ";
  211. $sql .= "(SELECT qa.id FROM {$CFG->prefix}quiz q ";
  212. $sql .= "INNER JOIN {$CFG->prefix}quiz_attempts qa ON q.id = qa.quiz ";
  213. $sql .= "INNER JOIN {$CFG->prefix}course c ON q.course = c.id ";
  214. $sql .= (!empty($category_id)) ? "WHERE c.category=$category_id " : "";
  215. $sql .= ") as quiz_attempts";
  216. $quiz_info->usage = number_format(array_pop(get_records_sql($sql))->count) . " attempts";
  217. $activity_info[] = $quiz_info;
  218. return $activity_info;
  219. }
  220. function get_user_info($week = null, $page = 1, $limit = 20){
  221. $user_info = array();
  222. $offset = ($page - 1) * $limit;
  223. $sql = "SELECT u.firstname, u.lastname, bau.user, SUM(bau.count) count ";
  224. $sql .= "FROM mdl_block_analytics_user bau ";
  225. $sql .= "INNER JOIN mdl_user u ON u.id = bau.user ";
  226. $sql .= "WHERE bau.course != 1 ";
  227. $sql .= "GROUP BY user ";
  228. $sql .= "ORDER BY count DESC ";
  229. $sql .= "LIMIT $limit ";
  230. $sql .= "OFFSET $offset ";
  231. $user_info = get_records_sql($sql);
  232. return $user_info;
  233. }
  234. function get_course_info($week = null, $page = 1, $limit = 20){
  235. $course_info = array();
  236. $offset = ($page - 1) * $limit;
  237. $sql = "SELECT c.fullname, bau.course, SUM(bau.count) count ";
  238. $sql .= "FROM mdl_block_analytics_user bau ";
  239. $sql .= "INNER JOIN mdl_course c ON c.id = bau.course ";
  240. $sql .= "WHERE bau.course != 1 ";
  241. $sql .= "GROUP BY course ";
  242. $sql .= "ORDER BY count DESC ";
  243. $sql .= "LIMIT $limit ";
  244. $sql .= "OFFSET $offset ";
  245. $course_info = get_records_sql($sql);
  246. return $course_info;
  247. }
  248. }