Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2018
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 102.47 KB | None | 0 0
  1. import html
  2. import json
  3. import operator
  4. import re
  5. from functools import reduce
  6.  
  7. import elasticsearch
  8. from django.db.models.functions import TruncMonth
  9. from django.db.models import Count
  10. from django.utils.dateparse import parse_date
  11. from django.core.files.base import ContentFile
  12. from django.core.files.storage import default_storage
  13. from django.db import transaction
  14. from datetime import datetime
  15. from django.db.models import Q
  16. from django.forms.models import model_to_dict
  17. from apps.workflow.bpmn.eForm import EForm as EFormPy
  18. from django.db.models.expressions import F
  19. from django.http import HttpResponseRedirect
  20. from django.views.generic import DetailView
  21. from rest_framework import mixins
  22.  
  23. from rest_framework import serializers, viewsets
  24. from rest_framework import status
  25. from rest_framework.decorators import api_view
  26. from rest_framework.response import Response
  27. from rest_framework.viewsets import GenericViewSet
  28.  
  29. from apps.core.admin.views import AdminView
  30. from apps.core.api.Pagination import LargeResultsSetPagination
  31. from apps.core.api.permission import GreenOfficeApiBasePermission
  32. from apps.core.api.viewset import CustomViewSetForQuerySet
  33. from apps.core.api.validators import UniqueNameValidator
  34. from apps.workflow.bpmn.elasticsearch import IndexApplication, ApplicationSearch
  35. from apps.workflow.bpmn.engine import BPMNRoute, BPMNEngine
  36.  
  37. from apps.workflow.bpmn.models import *
  38.  
  39.  
  40. class CategorySerializer(serializers.ModelSerializer):
  41. class Meta:
  42. model = Category
  43. fields = '__all__'
  44.  
  45.  
  46. class CategoryViewSet(CustomViewSetForQuerySet):
  47. permission_classes = [GreenOfficeApiBasePermission]
  48. serializer_class = CategorySerializer
  49. pagination_class = LargeResultsSetPagination
  50. queryset = Category.objects.all()
  51. model = Category
  52. permission_id = [8, ]
  53.  
  54.  
  55. class ProjectSerializer(serializers.ModelSerializer):
  56. assigned_user = serializers.PrimaryKeyRelatedField(read_only=True,
  57. default=serializers.CurrentUserDefault())
  58. category_name = serializers.ReadOnlyField(source='category.name')
  59. assigned_user_name = serializers.ReadOnlyField(source='assigned_user.get_full_name')
  60. title = serializers.CharField(validators=[
  61. UniqueNameValidator(
  62. queryset=Project.objects.all(),
  63. message='Project with this name already exists.',
  64. lookup='iexact'
  65. )
  66. ])
  67.  
  68. class Meta:
  69. model = Project
  70. fields = '__all__'
  71.  
  72.  
  73. class ProjectViewSet(CustomViewSetForQuerySet):
  74. permission_classes = [GreenOfficeApiBasePermission]
  75. serializer_class = ProjectSerializer
  76. pagination_class = LargeResultsSetPagination
  77. model = Project
  78. change_keys = {
  79. 'category_name': 'category__name',
  80. 'assigned_user_name': 'assigned_user',
  81. }
  82. search_keywords = ['title', 'assigned_user__username', 'category__name']
  83. permission_id = [2, ]
  84.  
  85.  
  86. class TaskSerializer(serializers.ModelSerializer):
  87. project_name = serializers.ReadOnlyField(source='project.title')
  88. category_name = serializers.ReadOnlyField(source='project.category.name')
  89. description = serializers.ReadOnlyField(source='project.description')
  90.  
  91. class Meta:
  92. model = Task
  93. fields = '__all__'
  94.  
  95.  
  96. class TaskViewSet(CustomViewSetForQuerySet):
  97. permission_classes = [GreenOfficeApiBasePermission]
  98. serializer_class = TaskSerializer
  99. pagination_class = LargeResultsSetPagination
  100. queryset = Task.objects.filter(project__published=True)
  101. model = Task
  102. search_keywords = ['project__title', 'project__category__name', 'project__description', 'name']
  103. change_keys = {
  104. 'project': 'project__title',
  105. 'project_name': 'project__title',
  106. 'category_name': 'project__category__name',
  107. 'description': 'project__description'
  108. }
  109. permission_id = [3, 4, ]
  110.  
  111. def retrieve(self, request, *args, **kwargs):
  112. try:
  113. instance = Task.objects.distinct().get(Q(user=request.user) | Q(group__user=request.user),
  114. pk=kwargs.get('pk'))
  115. except Task.DoesNotExist:
  116. try:
  117. instance = Task.objects.distinct().get(pk=kwargs.get('pk'),
  118. task_delegations__status=1,
  119. task_delegations__user=self.request.user)
  120. except Task.DoesNotExist:
  121. raise serializers.ValidationError({'detail': 'You do not have permission to perform this action.'})
  122.  
  123. position = 1 if request.query_params.get('position') is None else request.query_params.get('position')
  124. start_app = request.query_params.get('startapp')
  125. application = request.query_params.get('application')
  126. out_open = request.query_params.get('out_open')
  127. print("outttttttt", out_open)
  128.  
  129. if not instance.start and application is None:
  130. raise serializers.ValidationError({'detail': 'You must provide the application id.'})
  131.  
  132. instance = BPMNEngine(request=request, instance=instance, position=position, start_app=start_app, application=application, out_open=out_open).take_decision()
  133. return Response(instance)
  134.  
  135. def list(self, request, *args, **kwargs):
  136. if self.model is None:
  137. raise AssertionError('CustomViewSetForQuerySet need to include a model')
  138.  
  139. queryset = self.model.objects.filter()
  140. search = self.request.query_params.get('search[value]', None)
  141. column_id = self.request.query_params.get('order[0][column]', None)
  142. init = self.request.query_params.get('init')
  143.  
  144. if init is not None and init == 'true':
  145. queryset = queryset.filter(start=True, project__published=True)
  146.  
  147. # search
  148. if search and search is not None and self.search_keywords is not None:
  149. search_logic = []
  150.  
  151. for entity in self.search_keywords:
  152. search_logic.append(Q(**{entity + '__icontains': search}))
  153.  
  154. queryset = queryset.filter(reduce(operator.or_, search_logic))
  155.  
  156. # ascending or descending order
  157. if column_id and column_id is not None:
  158. column_name = self.request.query_params.get('columns[' + column_id + '][data]', None)
  159.  
  160. if self.change_keys is not None:
  161. for key in self.change_keys:
  162. if column_name == key:
  163. column_name = self.change_keys.get(key)
  164.  
  165. if column_name != '':
  166. order_dir = '-' if self.request.query_params.get('order[0][dir]') == 'desc' else ''
  167. queryset = queryset.order_by(order_dir + column_name)
  168.  
  169. queryset = queryset.filter(Q(user=request.user) | Q(group__user=request.user)).distinct()
  170. page = self.paginate_queryset(queryset)
  171. if page is not None:
  172. serializer = self.get_serializer(page, many=True)
  173. return self.get_paginated_response(serializer.data)
  174.  
  175. serializer = self.get_serializer(queryset, many=True)
  176. return Response(serializer.data)
  177.  
  178.  
  179. # class CheckTaskSerializer(serializers.ModelSerializer):
  180. # class Meta:
  181. # model = Task
  182. # fields = '__all__'
  183. #
  184. #
  185. # class CheckTaskViewSet(CustomViewSetForQuerySet):
  186. # permission_classes = [GreenOfficeApiBasePermission]
  187. # serializer_class = CheckTaskSerializer
  188. # pagination_class = LargeResultsSetPagination
  189. # permission_id = [3, 4, ]
  190. # queryset = Task.objects.all()
  191. # model = Task
  192. # # http_method_names = ['get']
  193. #
  194. # def create(self, request, *args, **kwargs):
  195. # # task_id = self.request.data.get('task')
  196. # # next_pos = self.request.data.get('next_pos')
  197. # # application = self.request.data.get('application')
  198. # # task = Task.objects.get(pk=task_id)
  199. # # condition = BPMNEngine(request=request, instance=task, position=next_pos,
  200. # # application=application).type_switcher(do_delegation=False)
  201. # # print("condition", condition)
  202. # # next_task_type = Route.objects.get(source=task_id).target.type
  203. #
  204. #
  205. # # if next_task_type == 'bpmn:EndEvent':
  206. # # return Response('end')
  207. # # elif next_task_type == 'bpmn:ExclusiveGateway':
  208. # # task = Task.objects.get(pk=task_id)
  209. # # condition = BPMNEngine(request=request, instance=task, position=next_pos, application=application)\
  210. # # .check_condition()
  211. # # print("condition", condition)
  212. # return Response(1)
  213.  
  214.  
  215. class RouteSerializer(serializers.ModelSerializer):
  216. class Meta:
  217. model = Route
  218. fields = '__all__'
  219.  
  220.  
  221. class RouteViewSet(CustomViewSetForQuerySet, mixins.CreateModelMixin, GenericViewSet):
  222. permission_classes = [GreenOfficeApiBasePermission]
  223. serializer_class = RouteSerializer
  224. queryset = Route.objects.all()
  225. permission_id = [2, ]
  226. model = Route
  227. http_method_names = ['post']
  228.  
  229. def create(self, request, *args, **kwargs):
  230.  
  231. # get project id
  232. try:
  233. project = request.data.get('project')
  234.  
  235. if project is not None:
  236. project = Project.objects.get(pk=project)
  237. else:
  238. raise serializers.ValidationError({'detail': 'No Project specified'})
  239.  
  240. except KeyError:
  241. raise serializers.ValidationError({'detail': 'No Project specified'})
  242.  
  243. # get process list
  244. try:
  245. process = json.loads(request.data.get('process'))
  246.  
  247. if process is None:
  248. raise serializers.ValidationError({'detail': 'No process specified'})
  249. except KeyError:
  250. raise serializers.ValidationError({'detail': 'No process specified'})
  251. # with transaction.atomic():
  252. # Process Validation
  253. if len(process) > 0:
  254. for p in process:
  255. flows = p.get('flow')
  256. process_id = p.get('process')
  257. start_event_count = 0
  258.  
  259. if len(flows) > 0:
  260. for f in flows:
  261. # check if there is multiple start
  262. if f.get('type') == 'bpmn:StartEvent':
  263. start_event_count += 1
  264.  
  265. if start_event_count > 1:
  266. raise serializers.ValidationError({'detail': 'Process: {0} can not contain multiple '
  267. 'bpmn:StartEvent'.format(process_id)})
  268.  
  269. if f.get('target') is not None and len(f.get('target')) > 1:
  270. raise serializers.ValidationError({'detail': 'bpmn:StartEvent can not contain multiple '
  271. 'Task in {0}.'.format(process_id)})
  272.  
  273. # check it there is multiple task for this any task
  274. if f.get('type') == 'bpmn:Task':
  275. if f.get('target') is not None and len(f.get('target')) > 1:
  276. raise serializers.ValidationError({'detail': 'Task should not have multiple node.'})
  277.  
  278. # Create task
  279. if len(process) > 0:
  280. for p in process:
  281. flows = p.get('flow')
  282. process_id = p.get('process')
  283.  
  284. if len(flows) > 0:
  285. for f in flows:
  286. source = f.get('source')
  287. target = f.get('target')
  288. task_element = [source, target]
  289.  
  290. params = {
  291. 'element_id': f.get('id'),
  292. 'name': f.get('name', None),
  293. 'process': process_id,
  294. 'project': project,
  295. 'type': f.get('type')
  296. }
  297.  
  298. BPMNRoute.create_or_update_task(params)
  299.  
  300. for element in task_element:
  301. if element is not None and element != '':
  302. for e in element:
  303. params = {
  304. 'element_id': e.get('id'),
  305. 'name': e.get('name', None),
  306. 'process': process_id,
  307. 'project': project,
  308. 'type': e.get('type')
  309. }
  310.  
  311. BPMNRoute.create_or_update_task(params)
  312.  
  313. # Make task as initiator
  314. if len(process) > 0:
  315. for p in process:
  316. flows = p.get('flow')
  317. process_id = p.get('process')
  318.  
  319. if len(flows) > 0:
  320. for f in flows:
  321. if f.get('type') == 'bpmn:StartEvent' and f.get('target') is not None:
  322. for t in f.get('target'):
  323. previous_initiator = Task.objects.filter(process=process_id, project=project.id,
  324. start=True)
  325.  
  326. if previous_initiator:
  327. for p_i in previous_initiator:
  328. p_i.start = False
  329. p_i.save()
  330.  
  331. try:
  332. task = Task.objects.get(element_id=t.get('id'), project=project.id,
  333. process=process_id)
  334. task.start = True
  335. task.save()
  336. except Task.DoesNotExist:
  337. pass
  338.  
  339. # Create route
  340. if len(process) > 0:
  341. for p in process:
  342. flows = p.get('flow')
  343. process_id = p.get('process')
  344.  
  345. if len(flows) > 0:
  346. for f in flows:
  347. target = f.get('target')
  348. route_element = [target]
  349.  
  350. for r_el in route_element:
  351. if r_el is not None:
  352. for el in r_el:
  353. params = {
  354. 'source': Task.objects.get(element_id=f.get('id'), project=project.id,
  355. process=process_id),
  356. 'target': Task.objects.get(element_id=el.get('id'), project=project.id,
  357. process=process_id),
  358. 'project': project,
  359. 'process': process_id,
  360. 'type': f.get('type')
  361. }
  362.  
  363. try:
  364. Route.objects.get(**params)
  365. except Route.DoesNotExist:
  366. Route.objects.create(**params)
  367.  
  368. # Clean up Task and Route
  369. if len(process) > 0:
  370. for p in process:
  371. flows = p.get('flow')
  372. process_id = p.get('process')
  373. task_list_in_project = Task.objects.filter(project=project.id, process=process_id)
  374. route_list_in_project = Route.objects.filter(project=project.id, process=process_id)
  375.  
  376. if len(flows) > 0:
  377. for f in flows:
  378. source = f.get('source')
  379. target = f.get('target')
  380. gather_element = [source, target]
  381. task_list_in_project = task_list_in_project.exclude(element_id=f.get('id'))
  382.  
  383. for g_el in gather_element:
  384. if g_el is not None:
  385. for el in g_el:
  386. task_list_in_project = task_list_in_project.exclude(element_id=el.get('id'))
  387.  
  388. try:
  389. source_id = Task.objects.get(project=project.id, process=process_id,
  390. element_id=f.get('id'))
  391. for t_el in target:
  392. target_id = Task.objects.get(project=project.id, process=process_id,
  393. element_id=t_el.get('id'))
  394.  
  395. route_list_in_project = route_list_in_project.exclude(source=source_id,
  396. target=target_id)
  397.  
  398. except (Task.DoesNotExist, IndexError, TypeError):
  399. pass
  400.  
  401. task_list_in_project.delete()
  402. route_list_in_project.delete()
  403.  
  404. # Clean up garbage process
  405. if len(process) > 0:
  406. process_list_in_project = Task.objects.filter(project=project.id)
  407.  
  408. for p in process:
  409. process_id = p.get('process')
  410. process_list_in_project = process_list_in_project.exclude(process=process_id)
  411.  
  412. process_list_in_project.delete()
  413.  
  414. # raise
  415. # self.perform_create(serializer)
  416. # headers = self.get_success_headers(serializer.data)
  417. # return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
  418. return Response('okay')
  419.  
  420.  
  421. class ConditionSerializer(serializers.ModelSerializer):
  422. target_name = serializers.ReadOnlyField(source='target.name', read_only=True)
  423.  
  424. class Meta:
  425. model = Route
  426. fields = ['id', 'target_id', 'target_name', 'condition']
  427. read_only_fields = ['id', 'project', 'process', 'name', 'type', 'email', 'source', 'target']
  428.  
  429.  
  430. class ConditionViewSet(CustomViewSetForQuerySet):
  431. permission_classes = [GreenOfficeApiBasePermission]
  432. serializer_class = ConditionSerializer
  433. permission_id = [2, ]
  434. model = Route
  435.  
  436. def create(self, request, *args, **kwargs):
  437. return Response('There is nothing to create here.')
  438.  
  439. def retrieve(self, request, *args, **kwargs):
  440. return Response('There is nothing to retrieve here.')
  441.  
  442. def destroy(self, request, *args, **kwargs):
  443. return Response('There is nothing to destroy here.')
  444.  
  445. def list(self, request, *args, **kwargs):
  446. project = request.query_params.get('project')
  447. if not project:
  448. raise serializers.ValidationError({'detail': 'Please send project id with "project" parameter.'})
  449. process = request.query_params.get('process')
  450. if not process:
  451. raise serializers.ValidationError({'detail': 'Please send process id with "process" parameter.'})
  452. gateway = request.query_params.get('gateway')
  453. if not gateway:
  454. raise serializers.ValidationError({'detail': 'Please send gateway id with "gateway" parameter.'})
  455.  
  456. try:
  457. element = Task.objects.get(project=project, process=process, element_id=gateway,
  458. type='bpmn:ExclusiveGateway')
  459. serializer = self.get_serializer(Route.objects.filter(source=element), many=True)
  460. return Response(serializer.data)
  461. except Task.DoesNotExist:
  462. raise serializers.ValidationError({'detail': 'No gateway found using this id: {}.'.format(gateway)})
  463.  
  464.  
  465. class TaskOpSerializer(serializers.ModelSerializer):
  466. available_users = serializers.SerializerMethodField(read_only=True)
  467. available_groups = serializers.SerializerMethodField(read_only=True)
  468. assigned_users = serializers.SerializerMethodField(read_only=True)
  469. assigned_groups = serializers.SerializerMethodField(read_only=True)
  470. all_users = serializers.SerializerMethodField(read_only=True)
  471.  
  472. @staticmethod
  473. def get_available_users(obj):
  474. return User.objects.exclude(id__in=[u.id for u in obj.user.all()]).filter(
  475. ~Q(status=0) & ~Q(status=2) & ~Q(status=3)).values('id', 'first_name', 'last_name', 'username')
  476.  
  477. @staticmethod
  478. def get_available_groups(obj):
  479. return Group.objects.exclude(id__in=[u.id for u in obj.group.all()]).values('id', 'name')
  480.  
  481. @staticmethod
  482. def get_assigned_users(obj):
  483. return obj.user.values('id', 'first_name', 'last_name', 'username')
  484.  
  485. @staticmethod
  486. def get_assigned_groups(obj):
  487. return obj.group.values('id', 'name')
  488.  
  489. @staticmethod
  490. def get_all_users(obj):
  491. users = []
  492.  
  493. for u in TaskOpSerializer.get_assigned_users(obj):
  494. users.append(u)
  495.  
  496. for g in obj.group.prefetch_related('user'):
  497. for u in g.user.values('id', 'first_name', 'last_name', 'username'):
  498. users.append(u)
  499.  
  500. return list({v['id']: v for v in users}.values())
  501.  
  502. class Meta:
  503. fields = ['id', 'available_users', 'available_groups', 'assigned_users', 'assigned_groups', 'user', 'group',
  504. 'rules_applied', 'assignment_type', 'project', 'all_users', 'duration']
  505. read_only_fields = ['id', 'project', 'process', 'element_id', 'type', 'start', 'rules_applied', 'all_users']
  506. extra_kwargs = {
  507. 'user': {'write_only': True},
  508. 'group': {'write_only': True},
  509. }
  510. model = Task
  511.  
  512.  
  513. class TaskOpViewSet(CustomViewSetForQuerySet):
  514. permission_classes = [GreenOfficeApiBasePermission]
  515. serializer_class = TaskOpSerializer
  516. permission_id = [2, ]
  517. model = Task
  518.  
  519. def create(self, request, *args, **kwargs):
  520. return Response('There is nothing to create here.')
  521.  
  522. def destroy(self, request, *args, **kwargs):
  523. return Response('There is nothing to destroy here.')
  524.  
  525. def list(self, request, *args, **kwargs):
  526. project = request.query_params.get('project')
  527. if not project:
  528. raise serializers.ValidationError({'detail': 'Please send project id with "project" parameter.'})
  529.  
  530. process = request.query_params.get('process')
  531. if not process:
  532. raise serializers.ValidationError({'detail': 'Please send process id with "process" parameter.'})
  533.  
  534. task = request.query_params.get('task')
  535. if not task:
  536. raise serializers.ValidationError({'detail': 'Please send task html element id with "task" parameter.'})
  537.  
  538. try:
  539. element = Task.objects.get(project=project, process=process, element_id=task, type='bpmn:Task')
  540. serializer = self.get_serializer(element, many=False)
  541. return Response(serializer.data)
  542. except Task.DoesNotExist:
  543. raise serializers.ValidationError({'detail': 'No task found using this id: {}.'.format(task)})
  544.  
  545. def update(self, request, *args, **kwargs):
  546. partial = kwargs.pop('partial', False)
  547. instance = self.get_object()
  548.  
  549. if request.data.get('user') is not None:
  550. if len(request.data.get('user')) == 0:
  551. TaskRule.objects.filter(task=instance).delete()
  552. else:
  553. TaskRule.objects.exclude(user__id__in=request.data.get('user')).filter(task=instance).delete()
  554.  
  555. serializer = self.get_serializer(instance, data=request.data, partial=partial)
  556. serializer.is_valid(raise_exception=True)
  557. self.perform_update(serializer)
  558.  
  559. if getattr(instance, '_prefetched_objects_cache', None):
  560. instance = self.get_object()
  561. serializer = self.get_serializer(instance)
  562.  
  563. return Response(serializer.data)
  564.  
  565.  
  566. class SupervisorSerializer(serializers.ModelSerializer):
  567. available_users = serializers.SerializerMethodField(read_only=True)
  568. assigned_users = serializers.SerializerMethodField(read_only=True)
  569.  
  570. @staticmethod
  571. def get_available_users(obj):
  572. return User.objects.exclude(id__in=[u.id for u in obj.supervisors.all()]).filter(
  573. ~Q(status=0) & ~Q(status=2) & ~Q(status=3)).values('id', 'first_name', 'last_name', 'username')
  574.  
  575. @staticmethod
  576. def get_assigned_users(obj):
  577. return obj.supervisors.values('id', 'first_name', 'last_name', 'username')
  578.  
  579. class Meta:
  580. fields = ['id', 'available_users', 'assigned_users', 'supervisors']
  581. read_only_fields = ['id']
  582. extra_kwargs = {
  583. 'supervisors': {'write_only': True},
  584. }
  585. model = Project
  586.  
  587.  
  588. class SupervisorViewSet(CustomViewSetForQuerySet):
  589. permission_classes = [GreenOfficeApiBasePermission]
  590. serializer_class = SupervisorSerializer
  591. permission_id = [2, ]
  592. model = Project
  593.  
  594. def create(self, request, *args, **kwargs):
  595. return Response('There is nothing to create here.')
  596.  
  597. def destroy(self, request, *args, **kwargs):
  598. return Response('There is nothing to destroy here.')
  599.  
  600. @staticmethod
  601. def bool_return(variable):
  602. if variable is None or variable is False:
  603. return False
  604.  
  605. if variable:
  606. return True
  607.  
  608.  
  609. class TaskRuleSerializer(serializers.ModelSerializer):
  610. available_users = serializers.SerializerMethodField(read_only=True)
  611.  
  612. @staticmethod
  613. def get_available_users(obj):
  614. return obj.task.user.values('id', 'username', 'first_name', 'last_name')
  615.  
  616. class Meta:
  617. fields = '__all__'
  618. read_only_fields = ['id']
  619. model = TaskRule
  620.  
  621.  
  622. class TaskRuleViewSet(CustomViewSetForQuerySet):
  623. permission_classes = [GreenOfficeApiBasePermission]
  624. serializer_class = TaskRuleSerializer
  625. permission_id = [2, ]
  626. model = TaskRule
  627.  
  628. def list(self, request, *args, **kwargs):
  629. project = request.query_params.get('project')
  630. if not project:
  631. raise serializers.ValidationError({'detail': 'Please send project id with "project" parameter.'})
  632. process = request.query_params.get('process')
  633. if not process:
  634. raise serializers.ValidationError({'detail': 'Please send process id with "process" parameter.'})
  635. task = request.query_params.get('task')
  636. if not task:
  637. raise serializers.ValidationError({'detail': 'Please send gateway id with "task" parameter.'})
  638.  
  639. try:
  640. element = Task.objects.get(project=project, process=process, element_id=task, type='bpmn:Task')
  641. element = TaskRule.objects.filter(task=element)
  642. serializer = self.get_serializer(element, many=True)
  643. return Response(serializer.data)
  644. except Task.DoesNotExist:
  645. raise serializers.ValidationError({'detail': 'No task found using this id: {}.'.format(task)})
  646.  
  647. def create(self, request, *args, **kwargs):
  648. serializer = self.get_serializer(data=request.data)
  649. serializer.is_valid(raise_exception=True)
  650. task = Task.objects.get(pk=request.data.get('task'))
  651.  
  652. if not task.user.filter(pk=request.data.get('user')).count():
  653. raise serializers.ValidationError({'detail': 'User with pk {} not found in this '
  654. 'task'.format(request.data.get('user'))})
  655.  
  656. self.perform_create(serializer)
  657. task.cyclic_assignment = True
  658. task.manual_assignment = False
  659. task.rules_applied = True
  660. task.save()
  661. headers = self.get_success_headers(serializer.data)
  662. return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
  663.  
  664. def update(self, request, *args, **kwargs):
  665. partial = kwargs.pop('partial', False)
  666. instance = self.get_object()
  667. serializer = self.get_serializer(instance, data=request.data, partial=partial)
  668. serializer.is_valid(raise_exception=True)
  669.  
  670. if request.data.get('user'):
  671. if not instance.task.user.filter(pk=request.data.get('user')).count():
  672. raise serializers.ValidationError({'detail': 'User with pk {} not found in this '
  673. 'task'.format(request.data.get('user'))})
  674.  
  675. self.perform_update(serializer)
  676.  
  677. if getattr(instance, '_prefetched_objects_cache', None):
  678. # If 'prefetch_related' has been applied to a queryset, we need to
  679. # refresh the instance from the database.
  680. instance = self.get_object()
  681. serializer = self.get_serializer(instance)
  682.  
  683. return Response(serializer.data)
  684.  
  685. def destroy(self, request, *args, **kwargs):
  686. instance = self.get_object()
  687. task = instance.task
  688. self.perform_destroy(instance)
  689.  
  690. if not task.task_based_rules.count():
  691. task.rules_applied = False
  692. task.cyclic_assignment = True
  693. task.save()
  694.  
  695. return Response(status=status.HTTP_204_NO_CONTENT)
  696.  
  697.  
  698. class EFormSerializer(serializers.ModelSerializer):
  699. def validate(self, data):
  700. if data['title'] is not None and data['title'] != '':
  701. data['title'] = " ".join(data['title'].split())
  702. queryset = EForm.objects.filter(title__iexact=data['title'], project=data['project'].id).values('id')
  703.  
  704. if self.instance is not None:
  705. queryset = queryset.exclude(pk=self.instance.pk)
  706.  
  707. if len(queryset) > 0:
  708. raise serializers.ValidationError({'detail': 'Eform with this name already exists'})
  709.  
  710. return data
  711.  
  712. class Meta:
  713. model = EForm
  714. fields = '__all__'
  715.  
  716.  
  717. class EFormViewSet(CustomViewSetForQuerySet):
  718. permission_classes = [GreenOfficeApiBasePermission]
  719. serializer_class = EFormSerializer
  720. pagination_class = LargeResultsSetPagination
  721. model = EForm
  722. search_keywords = ['label', 'project__title']
  723. permission_id = [2, ]
  724. queryset = EForm.objects.all()
  725.  
  726. def list(self, request, *args, **kwargs):
  727. project = self.request.query_params.get('project')
  728.  
  729. if project is None:
  730. raise serializers.ValidationError({'detail': 'Please set project parameter'})
  731.  
  732. queryset = self.filter_queryset(self.get_queryset()).filter(project=project)
  733.  
  734. page = self.paginate_queryset(queryset)
  735. if page is not None:
  736. serializer = self.get_serializer(page, many=True)
  737. return self.get_paginated_response(serializer.data)
  738.  
  739. serializer = self.get_serializer(queryset, many=True)
  740. return Response(serializer.data)
  741.  
  742.  
  743. class VariableSerializer(serializers.ModelSerializer):
  744. def validate(self, data):
  745. if data['name'] is not None and data['name'] != '':
  746.  
  747. data['name'] = " ".join(data['name'].split())
  748. queryset = Variable.objects.filter(name__exact=data['name'], project=data['project'].id).values('id')
  749.  
  750. if self.instance is not None:
  751. queryset = queryset.exclude(pk=self.instance.pk)
  752.  
  753. if len(queryset) > 0:
  754. raise serializers.ValidationError({'detail': 'Variable with this name already exists'})
  755.  
  756. return data
  757.  
  758. class Meta:
  759. model = Variable
  760. fields = '__all__'
  761.  
  762.  
  763. class VariableViewSet(CustomViewSetForQuerySet):
  764. permission_classes = [GreenOfficeApiBasePermission]
  765. pagination_class = LargeResultsSetPagination
  766. serializer_class = VariableSerializer
  767. model = Variable
  768. permission_id = [2, ]
  769.  
  770. def get_queryset(self):
  771. queryset = self.model.objects.all()
  772. project = self.request.query_params.get('project', None)
  773.  
  774. if project is not None:
  775. queryset = Variable.objects.filter(project=project)
  776.  
  777. return queryset
  778.  
  779.  
  780. class TemplateSerializer(serializers.ModelSerializer):
  781. class Meta:
  782. fields = '__all__'
  783. read_only_fields = ['location']
  784. model = Template
  785.  
  786.  
  787. class TemplateViewSet(CustomViewSetForQuerySet):
  788. permission_classes = [GreenOfficeApiBasePermission]
  789. pagination_class = LargeResultsSetPagination
  790. serializer_class = TemplateSerializer
  791. model = Template
  792. permission_id = [2, ]
  793.  
  794. def create(self, request, *args, **kwargs):
  795. content = request.data.get('content')
  796. if content is None:
  797. raise serializers.ValidationError(
  798. {'detail': 'You have to set content parameter and content should be html string.'})
  799.  
  800. serializer = self.get_serializer(data=request.data)
  801. serializer.is_valid(raise_exception=True)
  802. path = default_storage.save('templates/{}.html'.format(request.data.get('file_name')), ContentFile(content))
  803. template_dict = serializer.data
  804. template_dict.update({'location': path, 'project': Project.objects.get(pk=request.data.get('project'))})
  805.  
  806. try:
  807. template_dict.pop('content')
  808. except KeyError:
  809. pass
  810.  
  811. template = Template.objects.create(**template_dict)
  812. return Response({
  813. 'id': template.id,
  814. 'project': template.project.id,
  815. 'file_name': template.file_name,
  816. 'location': template.location
  817. }, status=status.HTTP_201_CREATED)
  818.  
  819. def list(self, request, *args, **kwargs):
  820. if self.model is None:
  821. raise AssertionError('CustomViewSetForQuerySet need to include a model')
  822.  
  823. project = self.request.query_params.get('project')
  824.  
  825. if project is None:
  826. raise serializers.ValidationError({'detail': 'You have to set project parameter.'})
  827.  
  828. queryset = self.model.objects.filter(project=project)
  829. search = self.request.query_params.get('search[value]', None)
  830. column_id = self.request.query_params.get('order[0][column]', None)
  831.  
  832. # search
  833. if search and search is not None and self.search_keywords is not None:
  834. search_logic = []
  835.  
  836. for entity in self.search_keywords:
  837. search_logic.append(Q(**{entity + '__icontains': search}))
  838.  
  839. queryset = queryset.filter(reduce(operator.or_, search_logic))
  840.  
  841. # ascending or descending order
  842. if column_id and column_id is not None:
  843. column_name = self.request.query_params.get(
  844. 'columns[' + column_id + '][data]', None)
  845.  
  846. if self.change_keys is not None:
  847. for key in self.change_keys:
  848. if column_name == key:
  849. column_name = self.change_keys.get(key)
  850.  
  851. if column_name != '':
  852. order_dir = '-' if self.request.query_params.get(
  853. 'order[0][dir]') == 'desc' else ''
  854. queryset = queryset.order_by(order_dir + column_name)
  855.  
  856. queryset = self.filter_queryset(queryset)
  857.  
  858. page = self.paginate_queryset(queryset)
  859. if page is not None:
  860. serializer = self.get_serializer(page, many=True)
  861. return self.get_paginated_response(serializer.data)
  862.  
  863. serializer = self.get_serializer(queryset, many=True)
  864. return Response(serializer.data)
  865.  
  866. def retrieve(self, request, *args, **kwargs):
  867. instance = self.get_object()
  868. serializer = self.get_serializer(instance)
  869. content = html.escape(str(default_storage.open(instance.location).read(), 'utf-8'))
  870. template_dict = serializer.data
  871. template_dict.update({'content': content})
  872. return Response(template_dict)
  873.  
  874. def update(self, request, *args, **kwargs):
  875. partial = kwargs.pop('partial', False)
  876. instance = self.get_object()
  877. serializer = self.get_serializer(instance, data=request.data, partial=partial)
  878. serializer.is_valid(raise_exception=True)
  879. self.perform_update(serializer)
  880. content = request.data.get('content')
  881.  
  882. if content:
  883. if default_storage.exists(instance.location):
  884. default_storage.open(instance.location, 'w').write(content)
  885. else:
  886. default_storage.save(instance.location, ContentFile(content))
  887.  
  888. if getattr(instance, '_prefetched_objects_cache', None):
  889. # If 'prefetch_related' has been applied to a queryset, we need to
  890. # refresh the instance from the database.
  891. instance = self.get_object()
  892. serializer = self.get_serializer(instance)
  893.  
  894. return Response(serializer.data)
  895.  
  896. def destroy(self, request, *args, **kwargs):
  897. instance = self.get_object()
  898. default_storage.delete(instance.location)
  899. self.perform_destroy(instance)
  900. return Response(status=status.HTTP_204_NO_CONTENT)
  901.  
  902.  
  903. class OutputDocumentSerializer(serializers.ModelSerializer):
  904. slug_regex = re.compile(r'^[a-zA-Z0-9_]{4,200}$')
  905. generated_name = serializers.RegexField(regex=slug_regex, error_messages={
  906. 'invalid': 'generated_name contains alphanumeric and underscores. Length: 4 to 200'
  907. })
  908.  
  909. class Meta:
  910. fields = '__all__'
  911. model = OutputDocument
  912.  
  913.  
  914. class OutputDocumentViewSet(CustomViewSetForQuerySet):
  915. permission_classes = [GreenOfficeApiBasePermission]
  916. pagination_class = LargeResultsSetPagination
  917. serializer_class = OutputDocumentSerializer
  918. model = OutputDocument
  919. permission_id = [2, ]
  920.  
  921. def list(self, request, *args, **kwargs):
  922. if self.model is None:
  923. raise AssertionError('CustomViewSetForQuerySet need to include a model')
  924.  
  925. project = self.request.query_params.get('project')
  926.  
  927. if project is None:
  928. raise serializers.ValidationError({'detail': 'You have to set project parameter.'})
  929.  
  930. queryset = self.model.objects.filter(project=project)
  931. search = self.request.query_params.get('search[value]', None)
  932. column_id = self.request.query_params.get('order[0][column]', None)
  933.  
  934. # search
  935. if search and search is not None and self.search_keywords is not None:
  936. search_logic = []
  937.  
  938. for entity in self.search_keywords:
  939. search_logic.append(Q(**{entity + '__icontains': search}))
  940.  
  941. queryset = queryset.filter(reduce(operator.or_, search_logic))
  942.  
  943. # ascending or descending order
  944. if column_id and column_id is not None:
  945. column_name = self.request.query_params.get(
  946. 'columns[' + column_id + '][data]', None)
  947.  
  948. if self.change_keys is not None:
  949. for key in self.change_keys:
  950. if column_name == key:
  951. column_name = self.change_keys.get(key)
  952.  
  953. if column_name != '':
  954. order_dir = '-' if self.request.query_params.get(
  955. 'order[0][dir]') == 'desc' else ''
  956. queryset = queryset.order_by(order_dir + column_name)
  957.  
  958. queryset = self.filter_queryset(queryset)
  959.  
  960. page = self.paginate_queryset(queryset)
  961. if page is not None:
  962. serializer = self.get_serializer(page, many=True)
  963. return self.get_paginated_response(serializer.data)
  964.  
  965. serializer = self.get_serializer(queryset, many=True)
  966. return Response(serializer.data)
  967.  
  968.  
  969. class StepSerializer(serializers.ModelSerializer):
  970. class Meta:
  971. model = Step
  972. fields = '__all__'
  973.  
  974.  
  975. class StepViewSet(CustomViewSetForQuerySet):
  976. permission_classes = [GreenOfficeApiBasePermission]
  977. serializer_class = StepSerializer
  978. pagination_class = LargeResultsSetPagination
  979. queryset = Step.objects.all()
  980. permission_id = [2, ]
  981. model = Step
  982.  
  983. def list(self, request, *args, **kwargs):
  984. if self.model is None:
  985. raise AssertionError('CustomViewSetForQuerySet need to include a model')
  986.  
  987. task = self.request.query_params.get('task')
  988.  
  989. if task is None:
  990. raise serializers.ValidationError({'detail': 'You have to set task parameter.'})
  991.  
  992. queryset = self.model.objects.filter(task=task)
  993. search = self.request.query_params.get('search[value]', None)
  994. column_id = self.request.query_params.get('order[0][column]', None)
  995.  
  996. # search
  997. if search and search is not None and self.search_keywords is not None:
  998. search_logic = []
  999.  
  1000. for entity in self.search_keywords:
  1001. search_logic.append(Q(**{entity + '__icontains': search}))
  1002.  
  1003. queryset = queryset.filter(reduce(operator.or_, search_logic))
  1004.  
  1005. # ascending or descending order
  1006. if column_id and column_id is not None:
  1007. column_name = self.request.query_params.get(
  1008. 'columns[' + column_id + '][data]', None)
  1009.  
  1010. if self.change_keys is not None:
  1011. for key in self.change_keys:
  1012. if column_name == key:
  1013. column_name = self.change_keys.get(key)
  1014.  
  1015. if column_name != '':
  1016. order_dir = '-' if self.request.query_params.get(
  1017. 'order[0][dir]') == 'desc' else ''
  1018. queryset = queryset.order_by(order_dir + column_name)
  1019.  
  1020. queryset = queryset.order_by('position')
  1021. queryset = self.filter_queryset(queryset)
  1022.  
  1023. page = self.paginate_queryset(queryset)
  1024. if page is not None:
  1025. serializer = self.get_serializer(page, many=True)
  1026. return self.get_paginated_response(serializer.data)
  1027.  
  1028. serializer = self.get_serializer(queryset, many=True)
  1029. return Response(serializer.data)
  1030.  
  1031.  
  1032. class ApplicationSerializer(serializers.ModelSerializer):
  1033. class Meta:
  1034. model = Application
  1035. fields = '__all__'
  1036.  
  1037.  
  1038. class ApplicationViewSet(CustomViewSetForQuerySet):
  1039. permission_classes = [GreenOfficeApiBasePermission]
  1040. serializer_class = ApplicationSerializer
  1041. pagination_class = LargeResultsSetPagination
  1042. queryset = Application.objects
  1043. permission_id = [3, 25, ]
  1044. model = Application
  1045.  
  1046. def list(self, request, *args, **kwargs):
  1047. queryset = self.queryset.filter(init_user=request.user)
  1048. page = self.paginate_queryset(queryset)
  1049.  
  1050. if page is not None:
  1051. serializer = self.get_serializer(page, many=True)
  1052. return self.get_paginated_response(serializer.data)
  1053.  
  1054. serializer = self.get_serializer(queryset, many=True)
  1055. return Response(serializer.data)
  1056.  
  1057. def create(self, request, *args, **kwargs):
  1058. if request.data.get('application') is None or not request.data.get('application'):
  1059. raise serializers.ValidationError({'detail': 'Please provide the application id.'})
  1060.  
  1061. if request.data.get('task') is None or not request.data.get('task'):
  1062. raise serializers.ValidationError({'detail': 'Please provide the task id.'})
  1063.  
  1064. if request.data.get('project') is None or not request.data.get('project'):
  1065. raise serializers.ValidationError({'detail': 'Please provide the project id.'})
  1066.  
  1067. d_dict = {}
  1068. task = Task.objects.get(pk=request.data['task'])
  1069. app = Application.objects.get(pk=request.data.get('application'))
  1070. app_data = json.loads(app.data)
  1071.  
  1072. for tuple_item in request.data.lists():
  1073.  
  1074. if 'grid-' in tuple_item[0]:
  1075. extracted_name = tuple_item[0].split('-')
  1076. if len(tuple_item[1]):
  1077. for i, t in enumerate(tuple_item[1]):
  1078. try:
  1079. try:
  1080. d_dict[extracted_name[1]][i].update({extracted_name[2]: t})
  1081. except IndexError:
  1082. d_dict[extracted_name[1]].insert(i, {extracted_name[2]: t})
  1083.  
  1084. except KeyError:
  1085. d_dict.update({extracted_name[1]: []})
  1086. d_dict[extracted_name[1]].insert(i, {extracted_name[2]: t})
  1087.  
  1088. elif 'checkgroup-' in tuple_item[0]:
  1089. d_dict[tuple_item[0].replace('checkgroup-', '')] = tuple_item[1]
  1090.  
  1091. else:
  1092. ignored_keys = ['manual_final_user', 'next_pos', 'task', 'application', 'project', 'process',
  1093. 'manual', 'claimed_user', 'claiming']
  1094.  
  1095. if 'file' not in tuple_item[0] and tuple_item[0] not in ignored_keys:
  1096. try:
  1097. d_dict[tuple_item[0]] = tuple_item[1][0]
  1098. except IndexError:
  1099. d_dict[tuple_item[0]] = ''
  1100.  
  1101. # update application data
  1102. app_data.update(d_dict)
  1103.  
  1104. if len(request.FILES) > 0:
  1105. with transaction.atomic():
  1106. for l in request.FILES:
  1107. o = []
  1108.  
  1109. InputDocument.objects.filter(**{
  1110. 'project': Project.objects.get(pk=request.data.get('project')),
  1111. 'process': request.data['process'],
  1112. 'application': app,
  1113. 'variable': l
  1114. }).delete()
  1115.  
  1116. for f in request.FILES.getlist(l):
  1117. input_doc = InputDocument.objects.create(**{
  1118. 'project': Project.objects.get(pk=request.data.get('project')),
  1119. 'process': request.data['process'],
  1120. 'task': task,
  1121. 'application': app,
  1122. 'size': f.size,
  1123. 'name': f.name,
  1124. 'extension': f.content_type,
  1125. 'file': f,
  1126. 'user': request.user,
  1127. 'variable': l
  1128. })
  1129. f_dict = dict()
  1130. f_dict['location'] = input_doc.file.__str__()
  1131. f_dict['name'] = input_doc.name
  1132. o.append(f_dict)
  1133. d_dict.update({
  1134. l: o
  1135. })
  1136.  
  1137. app_data.update(d_dict)
  1138. app.data = json.dumps(app_data)
  1139. app.current_user = request.user
  1140. #app.save()
  1141.  
  1142. try:
  1143. IndexApplication(app)
  1144. app.save()
  1145. except elasticsearch.ConnectionError:
  1146. return Response('Please check your search engine connection is down or not',
  1147. status=status.HTTP_400_BAD_REQUEST)
  1148. if request.data.get('save_as_draft') and int(request.data.get('save_as_draft')) == 1:
  1149. result = {'detail': 'Draft has been saved.', 'type': 'draft'}
  1150. elif request.data.get('_reject_') and int(request.data.get('_reject_')) == 1:
  1151. bpmne_obj = BPMNEngine(request, task, request.data['next_pos'], application=app.id)
  1152. if bpmne_obj.end_event_operation('reject'):
  1153. response_dict = {
  1154. 'type': 'task',
  1155. 'manual': False,
  1156. 'end': False,
  1157. 'parallel': False,
  1158. 'application': model_to_dict(app)
  1159. }
  1160. result = dict(response_dict, **{
  1161. 'end': True,
  1162. 'detail': 'The application has been rejected',
  1163. 'reject': True,
  1164. })
  1165. bpmne_obj.workflow_send_mail(button_action='reject')
  1166. elif request.data.get('_recheck_') and int(request.data.get('_recheck_')) == 1:
  1167. result = BPMNEngine(request, task, request.data['next_pos'], application=app.id).take_decision('recheck')
  1168. elif request.data.get('manual') == 'true':
  1169. print("m")
  1170. manual_final_user = request.data.get('manual_final_user')
  1171. result = BPMNEngine(request, task, request.data['next_pos'], application=app.id, manual_pass=True,
  1172. manual_final_user=manual_final_user).take_decision()
  1173. elif request.data.get('claiming'):
  1174. print("c")
  1175. claimed_user = request.data.get('claimed_user')
  1176. result = BPMNEngine(request, task, request.data['next_pos'], application=app.id, manual_pass=True,
  1177. manual_final_user=claimed_user, claimed=True).claim_operation(claimed_user)
  1178. else:
  1179. print("o")
  1180. result = BPMNEngine(request, task, request.data['next_pos'], application=app.id).take_decision()
  1181.  
  1182. return Response(result, status=status.HTTP_202_ACCEPTED)
  1183.  
  1184.  
  1185. class ApplicationCountSerializer(serializers.ModelSerializer):
  1186. class Meta:
  1187. model = Delegation
  1188. fields = '__all__'
  1189.  
  1190.  
  1191. class ApplicationCountViewSet(CustomViewSetForQuerySet):
  1192. permission_classes = [GreenOfficeApiBasePermission]
  1193. serializer_class = ApplicationCountSerializer
  1194. pagination_class = LargeResultsSetPagination
  1195. queryset = Delegation.objects.filter()
  1196. http_method_names = ['get']
  1197. model = Delegation
  1198. permission_id = [3, 25, ]
  1199.  
  1200. def list(self, request, *args, **kwargs):
  1201. if self.model is None:
  1202. raise AssertionError('CustomViewSetForQuerySet need to include a model')
  1203.  
  1204. status_dict = {
  1205. 'completed': 0,
  1206. 'todo': 1,
  1207. 'open': 2,
  1208. 'non_claimed': 3,
  1209. }
  1210. count_dic = {}
  1211. for k, v in sorted(status_dict.items()):
  1212. number = Delegation.objects.filter(status=v, user=request.user).count()
  1213. count_dic[k] = number
  1214. return Response(count_dic)
  1215.  
  1216.  
  1217. class DelegationSerializer(serializers.ModelSerializer):
  1218. task_name = serializers.StringRelatedField(source='task.name')
  1219. task = serializers.StringRelatedField(source='task.id')
  1220. task_element_id = serializers.StringRelatedField(source='task.element_id')
  1221. project_category = serializers.StringRelatedField(source='project.category.name')
  1222. project_name = serializers.StringRelatedField(source='project.title')
  1223. app_id = serializers.StringRelatedField(source='application.id')
  1224. app_number = serializers.StringRelatedField(source='application.number')
  1225. user = serializers.StringRelatedField(source='user.get_full_name')
  1226. sent_by = serializers.StringRelatedField(source='sent_by.get_full_name')
  1227. comment_count = serializers.SerializerMethodField()
  1228. query_count = serializers.SerializerMethodField()
  1229.  
  1230. @staticmethod
  1231. def get_comment_count(obj):
  1232. return AppComment.objects.filter(application=obj.application.id).count()
  1233.  
  1234. @staticmethod
  1235. def get_query_count(obj):
  1236. return AppQuery.objects.filter(application=obj.application.id).count()
  1237.  
  1238. class Meta:
  1239. model = Delegation
  1240. fields = '__all__'
  1241.  
  1242.  
  1243. class DelegationCustomSerializer(serializers.ModelSerializer):
  1244. class Meta:
  1245. model = Delegation
  1246. fields = '__all__'
  1247.  
  1248.  
  1249. class DelegationViewSet(CustomViewSetForQuerySet):
  1250. permission_classes = [GreenOfficeApiBasePermission]
  1251. serializer_class = DelegationSerializer
  1252. pagination_class = LargeResultsSetPagination
  1253. queryset = Delegation.objects.filter()
  1254. http_method_names = ['get', 'delete']
  1255. model = Delegation
  1256. search_keywords = ['application__number', 'project__title', 'sent_by__first_name', 'sent_by__last_name']
  1257. change_keys = {
  1258. 'app_id': 'application__id',
  1259. 'app_number': 'application__number',
  1260. 'project_name': 'project__title',
  1261. 'task_name': 'task__name',
  1262. 'priority': 'task__priority',
  1263. # 'due_date': 'task__init_date',
  1264. }
  1265. permission_id = [3, 25, ]
  1266.  
  1267. def destroy(self, request, *args, **kwargs):
  1268. try:
  1269. instance = Delegation.objects.get(pk=kwargs['pk'], user=request.user)
  1270. instance.application.delete()
  1271. self.perform_destroy(instance)
  1272. return Response(status=status.HTTP_204_NO_CONTENT)
  1273.  
  1274. except Delegation.DoesNotExist:
  1275. raise serializers.ValidationError({'detail': 'You do not have permission to perform this action.'})
  1276.  
  1277. def list(self, request, *args, **kwargs):
  1278. if self.model is None:
  1279. raise AssertionError('CustomViewSetForQuerySet need to include a model')
  1280.  
  1281. queryset = self.model.objects
  1282. search = self.request.query_params.get('search[value]', None)
  1283. column_id = self.request.query_params.get('order[0][column]', None)
  1284. item_status = self.request.query_params.get('item_status')
  1285. due_status = self.request.query_params.get('due_status', None)
  1286.  
  1287. if item_status is None or item_status not in ['completed', 'todo', 'open', 'non_claimed']:
  1288. raise serializers.ValidationError({'detail': 'Please provide an item_status (open, todo, completed)'})
  1289. else:
  1290. status_dict = {
  1291. 'completed': 0,
  1292. 'todo': 1,
  1293. 'open': 2,
  1294. 'non_claimed': 3,
  1295. }
  1296. queryset = queryset.filter(status=status_dict[item_status]).order_by('-init_date')
  1297. if due_status is not None:
  1298. print("inside due code")
  1299. if due_status not in ['risk', 'due']:
  1300. raise serializers.ValidationError({'detail': 'Please provide an due_status (risk, due)'})
  1301. else:
  1302. today_datetime = timezone.now()
  1303. if due_status == 'risk':
  1304. queryset = queryset.filter(Q(risk_date__lte=today_datetime) & Q(due_date__gt=today_datetime))
  1305. else:
  1306. queryset = queryset.filter(Q(due_date__lt=today_datetime) & Q(risk_date__lt=today_datetime))
  1307. # search
  1308. if search and search is not None and self.search_keywords is not None:
  1309. search_logic = []
  1310.  
  1311. for entity in self.search_keywords:
  1312. search_logic.append(Q(**{entity + '__icontains': search}))
  1313.  
  1314. queryset = queryset.filter(reduce(operator.or_, search_logic))
  1315.  
  1316. # ascending or descending order
  1317. if column_id and column_id is not None:
  1318. column_name = self.request.query_params.get('columns[' + column_id + '][data]', None)
  1319.  
  1320. if self.change_keys is not None:
  1321. for key in self.change_keys:
  1322. if column_name == key:
  1323. column_name = self.change_keys.get(key)
  1324.  
  1325. if column_name != '':
  1326. order_dir = '-' if self.request.query_params.get('order[0][dir]') == 'desc' else ''
  1327. queryset = queryset.order_by(order_dir + column_name)
  1328.  
  1329. queryset = queryset.filter(user=request.user)
  1330. page = self.paginate_queryset(queryset)
  1331. if page is not None:
  1332. serializer = self.get_serializer(page, many=True)
  1333. return self.get_paginated_response(serializer.data)
  1334.  
  1335. serializer = self.get_serializer(queryset, many=True)
  1336. return Response(serializer.data)
  1337.  
  1338.  
  1339. class PendingTaskViewSet(viewsets.ModelViewSet):
  1340. serializer_class = DelegationSerializer
  1341. pagination_class = LargeResultsSetPagination
  1342. queryset = Delegation.objects.all()
  1343. http_method_names = ['get']
  1344. model = Delegation
  1345. permission_id = [3, 25, ]
  1346.  
  1347. def list(self, request, *args, **kwargs):
  1348. task_status = self.request.query_params.get('status')
  1349. if task_status is None:
  1350. raise serializers.ValidationError({'detail': 'Please provide an status (risk_task, over_due)'})
  1351. else:
  1352. task_status = task_status.lower()
  1353. if task_status == 'risk_task':
  1354. queryset = Delegation.objects.filter(~(Q(status=0) | Q(status=2)), risk_date__lte=timezone.now(),
  1355. due_date__gt=timezone.now(), user_id=request.user)
  1356. elif task_status == 'over_due':
  1357. queryset = Delegation.objects.filter(~(Q(status=0) | Q(status=2)), due_date__lte=timezone.now(),
  1358. user_id=request.user)
  1359. else:
  1360. raise serializers.ValidationError({'detail': 'Please provide an status risk_task or over_due'})
  1361. page = self.paginate_queryset(queryset)
  1362. if page is not None:
  1363. serializer = self.get_serializer(page, many=True)
  1364. return self.get_paginated_response(serializer.data)
  1365.  
  1366. serializer = self.get_serializer(queryset, many=True)
  1367. return Response(serializer.data)
  1368.  
  1369.  
  1370. class GeneralInfoSerializer(serializers.ModelSerializer):
  1371. process_name = serializers.StringRelatedField(source='project.title', read_only=True)
  1372. init_user_name = serializers.StringRelatedField(source='init_user.get_full_name')
  1373. current_user_name = serializers.StringRelatedField(source='current_user.get_full_name')
  1374. description = serializers.StringRelatedField(source='project.description')
  1375. category = serializers.StringRelatedField(source='project.category')
  1376. process_created_date = serializers.StringRelatedField(source='project.created_at')
  1377. # delegation = DelegationCustomSerializer(many=True, read_only=True)
  1378. delegation = serializers.SerializerMethodField()
  1379.  
  1380. def get_delegation(self, obj):
  1381. l = []
  1382. data_query = Delegation.objects.filter(user=obj.current_user, application=obj)
  1383.  
  1384. def day_convert(time):
  1385. day = int(time) / 24
  1386. hour = int(time) % 24
  1387. return "{} days {} hours".format(day, hour)
  1388.  
  1389. if data_query.filter(status=1).count():
  1390. for delegation in data_query.filter(status=1):
  1391. d = dict()
  1392. d['user'] = delegation.user.get_full_name()
  1393. d['status'] = delegation.status
  1394. d['additional_status'] = delegation.additional_status
  1395. d['finish_date'] = delegation.finish_date
  1396. d['task'] = delegation.task.name
  1397. d['delegation_init_date'] = delegation.init_date
  1398. d['delegation_finish_date'] = delegation.finish_date
  1399. d['delegation_due_date'] = delegation.due_date
  1400. d['duration'] = delegation.task.duration
  1401. duration = delegation.task.duration
  1402. if int(duration) >= 24:
  1403. final_duration = day_convert(duration)
  1404. d['duration'] = final_duration
  1405. else:
  1406. d['duration'] = "{}hours".format(delegation.task.duration)
  1407. l.append(d)
  1408.  
  1409. elif data_query.filter(status=2).count():
  1410. for delegation in data_query.filter(status=2):
  1411. d = dict()
  1412. d['user'] = delegation.user.get_full_name()
  1413. d['status'] = delegation.status
  1414. d['additional_status'] = delegation.additional_status
  1415. d['finish_date'] = delegation.finish_date
  1416. d['task'] = delegation.task.name
  1417. d['delegation_init_date'] = delegation.init_date
  1418. d['delegation_finish_date'] = delegation.finish_date
  1419. d['delegation_due_date'] = delegation.due_date
  1420. d['duration'] = delegation.task.duration
  1421. duration = delegation.task.duration
  1422. if int(duration) >= 24:
  1423. final_duration = day_convert(duration)
  1424. d['duration'] = final_duration
  1425. else:
  1426. d['duration'] = "{}hours".format(delegation.task.duration)
  1427. l.append(d)
  1428.  
  1429. else:
  1430. data = Delegation.objects.filter(application=obj).latest('finish_date')
  1431. d = dict()
  1432. d['user'] = data.user.get_full_name()
  1433. d['status'] = data.status
  1434. d['additional_status'] = data.additional_status
  1435. d['finish_date'] = data.finish_date
  1436. d['task'] = data.task.name
  1437. d['delegation_init_date'] = data.init_date
  1438. d['delegation_due_date'] = data.due_date
  1439. d['delegation_finish_date'] = data.finish_date
  1440. duration = data.task.duration
  1441. if int(duration) >= 24:
  1442. final_duration = day_convert(duration)
  1443. d['duration'] = final_duration
  1444. else:
  1445. d['duration'] = "{}hours".format(data.task.duration)
  1446. l.append(d)
  1447.  
  1448. return l
  1449.  
  1450. class Meta:
  1451. model = Application
  1452. exclude = ['data']
  1453.  
  1454.  
  1455. class GeneralInfoViewSet(CustomViewSetForQuerySet):
  1456. permission_classes = [GreenOfficeApiBasePermission]
  1457. serializer_class = GeneralInfoSerializer
  1458. pagination_class = LargeResultsSetPagination
  1459. model = Application
  1460. http_method_names = ['get']
  1461. permission_id = [3, 25, ]
  1462.  
  1463.  
  1464. class UploadDocumentSerializer(serializers.ModelSerializer):
  1465. origin_task = serializers.StringRelatedField(source='task.name')
  1466.  
  1467. class Meta:
  1468. model = InputDocument
  1469. fields = '__all__'
  1470.  
  1471.  
  1472. class UploadDocumentViewSet(CustomViewSetForQuerySet):
  1473. permission_classes = [GreenOfficeApiBasePermission]
  1474. serializer_class = UploadDocumentSerializer
  1475. pagination_class = LargeResultsSetPagination
  1476. queryset = InputDocument.objects.all()
  1477. model = InputDocument
  1478. permission_id = [3, 25, ]
  1479.  
  1480. def list(self, request, *args, **kwargs):
  1481. app_id = self.request.query_params.get('app_id')
  1482. document_status = self.request.query_params.get('attach')
  1483.  
  1484. if app_id is None:
  1485. raise serializers.ValidationError({'detail': 'You must provide a valid Application ID. (ex: ?app_id=001)'})
  1486.  
  1487. if document_status is not None:
  1488. if document_status == 'true':
  1489. queryset = self.queryset.filter(application=app_id, attached=True)
  1490. elif document_status == 'false':
  1491. queryset = self.queryset.filter(application=app_id, attached=False)
  1492.  
  1493. else:
  1494. queryset = self.queryset.filter(application=app_id)
  1495.  
  1496. page = self.paginate_queryset(queryset)
  1497. if page is not None:
  1498. serializer = self.get_serializer(page, many=True)
  1499. return self.get_paginated_response(serializer.data)
  1500.  
  1501. serializer = self.get_serializer(queryset, many=True)
  1502. file_lists = serializer.data
  1503.  
  1504. return Response(file_lists)
  1505.  
  1506.  
  1507. class GeneratedDocumentSerializer(serializers.ModelSerializer):
  1508. class Meta:
  1509. model = GeneratedDocument
  1510. fields = '__all__'
  1511.  
  1512.  
  1513. class GeneratedDocumentViewSet(CustomViewSetForQuerySet):
  1514. permission_classes = [GreenOfficeApiBasePermission]
  1515. serializer_class = GeneratedDocumentSerializer
  1516. pagination_class = LargeResultsSetPagination
  1517. queryset = GeneratedDocument.objects.all()
  1518. model = GeneratedDocument
  1519. permission_id = [3, 25, ]
  1520.  
  1521. def retrieve(self, request, *args, **kwargs):
  1522. return Response({'detail': 'There is no operation.'})
  1523.  
  1524. def create(self, request, *args, **kwargs):
  1525. return Response({'detail': 'There is no operation.'})
  1526.  
  1527. def update(self, request, *args, **kwargs):
  1528. return Response({'detail': 'There is no operation.'})
  1529.  
  1530. def destroy(self, request, *args, **kwargs):
  1531. return Response({'detail': 'There is no operation.'})
  1532.  
  1533. def list(self, request, *args, **kwargs):
  1534. app_id = self.request.query_params.get('app_id')
  1535.  
  1536. if app_id is None:
  1537. raise serializers.ValidationError({'detail': 'You must provide a valid Application ID. (ex: ?app_id=001)'})
  1538.  
  1539. queryset = self.queryset.filter(application=app_id)
  1540.  
  1541. # if not queryset.count():
  1542. # raise serializers.ValidationError('You must provide a valid Application ID.')
  1543.  
  1544. page = self.paginate_queryset(queryset)
  1545. if page is not None:
  1546. serializer = self.get_serializer(page, many=True)
  1547. return self.get_paginated_response(serializer.data)
  1548.  
  1549. serializer = self.get_serializer(queryset, many=True)
  1550. return Response(serializer.data)
  1551.  
  1552.  
  1553. class ProcessMapSerializer(serializers.ModelSerializer):
  1554. process_name = serializers.StringRelatedField(source='project.title')
  1555. task_name = serializers.StringRelatedField(source='task.name')
  1556. application_number = serializers.StringRelatedField(source='application.number')
  1557. user_name = serializers.StringRelatedField(source='user.get_full_name')
  1558. time_taken = serializers.SerializerMethodField()
  1559.  
  1560. def get_time_taken(self, obj):
  1561. if obj.finish_date:
  1562. return str(obj.finish_date - obj.init_date).split(".")[0]
  1563. else:
  1564. return None
  1565.  
  1566. class Meta:
  1567. model = Delegation
  1568. fields = '__all__'
  1569.  
  1570.  
  1571. class ProcessMapViewSet(CustomViewSetForQuerySet):
  1572. permission_classes = [GreenOfficeApiBasePermission]
  1573. serializer_class = ProcessMapSerializer
  1574. pagination_class = LargeResultsSetPagination
  1575. queryset = Delegation.objects.all()
  1576. model = Delegation
  1577. permission_id = [3, 25, ]
  1578.  
  1579. def list(self, request, *args, **kwargs):
  1580. app_id = self.request.query_params.get('app_id')
  1581. is_query = self.request.query_params.get('is_query', None) #Azmi
  1582. if app_id is None:
  1583. raise serializers.ValidationError({'detail': 'You must provide a valid Application ID. (ex: ?app_id=001)'})
  1584.  
  1585. if is_query is not None: #Azmi
  1586. if is_query != "1":
  1587. raise serializers.ValidationError({'detail': 'You must provide is_query=1 for query'})
  1588. else:
  1589. queryset = self.queryset.filter(application=app_id, status=0).order_by('user').distinct('user')
  1590. else:
  1591. queryset = self.queryset.filter(application=app_id).order_by('-id')
  1592.  
  1593. if not queryset.count():
  1594. raise serializers.ValidationError({'detail': 'You must provide a valid Application ID.'})
  1595.  
  1596. page = self.paginate_queryset(queryset)
  1597. if page is not None:
  1598. serializer = self.get_serializer(page, many=True)
  1599. return self.get_paginated_response(serializer.data)
  1600.  
  1601. serializer = self.get_serializer(queryset, many=True)
  1602. return Response(serializer.data)
  1603.  
  1604.  
  1605. @api_view(['POST'])
  1606. def application_search(request):
  1607. return Response(ApplicationSearch(request.data).quick_search())
  1608.  
  1609.  
  1610. class ProjectList(AdminView):
  1611. category_list = Category.objects.all()
  1612. template_name = 'workflow/bpmn/project.html'
  1613.  
  1614. def get(self, request, *args, **kwargs):
  1615. # check Designs permissions
  1616. with transaction.atomic():
  1617. if request.user.role.permission.filter(id=2).count():
  1618. context = self.get_context_data(**kwargs)
  1619. return self.render_to_response(context)
  1620. else:
  1621. return HttpResponseRedirect('/dashboard')
  1622.  
  1623.  
  1624. class ProjectView(DetailView):
  1625. template_name = 'workflow/designer/designer.html'
  1626. model = Project
  1627.  
  1628.  
  1629. class EFormView(DetailView):
  1630. model = EForm
  1631. template_name = 'workflow/designer/formbuilder.html'
  1632.  
  1633.  
  1634. class KPISerializer(serializers.ModelSerializer):
  1635. class Meta:
  1636. model = Delegation
  1637.  
  1638.  
  1639. class KPIView(viewsets.ModelViewSet):
  1640. serializer_class = KPISerializer
  1641. http_method_names = ['get']
  1642.  
  1643. def list(self, request, *args, **kwargs):
  1644. user = self.request.query_params.get('user', None)
  1645. current_time = timezone.now()
  1646.  
  1647. if user is None:
  1648.  
  1649. if request.user.role.id == 1:
  1650. totaltask = Delegation.objects.filter(~Q(status=2)).count()
  1651. if totaltask:
  1652.  
  1653. todotask = Delegation.objects.filter(status=1).count()
  1654. lefttask = todotask * 100 / totaltask
  1655.  
  1656. if todotask:
  1657. overdue = Delegation.objects.filter(status=1,
  1658. due_date__lte=current_time).count() * 100 / todotask
  1659. risktask = Delegation.objects.filter(status=1, risk_date__lte=current_time,
  1660. due_date__gt=current_time).count() * 100 / todotask
  1661. else:
  1662. overdue = risktask = 0.0
  1663. completed = Delegation.objects.filter(status=0).count()
  1664. completedtask = completed * 100 / totaltask
  1665. if completed:
  1666. combeforedue = Delegation.objects.filter(status=0, due_date__gte=F(
  1667. 'finish_date')).count() * 100 / completed
  1668. comafterdue = Delegation.objects.filter(status=0,
  1669. due_date__lt=F('finish_date')).count() * 100 / completed
  1670. else:
  1671. combeforedue = comafterdue = 0.0
  1672. else:
  1673. lefttask = overdue = risktask = completedtask = combeforedue = comafterdue = 0.0
  1674. dict = {}
  1675. dict['totaltask'] = totaltask
  1676. dict['todotask'] = lefttask
  1677. dict['overdue'] = overdue
  1678. dict['risktask'] = risktask
  1679. dict['completed'] = completedtask
  1680. dict['completedbeforedue'] = combeforedue
  1681. dict['completedafterdue'] = comafterdue
  1682. return Response(dict)
  1683.  
  1684. else:
  1685.  
  1686. totaltask = Delegation.objects.filter(~Q(status=2), user=request.user).count()
  1687. if totaltask:
  1688. todotask = Delegation.objects.filter(status=1, user=request.user).count()
  1689.  
  1690. lefttask = todotask * 100 / totaltask
  1691. if totaltask:
  1692. overdue = Delegation.objects.filter(status=1, user=request.user,
  1693. due_date__lte=current_time).count() * 100 / todotask
  1694. risktask = Delegation.objects.filter(status=1, user=request.user, risk_date__lte=current_time,
  1695. due_date__gt=current_time).count() * 100 / todotask
  1696. else:
  1697. overdue = risktask = 0.0
  1698. completed = Delegation.objects.filter(status=0, user=request.user).count()
  1699. completedtask = completed * 100 / totaltask
  1700. if completed:
  1701. combeforedue = Delegation.objects.filter(status=0, user=request.user, due_date__gte=F(
  1702. 'finish_date')).count() * 100 / completed
  1703. comafterdue = Delegation.objects.filter(status=0, user=request.user,
  1704. due_date__lt=F('finish_date')).count() * 100 / completed
  1705. else:
  1706. combeforedue = comafterdue = 0.0
  1707. else:
  1708. lefttask = overdue = risktask = completedtask = combeforedue = comafterdue = 0.0
  1709. dict = {}
  1710. dict['totaltask'] = totaltask
  1711. dict['todotask'] = lefttask
  1712. dict['overdue'] = overdue
  1713. dict['risktask'] = risktask
  1714. dict['completed'] = completedtask
  1715. dict['completedbeforedue'] = combeforedue
  1716. dict['completedafterdue'] = comafterdue
  1717. return Response(dict)
  1718. elif user == 'all':
  1719. totaltask = Delegation.objects.filter(~Q(status=2)).count()
  1720. if totaltask:
  1721.  
  1722. todotask = Delegation.objects.filter(status=1).count()
  1723. lefttask = todotask * 100 / totaltask
  1724.  
  1725. if todotask:
  1726. overdue = Delegation.objects.filter(status=1, due_date__lte=current_time).count() * 100 / todotask
  1727. risktask = Delegation.objects.filter(status=1, risk_date__lte=current_time,
  1728. due_date__gt=current_time).count() * 100 / todotask
  1729. else:
  1730. overdue = risktask = 0.0
  1731. completed = Delegation.objects.filter(status=0).count()
  1732. completedtask = completed * 100 / totaltask
  1733. if completed:
  1734. combeforedue = Delegation.objects.filter(status=0,
  1735. due_date__gte=F('finish_date')).count() * 100 / completed
  1736. comafterdue = Delegation.objects.filter(status=0,
  1737. due_date__lt=F('finish_date')).count() * 100 / completed
  1738. else:
  1739. combeforedue = comafterdue = 0.0
  1740. else:
  1741. lefttask = overdue = risktask = completedtask = combeforedue = comafterdue = 0.0
  1742. dict = {}
  1743. dict['totaltask'] = totaltask
  1744. dict['todotask'] = lefttask
  1745. dict['overdue'] = overdue
  1746. dict['risktask'] = risktask
  1747. dict['completed'] = completedtask
  1748. dict['completedbeforedue'] = combeforedue
  1749. dict['completedafterdue'] = comafterdue
  1750. return Response(dict)
  1751. else:
  1752.  
  1753. totaltask = Delegation.objects.filter(~Q(status=2), user_id=user).count()
  1754. if totaltask:
  1755. todotask = Delegation.objects.filter(status=1, user_id=user).count()
  1756. lefttask = todotask * 100 / totaltask
  1757. if todotask:
  1758. overdue = Delegation.objects.filter(status=1, user_id=user,
  1759. due_date__gt=current_time).count() * 100 / todotask
  1760. overdue = Delegation.objects.filter(status=1, user_id=user,
  1761. due_date__lte=current_time).count() * 100 / todotask
  1762. risktask = Delegation.objects.filter(status=1, user_id=user, risk_date__lte=current_time,
  1763. due_date__gt=current_time).count() * 100 / todotask
  1764.  
  1765. else:
  1766. overdue = risktask = 0.0
  1767. completed = Delegation.objects.filter(status=0, user_id=user).count()
  1768. completedtask = completed * 100 / totaltask
  1769.  
  1770. if completed:
  1771. combeforedue = Delegation.objects.filter(status=0, user_id=user,
  1772. due_date__gte=F('finish_date')).count() * 100 / completed
  1773. comafterdue = Delegation.objects.filter(status=0, user_id=user,
  1774. due_date__lt=F('finish_date')).count() * 100 / completed
  1775. else:
  1776. combeforedue = comafterdue = 0.0
  1777. else:
  1778. lefttask = overdue = risktask = completedtask = combeforedue = comafterdue = 0.0
  1779. dict = {}
  1780. dict['totaltask'] = totaltask
  1781. dict['todotask'] = lefttask
  1782. dict['overdue'] = overdue
  1783. dict['risktask'] = risktask
  1784. dict['completed'] = completedtask
  1785. dict['completedbeforedue'] = combeforedue
  1786. dict['completedafterdue'] = comafterdue
  1787.  
  1788. return Response(dict)
  1789.  
  1790.  
  1791. class VariableSerializer(serializers.ModelSerializer):
  1792. class Meta:
  1793. model = EForm
  1794. fields = '__all__'
  1795.  
  1796.  
  1797. class CountViewSet(CustomViewSetForQuerySet):
  1798. permission_classes = [GreenOfficeApiBasePermission]
  1799. permission_id = [3, 25, ]
  1800.  
  1801. def list(self, request, *args, **kwargs):
  1802. delegation_queryset = Delegation.objects.filter(user=self.request.user,
  1803. init_date__year=timezone.now().year).count()
  1804. inbox_queryset = Delegation.objects.filter(user=self.request.user, status=1,
  1805. init_date__year=timezone.now().year)
  1806. completed_queryset = Delegation.objects.filter(user=self.request.user, status=0,
  1807. init_date__year=timezone.now().year)
  1808. completed_count = Delegation.objects.filter(user=self.request.user, status=0,
  1809. init_date__year=timezone.now().year).count()
  1810. overdue_count = inbox_queryset.filter(Q(due_date__lt=timezone.now()) & Q(risk_date__lt=timezone.now())).count()
  1811. query_count = AppQuery.objects.filter(user_to=self.request.user, is_answered=False).count()
  1812. total = inbox_queryset.count() + completed_count
  1813. if delegation_queryset != 0:
  1814. open_request = (inbox_queryset.count() / delegation_queryset) * 100
  1815. approve = Delegation.objects.filter(Q(user=self.request.user)
  1816. & Q(init_date__year=timezone.now().year) & Q(status=0)
  1817. & Q(additional_status__isnull=True)).count()
  1818. approve_count = (approve / delegation_queryset) * 100
  1819. reject = Delegation.objects.filter(Q(user=self.request.user) & Q(init_date__year=timezone.now().year)
  1820. & Q(status=0) & Q(additional_status=0)).count()
  1821. reject_count = (reject / delegation_queryset) * 100
  1822. recheck = Delegation.objects.filter(Q(user=self.request.user) & Q(init_date__year=timezone.now().year)
  1823. & Q(status=0) & Q(additional_status=1)).count()
  1824. recheck_count = (recheck / delegation_queryset) * 100
  1825. query = AppQuery.objects.filter(user_from=self.request.user).count()
  1826. requested_query_count = (query / delegation_queryset) * 100
  1827. else:
  1828. open_request = 0
  1829. approve_count = 0
  1830. reject_count = 0
  1831. recheck_count = 0
  1832. requested_query_count = 0
  1833. initiated = Delegation.objects.filter(user=self.request.user, status=2,
  1834. init_date__year=timezone.now().year).count()
  1835. x_axis = 'Initiated'
  1836. if initiated == 0:
  1837. x_axis = 'Inbox'
  1838. if x_axis == 'Initiated':
  1839. init_data = Delegation.objects.filter(user=self.request.user, status=2,
  1840. init_date__year=timezone.now().year). \
  1841. annotate(month=TruncMonth('init_date')).values('month'). \
  1842. annotate(monthly_count=Count('id'))
  1843. else:
  1844. init_data = Delegation.objects.filter(user=self.request.user, status=1,
  1845. init_date__year=timezone.now().year). \
  1846. annotate(month=TruncMonth('init_date')).values('month'). \
  1847. annotate(monthly_count=Count('id'))
  1848. init_data_array = ["None"] * 12
  1849. for exp in init_data:
  1850. init_data_array[exp['month'].date().month - 1] = exp['monthly_count']
  1851. completed_data = Delegation.objects.filter(user=self.request.user, status=0,
  1852. init_date__year=timezone.now().year). \
  1853. annotate(month=TruncMonth('finish_date')).values('month'). \
  1854. annotate(monthly_count=Count('id'))
  1855. complete_data = ["None"] * 12
  1856. for exp in completed_data:
  1857. complete_data[exp['month'].date().month - 1] = exp['monthly_count']
  1858. w_risk = completed_queryset.filter(Q(risk_date__lte=timezone.now()) & Q(due_date__gt=timezone.now())). \
  1859. annotate(month=TruncMonth('init_date')).values('month'). \
  1860. annotate(monthly_count=Count('id'))
  1861. b_risk = completed_queryset.filter(Q(risk_date__gt=timezone.now()) & Q(due_date__gt=timezone.now())). \
  1862. annotate(month=TruncMonth('init_date')).values('month'). \
  1863. annotate(monthly_count=Count('id'))
  1864. o_risk = completed_queryset.filter(Q(due_date__lt=timezone.now()) & Q(risk_date__lt=timezone.now())). \
  1865. annotate(month=TruncMonth('init_date')).values('month'). \
  1866. annotate(monthly_count=Count('id'))
  1867. overdue_risk_array = ["None"] * 12
  1868. within_risk_array = ["None"] * 12
  1869. before_risk_array = ["None"] * 12
  1870. for exp in w_risk:
  1871. within_risk_array[exp['month'].date().month - 1] = exp['monthly_count']
  1872. for exp in b_risk:
  1873. before_risk_array[exp['month'].date().month - 1] = exp['monthly_count']
  1874. for exp in o_risk:
  1875. overdue_risk_array[exp['month'].date().month - 1] = exp['monthly_count']
  1876. return Response({
  1877. 'pending': inbox_queryset.count(),
  1878. 'overdue': overdue_count,
  1879. 'completed': completed_count,
  1880. 'total': total,
  1881. 'query': query_count,
  1882. 'open_request': str(open_request) + '%',
  1883. 'approve_request': str(approve_count) + '%',
  1884. 'reject_request': str(reject_count) + '%',
  1885. 'query_request': str(requested_query_count) + '%',
  1886. 'recheck_request': str(recheck_count) + '%',
  1887. 'initiated_vs_completed': {
  1888. 'x_axis': x_axis,
  1889. 'graph_data': [
  1890. {
  1891. 'name': x_axis,
  1892. 'data': init_data_array
  1893. },
  1894. {
  1895. 'name': 'Completed',
  1896. 'data': complete_data
  1897. }
  1898. ]
  1899. },
  1900. 'histogram': [
  1901. {
  1902. 'name': 'Before Risk',
  1903. 'data': before_risk_array
  1904. },
  1905. {
  1906. 'name': 'Within Risk',
  1907. 'data': within_risk_array
  1908. },
  1909. {
  1910. 'name': 'Overdue Risk',
  1911. 'data': overdue_risk_array
  1912. }
  1913. ]
  1914. }, status=status.HTTP_201_CREATED)
  1915.  
  1916.  
  1917. class QueryVariableViewSet(CustomViewSetForQuerySet):
  1918. permission_classes = [GreenOfficeApiBasePermission]
  1919. permission_id = [1, ]
  1920. serializer_class = VariableSerializer
  1921. model = EForm
  1922.  
  1923. def list(self, request, *args, **kwargs):
  1924. project_id = self.request.query_params.get('project', None)
  1925. if project_id is None:
  1926. return Response({'Detail: project_id required'})
  1927. eform_content = self.model.objects.filter(project_id=project_id)
  1928. variable_list = []
  1929. for f in eform_content:
  1930. if f.variables_id is not None:
  1931. for elements in json.loads(f.variables_id):
  1932. elem_var = '@'+elements
  1933. if elem_var not in variable_list:
  1934. variable_list.append(elem_var)
  1935. return Response(variable_list)
  1936.  
  1937.  
  1938. class QueryInboxViewSet(CustomViewSetForQuerySet):
  1939. permission_classes = [GreenOfficeApiBasePermission]
  1940. permission_id = [3, 25, ]
  1941.  
  1942. def list(self, request, *args, **kwargs):
  1943. query_id = self.request.query_params.get('query_id', None)
  1944. if query_id is None:
  1945. return Response({'Detail: query_id required'})
  1946. try:
  1947. specified_query = AppQuery.objects.get(pk=query_id)
  1948. except AppQuery.DoesNotExist:
  1949. return Response({'Detail: no query exists with this query_id'})
  1950. obj_application = model_to_dict(specified_query.application)
  1951. step = specified_query.task.step
  1952. single_step = step.get(position=1)
  1953. if single_step.type == 0 and single_step.position == 1:
  1954. if single_step.eform is None:
  1955. return Response({'Detail': 'No eForm assigned.'})
  1956. if single_step.eform.content == '' or single_step.eform.content is None:
  1957. e_form = {}
  1958. else:
  1959. e_form = EFormPy(single_step.eform, specified_query.application).generate_form()
  1960. return Response({
  1961. 'query_id': specified_query.id,
  1962. 'query': specified_query.query,
  1963. 'asked_by': specified_query.user_from.get_full_name(),
  1964. 'application': obj_application,
  1965. 'task': specified_query.task.name,
  1966. 'eform': e_form,
  1967. 'type': 'query_view'
  1968. }, status=status.HTTP_201_CREATED)
  1969.  
  1970.  
  1971. class AppQuerySerializer(serializers.ModelSerializer):
  1972. user_from_name = serializers.StringRelatedField(source='user_from.get_full_name')
  1973. user_to_name = serializers.StringRelatedField(source='user_to.get_full_name')
  1974. app_number = serializers.StringRelatedField(source='application.number')
  1975. project_name = serializers.StringRelatedField(source='application.project.title')
  1976. comment_count = serializers.SerializerMethodField()
  1977.  
  1978. @staticmethod
  1979. def get_comment_count(obj):
  1980. return AppComment.objects.filter(application=obj.application.id).count()
  1981.  
  1982. class Meta:
  1983. model = AppQuery
  1984. fields = '__all__'
  1985.  
  1986.  
  1987. class AppQueryViewSet(CustomViewSetForQuerySet):
  1988. permission_classes = [GreenOfficeApiBasePermission]
  1989. serializer_class = AppQuerySerializer
  1990. pagination_class = LargeResultsSetPagination
  1991. queryset = AppQuery.objects.all()
  1992. model = AppQuery
  1993. permission_id = [3, 25, ]
  1994.  
  1995. def list(self, request, *args, **kwargs):
  1996. status = self.request.query_params.get('status', None)
  1997. user_id = self.request.query_params.get('user_id', None)
  1998. if status is None:
  1999. raise serializers.ValidationError({'Detail: status required Ex: ?status=todo/query/overall_query'})
  2000. if status == 'todo':
  2001. if user_id is None:
  2002. raise serializers.ValidationError({'Detail: no user_id given (?status=todo&user_id=1)'})
  2003. else:
  2004. to_user = User.objects.filter(pk=user_id)
  2005. if to_user.exists():
  2006. queryset = self.queryset.filter(user_to=to_user, is_answered=False).order_by('-id')
  2007. page = self.paginate_queryset(queryset)
  2008. if page is not None:
  2009. serializer = self.get_serializer(page, many=True)
  2010. return self.get_paginated_response(serializer.data)
  2011. #serializer = self.get_serializer(queryset, many=True)
  2012. #return Response(serializer.data)
  2013. else:
  2014. raise serializers.ValidationError({'Detail: Invalid user id given'})
  2015. elif status == 'query':
  2016. task_id = self.request.query_params.get('task', None)
  2017. application_id = self.request.query_params.get('application', None)
  2018. if user_id is None:
  2019. raise serializers.ValidationError({'Detail: no user_id given (?status=todo&user_id=1)'})
  2020. if task_id is None:
  2021. raise serializers.ValidationError({'Detail: no task id given'})
  2022. if application_id is None:
  2023. raise serializers.ValidationError({'Detail: no application id given'})
  2024. from_user = User.objects.filter(pk=user_id)
  2025. if not from_user.exists():
  2026. raise serializers.ValidationError({'Detail: Invalid user id given'})
  2027. application = Application.objects.filter(pk=application_id)
  2028. if not application.exists():
  2029. raise serializers.ValidationError({'Detail: No application exists with the provided application id'})
  2030. task = Task.objects.filter(pk=task_id)
  2031. if not task.exists():
  2032. raise serializers.ValidationError({'Detail: No task exists with the provided task id'})
  2033. queryset = self.queryset.filter(user_from=from_user, application=application, task=task).order_by('-id')
  2034. elif status == 'overall_query':
  2035. application_id = self.request.query_params.get('application', None)
  2036. if application_id is None:
  2037. raise serializers.ValidationError({'Detail: no application id given'})
  2038. application = Application.objects.filter(pk=application_id)
  2039. queryset = self.queryset.filter(application=application).order_by('-id')
  2040. serializer = self.get_serializer(queryset, many=True)
  2041. return Response(serializer.data)
  2042.  
  2043. def create(self, request, *args, **kwargs):
  2044. print(request.data.get("query", 'query'))
  2045. is_submit = request.data.get('is_submit', None)
  2046. if is_submit is None or not is_submit:
  2047. query = request.data.get('query', None)
  2048. application = request.data.get('application', None)
  2049. task = request.data.get('task', None)
  2050. user_from = request.data.get('user_from', None)
  2051. user_to = request.data.get('user_to', None)
  2052. if query is None or not query:
  2053. raise serializers.ValidationError({'detail': 'query required'})
  2054. if application is None or not application:
  2055. raise serializers.ValidationError({'detail': 'application required'})
  2056. if task is None or not task:
  2057. raise serializers.ValidationError({'detail': 'task required'})
  2058. if user_from is None or not user_from:
  2059. raise serializers.ValidationError({'detail': 'user_from required'})
  2060. if user_to is None or not user_to:
  2061. raise serializers.ValidationError({'detail': 'user_to required'})
  2062.  
  2063. expiry_date = request.data.get('expiry_date', None)
  2064. if expiry_date is not None:
  2065. if "/" not in expiry_date:
  2066. raise serializers.ValidationError(
  2067. {'detail': 'Please provide a valid format of activation_date (yyyy/mm/dd)'})
  2068. expiry_date = expiry_date.replace("/", "-")
  2069. expiry_date_date = parse_date(expiry_date)
  2070. app_query = self.model(query=query, user_from=User.objects.get(pk=user_from), user_to=User.objects.get(pk=user_to),
  2071. application=Application.objects.get(pk=application), task=Task.objects.get(pk=task), expiry_date=expiry_date_date)
  2072. else:
  2073. app_query = self.model(query=query, user_from=User.objects.get(pk=user_from), user_to=User.objects.get(pk=user_to),
  2074. application=Application.objects.get(pk=application), task=Task.objects.get(pk=task))
  2075. app_query.save()
  2076. queryset = self.model.objects.filter(pk=app_query.pk)
  2077. serializer = self.get_serializer(list(queryset), many=True)
  2078. return Response(serializer.data, status=status.HTTP_201_CREATED)
  2079. else:
  2080. if is_submit != "1":
  2081. raise serializers.ValidationError({'detail': 'provide is_submit=1 for submitting a query answer'})
  2082. else:
  2083. query_id = request.data.get('query_id')
  2084. query_answer = request.data.get('answer')
  2085. if query_id is None or not query_id:
  2086. raise serializers.ValidationError({'detail': 'query_id required'})
  2087. if query_answer is None or not query_answer:
  2088. raise serializers.ValidationError({'detail': 'answer required'})
  2089. try:
  2090. specified_query = self.model.objects.get(pk=query_id)
  2091. except self.model.DoesNotExist:
  2092. raise serializers.ValidationError({'detail': 'no query with query_id exists'})
  2093. if specified_query.is_answered:
  2094. raise serializers.ValidationError({'detail': 'This query is already answered'})
  2095. specified_query.query_answer = query_answer
  2096. specified_query.is_answered = True
  2097. specified_query.answer_date = datetime.now().date()
  2098. specified_query.save()
  2099. return Response({'detail: Query answer submitted successfully'}, status=status.HTTP_201_CREATED)
  2100.  
  2101.  
  2102. class AppCommentSerializer(serializers.ModelSerializer):
  2103. task_name = serializers.ReadOnlyField(source='task.name')
  2104. application_number = serializers.ReadOnlyField(source='application.number')
  2105. user_name = serializers.ReadOnlyField(source='user.get_full_name')
  2106.  
  2107. class Meta:
  2108. model = AppComment
  2109. fields = ['id', 'user', 'application', 'task', 'comment', 'date', 'task_name', 'application_number',
  2110. 'user_name']
  2111.  
  2112.  
  2113. class AppCommentView(CustomViewSetForQuerySet):
  2114. permission_classes = [GreenOfficeApiBasePermission]
  2115. serializer_class = AppCommentSerializer
  2116. pagination_class = LargeResultsSetPagination
  2117. queryset = AppComment.objects.all()
  2118. model = AppComment
  2119. model = AppComment
  2120. permission_id = [3, 25, ]
  2121.  
  2122. def list(self, request, *args, **kwargs):
  2123. app_id = self.request.query_params.get('app_id')
  2124.  
  2125. if app_id is None:
  2126. queryset = self.queryset.all()
  2127. else:
  2128. queryset = self.queryset.filter(application=app_id).order_by('date')
  2129. app = Application.objects.filter(id=app_id)
  2130.  
  2131. if not app.count():
  2132. raise serializers.ValidationError("Please provide correct Application ID")
  2133.  
  2134. page = self.paginate_queryset(queryset)
  2135. if page is not None:
  2136. serializer = self.get_serializer(page, many=True)
  2137. return self.get_paginated_response(serializer.data)
  2138.  
  2139. serializer = self.get_serializer(queryset, many=True)
  2140. return Response(serializer.data)
  2141.  
  2142.  
  2143. class DelegationReportSerializer(serializers.ModelSerializer):
  2144. class Meta:
  2145. model = Delegation
  2146. fields = '__all__'
  2147.  
  2148.  
  2149. class DelegationReportViewset(CustomViewSetForQuerySet):
  2150. permission_classes = [GreenOfficeApiBasePermission]
  2151. serializer_class = DelegationSerializer
  2152. pagination_class = LargeResultsSetPagination
  2153. queryset = Delegation.objects.all()
  2154. http_method_names = ['get']
  2155. model = Delegation
  2156. search_keywords = ['application__number', 'project__title', 'task__name', 'process', 'user__first_name']
  2157. change_keys = {
  2158. 'app_id': 'application__id',
  2159. 'app_number': 'application__number',
  2160. 'project_name': 'project__title',
  2161. 'task_name': 'task__name',
  2162. 'priority': 'task__priority',
  2163. 'user': 'first_name',
  2164. # 'due_date': 'task__init_date',
  2165. }
  2166. permission_id = [3, 25, ]
  2167.  
  2168. def list(self, request, *args, **kwargs):
  2169. operation = self.request.query_params.get('operation', None)
  2170. user = self.request.query_params.get('user', None)
  2171. wf_status = self.request.query_params.get('status', None)
  2172. if self.model is None:
  2173. raise AssertionError(
  2174. 'CustomViewSetForQuerySet need to include a model')
  2175.  
  2176. queryset = self.model.objects.filter()
  2177. search = self.request.query_params.get('search[value]', None)
  2178. column_id = self.request.query_params.get('order[0][column]', None)
  2179. date_from = (self.request.query_params.get('columns[1][search][value]', None))
  2180. date_to = (self.request.query_params.get('columns[2][search][value]', None))
  2181. # search
  2182. if search and search is not None and self.search_keywords is not None:
  2183. search_logic = []
  2184.  
  2185. for entity in self.search_keywords:
  2186. search_logic.append(Q(**{entity + '__icontains': search}))
  2187.  
  2188. queryset = queryset.filter(reduce(operator.or_, search_logic))
  2189.  
  2190. # dateRange search
  2191. if date_from and date_from is not None:
  2192. if date_to and date_to is not None:
  2193. queryset = queryset.filter(init_date__range=[date_from, date_to])
  2194. # ascending or descending order
  2195. if column_id and column_id is not None:
  2196. column_name = self.request.query_params.get(
  2197. 'columns[' + column_id + '][data]', None)
  2198.  
  2199. if self.change_keys is not None:
  2200. for key in self.change_keys:
  2201. if column_name == key:
  2202. column_name = self.change_keys.get(key)
  2203.  
  2204. if column_name != '':
  2205. order_dir = '-' if self.request.query_params.get(
  2206. 'order[0][dir]') == 'desc' else ''
  2207. queryset = queryset.order_by(order_dir + column_name)
  2208.  
  2209. if operation is not None and user is not None:
  2210. if operation == "activity":
  2211. queryset = queryset.filter(user_id=user)
  2212. # data = self.get_serializer(queryset, many=True)
  2213. else:
  2214. queryset = []
  2215. if operation is not None and wf_status is not None:
  2216. if operation == "activity":
  2217. queryset = queryset.filter(status=wf_status)
  2218. # data = self.get_serializer(queryset, many=True)
  2219. else:
  2220. queryset = []
  2221. else:
  2222. queryset = queryset.filter()
  2223.  
  2224. page = self.paginate_queryset(queryset)
  2225. if page is not None:
  2226. serializer = self.get_serializer(page, many=True)
  2227. return self.get_paginated_response(serializer.data)
  2228.  
  2229. serializer = self.get_serializer(queryset, many=True)
  2230. return Response(serializer.data)
  2231.  
  2232.  
  2233. class ReassignmentSerializer(serializers.ModelSerializer):
  2234. task_name = serializers.StringRelatedField(source='task.name')
  2235. task = serializers.StringRelatedField(source='task.id')
  2236. task_element_id = serializers.StringRelatedField(source='task.element_id')
  2237. project_category = serializers.StringRelatedField(source='project.category.name')
  2238. project_name = serializers.StringRelatedField(source='project.title')
  2239. app_id = serializers.StringRelatedField(source='application.id')
  2240. app_number = serializers.StringRelatedField(source='application.number')
  2241. user = serializers.StringRelatedField(source='user.get_full_name')
  2242. sent_by = serializers.StringRelatedField(source='sent_by.get_full_name')
  2243.  
  2244. class Meta:
  2245. model = Delegation
  2246. fields = '__all__'
  2247.  
  2248.  
  2249. class ReassignmentViewSet(CustomViewSetForQuerySet):
  2250. permission_classes = [GreenOfficeApiBasePermission]
  2251. serializer_class = ReassignmentSerializer
  2252. pagination_class = LargeResultsSetPagination
  2253. model = Delegation
  2254. search_keywords = ['application__number', 'project__title', 'task__name', 'process', 'user__first_name']
  2255. change_keys = {
  2256. 'app_id': 'application__id',
  2257. 'app_number': 'application__number',
  2258. 'project_name': 'project__title',
  2259. 'task_name': 'task__name',
  2260. 'priority': 'task__priority',
  2261. 'user': 'first_name',
  2262. # 'due_date': 'task__init_date',
  2263. }
  2264. permission_id = [2, ]
  2265.  
  2266. def update(self, request, *args, **kwargs):
  2267. instance = new_instance = self.get_object()
  2268.  
  2269. if not request.data.get('user'):
  2270. raise serializers.ValidationError({'detail': 'You must provide a user id'})
  2271.  
  2272. try:
  2273. user = User.objects.get(pk=request.data.get('user'))
  2274. except User.DoesNotExist:
  2275. raise serializers.ValidationError({'detail': 'User with this pk was not found'})
  2276.  
  2277. try:
  2278. instance.task.user.get(pk=request.data.get('user'))
  2279. except User.DoesNotExist:
  2280. raise serializers.ValidationError({'detail': 'Please assign this user to the task.'})
  2281.  
  2282. partial = kwargs.pop('partial', False)
  2283. instance.save()
  2284. instance.status = 4
  2285. instance.save()
  2286. new_instance.pk = None
  2287. new_instance.user = user
  2288. new_instance.status = 1
  2289. new_instance.save()
  2290.  
  2291. serializer = self.get_serializer(instance, data=request.data, partial=partial)
  2292. serializer.is_valid(raise_exception=True)
  2293. self.perform_update(serializer)
  2294.  
  2295. if getattr(instance, '_prefetched_objects_cache', None):
  2296. # If 'prefetch_related' has been applied to a queryset, we need to
  2297. # refresh the instance from the database.
  2298. instance = self.get_object()
  2299. serializer = self.get_serializer(instance)
  2300.  
  2301. return Response(serializer.data)
  2302.  
  2303. def destroy(self, request, *args, **kwargs):
  2304. pass
  2305.  
  2306. def create(self, request, *args, **kwargs):
  2307. pass
  2308.  
  2309. def retrieve(self, request, *args, **kwargs):
  2310. pass
  2311.  
  2312. def list(self, request, *args, **kwargs):
  2313. if self.model is None:
  2314. raise AssertionError(
  2315. 'CustomViewSetForQuerySet need to include a model')
  2316.  
  2317. queryset = self.model.objects.filter(project__supervisors=self.request.user, status=1)
  2318. search = self.request.query_params.get('search[value]', None)
  2319. column_id = self.request.query_params.get('order[0][column]', None)
  2320.  
  2321. # search
  2322. if search and search is not None and self.search_keywords is not None:
  2323. search_logic = []
  2324.  
  2325. for entity in self.search_keywords:
  2326. search_logic.append(Q(**{entity + '__icontains': search}))
  2327.  
  2328. queryset = queryset.filter(reduce(operator.or_, search_logic))
  2329.  
  2330. # ascending or descending order
  2331. if column_id and column_id is not None:
  2332. column_name = self.request.query_params.get(
  2333. 'columns[' + column_id + '][data]', None)
  2334.  
  2335. if self.change_keys is not None:
  2336. for key in self.change_keys:
  2337. if column_name == key:
  2338. column_name = self.change_keys.get(key)
  2339.  
  2340. if column_name != '':
  2341. order_dir = '-' if self.request.query_params.get(
  2342. 'order[0][dir]') == 'desc' else ''
  2343. queryset = queryset.order_by(order_dir + column_name)
  2344.  
  2345. page = self.paginate_queryset(queryset)
  2346. if page is not None:
  2347. serializer = self.get_serializer(page, many=True)
  2348. return self.get_paginated_response(serializer.data)
  2349.  
  2350. serializer = self.get_serializer(queryset, many=True)
  2351. return Response(serializer.data)
  2352.  
  2353.  
  2354. class WeekendSerializer(serializers.ModelSerializer):
  2355. def __init__(self, *args, **kwargs):
  2356. many = kwargs.pop('many', True)
  2357. super(WeekendSerializer, self).__init__(many=many, *args, **kwargs)
  2358.  
  2359. class Meta:
  2360. model = Weekend
  2361. fields = '__all__'
  2362.  
  2363.  
  2364. class WeekendViewSet(CustomViewSetForQuerySet):
  2365. permission_classes = [GreenOfficeApiBasePermission]
  2366. serializer_class = WeekendSerializer
  2367. model = Weekend
  2368. search_keywords = []
  2369. permission_id = [23, ]
  2370. http_method_names = ['get', 'post']
  2371.  
  2372. def create(self, request, *args, **kwargs):
  2373. data = [dict(t) for t in set(tuple(item.items()) for item in request.data)]
  2374. serializer = self.get_serializer(data=data, many=True)
  2375. serializer.is_valid(raise_exception=True)
  2376. Weekend.objects.all().delete()
  2377. self.perform_create(serializer)
  2378. headers = self.get_success_headers(serializer.data)
  2379. return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
  2380.  
  2381.  
  2382. class HolidaySerializer(serializers.ModelSerializer):
  2383. class Meta:
  2384. model = Holiday
  2385. fields = '__all__'
  2386.  
  2387.  
  2388. class HolidayViewSet(CustomViewSetForQuerySet):
  2389. permission_classes = [GreenOfficeApiBasePermission]
  2390. serializer_class = HolidaySerializer
  2391. pagination_class = LargeResultsSetPagination
  2392. model = Holiday
  2393. search_keywords = ['description']
  2394. permission_id = [23, ]
  2395. http_method_names = ['get', 'post', 'delete']
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement