PageRenderTime 48ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/trunk/src/manhat-lib/shared_grade_book_util.c

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