123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303 |
- # coding=utf-8
- import os
- import traceback
- import json
- from django.conf import settings
- from django.utils import timezone
- from django.db.models import ProtectedError
- from django.views.decorators.csrf import csrf_exempt
- from django.db import transaction, IntegrityError
- from django.db.models import Q
- from apps.office.filters import NoticeFilter
- from apps.office.models import Notice, NoticeReply, NoticeBrowseRecord, NoticeAttachment
- from apps.account.decorators import token_required, permission_required
- from apps.base import Formater
- from apps.foundation.models import BizLog
- from apps.office.serializers import NoticeSerializer, NoticeBrowseRecordSerializer, NoticeReplySerializer
- from libs.http import JSONResponse, JSONError, DataGridJSONResponse
- from libs import utils
- from apps.exceptions import CustomError
- @permission_required('office.view_notice')
- def notice_list(request):
- f = NoticeFilter(request.GET, queryset=Notice.objects.filter())
- rows, total = utils.get_page_data(request, f.qs)
- serializer = NoticeSerializer(rows, many=True)
- return DataGridJSONResponse(serializer.data, total)
- @csrf_exempt
- @permission_required('office.add_notice')
- def notice_save(request):
- id = request.GET.get('id')
- data = json.loads(request.body)
- try:
- with transaction.atomic():
- data['dendline'] += ' 00:00:00'
- serializer = NoticeSerializer.factory(request.user, data, id)
- serializer = serializer.validSave()
- if id:
- item_data = {'notice': serializer.id}
- replys = NoticeReply.getByNotice(id)
- reply_ids = replys.values_list('id')
- for reply_id in reply_ids:
- reply_serializer = NoticeReplySerializer.factory(request.user, item_data, reply_id[0])
- reply_serializer.validSave()
- browserecords = NoticeBrowseRecord.getByNotice(id)
- browserecord_ids = browserecords.values_list('id')
- for browserecord_id in browserecord_ids:
- browserecord_serializer = NoticeBrowseRecordSerializer.factory(request.user, item_data, browserecord_id[0])
- browserecord_serializer.validSave()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'保存失败!')
- return JSONResponse()
- @permission_required('office.delete_notice')
- def notice_delete(request):
- id = int(request.GET.get('id'))
- try:
- with transaction.atomic():
- notice = Notice.getById(id)
- BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除公告[%s],id=%d" % (notice.title, notice.id))
- notice.delete()
- browserecords = NoticeBrowseRecord.getByNotice(id)
- for browserecord in browserecords:
- BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除公告回复id=%d" % (browserecord.id))
- browserecord.delete()
- replys = NoticeReply.getByNotice(id)
- for reply in replys:
- BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除公告回复id=%d" % (reply.id))
- reply.delete()
- attachments = NoticeAttachment.getByNotice(id)
- for attachment in attachments:
- BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除公告回复id=%d" % (attachment.id))
- attachment.delete()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except ProtectedError:
- return JSONError(u'该公告已被使用,禁止删除!')
- except IntegrityError:
- return JSONError(u'该公告已被使用,禁止删除!')
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'删除失败!')
- return JSONResponse({})
- @token_required
- @permission_required('office.view_notice')
- def notice_detail(request):
- id = request.GET.get('id')
- if not id:
- return JSONResponse()
- instance = Notice.getById(id)
- try:
- with transaction.atomic():
- hits = instance.hits
- new_hits = int(hits) + 1
- instance.hits = new_hits
- instance.save()
- item_data = {'notice': instance.id}
- browserecord_serializer = NoticeBrowseRecordSerializer.factory(request.user, item_data)
- browserecord_serializer.validSave()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'查看失败!')
- if instance.priority == Notice.NORMAL:
- priority = u'普通'
- else:
- priority = u'紧急'
- main_data = {
- 'id': id,
- 'title': instance.title,
- 'priority': instance.priority,
- 'priority_text': priority,
- 'department_name': instance.department.name,
- 'hits': instance.hits,
- 'content': instance.content,
- 'create_user_text': instance.create_user.name,
- 'create_time': Formater.formatStrTime(instance.create_time),
- 'dendline': Formater.formatStrDate(instance.dendline)
- }
- data = {
- 'main_data': main_data,
- 'items_data': []
- }
- rows = NoticeReply.getByNotice(id)
- for row in rows:
- item_data = {
- 'id': row.id,
- 'content': row.content,
- 'create_user_text': row.create_user.name,
- 'create_time': Formater.formatStrTime(row.create_time)
- }
- data['items_data'].append(item_data)
- return JSONResponse(data)
- @token_required
- def notice_answer(request):
- id = request.GET.get('id')
- data = json.loads(request.body)
- try:
- with transaction.atomic():
- data['notice'] = id
- reply_serializer = NoticeReplySerializer.factory(request.user, data)
- reply_serializer.validSave()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'保存失败!')
- return JSONResponse()
- @token_required
- @permission_required('office.view_browserecord')
- def notice_browserecord(request):
- id = request.GET.get('id')
- if not id:
- return JSONResponse()
- instance = Notice.getById(id)
- if instance.priority == Notice.NORMAL:
- priority = u'普通'
- else:
- priority = u'紧急'
- main_data = {
- 'id': id,
- 'title': instance.title,
- 'priority': instance.priority,
- 'priority_text': priority,
- 'department_name': instance.department.name,
- 'hits': Formater.formatCountShow(instance.hits),
- 'content': instance.content,
- 'create_time': Formater.formatStrTime(instance.create_time),
- 'dendline': Formater.formatStrDate(instance.dendline)
- }
- data = {
- 'main_data': main_data,
- 'items_data': []
- }
- rows = NoticeBrowseRecord.getByNotice(id)
- for row in rows:
- item_data = {
- 'id': row.id,
- 'department': row.department.name,
- 'browse_user_name': row.browse_user.name,
- 'create_time': Formater.formatStrTime(row.create_time)
- }
- data['items_data'].append(item_data)
- return JSONResponse(data)
- @token_required
- def notice_upload_files(request):
- ids = request.POST.get('ids')
- files = request.FILES.getlist('file')
- try:
- with transaction.atomic():
- ids = str(ids).split(',')
- from models import path_and_rename
- for id in ids:
- notice = Notice.objects.filter(id=id).first()
- if not notice:
- raise CustomError(u'未找到公告')
- for file in files:
- filename = "%s%d-%s.%s" % (
- path_and_rename.path,
- notice.id,
- timezone.now().strftime('%Y%m%d%H%M%S%f'),
- file.name.split('.')[-1]
- )
- filename = filename.lower()
- full_filename = "%s/%s" % (settings.MEDIA_ROOT, filename)
- with open(full_filename, 'wb+') as destination:
- for chunk in file.chunks():
- destination.write(chunk)
- NoticeAttachment.objects.create(notice=notice, file=filename)
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception,e:
- traceback.print_exc()
- return JSONError(u'上传失败')
- return JSONResponse({})
- @token_required
- def notice_files(request):
- id = request.GET.get('id')
- rows = NoticeAttachment.objects.filter(notice_id=int(id))
- rows, total = utils.get_page_data(request, rows)
- data = []
- for row in rows:
- item = {
- 'id': row.id,
- 'notice_id': row.notice.id,
- 'files': unicode(row.file),
- 'files_name': str(row.file).split('/')[-1],
- 'files_url': row.file,
- }
- data.append(item)
- return DataGridJSONResponse(data, total)
- @token_required
- def notice_del_files(request):
- id = request.GET.get('id')
- try:
- with transaction.atomic():
- file = NoticeAttachment.objects.filter(id=int(id)).first()
- file.delete()
- try:
- os.remove("%s/%s" % (settings.MEDIA_ROOT, file.file))
- except:
- pass
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except:
- traceback.print_exc()
- return JSONError(u"删除失败")
- return JSONResponse({})
- @csrf_exempt
- @permission_required('office.view_notice')
- def touch_notice_list(request):
- children = request.user.getSubDepartmentIds()
- children.append(request.user.department.id)
- rows = Notice.objects.filter(dendline__gte=timezone.now(), department__in=children)
- browsed_ids = NoticeBrowseRecord.objects.filter(browse_user_id=request.user).values_list('notice_id', flat=True)
- not_notices = rows.filter(~Q(id__in=browsed_ids))
- ids = []
- for notice in not_notices:
- ids.append(notice.id)
- rows, total = utils.get_page_data(request, rows)
- data = []
- for row in rows:
- item = {'title': row.title, 'id': row.id, 'create_time': Formater.formatStrTime(row.create_time), 'status_text': u'已读',
- 'status': 2}
- if row.id in ids:
- item['status_text'] = u'未读'
- item['status'] = 1
- data.append(item)
- return DataGridJSONResponse(data, total)
|