views.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. from django.shortcuts import render
  2. from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
  3. from datetime import datetime, timedelta
  4. from django.core import serializers
  5. from django.forms.models import model_to_dict
  6. import json
  7. from .data import admin_psw
  8. from .models import Volunteer, ServiceTimeSlot, ServiceBooking
  9. # Create your views here.
  10. def index(request):
  11. if request.method == 'GET':
  12. return render(request, 'volunteer_arrangement/index.html')
  13. if request.method == 'POST':
  14. volunteer = Volunteer.get_by_mobile(request.POST['mobile'])
  15. if volunteer:
  16. if volunteer.status == 'active':
  17. request.session['volunteer_id'] = volunteer.ID
  18. return HttpResponseRedirect('/cq/volunteer/booking_service/')
  19. else:
  20. return render(request, 'volunteer_arrangement/directPage.html',
  21. {'alertMsg': '账户未激活', 'dirLink': '/cq/volunteer'})
  22. else:
  23. return render(request, 'volunteer_arrangement/directPage.html',
  24. {'alertMsg': '手机号码不存在', 'dirLink': '/cq/volunteer'})
  25. def volunteer_reg(request):
  26. if request.method == 'GET':
  27. return render(request, 'volunteer_arrangement/volunteer_reg.html')
  28. if request.method == 'POST':
  29. if not Volunteer.get_by_mobile(request.POST['mobile']):
  30. volunteer = Volunteer()
  31. volunteer.status = 'pending'
  32. volunteer.name = request.POST['name']
  33. volunteer.mobile = request.POST['mobile']
  34. volunteer.gender = request.POST['gender']
  35. volunteer.social_id = request.POST['social_id']
  36. volunteer.political_outlook = request.POST['political_outlook']
  37. volunteer.organization = request.POST['organization']
  38. volunteer.district_street = request.POST['district_street']
  39. volunteer.save()
  40. return render(request, 'volunteer_arrangement/directPage.html',
  41. {'alertMsg': '提交成功,请等待审批', 'dirLink': '/cq/volunteer'})
  42. else:
  43. return render(request, 'volunteer_arrangement/directPage.html',
  44. {'alertMsg': '手机号码已经注册过了', 'dirLink': '/cq/volunteer'})
  45. def admin(request):
  46. if request.method == 'GET':
  47. return render(request, 'volunteer_arrangement/admin_login.html')
  48. if request.method == 'POST':
  49. if request.POST['password'] == admin_psw:
  50. request.session['admin_login'] = True
  51. return HttpResponseRedirect('/cq/volunteer/admin_management/home/')
  52. else:
  53. return render(request, 'volunteer_arrangement/directPage.html',
  54. {'alertMsg': '密码错误', 'dirLink': '/cq/volunteer/admin/'})
  55. def admin_management(request, action):
  56. # 验证管理员登录状态
  57. if not request.session.get('admin_login'):
  58. return render(request, 'volunteer_arrangement/directPage.html',
  59. {'alertMsg': '请重新登录管理员', 'dirLink': '/cq/admin/'})
  60. if action == 'home':
  61. return render(request, 'volunteer_arrangement/admin_home.html')
  62. if action == 'pending_list':
  63. pending_list = Volunteer.pending_list()
  64. return render(request, 'volunteer_arrangement/admin_pending_list.html', {'pending_list': pending_list})
  65. if action == 'approve_volunteer':
  66. v_id = request.GET.get('v_id')
  67. Volunteer.approve_volunteer(v_id)
  68. return HttpResponseRedirect('/cq/volunteer/admin_management/home/')
  69. if action == 'reject_volunteer':
  70. v_id = request.GET.get('v_id')
  71. Volunteer.reject(v_id)
  72. return HttpResponseRedirect('/cq/volunteer/admin_management/home/')
  73. if action == 'delete_service':
  74. if request.method == 'GET':
  75. booking_list = None
  76. # booking_overall_status = []
  77. # 如果有日期就获取当天的报名状况
  78. if request.GET.get('date'):
  79. service_date = request.GET['date']
  80. service_list = ServiceTimeSlot.search_by_date(service_date)
  81. # service_list_IDs = []
  82. # for service in service_list:
  83. # service_list_IDs.append(service.ID)
  84. booking_list = ServiceBooking.search_by_service_timeslot_list(service_list)
  85. # booking_list_new = ServiceBooking.search_by_service_timeslot_list_with_volunteer_info(service_list)
  86. # service_list_json = serializers.serialize('json', service_list)
  87. # for service in service_list:
  88. # service_dict = model_to_dict(service)
  89. # service_exist_booking_count = len(booking_list.filter(timeslot_id=service))
  90. # service_dict['current_booking'] = service_exist_booking_count
  91. # # service_dict['date'] = service_dict['date'].strftime("%Y-%m-%d")
  92. # service_dict['date'] = str(service_dict['date'])
  93. # service_dict['start_time'] = service_dict['start_time'].strftime("%H:%M:%S")
  94. # service_dict['end_time'] = service_dict['end_time'].strftime("%H:%M:%S")
  95. # booking_overall_status.append(service_dict)
  96. return render(request, 'volunteer_arrangement/admin_delete_service.html',
  97. {'booking_status': booking_list, 'date': str(request.GET.get('date'))})
  98. if action == 'get_month_service':
  99. if request.method == 'GET':
  100. # 获取日期值
  101. if request.GET.get('date'):
  102. service_date = request.GET.get('date')
  103. monthly_report = ServiceBooking.get_monthly_report(service_date)
  104. # 获取数据,生成response
  105. response = HttpResponse(content_type='text/csv;charset=ANSI')
  106. response['Content-Disposition'] = 'attachment; filename="MonthlyReport.csv"'
  107. import csv
  108. writer = csv.writer(response)
  109. # keys = monthly_report[0].keys()
  110. keys = ['日期', '开始时间', '结束时间', '姓名', '性别', '手机号码', '身份证号码', '政治面貌', '学校/单位', '居住区域(区或街道)']
  111. writer.writerow(keys)
  112. for x in monthly_report:
  113. writer.writerow(x.values())
  114. return response
  115. def logout(request):
  116. del request.session
  117. return render(request, 'volunteer_arrangement/directPage.html',
  118. {'alertMsg': '已经退出', 'dirLink': '/cq/volunteer'})
  119. def booking_service(request):
  120. # 志愿者注册服务时间页面
  121. if request.method == 'GET':
  122. booking_overall_status = []
  123. monthly_booking_status = []
  124. count_month = []
  125. current_year = datetime.now().year
  126. current_month = datetime.now().month
  127. # 验证登陆状态
  128. if not request.session.get('volunteer_id'):
  129. return render(request, 'volunteer_arrangement/directPage.html', {'alertMsg': '请登录', 'dirLink': '/cq/volunteer'})
  130. volunteer = Volunteer.get_by_id(request.session.get('volunteer_id'))
  131. # 如果有日期就获取当天的报名状况
  132. if request.GET.get('date'):
  133. service_date = request.GET['date']
  134. if datetime.strptime(service_date, '%Y-%m-%d').date() < datetime.now().date():
  135. return render(request, 'volunteer_arrangement/directPage.html',
  136. {'alertMsg': '日期不能早于今天', 'dirLink': '/cq/volunteer/booking_service/?date='+str(datetime.now().date())})
  137. else:
  138. service_date = str(datetime.now().date())
  139. service_list = ServiceTimeSlot.search_by_date(service_date)
  140. # service_list_IDs = []
  141. # for service in service_list:
  142. # service_list_IDs.append(service.ID)
  143. booking_list = ServiceBooking.search_by_service_timeslot_list(service_list)
  144. # service_list_json = serializers.serialize('json', service_list)
  145. for service in service_list:
  146. service_dict = model_to_dict(service)
  147. service_exist_booking_count = len(booking_list.filter(timeslot_id=service))
  148. service_dict['current_booking'] = service_exist_booking_count
  149. # service_dict['date'] = service_dict['date'].strftime("%Y-%m-%d")
  150. service_dict['date'] = str(service_dict['date'])
  151. service_dict['start_time'] = service_dict['start_time'].strftime("%H:%M:%S")
  152. service_dict['end_time'] = service_dict['end_time'].strftime("%H:%M:%S")
  153. booking_overall_status.append(service_dict)
  154. selected_date = datetime.strptime(service_date, '%Y-%m-%d').date()
  155. current_year = selected_date.year
  156. current_month = selected_date.month
  157. monthly_service_list = ServiceTimeSlot.search_by_year_month(current_year, current_month)
  158. monthly_booking_list = ServiceBooking.search_by_service_timeslot_list(monthly_service_list)
  159. count_date = 0
  160. count_people = 0
  161. count_volunteer = 0
  162. count_month = []
  163. for service in monthly_service_list:
  164. service_dict = model_to_dict(service)
  165. service_exist_booking_count = len(monthly_booking_list.filter(timeslot_id=service))
  166. service_dict['current_booking'] = service_exist_booking_count
  167. # service_dict['date'] = service_dict['date'].strftime("%Y-%m-%d")
  168. # service_dict['date'] = str(service_dict['date'])
  169. service_dict['start_time'] = service_dict['start_time'].strftime("%H:%M:%S")
  170. service_dict['end_time'] = service_dict['end_time'].strftime("%H:%M:%S")
  171. monthly_booking_status.append(service_dict)
  172. if count_date == 0 and service_dict['date'].day != count_date:
  173. count_date = service_dict['date'].day
  174. count_people += service_dict['people_count']
  175. count_volunteer += service_dict['current_booking']
  176. elif service_dict['date'].day == count_date:
  177. count_people += service_dict['people_count']
  178. count_volunteer += service_dict['current_booking']
  179. else:
  180. count_month.append({'day': count_date, 'total': count_people, 'current': count_volunteer})
  181. count_date = service_dict['date'].day
  182. count_people = 0
  183. count_volunteer = 0
  184. count_people += service_dict['people_count']
  185. count_volunteer += service_dict['current_booking']
  186. if count_date != 0:
  187. count_month.append({'day': count_date, 'total': count_people, 'current': count_volunteer})
  188. return render(request, 'volunteer_arrangement/booking_service.html',
  189. {'booking_status': booking_overall_status, 'monthly_status': count_month,
  190. 'date': str(request.GET.get('date')), 'volunteer': volunteer})
  191. def my_service(request):
  192. # 验证登陆状态
  193. if not request.session.get('volunteer_id'):
  194. return render(request, 'volunteer_arrangement/directPage.html',
  195. {'alertMsg': '请登录', 'dirLink': '/cq/volunteer'})
  196. my_booking_list = ServiceBooking.search_by_volunteer(request.session.get('volunteer_id'))
  197. return render(request, 'volunteer_arrangement/my_service.html', {'my_service': my_booking_list})
  198. def booking_info_api(request):
  199. # 获取指定日期注册查询信息
  200. service_date = request.GET['date']
  201. service_list = ServiceTimeSlot.search_by_date(service_date)
  202. # service_list_IDs = []
  203. # for service in service_list:
  204. # service_list_IDs.append(service.ID)
  205. booking_list = ServiceBooking.search_by_service_timeslot_list(service_list)
  206. booking_overall_status = []
  207. service_list_json = serializers.serialize('json', service_list)
  208. for service in service_list:
  209. service_dict = model_to_dict(service)
  210. service_exist_booking_count = len(booking_list.filter(timeslot_id=service))
  211. service_dict['current_booking'] = service_exist_booking_count
  212. # service_dict['date'] = service_dict['date'].strftime("%Y-%m-%d")
  213. service_dict['date'] = str(service_dict['date'])
  214. service_dict['start_time'] = service_dict['start_time'].strftime("%H:%M:%S")
  215. service_dict['end_time'] = service_dict['end_time'].strftime("%H:%M:%S")
  216. booking_overall_status.append(service_dict)
  217. booking_overall_status_json = json.dumps(booking_overall_status, ensure_ascii=False)
  218. return JsonResponse(json.loads(booking_overall_status_json), safe=False)
  219. # return HttpResponse(booking_overall_status_json)
  220. # return HttpResponse(booking_overall_status)
  221. def register(request, action):
  222. if action == 'add':
  223. # 验证登陆状态
  224. if not request.session.get('volunteer_id'):
  225. return render(request, 'volunteer_arrangement/directPage.html',
  226. {'alertMsg': '请登录', 'dirLink': '/cq/volunteer'})
  227. # 验证是否传入timeslot_id
  228. if not request.GET.get('timeslot_id'):
  229. return render(request, 'volunteer_arrangement/directPage.html',
  230. {'alertMsg': '参数错误', 'dirLink': '/cq/volunteer'})
  231. volunteer = Volunteer.get_by_id(request.session.get('volunteer_id'))
  232. booking_timeslot = ServiceTimeSlot.get_by_id(request.GET.get('timeslot_id'))
  233. current_booking_count = len(ServiceBooking.search_by_service_timeslot(booking_timeslot))
  234. if current_booking_count < booking_timeslot.people_count:
  235. service_booking = ServiceBooking()
  236. service_booking.volunteer_id = volunteer
  237. service_booking.timeslot_id = booking_timeslot
  238. if ServiceBooking.add(service_booking) == 0:
  239. return render(request, 'volunteer_arrangement/directPage.html',
  240. {'alertMsg': '报名成功',
  241. 'dirLink': '/cq/volunteer/booking_service/?date=' + str(booking_timeslot.date)})
  242. else:
  243. return render(request, 'volunteer_arrangement/directPage.html',
  244. {'alertMsg': '你已经报名了',
  245. 'dirLink': '/cq/volunteer/booking_service/?date=' + str(booking_timeslot.date)})
  246. if action == 'delete':
  247. # 验证管理员登录状态
  248. if not request.session.get('admin_login'):
  249. return render(request, 'volunteer_arrangement/directPage.html',
  250. {'alertMsg': '请重新登录管理员', 'dirLink': '/cq/admin/'})
  251. # 验证是否传入timeslot_id and volunteer_id
  252. if not request.GET.get('timeslot_id') and request.GET.get('volunteer_id'):
  253. return render(request, 'volunteer_arrangement/directPage.html',
  254. {'alertMsg': '参数错误', 'dirLink': '/cq/volunteer'})
  255. volunteer_id = request.GET.get('volunteer_id')
  256. service_timeslot_id = request.GET.get('timeslot_id')
  257. service_timeslot = ServiceTimeSlot.get_by_id(service_timeslot_id)
  258. ServiceBooking.delete(service_timeslot_id, volunteer_id)
  259. return render(request, 'volunteer_arrangement/directPage.html',
  260. {'alertMsg': '删除成功',
  261. 'dirLink': '/cq/volunteer/admin_management/delete_service/?date='
  262. + str(service_timeslot.date)
  263. })