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),)
...