234 lines
7.6 KiB
Python
234 lines
7.6 KiB
Python
from io import BytesIO
|
||
|
||
from django.http import HttpResponse
|
||
from openpyxl import Workbook
|
||
from rest_framework import viewsets
|
||
from rest_framework.decorators import action
|
||
|
||
from apps.core.mixins.search_mixin import ExcelDynamicSearchMixin
|
||
from apps.herd.models import Herd, Rancher
|
||
from apps.herd.web.api.v1.serializers import HerdSerializer, RancherSerializer
|
||
from common.helper_excel import create_header, excel_description, create_header_freez, create_value
|
||
|
||
|
||
class HerdExcelViewSet(viewsets.ModelViewSet, ExcelDynamicSearchMixin):
|
||
queryset = Herd.objects.all()
|
||
serializer_class = HerdSerializer
|
||
|
||
# noqa # دامداران
|
||
@action(
|
||
methods=['get'],
|
||
detail=False,
|
||
url_path='rancher_excel',
|
||
url_name='rancher_excel',
|
||
name='rancher_excel'
|
||
)
|
||
def rancher_excel(self, request):
|
||
output = BytesIO()
|
||
workbook = Workbook()
|
||
worksheet = workbook.active
|
||
worksheet.sheet_view.rightToLeft = True
|
||
worksheet.insert_rows(1)
|
||
ranchers = Rancher.objects.all().order_by('-modify_date')
|
||
rancher_search_fields = [
|
||
"ranching_farm",
|
||
"first_name",
|
||
"last_name",
|
||
"mobile",
|
||
"national_code",
|
||
"birthdate",
|
||
"nationality",
|
||
"address",
|
||
"province__name",
|
||
"city__name",
|
||
]
|
||
query = self.filter_query(ranchers, search_list=rancher_search_fields)
|
||
|
||
ser_data = RancherSerializer(query, many=True).data
|
||
|
||
excel_options = [
|
||
"ردیف",
|
||
"نام دامداری",
|
||
"نام",
|
||
"نام خانوادگی",
|
||
"کد ملی",
|
||
"موبایل",
|
||
"استان",
|
||
"شهر",
|
||
"آدرس",
|
||
"وضعیت",
|
||
]
|
||
|
||
header_list = [
|
||
"تعداد دامداران",
|
||
|
||
]
|
||
|
||
create_header(worksheet, header_list, 5, 2, height=25, border_style='thin')
|
||
excel_description(worksheet, 'B1', f'دامداران', row2='C3')
|
||
create_header_freez(worksheet, excel_options, 1, 6, 7, height=25, width=20)
|
||
|
||
l = 6
|
||
m = 1
|
||
if ser_data:
|
||
for data in ser_data:
|
||
without_herd = 'بدون دام' if data.get('without_herd') == True else 'دام عادی'
|
||
|
||
list1 = [
|
||
m,
|
||
data.get('ranching_farm') or '-',
|
||
data.get('first_name') or '-',
|
||
data.get('last_name') or '-',
|
||
data.get('national_code') or '-',
|
||
data.get('mobile') or '-',
|
||
(data.get('province') or {}).get('name') or '-',
|
||
(data.get('city') or {}).get('name') or '-',
|
||
data.get('address') or '-',
|
||
without_herd,
|
||
|
||
]
|
||
create_value(worksheet, list1, l + 1, 1, height=23, m=m)
|
||
m += 1
|
||
l += 1
|
||
value_list = [
|
||
len(query)
|
||
]
|
||
|
||
create_value(worksheet, value_list, 3, 5, border_style='thin')
|
||
workbook.save(output)
|
||
output.seek(0)
|
||
|
||
response = HttpResponse(
|
||
content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
|
||
response[
|
||
'Content-Disposition'] = f'attachment; filename="دامداران.xlsx"'.encode(
|
||
'utf-8')
|
||
response.write(output.getvalue())
|
||
return response
|
||
|
||
# noqa # دامداران
|
||
|
||
@action(
|
||
methods=['get'],
|
||
detail=False,
|
||
url_path='herd_excel',
|
||
url_name='herd_excel',
|
||
name='herd_excel'
|
||
)
|
||
def herd_excel(self, request):
|
||
output = BytesIO()
|
||
workbook = Workbook()
|
||
worksheet = workbook.active
|
||
worksheet.sheet_view.rightToLeft = True
|
||
worksheet.insert_rows(1)
|
||
|
||
query = self.filter_query(self.queryset)
|
||
|
||
ser_data = self.serializer_class(query, many=True).data
|
||
|
||
excel_options = [
|
||
"ردیف",
|
||
"شناسه یکتا",
|
||
"نام گله",
|
||
"نام تعاونی",
|
||
"نام شرکت پیمانکار",
|
||
"ظرفیت",
|
||
"نوع فعالیت",
|
||
"کد اپیدمیولوژیک",
|
||
"حجم دام سبک",
|
||
"حجم دام سنگین",
|
||
"استان",
|
||
"شهر",
|
||
"مجوز فعالیت",
|
||
"وضعیت فعالیت",
|
||
"کد پستی",
|
||
]
|
||
|
||
header_list = [
|
||
"تعداد گله ها",
|
||
"ظرفیت کل",
|
||
"مجموع دام سبک",
|
||
"مجموع دام سنگین",
|
||
|
||
]
|
||
|
||
create_header(worksheet, header_list, 5, 2, height=25, border_style='thin')
|
||
excel_description(worksheet, 'B1', f'گله ها', row2='C3')
|
||
create_header_freez(worksheet, excel_options, 1, 6, 7, height=25, width=20)
|
||
|
||
l = 6
|
||
m = 1
|
||
if ser_data:
|
||
for data in ser_data:
|
||
if data.get('activity') == 'I':
|
||
activity = 'صنعتی'
|
||
elif data.get('activity') == 'V':
|
||
activity = 'روستایی'
|
||
else:
|
||
activity = 'عشایری'
|
||
operating_license_state='ندارد' if data.get('operating_license_state') == False else 'دارد'
|
||
activity_state='ندارد' if data.get('activity_state') == False else 'دارد'
|
||
|
||
list1 = [
|
||
m,
|
||
data.get('unit_unique_id') or '-',
|
||
data.get('name') or '-',
|
||
(data.get('cooperative') or {}).get('name') or '-',
|
||
(data.get('contractor') or {}).get('name') or '-',
|
||
data.get('capacity') or 0,
|
||
activity,
|
||
data.get('epidemiologic') or '-',
|
||
data.get('light_livestock_number') or 0,
|
||
data.get('heavy_livestock_number') or 0,
|
||
(data.get('province') or {}).get('name') or '-',
|
||
(data.get('city') or {}).get('name') or '-',
|
||
operating_license_state,
|
||
activity_state,
|
||
data.get('postal') or '-',
|
||
|
||
]
|
||
create_value(worksheet, list1, l + 1, 1, height=23, m=m)
|
||
m += 1
|
||
l += 1
|
||
|
||
capacity = sum((data['capacity'] or 0) for data in ser_data)
|
||
light_livestock_number = sum((data['light_livestock_number'] or 0) for data in ser_data)
|
||
heavy_livestock_number = sum((data['heavy_livestock_number'] or 0) for data in ser_data)
|
||
|
||
value_list = [
|
||
len(query),
|
||
capacity,
|
||
light_livestock_number,
|
||
heavy_livestock_number,
|
||
]
|
||
|
||
create_value(worksheet, value_list, 3, 5, border_style='thin')
|
||
|
||
list2 = [
|
||
'مجموع==>',
|
||
'',
|
||
'',
|
||
'',
|
||
'',
|
||
capacity,
|
||
'',
|
||
'',
|
||
light_livestock_number,
|
||
heavy_livestock_number,
|
||
'',
|
||
'',
|
||
'',
|
||
'',
|
||
''
|
||
]
|
||
create_value(worksheet, list2, l + 3, 1, color='gray', height=23)
|
||
workbook.save(output)
|
||
output.seek(0)
|
||
|
||
response = HttpResponse(
|
||
content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
|
||
response[
|
||
'Content-Disposition'] = f'attachment; filename="گله ها.xlsx"'.encode(
|
||
'utf-8')
|
||
response.write(output.getvalue())
|
||
return response |