views.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. #coding=utf-8
  2. import traceback
  3. import json
  4. from collections import OrderedDict
  5. from django.db import transaction,IntegrityError
  6. from django.db.models import F,ProtectedError
  7. from django.shortcuts import get_object_or_404
  8. from django.views.decorators.csrf import csrf_exempt
  9. from django.contrib.auth.models import Permission, Group
  10. from django.utils import timezone
  11. from libs import utils
  12. from libs.utils import dump_form_errors
  13. from libs.http import JSONError, JSONResponse,DataGridJSONResponse
  14. from apps.dashboard.forms import MyAuthenticationForm
  15. from decorators import token_required,permission_required
  16. from apps.exceptions import CustomError
  17. from apps.foundation.models import BizLog
  18. from models import User, Department,SubDepartment,SubEmployee
  19. from serializers import EmployeeSerializer, EmployeeSafeSerializer, GroupSerializer,GroupComboboxSerializer
  20. from django.db.models import Q
  21. from django.conf import settings
  22. from apps.goods.models import GoodsGodownEntry
  23. from apps.material.models import Deliver
  24. from apps.order.models import SaleOrder, GoodsDeliver
  25. from apps.plan.models import SalePlan, ProductionPlan
  26. from apps.purchase.models import PurchasePlan, PurchaseOrder, GodownEntry, GodownEntryReturn
  27. from apps.warehouse.models import Warehouse, Inventory
  28. from apps.office.models import Notice,NoticeBrowseRecord
  29. @csrf_exempt
  30. def login(request):
  31. form = MyAuthenticationForm(data=request.POST, request=request)
  32. if form.is_valid():
  33. user = form.get_user()
  34. if user.status == User.DIMISSION:
  35. BizLog.objects.addnew(user, BizLog.INSERT, u"离职账号[%s]登录,IP[%s]" % (
  36. user.username,
  37. request.META['REMOTE_ADDR']
  38. ))
  39. return JSONError(u'离职账号禁止登录')
  40. permissions = list(user.get_all_permissions())
  41. BizLog.objects.addnew(user, BizLog.INSERT, u"[%s]登录,IP[%s]" % (
  42. user.username,
  43. request.META['REMOTE_ADDR']
  44. ))
  45. return JSONResponse({
  46. 'user_id':user.id,
  47. 'access_token':form.access_token,
  48. 'name':user.name,
  49. 'permissions':permissions
  50. })
  51. else:
  52. BizLog.objects.addnew(None, BizLog.INSERT, u"[%s]登录失败,密码[%s],IP[%s]" % (
  53. request.POST['username'],
  54. request.POST['password'],
  55. request.META['REMOTE_ADDR']
  56. ))
  57. return JSONError(dump_form_errors(form))
  58. @permission_required('foundation.view_group')
  59. def group_list(request):
  60. rows = Group.objects.filter()
  61. rows, total = utils.get_page_data(request, rows)
  62. serializer = GroupSerializer(rows, many=True)
  63. return DataGridJSONResponse(serializer.data, total)
  64. @token_required
  65. def group_combobox_list(request):
  66. rows = Group.objects.filter()
  67. total = rows.count()
  68. #rows, total = utils.get_page_data(request, rows)
  69. serializer = GroupComboboxSerializer(rows, many=True)
  70. return DataGridJSONResponse(serializer.data, total)
  71. @csrf_exempt
  72. @permission_required('foundation.add_group')
  73. def group_save(request):
  74. id = request.GET.get('id')
  75. data = json.loads(request.body)
  76. try:
  77. with transaction.atomic():
  78. User.objects.save_group(id, data['name'], data['permissions'], request.user)
  79. except CustomError, e:
  80. return JSONError(e.get_error_msg())
  81. except Exception, e:
  82. traceback.print_exc()
  83. return JSONError(u'保存失败')
  84. return JSONResponse()
  85. @csrf_exempt
  86. @permission_required('foundation.delete_group')
  87. def group_delete(request):
  88. id = request.GET.get('id')
  89. try:
  90. with transaction.atomic():
  91. group = Group.objects.filter(pk=id).first()
  92. if not group:
  93. raise CustomError(u'未找到相应的权限组')
  94. BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除权限组[%s],id=%s" % (group.name, id))
  95. group.delete()
  96. except CustomError, e:
  97. return JSONError(e.get_error_msg())
  98. except ProtectedError:
  99. return JSONError(u'该权限组已分配给用户,禁止删除!')
  100. except IntegrityError:
  101. return JSONError(u'该权限组已分配给用户,禁止删除!')
  102. except:
  103. traceback.print_exc()
  104. return JSONError(u'删除失败')
  105. return JSONResponse()
  106. @token_required
  107. def permission_all(request):
  108. rows = Permission.objects.all().exclude(name__startswith='Can')
  109. rows = User.objects.sort_perms(rows)
  110. menus = OrderedDict()
  111. for row in rows:
  112. item = {'id': row.id, 'name': row.name}
  113. mn = User.objects.get_menuname_of_contenttype(row.content_type.app_label, row.content_type.model)
  114. if menus.has_key(mn):
  115. permissions = menus[mn]
  116. else:
  117. permissions = menus[mn] = OrderedDict()
  118. if permissions.has_key(row.content_type.name):
  119. if not item in permissions[row.content_type.name]:
  120. permissions[row.content_type.name].append(item)
  121. else:
  122. permissions[row.content_type.name] = [item, ]
  123. return JSONResponse(menus)
  124. @permission_required('account.view_user')
  125. def employee_list(request):
  126. username = request.GET.get('username')
  127. name = request.GET.get('name')
  128. rows = User.objects.filter()
  129. if username:
  130. rows = rows.filter(username__icontains=username)
  131. if name:
  132. rows = rows.filter(name__icontains=name)
  133. rows, total = utils.get_page_data(request, rows)
  134. serializer = EmployeeSafeSerializer(rows, many=True)
  135. return DataGridJSONResponse(serializer.data, total)
  136. @csrf_exempt
  137. @permission_required('account.add_user')
  138. def employee_save(request):
  139. id = request.GET.get('id')
  140. data = json.loads(request.body)
  141. try:
  142. with transaction.atomic():
  143. serializer = EmployeeSerializer.factory(request.user, data, id)
  144. if serializer.instance:
  145. user = serializer.instance
  146. if not data['password']:
  147. data['password'] = user.password
  148. else:
  149. user.set_password(data['password'])
  150. data['password'] = user.password
  151. serializer.validSave()
  152. except CustomError, e:
  153. return JSONError(e.get_error_msg())
  154. except Exception, e:
  155. traceback.print_exc()
  156. return JSONError(u'保存失败')
  157. return JSONResponse()
  158. @csrf_exempt
  159. @token_required
  160. def employee_tree(request):
  161. def child_employee_tree(department_id,children):
  162. rows = User.objects.filter(department_id=department_id)
  163. for row in rows:
  164. item = {
  165. 'id': row.id,
  166. 'value': 'employee_' + str(row.id),
  167. 'name': row.name
  168. }
  169. children.append(item)
  170. def child_department_tree(parent_id,children):
  171. rows = Department.objects.filter(parent_id=parent_id)
  172. for row in rows:
  173. item = {
  174. 'id': row.id,
  175. 'value': 'department_' + str(row.id),
  176. 'name': row.name,
  177. 'children': []
  178. }
  179. child_employee_tree(row.id,item['children'])
  180. child_department_tree(row.id,item['children'])
  181. children.append(item)
  182. result = []
  183. child_department_tree(None,result)
  184. return JSONResponse(result)
  185. @csrf_exempt
  186. @permission_required('account.add_user')
  187. def manager_save(request):
  188. id = request.GET.get('id')
  189. data = json.loads(request.body)
  190. try:
  191. with transaction.atomic():
  192. user = User.getById(id)
  193. user.removeSubs()
  194. for row in data['managers']:
  195. sub_arr = row.split('_')
  196. if sub_arr[0] == 'department':
  197. SubDepartment.objects.create(user=user,department_id=int(sub_arr[1]))
  198. elif sub_arr[0] == 'employee':
  199. SubEmployee.objects.create(user=user,employee_id=int(sub_arr[1]))
  200. BizLog.objects.addnew(request.user, BizLog.UPDATE, u"修改员工管理范围[%s],id=%s" % (user.name, user.id),data)
  201. return JSONResponse({})
  202. except CustomError, e:
  203. return JSONError(e.get_error_msg())
  204. except Exception,e:
  205. traceback.print_exc()
  206. return JSONError(u'保存失败')
  207. @csrf_exempt
  208. @permission_required('account.delete_user')
  209. def employee_delete(request):
  210. id = request.GET.get('id')
  211. try:
  212. with transaction.atomic():
  213. user = User.getById(id)
  214. BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除员工[%s],id=%d" % (user.name, user.id))
  215. user.removeSubs()
  216. user.delete()
  217. except CustomError, e:
  218. return JSONError(e.get_error_msg())
  219. except ProtectedError:
  220. return JSONError(u'该员工存在业务数据,禁止删除!')
  221. except IntegrityError:
  222. return JSONError(u'该员工存在业务数据,禁止删除!')
  223. except Exception, e:
  224. traceback.print_exc()
  225. return JSONError(u'删除失败!')
  226. return JSONResponse({})
  227. @token_required
  228. def employee_combobox_list(request):
  229. rows = User.objects.filter(status=User.INSERVICE)
  230. total = rows.count()
  231. #rows, total = utils.get_page_data(request, rows)
  232. serializer = EmployeeSafeSerializer(rows, many=True)
  233. return DataGridJSONResponse(serializer.data, total)
  234. @token_required
  235. def employee_list_mobile(request):
  236. id = request.GET.get('id')
  237. user = User.objects.filter(id=id).first()
  238. data = {
  239. 'name': user.name,
  240. 'tel': user.tel,
  241. 'department_name': user.department.name
  242. }
  243. return JSONResponse(data)
  244. @csrf_exempt
  245. @token_required
  246. def password_save(request):
  247. data = json.loads(request.body)
  248. try:
  249. data['new_password'] = data['new_password'].strip(u' ')
  250. data['confirm_password'] = data['confirm_password'].strip(u' ')
  251. data['old_password'] = data['old_password'].strip(u' ')
  252. if data['new_password'] != data['confirm_password']:
  253. raise CustomError(u'两次输入的密码不一致, 请检查')
  254. with transaction.atomic():
  255. if not request.user.check_password(data['old_password']):
  256. raise CustomError(u'原密码输入错误, 请检查')
  257. request.user.set_password(data['new_password'])
  258. request.user.save()
  259. except CustomError, e:
  260. return JSONError(e.get_error_msg())
  261. except Exception, e:
  262. traceback.print_exc()
  263. return JSONError(u'保存失败!')
  264. return JSONResponse()
  265. @permission_required('account.view_department')
  266. def department_list(request):
  267. result = []
  268. rows = Department.objects.filter()
  269. for row in rows:
  270. isCompany = False
  271. if row.id == row.company_id:
  272. isCompany = True
  273. item = {
  274. 'id': row.id,
  275. 'company': row.company_id,
  276. 'product_range': row.product_range,
  277. 'product_range_text': row.product_range and Department.PRODUCT_RANGE_CHOICES[row.product_range - 1][1] or '',
  278. 'name': row.name,
  279. 'notes': row.notes,
  280. 'isCompany': isCompany,
  281. 'parent_id': row.parent_id or 0,
  282. }
  283. result.append(item)
  284. return JSONResponse(result)
  285. @csrf_exempt
  286. @permission_required('account.add_department')
  287. def department_save(request):
  288. id = request.GET.get('id')
  289. parent_id = request.GET.get('parent_id')
  290. data = json.loads(request.body)
  291. try:
  292. with transaction.atomic():
  293. if id:
  294. department = Department.getById(id)
  295. department.name = data['name']
  296. department.notes = data['notes']
  297. department.save()
  298. BizLog.objects.addnew(request.user, BizLog.UPDATE, u"修改部门[%s],id=%d" % (data['name'], department.id))
  299. else:
  300. if parent_id:
  301. parent = Department.getById(parent_id)
  302. company_id = parent.company_id
  303. parent_id = parent.id
  304. else:
  305. parent = None
  306. parent_id = None
  307. company_id = None
  308. lft = Department.getLft(parent)
  309. Department.objects.filter(rgt__gt=lft).update(rgt=F('rgt') + 2)
  310. Department.objects.filter(lft__gt=lft).update(lft=F('lft') + 2)
  311. department = Department.objects.create(
  312. name=data['name'],
  313. notes=data['notes'],
  314. parent_id=parent_id,
  315. company_id=company_id,
  316. lft=lft+1,
  317. rgt=lft+2
  318. )
  319. if department.company_id == None:
  320. department.company_id = department.id
  321. department.save()
  322. BizLog.objects.addnew(request.user, BizLog.INSERT, u"添加部门[%s],id=%d" % (data['name'], department.id))
  323. if department.id == department.company_id and data['product_range']:
  324. department.product_range = int(data['product_range'])
  325. department.save()
  326. except CustomError, e:
  327. return JSONError(e.get_error_msg())
  328. except Exception, e:
  329. traceback.print_exc()
  330. return JSONError(u'保存失败!')
  331. return JSONResponse({})
  332. @csrf_exempt
  333. @permission_required('account.delete_department')
  334. def department_delete(request):
  335. id = request.GET.get('id')
  336. try:
  337. with transaction.atomic():
  338. if Department.objects.filter(parent_id=id).count() > 0:
  339. raise CustomError(u'该部门存在子部门, 不允许删除')
  340. dep = Department.getById(id)
  341. lft = dep.lft
  342. rgt = dep.rgt
  343. total = rgt - lft + 1
  344. BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除部门[%s],id=%d" % (dep.name, dep.id))
  345. dep.delete()
  346. Department.objects.filter(rgt__gt=lft).update(rgt=F('rgt')-total)
  347. Department.objects.filter(lft__gt=lft).update(lft=F('lft')-total)
  348. except CustomError, e:
  349. return JSONError(e.get_error_msg())
  350. except ProtectedError:
  351. return JSONError(u'该部门已被引用,禁止删除!')
  352. except IntegrityError:
  353. return JSONError(u'该部门已被引用,禁止删除!')
  354. except Exception, e:
  355. traceback.print_exc()
  356. return JSONError(u'删除失败!')
  357. return JSONResponse({})
  358. @csrf_exempt
  359. @token_required
  360. def department_tree(request):
  361. def child_department_tree(parent_id,children):
  362. rows = Department.objects.filter(parent_id=parent_id)
  363. for row in rows:
  364. item = {
  365. 'id': row.id,
  366. 'value': row.id,
  367. 'name': row.name,
  368. 'notes': row.notes,
  369. 'parent_id': row.parent_id,
  370. 'children': []
  371. }
  372. child_department_tree(row.id,item['children'])
  373. children.append(item)
  374. result = []
  375. child_department_tree(None,result)
  376. return JSONResponse(result)
  377. @csrf_exempt
  378. @token_required
  379. def select_department(request):
  380. result = []
  381. rows = Department.objects.filter()
  382. for row in rows:
  383. item = {
  384. 'id': row.id,
  385. 'name': row.name
  386. }
  387. result.append(item)
  388. return JSONResponse(result)
  389. @token_required
  390. def home_count(request):
  391. department_ids = request.user.getSubDepartmentIds()
  392. user_ids = request.user.getSubEmployeeIds()
  393. warehouses_ids = Warehouse.getManagerWarehouses(request.user)
  394. sale_plan_count = SalePlan.objects.filter(Q(create_user_id__in=user_ids) | Q(department_id__in=department_ids) | Q(create_user=request.user)).filter(status=settings.DEFAULT).count()
  395. sale_order_count = SaleOrder.objects.filter(Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user)).filter(status=settings.DEFAULT).count()
  396. production_count = ProductionPlan.objects.filter(Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user)).filter(status=settings.DEFAULT).count()
  397. purchase_count = PurchasePlan.objects.filter(Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user)).filter(status=settings.DEFAULT).count()
  398. purchase_order_count = PurchaseOrder.objects.filter(Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user)).filter(status=settings.DEFAULT).count()
  399. material_godownentry_count = GodownEntry.objects.filter(product_type=GodownEntry.MATERIAL,warehouse_id__in=warehouses_ids).filter(Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user)).filter(status=settings.DEFAULT).count()
  400. material_deliver_count = Deliver.objects.filter(product_type=GodownEntry.MATERIAL,warehouse_id__in=warehouses_ids).filter(Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user)).filter(status=settings.DEFAULT).count()
  401. material_godownentry_return_count = GodownEntryReturn.objects.filter(type=GodownEntryReturn.MATERIAL, warehouse_id__in=warehouses_ids).filter(Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user)).filter(status=settings.DEFAULT).count()
  402. material_inventory_count = Inventory.objects.filter(product_type=Inventory.MATERIAL,warehouse_id__in=warehouses_ids).filter(Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user)).filter(check_status=settings.DEFAULT).count()
  403. consumable_godownentry_count = GodownEntry.objects.filter(product_type=GodownEntry.CONSUMABLE,warehouse_id__in=warehouses_ids).filter(Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user)).filter(status=settings.DEFAULT).count()
  404. consumable_deliver_count = Deliver.objects.filter(product_type=GodownEntry.CONSUMABLE,warehouse_id__in=warehouses_ids).filter(Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user)).filter(status=settings.DEFAULT).count()
  405. consumable_godownentry_return_count = GodownEntryReturn.objects.filter(type=GodownEntryReturn.CONSUMABLE, warehouse_id__in=warehouses_ids).filter(Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user)).filter(status=settings.DEFAULT).count()
  406. consumable_inventory_count = Inventory.objects.filter(product_type=Inventory.CONSUMABLE,warehouse_id__in=warehouses_ids).filter(Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user)).filter(check_status=settings.DEFAULT).count()
  407. goods_godownentry_count = GoodsGodownEntry.objects.filter(warehouse_id__in=warehouses_ids).filter(Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user)).filter(status=settings.DEFAULT).count()
  408. goods_deliver_count = GoodsDeliver.objects.filter(warehouse_id__in=warehouses_ids).filter(Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user)).filter(status=settings.DEFAULT).count()
  409. goods_inventory_count = Inventory.objects.filter(product_type=Inventory.GOODS,warehouse_id__in=warehouses_ids).filter(Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user)).filter(check_status=settings.DEFAULT).count()
  410. children = request.user.getSubDepartmentIds()
  411. children.append(request.user.department.id)
  412. rows = Notice.objects.filter(dendline__gte=timezone.now(), department__in=children)
  413. browsed_ids = NoticeBrowseRecord.objects.filter(browse_user_id=request.user).values_list('notice_id', flat=True)
  414. not_notices = rows.filter(~Q(id__in=browsed_ids))
  415. data = {
  416. 'notice_unread': not_notices.count(),
  417. 'sale_plan_count': sale_plan_count,
  418. 'sale_order_count': sale_order_count,
  419. 'production_count': production_count,
  420. 'purchase_count': purchase_count,
  421. 'purchase_order_count': purchase_order_count,
  422. 'material_godownentry_count': material_godownentry_count,
  423. 'material_deliver_count': material_deliver_count,
  424. 'material_godownentry_return_count': material_godownentry_return_count,
  425. 'material_inventory_count': material_inventory_count,
  426. 'consumable_godownentry_count': consumable_godownentry_count,
  427. 'consumable_deliver_count': consumable_deliver_count,
  428. 'consumable_godownentry_return_count': consumable_godownentry_return_count,
  429. 'consumable_inventory_count': consumable_inventory_count,
  430. 'goods_godownentry_count': goods_godownentry_count,
  431. 'goods_deliver_count': goods_deliver_count,
  432. 'goods_inventory_count': goods_inventory_count,
  433. }
  434. return JSONResponse(data)