views.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. # coding=utf-8
  2. import os
  3. import traceback
  4. import json
  5. from django.conf import settings
  6. from django.utils import timezone
  7. from django.db.models import ProtectedError
  8. from django.views.decorators.csrf import csrf_exempt
  9. from django.db import transaction, IntegrityError
  10. from django.db.models import Q
  11. from apps.office.filters import NoticeFilter
  12. from apps.office.models import Notice, NoticeReply, NoticeBrowseRecord, NoticeAttachment
  13. from apps.account.decorators import token_required, permission_required
  14. from apps.base import Formater
  15. from apps.foundation.models import BizLog
  16. from apps.office.serializers import NoticeSerializer, NoticeBrowseRecordSerializer, NoticeReplySerializer
  17. from libs.http import JSONResponse, JSONError, DataGridJSONResponse
  18. from libs import utils
  19. from apps.exceptions import CustomError
  20. @permission_required('office.view_notice')
  21. def notice_list(request):
  22. f = NoticeFilter(request.GET, queryset=Notice.objects.filter())
  23. rows, total = utils.get_page_data(request, f.qs)
  24. serializer = NoticeSerializer(rows, many=True)
  25. return DataGridJSONResponse(serializer.data, total)
  26. @csrf_exempt
  27. @permission_required('office.add_notice')
  28. def notice_save(request):
  29. id = request.GET.get('id')
  30. data = json.loads(request.body)
  31. try:
  32. with transaction.atomic():
  33. data['dendline'] += ' 00:00:00'
  34. serializer = NoticeSerializer.factory(request.user, data, id)
  35. serializer = serializer.validSave()
  36. if id:
  37. item_data = {'notice': serializer.id}
  38. replys = NoticeReply.getByNotice(id)
  39. reply_ids = replys.values_list('id')
  40. for reply_id in reply_ids:
  41. reply_serializer = NoticeReplySerializer.factory(request.user, item_data, reply_id[0])
  42. reply_serializer.validSave()
  43. browserecords = NoticeBrowseRecord.getByNotice(id)
  44. browserecord_ids = browserecords.values_list('id')
  45. for browserecord_id in browserecord_ids:
  46. browserecord_serializer = NoticeBrowseRecordSerializer.factory(request.user, item_data, browserecord_id[0])
  47. browserecord_serializer.validSave()
  48. except CustomError, e:
  49. return JSONError(e.get_error_msg())
  50. except Exception, e:
  51. traceback.print_exc()
  52. return JSONError(u'保存失败!')
  53. return JSONResponse()
  54. @permission_required('office.delete_notice')
  55. def notice_delete(request):
  56. id = int(request.GET.get('id'))
  57. try:
  58. with transaction.atomic():
  59. notice = Notice.getById(id)
  60. BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除公告[%s],id=%d" % (notice.title, notice.id))
  61. notice.delete()
  62. browserecords = NoticeBrowseRecord.getByNotice(id)
  63. for browserecord in browserecords:
  64. BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除公告回复id=%d" % (browserecord.id))
  65. browserecord.delete()
  66. replys = NoticeReply.getByNotice(id)
  67. for reply in replys:
  68. BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除公告回复id=%d" % (reply.id))
  69. reply.delete()
  70. attachments = NoticeAttachment.getByNotice(id)
  71. for attachment in attachments:
  72. BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除公告回复id=%d" % (attachment.id))
  73. attachment.delete()
  74. except CustomError, e:
  75. return JSONError(e.get_error_msg())
  76. except ProtectedError:
  77. return JSONError(u'该公告已被使用,禁止删除!')
  78. except IntegrityError:
  79. return JSONError(u'该公告已被使用,禁止删除!')
  80. except Exception, e:
  81. traceback.print_exc()
  82. return JSONError(u'删除失败!')
  83. return JSONResponse({})
  84. @token_required
  85. @permission_required('office.view_notice')
  86. def notice_detail(request):
  87. id = request.GET.get('id')
  88. if not id:
  89. return JSONResponse()
  90. instance = Notice.getById(id)
  91. try:
  92. with transaction.atomic():
  93. hits = instance.hits
  94. new_hits = int(hits) + 1
  95. instance.hits = new_hits
  96. instance.save()
  97. item_data = {'notice': instance.id}
  98. browserecord_serializer = NoticeBrowseRecordSerializer.factory(request.user, item_data)
  99. browserecord_serializer.validSave()
  100. except CustomError, e:
  101. return JSONError(e.get_error_msg())
  102. except Exception, e:
  103. traceback.print_exc()
  104. return JSONError(u'查看失败!')
  105. if instance.priority == Notice.NORMAL:
  106. priority = u'普通'
  107. else:
  108. priority = u'紧急'
  109. main_data = {
  110. 'id': id,
  111. 'title': instance.title,
  112. 'priority': instance.priority,
  113. 'priority_text': priority,
  114. 'department_name': instance.department.name,
  115. 'hits': instance.hits,
  116. 'content': instance.content,
  117. 'create_user_text': instance.create_user.name,
  118. 'create_time': Formater.formatStrTime(instance.create_time),
  119. 'dendline': Formater.formatStrDate(instance.dendline)
  120. }
  121. data = {
  122. 'main_data': main_data,
  123. 'items_data': []
  124. }
  125. rows = NoticeReply.getByNotice(id)
  126. for row in rows:
  127. item_data = {
  128. 'id': row.id,
  129. 'content': row.content,
  130. 'create_user_text': row.create_user.name,
  131. 'create_time': Formater.formatStrTime(row.create_time)
  132. }
  133. data['items_data'].append(item_data)
  134. return JSONResponse(data)
  135. @token_required
  136. def notice_answer(request):
  137. id = request.GET.get('id')
  138. data = json.loads(request.body)
  139. try:
  140. with transaction.atomic():
  141. data['notice'] = id
  142. reply_serializer = NoticeReplySerializer.factory(request.user, data)
  143. reply_serializer.validSave()
  144. except CustomError, e:
  145. return JSONError(e.get_error_msg())
  146. except Exception, e:
  147. traceback.print_exc()
  148. return JSONError(u'保存失败!')
  149. return JSONResponse()
  150. @token_required
  151. @permission_required('office.view_browserecord')
  152. def notice_browserecord(request):
  153. id = request.GET.get('id')
  154. if not id:
  155. return JSONResponse()
  156. instance = Notice.getById(id)
  157. if instance.priority == Notice.NORMAL:
  158. priority = u'普通'
  159. else:
  160. priority = u'紧急'
  161. main_data = {
  162. 'id': id,
  163. 'title': instance.title,
  164. 'priority': instance.priority,
  165. 'priority_text': priority,
  166. 'department_name': instance.department.name,
  167. 'hits': Formater.formatCountShow(instance.hits),
  168. 'content': instance.content,
  169. 'create_time': Formater.formatStrTime(instance.create_time),
  170. 'dendline': Formater.formatStrDate(instance.dendline)
  171. }
  172. data = {
  173. 'main_data': main_data,
  174. 'items_data': []
  175. }
  176. rows = NoticeBrowseRecord.getByNotice(id)
  177. for row in rows:
  178. item_data = {
  179. 'id': row.id,
  180. 'department': row.department.name,
  181. 'browse_user_name': row.browse_user.name,
  182. 'create_time': Formater.formatStrTime(row.create_time)
  183. }
  184. data['items_data'].append(item_data)
  185. return JSONResponse(data)
  186. @token_required
  187. def notice_upload_files(request):
  188. ids = request.POST.get('ids')
  189. files = request.FILES.getlist('file')
  190. try:
  191. with transaction.atomic():
  192. ids = str(ids).split(',')
  193. from models import path_and_rename
  194. for id in ids:
  195. notice = Notice.objects.filter(id=id).first()
  196. if not notice:
  197. raise CustomError(u'未找到公告')
  198. for file in files:
  199. filename = "%s%d-%s.%s" % (
  200. path_and_rename.path,
  201. notice.id,
  202. timezone.now().strftime('%Y%m%d%H%M%S%f'),
  203. file.name.split('.')[-1]
  204. )
  205. filename = filename.lower()
  206. full_filename = "%s/%s" % (settings.MEDIA_ROOT, filename)
  207. with open(full_filename, 'wb+') as destination:
  208. for chunk in file.chunks():
  209. destination.write(chunk)
  210. NoticeAttachment.objects.create(notice=notice, file=filename)
  211. except CustomError, e:
  212. return JSONError(e.get_error_msg())
  213. except Exception,e:
  214. traceback.print_exc()
  215. return JSONError(u'上传失败')
  216. return JSONResponse({})
  217. @token_required
  218. def notice_files(request):
  219. id = request.GET.get('id')
  220. rows = NoticeAttachment.objects.filter(notice_id=int(id))
  221. rows, total = utils.get_page_data(request, rows)
  222. data = []
  223. for row in rows:
  224. item = {
  225. 'id': row.id,
  226. 'notice_id': row.notice.id,
  227. 'files': unicode(row.file),
  228. 'files_name': str(row.file).split('/')[-1],
  229. 'files_url': row.file,
  230. }
  231. data.append(item)
  232. return DataGridJSONResponse(data, total)
  233. @token_required
  234. def notice_del_files(request):
  235. id = request.GET.get('id')
  236. try:
  237. with transaction.atomic():
  238. file = NoticeAttachment.objects.filter(id=int(id)).first()
  239. file.delete()
  240. try:
  241. os.remove("%s/%s" % (settings.MEDIA_ROOT, file.file))
  242. except:
  243. pass
  244. except CustomError, e:
  245. return JSONError(e.get_error_msg())
  246. except:
  247. traceback.print_exc()
  248. return JSONError(u"删除失败")
  249. return JSONResponse({})
  250. @csrf_exempt
  251. @permission_required('office.view_notice')
  252. def touch_notice_list(request):
  253. children = request.user.getSubDepartmentIds()
  254. children.append(request.user.department.id)
  255. rows = Notice.objects.filter(dendline__gte=timezone.now(), department__in=children)
  256. browsed_ids = NoticeBrowseRecord.objects.filter(browse_user_id=request.user).values_list('notice_id', flat=True)
  257. not_notices = rows.filter(~Q(id__in=browsed_ids))
  258. ids = []
  259. for notice in not_notices:
  260. ids.append(notice.id)
  261. rows, total = utils.get_page_data(request, rows)
  262. data = []
  263. for row in rows:
  264. item = {'title': row.title, 'id': row.id, 'create_time': Formater.formatStrTime(row.create_time), 'status_text': u'已读',
  265. 'status': 2}
  266. if row.id in ids:
  267. item['status_text'] = u'未读'
  268. item['status'] = 1
  269. data.append(item)
  270. return DataGridJSONResponse(data, total)