PageRenderTime 66ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/branches/3.2/src/manhat-lib/shared_grade_book_util.c

#
C | 495 lines | 419 code | 76 blank | 0 comment | 64 complexity | 72928dce694c4d38c63a1207256ae672 MD5 | raw file
Possible License(s): 0BSD, Apache-2.0, GPL-2.0
  1. #include "shared_grade_book_util.h"
  2. #include "shared_grade_book_db.h"
  3. #include "shared_util.h"
  4. #include "shared_file_util.h"
  5. #include "shared_time.h"
  6. #include "shared_strtrm.h"
  7. int find_in_roster(GRADE *one_grade, P_NODE *head)
  8. {
  9. P_NODE *ptr;
  10. for(ptr = head; ptr; ptr = ptr->next)
  11. {
  12. if(strcmp(one_grade->username, ptr->data.username)== 0)
  13. return 1;
  14. }
  15. return 0;
  16. }
  17. void mark_deleted_students(GRADE_LIST *list, P_NODE *head)
  18. {
  19. GRADE *ptr;
  20. for (ptr = list->head; ptr; ptr = ptr->next)
  21. {
  22. if(!find_in_roster(ptr, head))
  23. strncpy(ptr->username, "-1", MAX_USERNAME +1);
  24. }
  25. }
  26. int check_spe_char( char *val)
  27. {
  28. char str[] = "&<>@@$%*!?/;,:#{}[]='`";
  29. int i, len;
  30. char *ptr =0;
  31. len = strlen(val);
  32. for(i = 0; i< len; i++)
  33. {
  34. ptr = strchr(str, val[i]);
  35. if(ptr)
  36. return 0;
  37. }
  38. return 1;
  39. }
  40. int check_float_number(const char *val)
  41. {
  42. int i, len, dot =0;
  43. if(val[0] == '.')
  44. return 0;
  45. len = strlen(val);
  46. for(i =0; i<len; i++)
  47. {
  48. if((!isdigit(val[i]) && val[i] != '.'))
  49. return 0;
  50. if(val[i] == '.')
  51. dot++;
  52. }
  53. if(dot > 1)
  54. return 0;
  55. return 1;
  56. }
  57. void free_scale_list(SCALE_LIST *list)
  58. {
  59. SCALE *ptr;
  60. if(list)
  61. {
  62. while(list->head)
  63. {
  64. ptr = list->head->next;
  65. free(list->head);
  66. list->head = ptr;
  67. }
  68. free(list);
  69. }
  70. }
  71. void free_category_list(CATEGORY_LIST *list)
  72. {
  73. CATEGORY *ptr;
  74. if(list)
  75. {
  76. while(list->head)
  77. {
  78. ptr = list->head->next;
  79. free(list->head);
  80. list->head = ptr;
  81. }
  82. free(list);
  83. }
  84. }
  85. void free_item_list(ITEM_LIST *list)
  86. {
  87. ITEM *ptr;
  88. if(list)
  89. {
  90. while(list->head)
  91. {
  92. ptr = list->head->next;
  93. if(list->head->grades)
  94. free_grade_list(list->head->grades);
  95. if(list->head->letters)
  96. free_letter_grade_list(list->head->letters);
  97. free(list->head);
  98. list->head = ptr;
  99. }
  100. free(list);
  101. }
  102. }
  103. void free_letter_grade_list(LETTER_GRADE_LIST *list)
  104. {
  105. LETTER_GRADE *ptr;
  106. if(list)
  107. {
  108. while(list->head)
  109. {
  110. ptr = list->head->next;
  111. free(list->head);
  112. list->head = ptr;
  113. }
  114. free(list);
  115. }
  116. }
  117. void free_grade_list(GRADE_LIST *list)
  118. {
  119. GRADE *ptr;
  120. if(list)
  121. {
  122. while(list->head)
  123. {
  124. ptr = list->head->next;
  125. if(list->head->comment)
  126. free(list->head->comment);
  127. free(list->head);
  128. list->head = ptr;
  129. }
  130. free(list);
  131. }
  132. }
  133. void free_total_grade_list(TOTAL_GRADE *head)
  134. {
  135. TOTAL_GRADE *ptr;
  136. if(head)
  137. {
  138. while(head)
  139. {
  140. ptr = head->next;
  141. free(head);
  142. head = ptr;
  143. }
  144. }
  145. }
  146. void set_cat_list_values()
  147. {
  148. #define MAX_TMP 40
  149. CATEGORY *ptr;
  150. char name[MAX_TMP];
  151. char temp[MAX_TMP];
  152. int i = 1;
  153. cs_set_int_value("cat_name_len",MAX_CAT_LEN);
  154. for(ptr = global_cat_list->head; ptr; ptr = ptr->next)
  155. {
  156. snprintf(name, MAX_TMP, "categories.%d.cat_name", i);
  157. cs_set_value(name, ptr->cat_name);
  158. snprintf(name, MAX_TMP, "categories.%d.cat_id", i);
  159. cs_set_int_value(name, ptr->cat_id);
  160. snprintf(name, MAX_TMP, "categories.%d.cat_weight", i);
  161. snprintf(temp, MAX_TMP, "%4.*f", test_precision(ptr->weight), ptr->weight);
  162. strtrm(temp);
  163. cs_set_value(name, temp);
  164. snprintf(name, MAX_TMP, "categories.%d.cat_drop", i);
  165. cs_set_int_value(name, ptr->drop_lowest);
  166. if(ptr->weight == 0)
  167. {
  168. snprintf(name, MAX_TMP, "categories.%d.cat_ungraded", i);
  169. cs_set_int_value(name, 1);
  170. }
  171. snprintf(name, MAX_TMP, "categories.%d.number_members", i);
  172. cs_set_int_value(name, ptr->number_members);
  173. snprintf(name, MAX_TMP, "categories.%d.number_graded_items", i);
  174. cs_set_int_value(name, ptr->number_graded_items);
  175. snprintf(name, MAX_TMP, "categories.%d.number_hided_items", i);
  176. cs_set_int_value(name, ptr->hided_items);
  177. i++;
  178. }
  179. cs_set_int_value("number_categories", i -1);
  180. #undef MAX_TMP
  181. }
  182. void set_item_list_values(int flag, int is_student_db)
  183. {
  184. #define MAX_TMP 40
  185. ITEM *ptr =0;
  186. char name[MAX_TMP];
  187. char temp[MAX_TMP];
  188. int i = 1;
  189. struct tm *due_time;
  190. for(ptr = global_item_list->head; ptr; ptr = ptr->next)
  191. {
  192. if( (is_student_db == 0) || (is_student_db && !strcmp(ptr->hide, "no")))
  193. {
  194. snprintf(name, MAX_TMP, "items.%d.item_id", i);
  195. cs_set_int_value(name, ptr->item_id);
  196. snprintf(name, MAX_TMP, "items.%d.item_name", i);
  197. cs_set_value(name, ptr->item_name);
  198. if(strcmp(ptr->is_letter_grade, "no") ==0)
  199. {
  200. snprintf(name, MAX_TMP, "items.%d.item_points", i);
  201. snprintf(temp, MAX_TMP, "%4.*f", test_precision(ptr->points), ptr->points);
  202. strtrm(temp);
  203. cs_set_value(name, temp);
  204. }
  205. due_time = localtime(&(ptr->due_date));
  206. snprintf(temp, MAX_TMP, "%s%d/%s%d/%d",
  207. (due_time->tm_mon + 1) < 10 ? "0" :"",
  208. due_time->tm_mon +1,
  209. due_time->tm_mday < 10 ? "0" :"",
  210. due_time->tm_mday,
  211. due_time->tm_year +1900
  212. );
  213. snprintf(name, MAX_TMP, "items.%d.due_date", i);
  214. cs_set_value(name, temp);
  215. set_hour_minute_ampm(due_time, name); /* shared_time.c */
  216. snprintf(name, MAX_TMP, "items.%d.extra_credit", i);
  217. cs_set_value(name, ptr->extra_credit);
  218. snprintf(name, MAX_TMP, "items.%d.is_letter_grade", i);
  219. cs_set_value(name, ptr->is_letter_grade);
  220. snprintf(name, MAX_TMP, "items.%d.grade_entered", i);
  221. cs_set_value(name, ptr->grade_entered);
  222. snprintf(name, MAX_TMP, "items.%d.hide", i);
  223. cs_set_value(name, ptr->hide);
  224. snprintf(name, MAX_TMP, "items.%d.cat_id", i);
  225. cs_set_int_value(name, ptr->cat_id);
  226. if(flag)
  227. {
  228. if(strlen(ptr->min))
  229. {
  230. snprintf(name, MAX_TMP, "items.%d.min", i);
  231. cs_set_value(name, ptr->min);
  232. }
  233. if(strlen(ptr->max))
  234. {
  235. snprintf(name, MAX_TMP, "items.%d.max", i);
  236. cs_set_value(name, ptr->max);
  237. }
  238. if(strlen(ptr->avg))
  239. {
  240. snprintf(name, MAX_TMP, "items.%d.avg", i);
  241. cs_set_value(name, ptr->avg);
  242. }
  243. }
  244. i++;
  245. }
  246. }
  247. cs_set_int_value("number_items", i-1);
  248. #undef MAX_TMP
  249. }
  250. void set_person_list_values(P_NODE *head, SESSION *user)
  251. {
  252. #define MAX_TMP 40
  253. P_NODE *ptr;
  254. char name[MAX_TMP];
  255. int i=0;
  256. char *username;
  257. username = hdf_get_value(global_cgi->hdf, "Query.username", "");
  258. if(user->group == STUDENT)
  259. username = malloc_str(user->username);
  260. for(ptr = head; ptr; ptr = ptr->next)
  261. {
  262. if(ptr->data.group != FACULTY && *(ptr->data.realname) != '*')
  263. {
  264. if(user->group == FACULTY && strlen(username) ==0)
  265. {
  266. snprintf(name, MAX_TMP, "std.%d.username", i);
  267. cs_set_value(name, ptr->data.username);
  268. snprintf(name, MAX_TMP, "std.%d.realname", i);
  269. cs_set_value(name, ptr->data.realname);
  270. snprintf(name, MAX_TMP, "std.%d.id", i);
  271. cs_set_value(name, ptr->data.id);
  272. i++;
  273. }
  274. else
  275. {
  276. if(strcmp(username, ptr->data.username) ==0)
  277. {
  278. snprintf(name, MAX_TMP, "std.%d.username", i);
  279. cs_set_value(name, ptr->data.username);
  280. snprintf(name, MAX_TMP, "std.%d.realname", i);
  281. cs_set_value(name, ptr->data.realname);
  282. snprintf(name, MAX_TMP, "std.%d.id", i);
  283. cs_set_value(name, ptr->data.id);
  284. i++;
  285. }
  286. }
  287. }
  288. }
  289. cs_set_int_value("number_students", i);
  290. #undef MAX_TMP
  291. }
  292. void set_letter_grades_value()
  293. {
  294. #define MAX_TMP_LEN 40
  295. LETTER_GRADE *ptr;
  296. char name[MAX_TMP_LEN];
  297. char temp[MAX_TMP_LEN];
  298. int i= 1;
  299. for(ptr = global_letter_grades->head; ptr; ptr = ptr->next)
  300. {
  301. snprintf(name, MAX_TMP_LEN, "letter.%d.letter_id", i);
  302. cs_set_int_value(name, ptr->letter_id);
  303. snprintf(name, MAX_TMP_LEN, "letter.%d.letter", i);
  304. cs_set_value(name, ptr->letter);
  305. snprintf(name, MAX_TMP_LEN, "letter.%d.points", i);
  306. snprintf(temp, MAX_TMP_LEN, "%4.*f", test_precision(ptr->points), ptr->points);
  307. strtrm(temp);
  308. cs_set_value(name, temp);
  309. snprintf(name, MAX_TMP_LEN, "letter.%d.item_id", i);
  310. cs_set_int_value(name, ptr->item_id);
  311. i++;
  312. }
  313. cs_set_int_value("number_letter_grades", i-1);
  314. #undef MAX_TMP_LEN
  315. }
  316. void set_current_grade_list_values()
  317. {
  318. #define MAX_TMP_LEN 40
  319. char name[MAX_TMP_LEN];
  320. GRADE *ptr;
  321. char temp[MAX_TMP_LEN];
  322. for(ptr = global_grade_list->head; ptr; ptr = ptr->next)
  323. {
  324. snprintf(name, MAX_TMP_LEN, "score.%s.%d.score", ptr->username, ptr->item_id);
  325. snprintf(temp, MAX_TMP_LEN, "%4.*f", test_precision(ptr->score), ptr->score);
  326. strtrm(temp);
  327. cs_set_value(name, temp);
  328. snprintf(name, MAX_TMP_LEN, "score.%s.%d.excuse", ptr->username, ptr->item_id);
  329. cs_set_value(name, ptr->excuse);
  330. snprintf(name, MAX_TMP_LEN, "score.%s.%d.pending", ptr->username, ptr->item_id);
  331. cs_set_value(name, ptr->pending);
  332. snprintf(name, MAX_TMP_LEN, "score.%s.%d.comment", ptr->username, ptr->item_id);
  333. cs_set_value(name, ptr->comment);
  334. snprintf(name, MAX_TMP_LEN, "score.%s.%d.letter_id", ptr->username, ptr->item_id);
  335. cs_set_int_value(name, ptr->letter_id);
  336. }
  337. #undef MAX_TMP_LEN
  338. }
  339. void set_score_log_values()
  340. {
  341. #define MAX_TMP_LEN 40
  342. char name[MAX_TMP_LEN];
  343. GRADE *ptr;
  344. char temp[MAX_TMP_LEN];
  345. int i = 0;
  346. char timestring[MAX_TIMESTRING +1];
  347. for(ptr = global_grade_list->head; ptr; ptr = ptr->next)
  348. {
  349. if(strcmp(ptr->is_letter_grade, "no" ) == 0)
  350. {
  351. if(ptr->score >= 0)
  352. {
  353. snprintf(name, MAX_TMP_LEN, "score.%d.score", i);
  354. snprintf(temp, MAX_TMP_LEN, "%4.*f", test_precision(ptr->score), ptr->score);
  355. strtrm(temp);
  356. cs_set_value(name, temp);
  357. snprintf(name, MAX_TMP_LEN, "score.%d.comment", i);
  358. cs_set_value(name, ptr->comment);
  359. strftime (timestring, MAX_TIMESTRING, DOW_DATE_TIME_FORMAT,localtime (&(ptr->timestamp)));
  360. snprintf(name, MAX_TMP_LEN, "score.%d.timestamp", i);
  361. cs_set_value(name, timestring);
  362. i++;
  363. }
  364. }
  365. else
  366. {
  367. if(ptr->letter_id >0)
  368. {
  369. snprintf(name, MAX_TMP_LEN, "score.%d.letter", i);
  370. cs_set_value(name, ptr->letter);
  371. snprintf(name, MAX_TMP_LEN, "score.%d.comment", i);
  372. cs_set_value(name, ptr->comment);
  373. strftime (timestring, MAX_TIMESTRING, DOW_DATE_TIME_FORMAT,localtime (&(ptr->timestamp)));
  374. snprintf(name, MAX_TMP_LEN, "score.%d.timestamp", i);
  375. cs_set_value(name, timestring);
  376. i++;
  377. }
  378. }
  379. }
  380. #undef MAX_TMP_LEN
  381. }
  382. int read_grade_book_conf(CONFIG_STRUCT *conf, GRADE_BOOK_CONFIGURE *grade_conf)
  383. {
  384. char path[MAX_PATH +1];
  385. FILE *fp;
  386. snprintf(path, MAX_PATH +1, "%s%s/%s", conf->course_path, GRADE_BOOK_DIR, GRADE_CAL_CONF_FNAME);
  387. if(!file_exists(path))
  388. return 0;
  389. fp = fopen(path, "r");
  390. if(!fp)
  391. cs_critical_error(ERR_FOPEN_READ_FAILED, "grade_book_final read grade book conf");
  392. if(fread(grade_conf, sizeof(GRADE_BOOK_CONFIGURE), 1, fp) != 1)
  393. cs_critical_error(ERR_FREAD_FAILED, "grade_book_final read grade book conf");
  394. fclose(fp);
  395. return 1;
  396. }
  397. int read_release_conf(CONFIG_STRUCT *conf, RELEASE_CONF *release_conf)
  398. {
  399. char path[MAX_PATH +1];
  400. FILE *fp;
  401. snprintf(path, MAX_PATH +1, "%s%s/%s", conf->course_path, GRADE_BOOK_DIR, GRADE_BOOK_RELEASE_CONF_FNAME);
  402. if(!file_exists(path))
  403. return 0;
  404. fp = fopen(path, "r");
  405. if(!fp)
  406. cs_critical_error(ERR_FOPEN_READ_FAILED, "grade_book_final read grade book conf");
  407. if(fread(release_conf, sizeof(RELEASE_CONF), 1, fp) != 1)
  408. cs_critical_error(ERR_FREAD_FAILED, "grade_book_final read grade book conf");
  409. fclose(fp);
  410. return 1;
  411. }
  412. int test_precision(float aNumber)
  413. {
  414. float diff;
  415. diff = aNumber - (int)aNumber;
  416. if(diff >0)
  417. return 2;
  418. return 0;
  419. }