/wp-content/plugins/openlab-gradebook/database/Assignment.php

https://github.com/livinglab/openlab · PHP · 248 lines · 191 code · 46 blank · 11 comment · 16 complexity · 73212fb500b6b553dfd24d1ee33c2eb2 MD5 · raw file

  1. <?php
  2. /**
  3. * Assignment API
  4. */
  5. class gradebook_assignment_API
  6. {
  7. public function __construct()
  8. {
  9. add_action('wp_ajax_assignment', array($this, 'assignment'));
  10. }
  11. public function assignment()
  12. {
  13. global $wpdb, $oplb_gradebook_api;
  14. $params = $oplb_gradebook_api->oplb_gradebook_get_params();
  15. $gbid = $params['gbid'];
  16. //user check - only instructors allowed in
  17. if ($oplb_gradebook_api->oplb_gradebook_get_user_role_by_gbid($gbid) != 'instructor') {
  18. echo json_encode(array("status" => "Not Allowed."));
  19. die();
  20. }
  21. //nonce check
  22. if (!wp_verify_nonce($params['nonce'], 'oplb_gradebook')) {
  23. echo json_encode(array("status" => "Authentication error."));
  24. die();
  25. }
  26. $wpdb->show_errors();
  27. //trim assignment_category to prevent downstream spacing issues
  28. if (!empty($params['assign_category'])) {
  29. $params['assign_category'] = trim($params['assign_category']);
  30. }
  31. switch ($params['method']) {
  32. case 'DELETE':
  33. $id = $params['id'];
  34. $wpdb->delete(
  35. "{$wpdb->prefix}oplb_gradebook_cells",
  36. array(
  37. 'amid' => $id,
  38. 'gbid' => $gbid,
  39. )
  40. );
  41. $wpdb->delete(
  42. "{$wpdb->prefix}oplb_gradebook_assignments",
  43. array(
  44. 'id' => $id,
  45. 'gbid' => $gbid,
  46. )
  47. );
  48. $return_data = array('id' => $id);
  49. $student_data = $oplb_gradebook_api->oplb_gradebook_update_all_student_current_grade_averages($params['gbid']);
  50. if (!empty($student_data)) {
  51. $return_data['student_grade_update'] = $student_data;
  52. }
  53. //get the total weight
  54. $weight_return = $oplb_gradebook_api->oplb_gradebook_get_total_weight($gbid, array());
  55. $return_data['distributed_weight'] = $weight_return['distributed_weight'];
  56. echo json_encode($return_data);
  57. break;
  58. case 'PUT':
  59. $query = $wpdb->prepare("SELECT assign_weight FROM {$wpdb->prefix}oplb_gradebook_assignments WHERE id = %d AND gbid = %d", $params['id'], $gbid);
  60. $current_weight = $wpdb->get_var($query);
  61. $incoming_weight = $params['assign_weight'];
  62. $wpdb->update("{$wpdb->prefix}oplb_gradebook_assignments", array(
  63. 'assign_name' => htmlspecialchars_decode(trim($params['assign_name']), ENT_QUOTES),
  64. 'assign_date' => $params['assign_date'],
  65. 'assign_due' => $params['assign_due'],
  66. 'assign_order' => $params['assign_order'],
  67. 'assign_category' => $params['assign_category'],
  68. 'assign_visibility' => $params['assign_visibility'],
  69. 'assign_grade_type' => $params['assign_grade_type'],
  70. 'assign_weight' => $params['assign_weight'],
  71. ), array(
  72. 'id' => $params['id'],
  73. 'gbid' => $gbid,
  74. ), array(
  75. '%s',
  76. '%s',
  77. '%s',
  78. '%d',
  79. '%s',
  80. '%s',
  81. '%s',
  82. '%f',
  83. ), array(
  84. '%d',
  85. '%d',
  86. ));
  87. $is_null = 1;
  88. if ($params['assign_grade_type'] === 'checkmark') {
  89. $is_null = 0;
  90. }
  91. $oplb_gradebook_api->oplb_gradebook_update_cells_by_assignment($params['id'], $gbid, $params['assign_order']);
  92. $query = $wpdb->prepare("SELECT * FROM {$wpdb->prefix}oplb_gradebook_assignments WHERE id = %d AND gbid = %d", $params['id'], $gbid);
  93. $assignment = $wpdb->get_row($query, ARRAY_A);
  94. //get the total weight
  95. $weight_return = $oplb_gradebook_api->oplb_gradebook_get_total_weight($gbid, array());
  96. $assignment['id'] = intval($assignment['id']);
  97. $assignment['gbid'] = intval($assignment['gbid']);
  98. $assignment['assign_order'] = intval($assignment['assign_order']);
  99. $assignment['total_weight'] = $weight_return['total_weight'];
  100. $assignment['distributed_weight'] = $weight_return['distributed_weight'];
  101. //if weight changed, update students
  102. if ($current_weight !== $incoming_weight) {
  103. $student_data = $oplb_gradebook_api->oplb_gradebook_update_all_student_current_grade_averages($assignment['gbid']);
  104. if (!empty($student_data)) {
  105. $assignment['student_grade_update'] = $student_data;
  106. }
  107. }
  108. echo json_encode($assignment);
  109. break;
  110. case 'UPDATE':
  111. echo json_encode(array("update" => "updating"));
  112. break;
  113. case 'PATCH':
  114. echo json_encode(array("patch" => "patching"));
  115. break;
  116. case 'GET':
  117. echo json_encode(array("get" => "getting"));
  118. break;
  119. case 'POST':
  120. $query = $wpdb->prepare("SELECT assign_order FROM {$wpdb->prefix}oplb_gradebook_assignments WHERE gbid = %d", $params['gbid']);
  121. $assignOrders = $wpdb->get_col($query);
  122. if (!$assignOrders) {
  123. $assignOrders = array(0);
  124. }
  125. $assignOrder = max($assignOrders) + 1;
  126. //handle values that cannot be NULL
  127. if (!$params['assign_weight']) {
  128. $params['assign_weight'] = 0;
  129. }
  130. if (!$params['assign_date']) {
  131. $params['assign_date'] = date('Y-m-d');
  132. }
  133. if (!$params['assign_due']) {
  134. $params['assign_due'] = date('0000-00-00');
  135. }
  136. if (!$params['assign_category']) {
  137. $params['assign_category'] = 'uncategorized';
  138. }
  139. $wpdb->insert("{$wpdb->prefix}oplb_gradebook_assignments", array(
  140. 'assign_name' => htmlspecialchars_decode(trim($params['assign_name']), ENT_QUOTES),
  141. 'assign_date' => $params['assign_date'],
  142. 'assign_due' => $params['assign_due'],
  143. 'assign_category' => $params['assign_category'],
  144. 'assign_visibility' => $params['assign_visibility'],
  145. 'assign_grade_type' => $params['assign_grade_type'],
  146. 'assign_weight' => $params['assign_weight'],
  147. 'gbid' => $params['gbid'],
  148. 'assign_order' => $assignOrder,
  149. ), array('%s', '%s', '%s', '%s', '%s', '%s', '%f', '%d', '%d'));
  150. $assignID = $wpdb->insert_id;
  151. $query = $wpdb->prepare("SELECT uid FROM {$wpdb->prefix}oplb_gradebook_users WHERE gbid = %d AND role = %s", $params['gbid'], 'student');
  152. $studentIDs = $wpdb->get_results($query, ARRAY_N);
  153. $is_null = 1;
  154. if ($params['assign_grade_type'] === 'checkmark') {
  155. $is_null = 0;
  156. }
  157. $usernames = array();
  158. foreach ($studentIDs as $value) {
  159. $student = get_userdata($value[0]);
  160. $usernames[intval($student->ID)] = $student->user_login;
  161. $wpdb->insert("{$wpdb->prefix}oplb_gradebook_cells", array(
  162. 'amid' => $assignID,
  163. 'uid' => $value[0],
  164. 'gbid' => $params['gbid'],
  165. 'assign_order' => $assignOrder,
  166. 'assign_points_earned' => 0,
  167. 'is_null' => $is_null,
  168. ), array('%d', '%d', '%d', '%d', '%f', '%d'));
  169. }
  170. $query = $wpdb->prepare("SELECT * FROM {$wpdb->prefix}oplb_gradebook_assignments WHERE id = %d AND gbid = %d", $assignID, $gbid);
  171. $assignment = $wpdb->get_row($query, ARRAY_A);
  172. $assignment['assign_order'] = intval($assignment['assign_order']);
  173. $assignment['gbid'] = intval($assignment['gbid']);
  174. $assignment['id'] = intval($assignment['id']);
  175. //get the total weight
  176. $weight_return = $oplb_gradebook_api->oplb_gradebook_get_total_weight($assignment['gbid'], array());
  177. $assignment['total_weight'] = $weight_return['total_weight'];
  178. $assignment['distributed_weight'] = $weight_return['distributed_weight'];
  179. $student_data = $oplb_gradebook_api->oplb_gradebook_update_all_student_current_grade_averages($assignment['gbid']);
  180. if (!empty($student_data)) {
  181. $assignment['student_grade_update'] = $student_data;
  182. }
  183. $query = $wpdb->prepare("SELECT * FROM {$wpdb->prefix}oplb_gradebook_cells WHERE amid = %d AND gbid = %d", $assignID, $gbid);
  184. $cells = $wpdb->get_results($query, ARRAY_A);
  185. foreach ($cells as &$cell) {
  186. $cell['amid'] = intval($cell['amid']);
  187. $cell['uid'] = intval($cell['uid']);
  188. $cell['username'] = !empty($usernames[intval($cell['uid'])]) ? $usernames[intval($cell['uid'])] : '';
  189. $cell['assign_order'] = intval($cell['assign_order']);
  190. $cell['assign_points_earned'] = floatval($cell['assign_points_earned']);
  191. $cell['gbid'] = intval($cell['gbid']);
  192. $cell['id'] = intval($cell['id']);
  193. $cell['is_null'] = boolval(intval($cell['is_null']));
  194. $cell['comments'] = !empty($cell['comments']) ? sanitize_text_field($cell['comments']) : false;
  195. }
  196. $data = array('assignment' => $assignment, 'cells' => $cells);
  197. echo json_encode($data);
  198. break;
  199. }
  200. die();
  201. }
  202. }