class AddressViewSet(viewsets.ModelViewSet): permission_classes = (AddressAccessPolicy,) queryset = Address.objects.all() serializer_class = AddressSerializer @swagger_auto_schema( tags=['addresses'], operation_description="Method to get a list of task Addresses", responses=base_swagger_responses( 204, 401, 403, kparams={200: TaskItemSerializer(many=True)} ) ) def list(self, request, *args, **kwargs): """ Return a list of task Items. """ return super().list(request, *args, **kwargs) @swagger_auto_schema( tags=['addresses'], operation_description="Method to get task item address.", responses=base_swagger_responses( 400, 401, 403, 404, kparams={200: TaskItemSerializer} ) ) def retrieve(self, request, pk=None, *args, **kwargs): """ Retrieve task item. """ return super().retrieve(request, pk, *args, **kwargs)
class UserGroupAccess(APIView): @swagger_auto_schema(tags=['access'], operation_description="", responses=base_swagger_responses( 204, 401, 403, 404, kparams={200: GroupSerializer(many=True)})) def get(self, request, user_id): user = get_object_or_404(User, pk=user_id) serializer = GroupSerializer(user.groups.all(), many=True) return Response(serializer.data, 200) @swagger_auto_schema(tags=['access'], operation_description="", request_body=UserGroupAccessSerializer, responses=base_swagger_responses( 200, 400, 401, 403, 404)) def put(self, request, user_id): user = get_object_or_404(User, pk=user_id) serializer = UserGroupAccessSerializer(user, data=request.data, partial=True) if serializer.is_valid(): user.groups.set(serializer.validated_data['groups']) return Response(serializer.data, 200) return Response(serializer.errors, 400)
class ReviewViewSet(CustomSerializerClassMixin, viewsets.ModelViewSet): queryset = Review.objects.all() serializer_class = WorkerCustomerReviewSerializer permission_classes = (ReviewAccessPolicy,) action_serializers = { 'update': ReviewUpdateSerializer } @swagger_auto_schema( tags=['review'], operation_description="Method to get a list of reviews by worker.", manual_parameters=[ openapi.Parameter( 'worker', openapi.IN_QUERY, description="List of reviews by worker", type=openapi.TYPE_INTEGER ) ], responses=base_swagger_responses( 204, 401, 403, kparams={200: WorkerCustomerReviewSerializer(many=True)} ) ) def list(self, request, *args, **kwargs): worker_id = request.GET.get('worker') if worker_id: worker = Worker.objects.get(id=worker_id) serializer = WorkerCustomerReviewSerializer( worker.worker_reviews.all(), many=True ) if serializer.data: return Response(serializer.data, status=200) return Response(serializer.data, status=204) reviews = CustomerReview.objects.filter( worker__in=Worker.objects.values_list('id', flat=True) ) serializer = WorkerCustomerReviewSerializer(reviews, many=True) if serializer.data: return Response(serializer.data, status=200) return Response(serializer.data, status=204) @swagger_auto_schema( tags=['review'], operation_description="Creating a new review for worker", responses=base_swagger_responses(201, 400, 401, 403) ) def create(self, request, *args, **kwargs): return super().create(request, *args, **kwargs) @swagger_auto_schema( tags=['review'], operation_description="Creating a new review for worker", responses=base_swagger_responses(200, 400, 401, 403) ) def update(self, request, *args, **kwargs): return super().update(request, *args, **kwargs)
class ProductViewSet(viewsets.ModelViewSet): permission_classes = (ProductAccessPolicy,) queryset = Product.objects.all() serializer_class = ProductSerializer @swagger_auto_schema( tags=['products'], operation_description="Creating a new product", responses=base_swagger_responses(201, 400, 401, 403) ) def create(self, request, *args, **kwargs): """ Create new product. """ if request.POST: data = json.loads(request.POST.get('data')) file = request.FILES.get('file') serializer = self.serializer_class(data=data) if serializer.is_valid(): if file: url = upload_to_backet(file) serializer.validated_data['image_url'] = url serializer.save() return Response(serializer.data, 201) return Response(serializer.errors, 400) return super().create(request, *args, **kwargs) @swagger_auto_schema( tags=['products'], operation_description="Updating a product item object in the system.", responses=base_swagger_responses(200, 400, 401, 403, 404) ) def update(self, request, pk=None, *args, **kwargs): """ Update task item. """ if request.POST: place = self.get_object() data = json.loads(request.POST.get('data')) file = request.FILES.get('file') serializer = self.serializer_class(place, data=data) if serializer.is_valid(): if file: url = upload_to_backet(file) serializer.validated_data['image_url'] = url serializer.save() return Response(serializer.data, 200) return Response(serializer.errors, 400) return super().update(request, pk, *args, **kwargs)
class UserViewSet(viewsets.ModelViewSet): queryset = UserModel.objects.all() model = User serializer_class = UserSerializer permission_classes = (UserAccessPolicy,) @swagger_auto_schema( tags=['users'], operation_description="Creating a new user", responses=base_swagger_responses(201, 400, 401, 403) ) def create(self, request, *args, **kwargs): """ Create new service. """ return super().create(request, *args, **kwargs) @swagger_auto_schema( tags=['users'], operation_description="Method to get place object.", responses=base_swagger_responses( 400, 401, 403, 404, kparams={200: UserSerializer} ) ) def retrieve(self, request, pk=None, *args, **kwargs): """ Retrieve place. """ return super().retrieve(request, pk, *args, **kwargs) @swagger_auto_schema( tags=['users'], operation_description="Block user", request_body=UserBlockSerializer, responses=base_swagger_responses(200, 401, 403, 404) ) @action(methods=["PATCH"], detail=True) def block(self, request, pk, *args, **kwargs): user = get_object_or_404(User, pk=pk) serializer = UserBlockSerializer( user, data=request.data, partial=True ) if serializer.is_valid(): serializer.save() return Response(serializer.data, 200) return Response(serializer.errors, 400)
class AccessGroupView(APIView): @swagger_auto_schema(tags=['access'], operation_description="", responses=base_swagger_responses( 204, 401, 403, kparams={200: GroupSerializer(many=True)})) def get(self, request): groups = Group.objects.all() serializer = GroupSerializer(groups, many=True) return Response(serializer.data, 200)
class TaskList(APIView): permission_classes = (TaskListAccessPolicy,) @swagger_auto_schema( tags=['Reports'], operation_description="List task objects", responses=base_swagger_responses( 204, 401, 403, kparams={200: ReportTaskSerializer(many=True)} ) ) def get(self, request): """ List of tasks. """ data = Task.objects.all() serializer = ReportTaskSerializer(data, many=True) if serializer.data: return Response(serializer.data, 200) return Response(serializer.data, 204)
class TaskRetrieve(APIView): permission_classes = (TaskListAccessPolicy,) @swagger_auto_schema( tags=['Reports'], operation_description="Object of task", responses=base_swagger_responses( 400, 401, 403, 404, kparams={200: ReportTaskReviewSerializer()} ) ) def get(self, request, id): """ Retrieve of task. """ review = get_object_or_404(Task, pk=id) serializer = ReportTaskReviewSerializer(review) if serializer.data: return Response(serializer.data, 200) return Response(serializer.errors, 403)
class ReviewRetrieve(APIView): permission_classes = (ReviewRetrieveAccessPolicy,) @swagger_auto_schema( tags=['Reports'], operation_description="Object of review / complaints of the customer", responses=base_swagger_responses( 400, 401, 403, 404, kparams={200: ReportCustomerReviewSerializer} ) ) def get(self, request, review_id): """ Retrieve of review. """ review = get_object_or_404(Review, pk=review_id) serializer = ReportCustomerReviewSerializer(review.customer_review) if serializer.data: return Response(serializer.data, 200) return Response(serializer.data, 204)
class ReviewList(APIView): permission_classes = (ReviewListAccessPolicy,) @swagger_auto_schema( tags=['Reports'], operation_description="List objects of all reviews / complaints of " "custom", responses=base_swagger_responses( 204, 401, 403, kparams={200: ReportCustomerReviewSerializer(many=True)} ) ) def get(self, request): """ List of reviews. """ data = CustomerReview.objects.all() serializer = ReportCustomerReviewSerializer(data, many=True) if serializer.data: return Response(serializer.data, 200) return Response(serializer.data, 204)
class CustomerTasks(APIView): permission_classes = (CustomerTasksAccessPolicy,) @swagger_auto_schema( tags=['Reports'], operation_description="List of task objects of a specific customer", responses=base_swagger_responses( 204, 401, 403, kparams={200: ReportCustomerTasksSerializer(many=True)} ) ) def get(self, request, customer_id): """ List of tasks. """ customer = get_object_or_404(Customer, pk=customer_id) tasks = customer.tasks data = {'customer': customer, 'tasks': tasks.all()} serializer = ReportCustomerTasksSerializer(data) if serializer.data: return Response(serializer.data, 200) return Response(serializer.data, 204)
class CustomAuthToken(ObtainAuthToken): @swagger_auto_schema(tags=['auth'], request_body=ObtainAuthToken.serializer_class, operation_description="Response auth token", responses=base_swagger_responses(200, 400, 401, 403)) def post(self, request, *args, **kwargs): username = request.data.get("username") password = request.data.get("password") if not password or password != "0000": return Response({"invalid password"}, status.HTTP_400_BAD_REQUEST) if re.match(r'^\+?1?\d{9,15}$', username): user, _ = User.objects.get_or_create(phone_number=username) token, _ = Token.objects.get_or_create(user=user) try: customer = Customer.objects.get(user=user).pk except Customer.DoesNotExist: customer = '' worker = Worker.objects.filter(user=user).first() if worker: worker = worker.pk else: worker = '' else: return Response({"invalid phone number"}, status.HTTP_400_BAD_REQUEST) return Response( { 'token': token.key, 'user_id': user.pk, 'phone_number': user.phone_number, 'customer_id': customer, 'worker_id': worker, 'is_staff': user.is_staff, }, status.HTTP_200_OK)
class CustomersViewSet(viewsets.ModelViewSet): queryset = Customer.objects.all() serializer_class = CustomerSerializer # authentication_classes = (TokenAuthentication,) model = Customer permission_classes = (CustomerAccessPolicy,) parser_classes = (JSONParser, FormParser, MultiPartParser) @swagger_auto_schema( tags=['Customers'], operation_description="Method to get a list of customers" " within your access", responses=base_swagger_responses( 204, 401, 403, kparams={200: CustomerSerializer(many=True)} ) ) def list(self, request, *args, **kwargs): """ Return a list of customers. """ return super().list(request, *args, **kwargs) @swagger_auto_schema( tags=['Customers'], operation_description="Creating a new user in the system as customer", responses=base_swagger_responses(201, 400, 401, 403) ) def create(self, request, *args, **kwargs): """ Create new customer. """ return super().create(request, *args, **kwargs) @swagger_auto_schema( tags=['Customers'], operation_description="Method to get customer object. This user " "method is installed in the system as the " "customer of the service.", responses=base_swagger_responses( 400, 401, 403, 404, kparams={200: CustomerSerializer} ) ) def retrieve(self, request, pk=None, *args, **kwargs): """ Retrieve customer. """ return super().retrieve(request, pk, *args, **kwargs) @swagger_auto_schema( tags=['Customers'], operation_description="Updating a customer object in the system", responses=base_swagger_responses(200, 400, 401, 403, 404) ) def update(self, request, pk=None, *args, **kwargs): """ Update customer. """ return super().update(request, pk, *args, **kwargs) @swagger_auto_schema( tags=['Customers'], operation_description="Updating individual customer fields in the " "system", responses=base_swagger_responses(200, 400, 401, 403, 404) ) def partial_update(self, request, pk=None, *args, **kwargs): """ Partial customer update. """ return super().partial_update(request, pk, *args, **kwargs) @swagger_auto_schema( tags=['Customers'], operation_description="Removing a customer record from the system", responses=base_swagger_responses(204, 401, 403, 404) ) def destroy(self, request, pk=None, *args, **kwargs): """ Delete customer. """ return super().destroy(request, pk, *args, **kwargs)
class ReportHomeStatistics(APIView): permission_classes = (ReportHomeStatisticsChartAccessPolicy,) @swagger_auto_schema( tags=['Reports Chart'], operation_description="", manual_parameters=[ openapi.Parameter( 'period', openapi.IN_QUERY, description="Type of Period (day, week, month, year)", type=openapi.TYPE_STRING, default='day' ) ], responses=base_swagger_responses( 204, 401, 403, kparams={200: ReportHomesStatisticsSerializer(many=True)} ) ) def get(self, request): period = request.GET.get('period', 'year') # ---==== WORKERS ====--- # workers_statistics = DateTimeStatistic( Worker.objects, 'user__date_joined', 'date_joined', period, 'count', 'id' ) workers_statistics.get_data() current_count = workers_statistics.qs.count() chart_data = workers_statistics.get_chart_data() qs_table = workers_statistics.qs.values('user__first_name').annotate( profit=Sum('tasks__delivery_cost') ).order_by('profit')[:5] qs_table = sorted(qs_table, key=lambda t: t['profit'] is not None) workers_statistics.is_prev = True prev_count = workers_statistics.qs.count() ratio = calculate_percentage_of_number(prev_count, current_count) table = [] qs_table.reverse() for x in qs_table: table.append([{'key': k, 'value': v} for k, v in x.items()]) # TODO: refactoring, outgoing to templates workers_chart = { 'label': 'Workers', 'data': chart_data['count'].values(), 'backgroundColor': '#3BAFDA', 'borderColor': 'danger', 'borderWidth': 1 } worker = { "name": 'Workers', "data": { "values": {"count": current_count}, "ratio": ratio, 'datasets': [workers_chart], "table": table } } # # ---==== CUSTOMERS ====--- # customers_statistics = DateTimeStatistic( Customer.objects, 'user__date_joined', 'date_joined', period, 'count', 'id' ) customers_statistics.get_data() current_count = customers_statistics.qs.count() chart_data = customers_statistics.get_chart_data() qs_table = customers_statistics.qs.values('user__first_name').annotate( profit=Sum('tasks__delivery_cost') ).order_by('profit')[:5] qs_table = sorted(qs_table, key=lambda t: t['profit'] is not None) customers_statistics.is_prev = True prev_count = customers_statistics.qs.count() ratio = calculate_percentage_of_number(prev_count, current_count) table = [] qs_table.reverse() for x in qs_table: table.append([{'key': k, 'value': v} for k, v in x.items()]) # TODO: refactoring, outgoing to templates customer_chart = { 'label': 'Customers', 'data': chart_data['count'].values(), 'backgroundColor': '#DA4453', 'borderColor': 'danger', 'borderWidth': 1 } customer = { "name": 'Customers', "data": { "values": {"count": current_count}, "ratio": ratio, 'datasets': [customer_chart], "table": table } } # # ---==== CONVERSION ====--- # conversion_statistics = DateTimeStatistic( Task.objects, 'created_at', 'created_at', period, 'sum', 'delivery_cost' ) conversion_statistics.get_data() current_count = conversion_statistics.qs.count() ready_count = conversion_statistics.qs.filter(status='READY').count() conversion = calculate_conversion(ready_count, current_count) chart_data = conversion_statistics.get_chart_data() qs_table = conversion_statistics.qs.values('worker').annotate( total=Sum('delivery_cost')).order_by('total')[:5] qs_table = sorted(qs_table, key=lambda t: t['total'] is not None) conversion_statistics.is_prev = True prev_count = conversion_statistics.qs.count() ratio = calculate_percentage_of_number(prev_count, current_count) table = [] # qs_table.reverse() for x in qs_table: table.append([{'key': k, 'value': v} for k, v in x.items()]) # TODO: refactoring, outgoing to templates conversion_chart = { 'label': 'Conversion', 'data': chart_data['count'].values(), 'backgroundColor': '#20C997', 'borderColor': 'danger', 'borderWidth': 1 } conversion = { "name": 'Conversion', "data": { "values": {"count": conversion}, "ratio": ratio, 'datasets': [conversion_chart], "table": table } } # # ---==== TOTAL, AVG ====--- # profit = DateTimeStatistic( Task.objects, 'created_at', 'created_at', period, {'avg': Avg('delivery_cost'), 'total': Sum('delivery_cost')}, 'delivery_cost' ) data = profit.get_data() total = data[0]['total'] if data else 0 avg = data[0]['avg'] if data else 0 chart_data = profit.get_chart_data() qs_table = profit.qs.values('worker')\ .annotate(total=Sum('delivery_cost'), avg=Avg('delivery_cost'))\ .order_by('total') qs_table = sorted(qs_table, key=lambda t: t['total'] is not None) profit.is_prev = True aggr_prev = profit.qs.filter(status='READY').values('worker')\ .annotate(total=Sum('delivery_cost')).first() prev_total = aggr_prev['total'] if aggr_prev else 0 ratio = calculate_percentage_of_number(prev_total, total) \ if prev_total and data else 0 table = [] qs_table.reverse() for x in qs_table: table.append([{'key': k, 'value': v} for k, v in x.items()]) # TODO: refactoring, outgoing to templates conversion_chart_avg = { 'label': 'AVG', 'data': chart_data['avg'].values(), 'backgroundColor': '#CCCCCC', 'borderColor': 'danger', 'borderWidth': 1 } conversion_chart_total = { 'label': 'Profit', 'data': chart_data['total'].values(), 'backgroundColor': '#F6BB42', 'borderColor': 'danger', 'borderWidth': 1 } avg_sum = { "name": 'Profit', "data": { "values": {"total": total, "avg": avg}, "ratio": ratio, 'datasets': [conversion_chart_total, conversion_chart_avg], "table": table } } serializer = ReportHomesStatisticsSerializer( {'labels': profit.labels, 'workers': worker, 'customers': customer, 'conversion': conversion, 'profit': avg_sum} ) return Response(serializer.data, 200)
class ReportWorkerChart(APIView): permission_classes = (ReportWorkerChartAccessPolicy,) @swagger_auto_schema( tags=['Reports Chart'], operation_description="The method returns an aggregated data object, " "Worker object by period.", manual_parameters=[ openapi.Parameter( 'period', openapi.IN_QUERY, description="Type of Period (day, week, month, year)", type=openapi.TYPE_STRING, default='day' ), openapi.Parameter( 'types', openapi.IN_QUERY, description="Type of Aggregation Schedules Required " "(profit, avg)", type=openapi.TYPE_ARRAY, items=openapi.Items(type=openapi.TYPE_STRING), ), ], responses=base_swagger_responses( 204, 401, 403, kparams={200: ReportChartStatisticSerializer(many=True)} ) ) def get(self, request, worker_id): worker = get_object_or_404(Worker, id=worker_id) period = request.GET.get('period', 'day') types = request.GET.get('types', 'profit,avg') types = types.split(',') labels = None datasets = [] type_ = 'profit' if type_ in types: qs = DateTimeStatistic( worker.tasks, 'created_at', 'created_at', period, 'sum', 'delivery_cost' ) result = qs.get_chart_data() # TODO: refactoring, outgoing to templates dataset = { 'label': type_, 'data': result['count'].values(), 'backgroundColor': '#ffc1079c', 'borderColor': 'danger', 'borderWidth': 1 } datasets.append(dataset) labels = qs.labels type_ = 'avg' if type_ in types: qs = DateTimeStatistic( worker.tasks, 'created_at', 'created_at', period, 'avg', 'delivery_cost' ) result = qs.get_chart_data() # TODO: refactoring, outgoing to templates dataset = { 'label': type_, 'data': result['count'].values(), 'backgroundColor': '#3bafdac7', 'borderColor': 'danger', 'borderWidth': 1 } datasets.append(dataset) labels = qs.labels if not labels: return Response( {"type": "No such type {0}".format(types)}, 403 ) serializer = ReportChartStatisticSerializer( {'labels': labels, 'datasets': datasets} ) if serializer.data: return Response(serializer.data, 200) return Response(serializer.data, 204)
class ReportTasksChart(APIView): permission_classes = (ReportTasksChartAccessPolicy,) @swagger_auto_schema( tags=['Reports Chart'], operation_description="The method returns an aggregated data object, " "Task entities by period.", manual_parameters=[ openapi.Parameter( 'period', openapi.IN_QUERY, description="Type of Period (day, week, month, year)", type=openapi.TYPE_STRING, default='day' ), openapi.Parameter( 'types', openapi.IN_QUERY, description="Type of Aggregation Schedules Required " "(ready, all)", type=openapi.TYPE_ARRAY, items=openapi.Items(type=openapi.TYPE_STRING), ), ], responses=base_swagger_responses( 204, 401, 403, kparams={200: ReportChartStatisticSerializer(many=True)} ) ) def get(self, request): period = request.GET.get('period', 'day') types = request.GET.get('types', 'ready,all') types = types.split(',') labels = None datasets = [] type_ = 'ready' if type_ in types: values_expression = Case( When(status=type_.upper(), then='status') ) qs = DateTimeStatistic( Task.objects, 'created_at', 'created_at', period, 'count', values_expression ) result = qs.get_chart_data() # TODO: refactoring, outgoing to templates dataset = { 'label': type_, 'data': result['count'].values(), 'backgroundColor': '#3bafdac7', 'borderColor': 'info', 'borderWidth': 1 } datasets.append(dataset) labels = qs.labels type_ = 'all' if type_ in types: qs = DateTimeStatistic( Task.objects, 'created_at', 'created_at', period, 'count', 'id' ) result = qs.get_chart_data() # TODO: refactoring, outgoing to templates dataset = { 'label': type_, 'data': result['count'].values(), 'backgroundColor': '#ffc1079c', 'borderColor': 'danger', 'borderWidth': 1 } datasets.append(dataset) labels = qs.labels if not labels: return Response( {"type": "not one of the passed types is acceptable {0}". format(types)}, 403 ) serializer = ReportChartStatisticSerializer( {'labels': labels, 'datasets': datasets} ) if serializer.data: return Response(serializer.data, 200) return Response(serializer.data, 204)
class ReportCustomersChart(APIView): permission_classes = [ReportCustomersChartAccessPolicy, ] @swagger_auto_schema( tags=['Reports Chart'], operation_description="The method displays aggregated data for " "periods.", manual_parameters=[ openapi.Parameter( 'period', openapi.IN_QUERY, description="Type of Period (day, week, month, year)", type=openapi.TYPE_STRING, default='day' ), openapi.Parameter( 'types', openapi.IN_QUERY, description="Type of Aggregation Schedules Required " "(registered, profit, avg)", type=openapi.TYPE_ARRAY, items=openapi.Items(type=openapi.TYPE_STRING), ), ], responses=base_swagger_responses( 204, 401, 403, kparams={200: ReportChartStatisticSerializer()} ) ) def get(self, request): period = request.GET.get('period', 'day') types = request.GET.get('types', 'registered,profit,avg') types = types.split(',') labels = None datasets = [] type_ = 'profit' if type_ in types: qs = DateTimeStatistic( Customer.objects, 'tasks__created_at', 'created_at', period, 'sum', 'tasks__delivery_cost' ) result = qs.get_chart_data() # TODO: refactoring, outgoing to templates dataset = { 'label': type_, 'data': result['count'].values(), 'backgroundColor': '#ffc1079c', 'borderColor': 'info', 'borderWidth': 1 } datasets.append(dataset) labels = qs.labels type_ = 'avg' if type_ in types: qs = DateTimeStatistic( Customer.objects, 'tasks__created_at', 'created_at', period, 'avg', 'tasks__delivery_cost' ) result = qs.get_chart_data() # TODO: refactoring, outgoing to templates dataset = { 'label': type_, 'data': result['count'].values(), 'backgroundColor': '#3bafdac7', 'borderColor': 'danger', 'borderWidth': 1 } datasets.append(dataset) labels = qs.labels type_ = 'registered' if type_ in types: qs = DateTimeStatistic( Customer.objects, 'user__date_joined', 'date_joined', period, 'count', 'id' ) result = qs.get_chart_data() # TODO: refactoring, outgoing to templates dataset = { 'label': type_, 'data': result['count'].values(), 'backgroundColor': '#20C997', 'borderColor': 'danger', 'borderWidth': 1 } datasets.append(dataset) labels = qs.labels if not labels: return Response( {"type": "not one of the passed types is acceptable {0}". format(types)}, 403 ) serializer = ReportChartStatisticSerializer( {'labels': labels, 'datasets': datasets} ) if serializer.data: return Response(serializer.data, 200) return Response(serializer.data, 204)
class WorkersViewSet(viewsets.ModelViewSet): queryset = Worker.objects.all() model = Worker serializer_class = WorkerSerializer permission_classes = (WorkerAccessPolicy,) @swagger_auto_schema( tags=['Workers'], operation_description="Method to get a list of workers" " within your access", responses=base_swagger_responses( 204, 401, 403, kparams={200: WorkerSerializer(many=True)} ) ) def list(self, request, *args, **kwargs): """ Return a list of workers. """ return super().list(request, *args, **kwargs) @swagger_auto_schema( tags=['Workers'], operation_description="Creating a new user in the system as worker", responses=base_swagger_responses(201, 400, 401, 403) ) def create(self, request, *args, **kwargs): """ Create new worker. """ return super().create(request, *args, **kwargs) @swagger_auto_schema( tags=['Workers'], operation_description="Method to get worker object. This user method " "is installed in the system as the order " "executor of the service.", responses=base_swagger_responses( 400, 401, 403, 404, kparams={200: WorkerSerializer} ) ) def retrieve(self, request, pk=None, *args, **kwargs): """ Retrieve worker. """ return super().retrieve(request, pk, *args, **kwargs) @swagger_auto_schema( tags=['Workers'], operation_description="Updating a worker object in the system", responses=base_swagger_responses(200, 400, 401, 403, 404) ) def update(self, request, pk=None, *args, **kwargs): """ Update worker. """ return super().update(request, pk, *args, **kwargs) @swagger_auto_schema( tags=['Workers'], operation_description="Updating individual worker " "fields in the system", responses=base_swagger_responses(200, 400, 401, 403, 404) ) def partial_update(self, request, pk=None, *args, **kwargs): """ Partial worker update. """ return super().partial_update(request, pk, *args, **kwargs) @swagger_auto_schema( tags=['Workers'], operation_description="Removing a worker record " "from the system", responses=base_swagger_responses(204, 401, 403, 404) ) def destroy(self, request, pk=None, *args, **kwargs): """ Delete worker. """ return super().destroy(request, pk, *args, **kwargs) @swagger_auto_schema( tags=['Workers'], operation_id="workers_approve_partial_update", operation_description="Worker approval", request_body=WorkerApproveSerializer, responses=base_swagger_responses(200, 401, 403, 404) ) @action(methods=["PATCH"], detail=True) def approve(self, request, pk, *args, **kwargs): worker = get_object_or_404(Worker, pk=pk) serializer = UserBlockSerializer( worker.user, data=request.data, partial=True ) if serializer.is_valid(): serializer.save() return Response(serializer.data, 200) return Response(serializer.errors, 400)
class TasksViewSet(CustomSerializerClassMixin, viewsets.ModelViewSet): queryset = Task.objects.all() serializer_class = TaskSerializer permission_classes = (TasksAccessPolicy,) action_serializers = { 'list': TaskListSerializer } # @method_decorator(cache_page(60 * 60 * 2)) @swagger_auto_schema( tags=['Tasks'], operation_description="Method to get a list of tasks " "within your access", manual_parameters=[ openapi.Parameter( 'role', openapi.IN_QUERY, description="Getting tasks by role", type=openapi.TYPE_STRING, enum=['WORKER', 'CUSTOMER'] ), openapi.Parameter( 'status', openapi.IN_QUERY, description="Getting tasks by status", type=openapi.TYPE_STRING, enum=configs.TASK_STATUSES + ['IN_PROCESS'], ), openapi.Parameter( 'date_from', openapi.IN_QUERY, description="Date received tasks from. Format " "(2019-07-29T21:00:00Z)", type=openapi.TYPE_STRING, ), openapi.Parameter( 'date_to', openapi.IN_QUERY, description="Date received tasks to. " "Format (2019-07-29T21:00:00Z)", type=openapi.TYPE_STRING, ), ], responses=base_swagger_responses( 204, 400, 401, 403, kparams={200: TaskListSerializer(many=True)} ) ) def list(self, request, *args, **kwargs): """ Return a list of tasks. """ user = request.user role = request.GET.get('role') status = request.GET.get('status') date_from = request.GET.get('date_from') date_from = get_datetime_obj(date_from) date_to = request.GET.get('date_to') date_to = get_datetime_obj(date_to) if hasattr(user, 'worker') and user.groups.filter( name='Worker').exists() and role == 'WORKER': self.queryset = user.worker.tasks if hasattr(user, 'customer') and user.groups.filter( name='Customer').exists() and role == 'CUSTOMER': self.queryset = user.customer.tasks if status == 'IN_PROCESS': self.queryset = self.queryset.filter( status__in=configs.TASK_STATUSES_PROCESS ) elif status: self.queryset = self.queryset.filter( status=status ) if date_from and date_to: self.queryset = self.queryset.filter( created_at__range=(date_from, date_to) ) return super().list(request, *args, **kwargs) @swagger_auto_schema( tags=['Tasks'], operation_description="Creating a new task", responses=base_swagger_responses(201, 400, 401, 403) ) def create(self, request, *args, **kwargs): """ Create new task. """ return super().create(request, *args, **kwargs) @swagger_auto_schema( tags=['Tasks'], operation_description="Method to get task object. Can only be created " "by Сustomer.", responses=base_swagger_responses( 400, 401, 403, 404, kparams={200: TaskSerializer} ) ) def retrieve(self, request, pk=None, *args, **kwargs): """ Retrieve task. """ return super().retrieve(request, pk, *args, **kwargs) @swagger_auto_schema( tags=['Tasks'], operation_description="Updating a task object in the system. " "Can only be updated by Сustomer or Manager.", responses=base_swagger_responses(200, 400, 401, 403, 404) ) def update(self, request, pk=None, *args, **kwargs): """ Update task. """ return super().update(request, pk, *args, **kwargs) @swagger_auto_schema( tags=['Tasks'], operation_description="Updating individual task fields in the " "system. Can only be updated by Сustomer or " "Manager.", responses=base_swagger_responses(200, 400, 401, 403, 404) ) def partial_update(self, request, pk=None, *args, **kwargs): """ Partial task update. """ return super().partial_update(request, pk, *args, **kwargs)
class TaskItemViewSet(viewsets.ModelViewSet): queryset = TaskItem.objects.all() serializer_class = TaskItemSerializer @swagger_auto_schema( tags=['Task Item'], operation_description="Method to get a list of task Items", responses=base_swagger_responses( 204, 401, 403, kparams={200: TaskItemSerializer(many=True)} ) ) def list(self, request, *args, **kwargs): """ Return a list of task Items. """ return super().list(request, *args, **kwargs) @swagger_auto_schema( tags=['Task Item'], operation_description="Creating a new task item", responses=base_swagger_responses(201, 400, 401, 403) ) def create(self, request, *args, **kwargs): """ Create new task item. """ return super().create(request, *args, **kwargs) @swagger_auto_schema( tags=['Task Item'], operation_description="Method to get task item object.", responses=base_swagger_responses( 400, 401, 403, 404, kparams={200: TaskItemSerializer} ) ) def retrieve(self, request, pk=None, *args, **kwargs): """ Retrieve task item. """ return super().retrieve(request, pk, *args, **kwargs) @swagger_auto_schema( tags=['Task Item'], operation_description="Updating a task item object in the system.", responses=base_swagger_responses(200, 400, 401, 403, 404) ) def update(self, request, pk=None, *args, **kwargs): """ Update task item. """ return super().update(request, pk, *args, **kwargs) @swagger_auto_schema( tags=['Task Item'], operation_description="Updating individual task item fields in the " "system.", responses=base_swagger_responses(200, 400, 401, 403, 404) ) def partial_update(self, request, pk=None, *args, **kwargs): """ Partial task update. """ return super().partial_update(request, pk, *args, **kwargs) @swagger_auto_schema( tags=['Task Item'], operation_description="Deactivated system record. Not deleted from " "the database. Historical entity", responses=base_swagger_responses(200, 401, 403, 404) ) def destroy(self, request, pk=None, *args, **kwargs): """ Deactivate task item. """ return super().destroy(request, pk, *args, **kwargs)
class ServicesViewSet(viewsets.ModelViewSet): queryset = Service.objects.all() serializer_class = ServiceSerializer model = Service permission_classes = (ServicesAccessPolicy,) @swagger_auto_schema( tags=['Services'], operation_description="Method to get a list of services", responses=base_swagger_responses( 204, 401, 403, kparams={200: ServiceSerializer(many=True)} ) ) def list(self, request, *args, **kwargs): """ Return a list of services. """ return super().list(request, *args, **kwargs) @swagger_auto_schema( tags=['Services'], operation_description="Creating a new service", responses=base_swagger_responses(201, 400, 401, 403) ) def create(self, request, *args, **kwargs): """ Create new service. """ return super().create(request, *args, **kwargs) @swagger_auto_schema( tags=['Services'], operation_description="Method to get service object.", responses=base_swagger_responses( 400, 401, 403, 404, kparams={200: ServiceSerializer} ) ) def retrieve(self, request, pk=None, *args, **kwargs): """ Retrieve service. """ return super().retrieve(request, pk, *args, **kwargs) @swagger_auto_schema( tags=['Services'], operation_description="Updating a service object in the system.", responses=base_swagger_responses(200, 400, 401, 403, 404) ) def update(self, request, pk=None, *args, **kwargs): """ Update task. """ return super().update(request, pk, *args, **kwargs) @swagger_auto_schema( tags=['Services'], operation_description="Updating individual service fields in the " "system.", responses=base_swagger_responses(200, 400, 401, 403, 404) ) def partial_update(self, request, pk=None, *args, **kwargs): """ Partial task update. """ return super().partial_update(request, pk, *args, **kwargs) @swagger_auto_schema( tags=['Services'], # TODO: выяснить что будет происходить с этим методом operation_description="Deactivated system record. Not deleted from " "the database. Historical entity", responses=base_swagger_responses(200, 401, 403, 404) ) def destroy(self, request, pk=None, *args, **kwargs): """ Deactivate task. """ return super().destroy(request, pk, *args, **kwargs)
class PlaceViewSet(CustomSerializerClassMixin, viewsets.ModelViewSet): queryset = Place.objects.all() serializer_class = PlaceSerializer permission_classes = (PlaceAccessPolicy,) action_serializers = { 'list': PlaceListSerializer } @swagger_auto_schema( tags=['Places'], operation_description="Method to get a list of places", responses=base_swagger_responses( 204, 401, 403, kparams={200: PlaceListSerializer(many=True)} ) ) def list(self, request, *args, **kwargs): """ Return a list of places. """ return super().list(request, *args, **kwargs) @swagger_auto_schema( tags=['Places'], operation_description="Creating a new place", responses=base_swagger_responses(201, 400, 401, 403) ) def create(self, request, *args, **kwargs): """ Create new place. """ file = None if request.POST: data = request.data if request.accepted_media_type == 'multipart/form-data': data = json.loads(request.POST.get('data')) file = request.FILES.get('file') serializer = self.serializer_class(data=data) if serializer.is_valid(): if file: url = upload_to_backet(file) serializer.validated_data['image_url'] = url serializer.save() return Response(serializer.data, 201) return Response(serializer.errors, 400) return super().create(request, *args, **kwargs) @swagger_auto_schema( tags=['Places'], operation_description="Method to get place object.", responses=base_swagger_responses( 400, 401, 403, 404, kparams={200: PlaceSerializer} ) ) def retrieve(self, request, pk=None, *args, **kwargs): """ Retrieve place. """ return super().retrieve(request, pk, *args, **kwargs) @swagger_auto_schema( tags=['Places'], operation_description="Updating a place object in the system.", responses=base_swagger_responses(200, 400, 401, 403, 404) ) def update(self, request, pk=None, *args, **kwargs): """ Update place. """ if request.POST: place = self.get_object() data = json.loads(request.POST.get('data')) file = request.FILES.get('file') serializer = self.serializer_class(place, data=data) if serializer.is_valid(): if file: url = upload_to_backet(file) serializer.validated_data['image_url'] = url serializer.save() return Response(serializer.data, 200) return Response(serializer.errors, 400) return super().update(request, pk, *args, **kwargs) @swagger_auto_schema( tags=['Places'], operation_description="Updating individual place fields in the " "system.", responses=base_swagger_responses(200, 400, 401, 403, 404) ) def partial_update(self, request, pk=None, *args, **kwargs): """ Partial task update. """ return super().partial_update(request, pk, *args, **kwargs) @swagger_auto_schema( tags=['Places'], operation_description="Deactivated system record. Not deleted from " "the database. Historical entity", responses=base_swagger_responses(200, 401, 403, 404) ) def destroy(self, request, pk=None, *args, **kwargs): """ Deactivate place. """ return super().destroy(request, pk, *args, **kwargs)