[英]Automation with Celery Periodic Tasks in Django 1.11
我已經在下面實現了以下基於類的視圖,該視圖創建了工資單,並且運行良好。 我正在進一步考慮通過定期(即每月)運行該功能來使其自動化。 如何使用celery tasks.py
觸發POST
方法以定期運行? 我正在使用celery==4.1.0
,RabbitMQ as my message broker,
Python3 and
Django 1.11 and
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)
tasks.py
from celery import task
@task()
send_payslip_accounts(payload, accounting_url, payslip):
...
payslip.is_accounted = True
payslip.save()
views.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),)
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.