userViews.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. from .models import Item, CheckIn, UserContent
  2. from .forms import CaptchaForm
  3. from .functions import *
  4. import datetime
  5. from datetime import date
  6. import re
  7. def userURL(request, url):
  8. if url == 'checkIn':
  9. # 获取反馈的所有项目
  10. items = Item
  11. checkIn = CheckIn
  12. if not checkGET(request, 'ID'):
  13. return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID。', 'dirLink': '/'})
  14. if request.method == 'POST':
  15. checkIn.ID = request.GET.get('ID')
  16. checkIn = CheckIn.searchByID(checkIn)
  17. if checkIn.status != 'active':
  18. return render(request, 'checkIn/user/error.html',
  19. {'title': '反馈提交失败', 'content': '反馈已经关闭。'})
  20. if checkIn.captcha: # 是否需要验证码确认
  21. myCaptcha = CaptchaForm(request.POST)
  22. if not myCaptcha.is_valid():
  23. return render(request, 'checkIn/user/error.html', {'title': '参数错误', 'content': '验证码错误。'})
  24. # 如果反馈人数达到上限就停止反馈
  25. userContent = UserContent
  26. userContent.c_ID = checkIn.ID
  27. checkInQty = UserContent.getContentQty(userContent)
  28. if checkInQty and isinstance(checkIn.maxNum, int):
  29. if checkInQty >= checkIn.maxNum:
  30. return render(request, 'checkIn/user/error.html', {'title': '活动已经到达人数上限了',
  31. 'content': '活动已经到达人数上限了。'})
  32. items.c_ID = request.session.get('Uc_ID')
  33. items = Item.searchByC_ID(items)
  34. values = {}
  35. # 通过遍历所有item从POST里面取值
  36. for x in items:
  37. # 从item获取反馈key
  38. key = x['description']
  39. # 从POST中取值
  40. # value = request.POST[key].strip()
  41. value = request.POST.getlist(key)
  42. # 如果是文件上传类型中的一种
  43. if x['type'] in [6, 7]:
  44. filename = request.FILES.get(key)
  45. new_file_name = hash(str(filename)+str(datetime.datetime.now()))
  46. upload_file(request, filename=key, prefix=new_file_name)
  47. filename = str(new_file_name)+'.'+get_ext(filename)
  48. value = [filename] # 还原value为list
  49. # 如果item要求唯一性,去user content里面搜索是否有同样的数据
  50. if x['unique']:
  51. itemUnique = UserContent
  52. itemUnique.content = "'{}': '{}'".format(key, value[0])
  53. # itemUnique.content = value[0]
  54. itemUnique.c_ID = x['c_ID']
  55. if not UserContent.uniqueCheck(itemUnique):
  56. return render(request, 'checkIn/user/error.html',
  57. {'title': '请不要重复反馈', 'content': '你已经反馈了。%s重复了。' % (x['description'])})
  58. else:
  59. del itemUnique
  60. # 如果要求数据不在预设范围之内的话
  61. # TODO 这边以后需要重新写一个reservedcontent 用re.split()
  62. if x['reservedFlag']:
  63. if value[0] not in re.split('\r\n|\n|\r|;|;', x['reservedContent']):
  64. return render(request, 'checkIn/user/error.html',
  65. {'title': '输入信息不在预设范围内', 'content': '输入信息不在预设范围内。'})
  66. # 如果通过验证就把数据Dict保留在Session里面
  67. values[key] = ','.join(value)
  68. request.session['UcheckInContent'] = values
  69. if checkIn.creatorConfirm:
  70. request.session['Uconfirmation'] = 10 # Session里面先保存一个需要确认,但是未确认的状态
  71. return HttpResponseRedirect('/checkIn/user/confirm')
  72. else:
  73. return HttpResponseRedirect('/checkIn/user/success')
  74. # GET开启,不是POST
  75. if request.method == 'GET':
  76. # reset反馈session
  77. if checkSession(request, 'Uc_ID'):
  78. del request.session['Uc_ID']
  79. if checkSession(request, 'UcheckInContent'):
  80. del request.session['UcheckInContent']
  81. if checkSession(request, 'Uconfirmation'):
  82. del request.session['Uconfirmation']
  83. # 验证是否GET Uc_ID
  84. try:
  85. # 获取反馈内容列表
  86. items.c_ID = request.GET['ID']
  87. checkIn.ID = request.GET['ID']
  88. request.session['Uc_ID'] = items.c_ID
  89. items = Item.searchByC_ID(items)
  90. checkIn = CheckIn.searchByID(checkIn)
  91. except Exception as e:
  92. return render(request, 'checkIn/user/error.html', {'title': '参数错误', 'content': e})
  93. # 验证反馈是否可以被执行。
  94. # 验证反馈内容是否为空。
  95. if len(items) == 0:
  96. return render(request, 'checkIn/user/error.html', {'title': '404', 'content': '这个活动内容还没有创建。'})
  97. # 如果时间未到,就提示反馈尚未开始
  98. currentDate = datetime.date.today()
  99. timeDelta = currentDate - checkIn.startTime
  100. if timeDelta.days < 0:
  101. return render(request, 'checkIn/user/error.html', {'title': '反馈活动还没有开始', 'content': '活动还没有开始。'})
  102. # 如果时间超过了,就提示反馈尚未开始
  103. if isinstance(checkIn.endTime, date):
  104. timeDelta = currentDate - checkIn.endTime
  105. if timeDelta.days > 0:
  106. return render(request, 'checkIn/user/error.html', {'title': '反馈活动已经结束了', 'content': '活动已经结束了。'})
  107. # 如果反馈人数达到上限就停止反馈
  108. userContent = UserContent
  109. userContent.c_ID = checkIn.ID
  110. checkInQty = UserContent.getContentQty(userContent)
  111. if checkInQty and isinstance(checkIn.maxNum, int):
  112. if checkInQty >= checkIn.maxNum:
  113. return render(request, 'checkIn/user/error.html', {'title': '活动已经到达人数上限了',
  114. 'content': '活动已经到达人数上限了。'})
  115. # 如果反馈没有激活
  116. if checkIn.status != 'active':
  117. return render(request, 'checkIn/user/error.html', {'title': '活动没有开启', 'content': '活动没有开启。'})
  118. # end of 反馈验证
  119. # 是否需要capthca
  120. if checkIn.captcha:
  121. myCaptcha = CaptchaForm
  122. else:
  123. myCaptcha = None
  124. # 遍历item里面的选项
  125. x = 0
  126. for i in items:
  127. if i['type'] in [4, 5]: # 如果是列表需要将文字转换为选项
  128. option = re.split('\r\n|\n|\r', i['itemSelection'])
  129. items[x]['option'] = option
  130. if i['type'] in [6]: # 如果是列表需要将文字转换为选项
  131. option = re.split('\r\n|\n|\r', i['itemSelection'])
  132. option_add_dot = []
  133. if len(option) > 0:
  134. for o in option:
  135. o = '.' + o
  136. option_add_dot.append(o)
  137. option_to_str = ','.join(option_add_dot)
  138. if option_to_str == '.': # 如果后缀名格式是空白的情况
  139. option_to_str = ''
  140. items[x]['option'] = option_to_str
  141. x += 1
  142. # 渲染反馈页面
  143. try:
  144. return render(request, 'checkIn/user/checkIn.html',
  145. {'checkIn': checkIn, 'items': items, 'captcha': myCaptcha})
  146. except Exception as e:
  147. return render(request, 'checkIn/user/error.html', {'title': '参数错误', 'content': e})
  148. if url == 'success':
  149. if not checkSession(request, 'UcheckInContent'):
  150. return render(request, 'checkIn/directPage.html', {'alertMsg': 'Session错误。', 'dirLink': '/'})
  151. values = getSession(request, 'UcheckInContent')
  152. if not checkSession(request, 'Uc_ID'):
  153. return render(request, 'checkIn/directPage.html', {'alertMsg': 'Session错误。', 'dirLink': '/'})
  154. checkIn = CheckIn
  155. checkIn.ID = getSession(request, 'Uc_ID')
  156. checkIn = CheckIn.searchByID(checkIn)
  157. # 将数据保存在SQL数据库里面
  158. userContent = UserContent
  159. userContent.c_ID = checkIn.ID
  160. userContent.o_ID = checkIn.o_ID
  161. userContent.content = values
  162. # 如果用户反馈需要组织者确认的。
  163. try:
  164. userContent.confirmation = request.session['Uconfirmation']
  165. except:
  166. userContent.confirmation = 0
  167. # 尝试获取反馈者的IP地址
  168. try:
  169. userContent.IPAddress = request.META['HTTP_X_FORWARDED_FOR']
  170. except:
  171. userContent.IPAddress = request.META['REMOTE_ADDR']
  172. # 在SQL server里面保存数据
  173. UserContent.createNew(userContent)
  174. # 将数据保存在mongoDB里面
  175. # mongoAddRecord(checkIn.ID, values)
  176. # 完成checkIn活动,清空Session
  177. del request.session['Uc_ID']
  178. del request.session['UcheckInContent']
  179. try:
  180. del request.session['Uconfirmation']
  181. except Exception as e:
  182. print(e)
  183. return render(request, 'checkIn/user/success.html', {'checkIn': checkIn})
  184. # 如果需要确认反馈
  185. if url == 'confirm':
  186. checkIn = CheckIn
  187. if request.method == 'POST':
  188. if not checkSession(request, 'Uconfirmation'):
  189. return render(request, 'checkIn/directPage.html', {'alertMsg': 'Session错误。', 'dirLink': '/'})
  190. request.session['Uconfirmation'] = request.POST['confirmValue']
  191. return HttpResponseRedirect('/checkIn/user/success')
  192. else: # GET打开页面
  193. if not checkSession(request, 'Uconfirmation'):
  194. return render(request, 'checkIn/directPage.html', {'alertMsg': '你还没有输入信息!', 'dirLink': '/'})
  195. else:
  196. return render(request, 'checkIn/user/confirm.html')