diff --git a/.idea/Rasaddam_Backend.iml b/.idea/Rasaddam_Backend.iml
index 168bde0..c5d6090 100644
--- a/.idea/Rasaddam_Backend.iml
+++ b/.idea/Rasaddam_Backend.iml
@@ -14,7 +14,7 @@
-
+
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 296aa57..29f5506 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,4 +1,4 @@
-
+
\ No newline at end of file
diff --git a/apps/herd/services/__init__.py b/apps/herd/services/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/apps/herd/services/excel/__init__.py b/apps/herd/services/excel/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/apps/herd/services/excel/excel_processing.py b/apps/herd/services/excel/excel_processing.py
new file mode 100644
index 0000000..f843a80
--- /dev/null
+++ b/apps/herd/services/excel/excel_processing.py
@@ -0,0 +1,234 @@
+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
\ No newline at end of file
diff --git a/apps/herd/services/excel/urls.py b/apps/herd/services/excel/urls.py
new file mode 100644
index 0000000..9af1e1d
--- /dev/null
+++ b/apps/herd/services/excel/urls.py
@@ -0,0 +1,11 @@
+from django.urls import path, include
+from rest_framework.routers import DefaultRouter
+
+from apps.herd.services.excel.excel_processing import HerdExcelViewSet
+
+router = DefaultRouter()
+router.register(r'', HerdExcelViewSet, basename='herd_excel')
+
+urlpatterns = [
+ path('', include(router.urls)),
+]
diff --git a/apps/herd/urls.py b/apps/herd/urls.py
index f18f421..3834512 100644
--- a/apps/herd/urls.py
+++ b/apps/herd/urls.py
@@ -4,5 +4,6 @@ from django.urls import path, include
urlpatterns = [
- path('web/', include('apps.herd.web.api.v1.urls'))
+ path('web/', include('apps.herd.web.api.v1.urls')),
+ path('excel/', include('apps.herd.services.excel.urls')),
]
diff --git a/apps/livestock/services/__init__.py b/apps/livestock/services/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/apps/livestock/services/excel/__init__.py b/apps/livestock/services/excel/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/apps/livestock/services/excel/excel_processing.py b/apps/livestock/services/excel/excel_processing.py
new file mode 100644
index 0000000..b34da35
--- /dev/null
+++ b/apps/livestock/services/excel/excel_processing.py
@@ -0,0 +1,98 @@
+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.livestock.models import LiveStock
+from apps.livestock.web.api.v1.serializers import LiveStockSerializer
+from common.helper_excel import create_header, excel_description, create_header_freez, create_value, shamsi_date, \
+ convert_str_to_date
+
+
+class LiveStockExcelViewSet(viewsets.ModelViewSet, ExcelDynamicSearchMixin):
+ queryset = LiveStock.objects.all()
+ serializer_class = LiveStockSerializer
+
+ # noqa # دامداران
+ @action(
+ methods=['get'],
+ detail=False,
+ url_path='livestock_excel',
+ url_name='livestock_excel',
+ name='livestock_excel'
+ )
+ def livestock_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:
+ gender = 'نر' if data.get('gender') == 1 else 'ماده'
+ weight_type = 'سنگین' if data.get('weight_type') == 'H' else 'سبک'
+ date = data.get('birthdate') or None
+ if date:
+ sh_date = shamsi_date(convert_str_to_date(date))
+ else:
+ sh_date = '-'
+
+ list1 = [
+ m,
+ (data.get('type') or {}).get('name') or '-',
+ (data.get('use_type') or {}).get('name') or '-',
+ sh_date,
+ gender,
+ (data.get('species') or {}).get('name') or '-',
+ weight_type,
+
+ ]
+ 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 # دامداران
diff --git a/apps/livestock/services/excel/urls.py b/apps/livestock/services/excel/urls.py
new file mode 100644
index 0000000..69eedb2
--- /dev/null
+++ b/apps/livestock/services/excel/urls.py
@@ -0,0 +1,11 @@
+from django.urls import path, include
+from rest_framework.routers import DefaultRouter
+
+from apps.livestock.services.excel.excel_processing import LiveStockExcelViewSet
+
+router = DefaultRouter()
+router.register(r'', LiveStockExcelViewSet, basename='livestock_excel')
+
+urlpatterns = [
+ path('', include(router.urls)),
+]
diff --git a/apps/livestock/urls.py b/apps/livestock/urls.py
index 3b365c1..a4e692d 100644
--- a/apps/livestock/urls.py
+++ b/apps/livestock/urls.py
@@ -3,6 +3,7 @@ from django.urls import path, include
urlpatterns = [
path('web/api/', include('apps.livestock.web.api.v1.urls')),
+ path('excel/', include('apps.livestock.services.excel.urls')),
# path('app/api/', include('apps.livestock.mobile.api.v1.urls')),
# path('pos/api/', include('apps.livestock.pos.api.v1.urls'))
]
\ No newline at end of file
diff --git a/common/helper_excel.py b/common/helper_excel.py
index 8556969..6704c6a 100644
--- a/common/helper_excel.py
+++ b/common/helper_excel.py
@@ -161,7 +161,7 @@ def create_value(worksheet, list, l, num, border_style=None, m=None, height=None
cell.font = Font(size=10, bold=True)
- if m is not None and m % 2 != 0:
+ if m is not None and m % 2 == 0:
if m_color:
cell.fill = PatternFill(start_color=m_color, fill_type="solid")
else: