Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
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)
Exemplo n.º 5
0
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)
Exemplo n.º 6
0
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)
Exemplo n.º 7
0
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)
Exemplo n.º 8
0
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)
Exemplo n.º 9
0
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)
Exemplo n.º 10
0
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)
Exemplo n.º 11
0
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)
Exemplo n.º 12
0
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)
Exemplo n.º 13
0
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)
Exemplo n.º 14
0
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)
Exemplo n.º 15
0
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)
Exemplo n.º 16
0
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)
Exemplo n.º 17
0
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)
Exemplo n.º 18
0
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)
Exemplo n.º 19
0
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)
Exemplo n.º 20
0
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)
Exemplo n.º 21
0
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)
Exemplo n.º 22
0
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)