Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 1.11中芹菜周期任务的自动化_Django_Python 3.x_Django Rest Framework_Django Celery - Fatal编程技术网

Django 1.11中芹菜周期任务的自动化

Django 1.11中芹菜周期任务的自动化,django,python-3.x,django-rest-framework,django-celery,Django,Python 3.x,Django Rest Framework,Django Celery,我已经实现了下面基于类的视图,它创建了一个工资条,并且工作得很好。我在考虑通过定期(即每月)运行此功能来进一步自动化此功能。如何使用芹菜tasks.py定期运行POST方法?我正在使用芹菜==4.1.0,RabbitMQ作为我的消息代理,Python3和Django 1.11和djangorestframework==3.8.2` class PayslipPostAPIView(APIView): """ .. http:get:: /payslip_create/

我已经实现了下面基于类的视图,它创建了一个工资条,并且工作得很好。我在考虑通过定期(即每月)运行此功能来进一步自动化此功能。如何使用芹菜
tasks.py
定期运行
POST
方法?我正在使用
芹菜==4.1.0
,RabbitMQ
作为我的消息代理,
Python3
Django 1.11
djangorestframework==3.8.2`

class PayslipPostAPIView(APIView):
    """
        .. http:get:: /payslip_create/
            **Request**:
            .. sourcecode:: http
                GET /payslip_create/web HTTP/1.1
                Host: {{theDomain}}
                Accept: application/json, text/javascript
            **Response**:
            .. sourcecode:: http
                HTTP/1.1 200 OK
                Vary: Accept
                Content-Type: text/javascript
                [
                    {
                    "id": 123,
                    "employee": 123,
                    "basic_salary": ["server", "web"],
                    "payment_mode": "I tried Nginx",
                    "currency": "Currency",
                    "payslip_no": "Payslip Number",
                    "month_ending": "Date",
                    "is_accounted": "True/False",
                    "created_at": "Date"
                    "modified_at": "Date",
                    "total_allowances": 123,
                    "total_deductions": 123,
                    "net_pay": 123,
                    "organization": 123
                    }
                ]
            :reqheader Authorization: JWT token required to authenticate
        .. http:post:: /payslip_create/
            :param post_id: post's unique id
            :type post_id: int
            :reqheader Authorization: JWT token required to authenticate
            :status 201: Payslip successfully Created
            :status 400: Post parameters are invalid or missing
    """

    permission_classes = (permissions.DjangoObjectPermissions,)
    queryset = Payslip.objects.all()
    model_list = [EmployeeProfile, Salary, Allowance, Deduction, PaymentMode]

    def get(self, request, format=None):
        payslip = Payslip.objects.filter(organization=get_auth(request)).all()
        serializer = PayslipSerializer(payslip, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        try:

            allowance_list = request.data.pop('allowance_list')

            deduction_list = request.data.pop('deduction_list')
            # employee = EmployeeProfile.objects.get(
            # id=request.data.pop('employee'), organization=get_auth(request))
            employee = EmployeeProfile.objects.get(id=request.data.pop('employee'),
                                                   organization=get_auth(request))
            basic_salary = Salary.objects.get(
                employee=employee)
            # print(basic_salary)
            payment_mode = PaymentMode.objects.get(
                id=request.data.pop('payment_mode'), organization=get_auth(request))
            data = request.data
            data["organization"] = get_auth(request)
            payslip = Payslip.objects.create(**data)
            payslip.payslip_no = "PAYSLIP" + str(payslip.id) + "DT" + \
                str(datetime.datetime.today())
            payslip.basic_salary = basic_salary
            payslip.employee = employee
            payslip.payment_mode = payment_mode

            payslip.save()

            for item in allowance_list:
                allowance = Allowance.objects.create(name=AllowanceType.objects.get(id=item['name']),
                                                     amount=item['amount'],
                                                     payslip=payslip,
                                                     organization=get_auth(
                                                         request)
                                                     )

            for item in deduction_list:
                ded = DeductionType.objects.get(id=item['name'])
                deduction = Deduction.objects.create(name=ded,
                                                     amount=item['amount'],
                                                     payslip=payslip,
                                                     organization=get_auth(
                                                         request)
                                                     )

            serializer = PayslipSerializer(payslip)

            allow = Allowance.objects.filter(
                payslip=payslip.id).aggregate(Sum('amount'))

            deduct = Deduction.objects.filter(
                payslip=payslip.id).aggregate(amount=Sum('amount'))

            total_deductions = deduct['amount']
            total_allowances = allow['amount__sum']

            net_pay = (payslip.basic_salary.salary_value +
                       allow['amount__sum']) - deduct['amount']

            payslip.total_deductions = total_deductions
            payslip.total_allowances = total_allowances
            payslip.basic_salary = basic_salary
            payslip.organization = get_auth(request)

            payslip.net_pay = net_pay
            payslip.save()
            serializer = PayslipSerializer(payslip)

            payload = {
                "allowances": list(Allowance.objects.filter(payslip=payslip.id, organization=get_auth(request)).values('name', 'amount', 'name__name')),
                "deductions": list(Deduction.objects.filter(payslip=payslip.id, organization=get_auth(request)).values('name', 'amount', 'name__name')),
                "app": "payroll",
                "organization": get_auth(request),
                "total_deductions": total_deductions,
                "basic": payslip.basic_salary.salary_value,
                "sal_grp": payslip.basic_salary.salary_group.name,
                "total_allowances": total_allowances,
                "net_pay": net_pay,
                "paid": payslip.is_paid,
                "data": json.dumps(serializer.data)
            }

            # print(payload)

            ###############################################
            # Post the paslip entry updates to accounting #
            ###############################################
            #
            # ACC_IP = "http://0.0.0.0:8000"
            accounting_url = ACC_IP + "/acc/incoming/transations/"

            try:
                if send_payslip_accounts(payload, accounting_url):
                    payslip.is_accounted = True
                    payslip.save()
                    return Response(data=json.dumps(serializer.data), status=status.HTTP_201_CREATED)

                else:
                    payslip.is_accounted = False
                    payslip.save()

            except Exception as e:
                return Response(data=str(e), status=status.HTTP_400_BAD_REQUEST)
            return Response(status=status.HTTP_201_CREATED)

        except Exception as e:
            raise e
        return Response(serializer.data, status=status.HTTP_201_CREATED)

任务。py

from celery import task
@task()
send_payslip_accounts(payload, accounting_url, payslip):
    ...
    payslip.is_accounted = True
    payslip.save()
视图.py


您将定期运行哪个函数?
from .tasks import send_payslip_accounts
class PayslipPostAPIView(APIView):
    ...
    payslip.is_accounted = False
    payslip.save()
    send_payslip_accounts.apply_async((payload, accounting_url, payslip),)
    ...