Skip to content

Commit eed1187

Browse files
committed
refactor(export): Export yearly compare and refactor export modules
1 parent bee3ffb commit eed1187

26 files changed

Lines changed: 618 additions & 343 deletions

src/apps/surveys18/export/__init__.py

Lines changed: 0 additions & 6 deletions
This file was deleted.

src/apps/surveys18/tasks.py

Lines changed: 0 additions & 51 deletions
This file was deleted.

src/apps/surveys18/views.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,17 @@
55
from django.contrib.auth.mixins import LoginRequiredMixin
66
from django.template.loader import render_to_string
77
from django.contrib.contenttypes.models import ContentType
8-
from django.http import JsonResponse, HttpResponse
8+
from django.http import JsonResponse
99
from django.db.models import Q
1010

1111
from rest_framework.decorators import action
1212
from rest_framework.exceptions import ValidationError
1313
from rest_framework.filters import SearchFilter, OrderingFilter
1414
from rest_framework.permissions import IsAuthenticated, IsAdminUser
1515
from rest_framework.viewsets import ModelViewSet
16-
from rest_framework import status
1716

1817
from config.viewsets import StandardViewSet
1918
from apps.users.models import User
20-
from apps.surveys18.tasks import async_export_106_statistics
2119
from apps.surveys18.models import (
2220
Survey,
2321
ShortTermHire,
@@ -201,10 +199,6 @@ def patch(self, request):
201199
logger.exception('Update survey data failed.', exc_info=True)
202200
raise
203201

204-
@action(methods=["GET"], detail=False)
205-
def export_statistics(self, request):
206-
async_export_106_statistics.delay(request.user.email)
207-
return HttpResponse(status=status.HTTP_204_NO_CONTENT)
208202

209203
class ContentTypeViewSet(StandardViewSet):
210204
serializer_class = serializers.ContentTypeSerializer

src/apps/surveys19/export/__init__.py

Lines changed: 0 additions & 8 deletions
This file was deleted.

src/apps/surveys19/tasks.py

Lines changed: 0 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,95 +1,6 @@
1-
import os
2-
import csv
3-
import pyminizip
4-
from datetime import datetime
5-
6-
from django.conf import settings
7-
from django.core.mail import EmailMessage
8-
from django.utils.crypto import get_random_string
9-
101
from config import celery_app as app
112
from apps.surveys19.models import FarmerStat, Survey
12-
from apps.surveys19.export import SurveyRelationGeneratorFactory, StatisticsExporter
13-
14-
15-
@app.task
16-
def async_export_107(email):
17-
try:
18-
factory = SurveyRelationGeneratorFactory(excludes={'note__icontains': '無效戶'})
19-
row_generator = factory.export_generator()
20-
21-
file_name = f"107_Full_Export_{datetime.now().strftime('%Y_%m_%d_%H_%M_%S')}"
22-
csv_path = f'{file_name}.csv'
23-
zip_path = f'{file_name}.zip'
24-
25-
with open(csv_path, 'w+', encoding="utf-8") as file:
26-
writer = csv.writer(file)
27-
for row in row_generator:
28-
writer.writerow(row)
29-
30-
password = get_random_string(length=24)
31-
pyminizip.compress(csv_path, "", zip_path, password, 5)
32-
33-
with open(zip_path, 'rb') as zip_file:
34-
mail = EmailMessage(
35-
'107調查表匯出完成',
36-
f'匯出結果如附件,解壓縮密碼請輸入:{password}',
37-
settings.DEFAULT_FROM_EMAIL,
38-
[email]
39-
)
40-
mail.attach('107調查表.zip', zip_file.read(), 'application/zip')
41-
mail.send()
42-
except Exception as e:
43-
EmailMessage(
44-
'107調查表匯出失敗',
45-
f"系統發生錯誤,請通知管理員處理。\n{e}",
46-
settings.DEFAULT_FROM_EMAIL,
47-
[email]
48-
).send()
49-
finally:
50-
try:
51-
os.remove(csv_path)
52-
os.remove(zip_path)
53-
except Exception:
54-
pass
55-
56-
@app.task
57-
def async_export_107_statistics(email):
58-
try:
59-
exporter = StatisticsExporter()
60-
61-
file_name = f"107_Statistic_Report_{datetime.now().strftime('%Y_%m_%d_%H_%M_%S')}"
62-
63-
file_path = f'{file_name}.xlsx'
64-
zip_path = f'{file_name}.zip'
65-
66-
exporter(file_path)
67-
68-
password = get_random_string(length=24)
69-
pyminizip.compress(file_path, "", zip_path, password, 5)
703

71-
with open(zip_path, 'rb') as zip_file:
72-
mail = EmailMessage(
73-
'107平台統計結果表式匯出完成',
74-
f'匯出結果如附件,解壓縮密碼請輸入:{password}',
75-
settings.DEFAULT_FROM_EMAIL,
76-
[email]
77-
)
78-
mail.attach('107平台統計結果表式.zip', zip_file.read(), 'application/zip')
79-
mail.send()
80-
except Exception as e:
81-
EmailMessage(
82-
'107平台統計結果表式匯出失敗',
83-
f"系統發生錯誤,請通知管理員處理。\n{e}",
84-
settings.DEFAULT_FROM_EMAIL,
85-
[email]
86-
).send()
87-
finally:
88-
try:
89-
os.remove(file_path)
90-
os.remove(zip_path)
91-
except Exception:
92-
pass
934

945
@app.task
956
def async_update_107_stratify(survey_id):

src/apps/surveys19/views.py

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,18 @@
77
from django.template.loader import render_to_string
88

99
from django.contrib.contenttypes.models import ContentType
10-
from django.http import JsonResponse, StreamingHttpResponse, HttpResponse
10+
from django.http import JsonResponse, StreamingHttpResponse
1111
from django.db.models import Q
1212

1313
from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet
1414
from rest_framework.permissions import IsAuthenticated, IsAdminUser
1515
from rest_framework.decorators import action
1616
from rest_framework.exceptions import ValidationError
1717
from rest_framework.filters import SearchFilter, OrderingFilter
18-
from rest_framework import status
1918

2019
from config.viewsets import StandardViewSet
2120

2221
from apps.users.models import User
23-
from apps.surveys19.tasks import async_export_107, async_export_107_statistics
24-
from apps.surveys19.export import SurveyRelationGeneratorFactory
2522
from apps.surveys19.models import (
2623
Survey,
2724
Phone,
@@ -269,20 +266,6 @@ def patch(self, request):
269266
logger.exception('Update survey data failed.', exc_info=True)
270267
raise
271268

272-
@action(methods=["GET"], detail=False)
273-
def export(self, request):
274-
"""A view that streams a large CSV file."""
275-
# Generate a sequence of rows. The range is based on the maximum number of
276-
# rows that can be handled by a single sheet in most spreadsheet
277-
# applications.
278-
279-
async_export_107.delay(request.user.email)
280-
return HttpResponse('ok')
281-
282-
@action(methods=["GET"], detail=False)
283-
def export_statistics(self, request):
284-
async_export_107_statistics.delay(request.user.email)
285-
return HttpResponse(status=status.HTTP_204_NO_CONTENT)
286269

287270
class PhoneViewSet(StandardViewSet):
288271
queryset = Phone.objects.all()

src/apps/surveys20/export/__init__.py

Lines changed: 0 additions & 8 deletions
This file was deleted.

src/apps/surveys20/tasks.py

Lines changed: 0 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,96 +1,5 @@
1-
import os
2-
import csv
3-
import pyminizip
4-
from datetime import datetime
5-
6-
from django.conf import settings
7-
from django.core.mail import EmailMessage
8-
from django.utils.crypto import get_random_string
9-
101
from config import celery_app as app
112
from apps.surveys20.models import FarmerStat, Survey
12-
from apps.surveys20.export import SurveyRelationGeneratorFactory, StatisticsExporter
13-
14-
15-
@app.task
16-
def async_export_108(email):
17-
try:
18-
factory = SurveyRelationGeneratorFactory(excludes={'note__icontains': '無效戶'})
19-
row_generator = factory.export_generator()
20-
21-
file_name = f"108_Full_Export_{datetime.now().strftime('%Y_%m_%d_%H_%M_%S')}"
22-
file_path = f'{file_name}.csv'
23-
zip_path = f'{file_name}.zip'
24-
25-
with open(file_path, 'w+', encoding="utf-8") as file:
26-
writer = csv.writer(file)
27-
for row in row_generator:
28-
writer.writerow(row)
29-
30-
password = get_random_string(length=24)
31-
pyminizip.compress(file_path, "", zip_path, password, 5)
32-
33-
with open(zip_path, 'rb') as zip_file:
34-
mail = EmailMessage(
35-
'108調查表匯出完成',
36-
f'匯出結果如附件,解壓縮密碼請輸入:{password}',
37-
settings.DEFAULT_FROM_EMAIL,
38-
[email]
39-
)
40-
mail.attach('108調查表.zip', zip_file.read(), 'application/zip')
41-
mail.send()
42-
except Exception as e:
43-
EmailMessage(
44-
'108調查表匯出失敗',
45-
f"系統發生錯誤,請通知管理員處理。\n{e}",
46-
settings.DEFAULT_FROM_EMAIL,
47-
[email]
48-
).send()
49-
finally:
50-
try:
51-
os.remove(file_path)
52-
os.remove(zip_path)
53-
except Exception:
54-
pass
55-
56-
57-
@app.task
58-
def async_export_108_statistics(email):
59-
try:
60-
exporter = StatisticsExporter()
61-
62-
file_name = f"108_Statistic_Report_{datetime.now().strftime('%Y_%m_%d_%H_%M_%S')}"
63-
64-
file_path = f'{file_name}.xlsx'
65-
zip_path = f'{file_name}.zip'
66-
67-
exporter(file_path)
68-
69-
password = get_random_string(length=24)
70-
pyminizip.compress(file_path, "", zip_path, password, 5)
71-
72-
with open(zip_path, 'rb') as zip_file:
73-
mail = EmailMessage(
74-
'108平台統計結果表式匯出完成',
75-
f'匯出結果如附件,解壓縮密碼請輸入:{password}',
76-
settings.DEFAULT_FROM_EMAIL,
77-
[email]
78-
)
79-
mail.attach('108平台統計結果表式.zip', zip_file.read(), 'application/zip')
80-
mail.send()
81-
except Exception as e:
82-
EmailMessage(
83-
'108平台統計結果表式匯出失敗',
84-
f"系統發生錯誤,請通知管理員處理。\n{e}",
85-
settings.DEFAULT_FROM_EMAIL,
86-
[email]
87-
).send()
88-
finally:
89-
try:
90-
os.remove(file_path)
91-
os.remove(zip_path)
92-
except Exception:
93-
pass
943

954

965
@app.task

src/apps/surveys20/views.py

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,18 @@
66
from django.template.loader import render_to_string
77

88
from django.contrib.contenttypes.models import ContentType
9-
from django.http import JsonResponse, HttpResponse
9+
from django.http import JsonResponse
1010
from django.db.models import Q
1111

1212
from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet
1313
from rest_framework.permissions import IsAuthenticated, IsAdminUser
1414
from rest_framework.decorators import action
1515
from rest_framework.exceptions import ValidationError
1616
from rest_framework.filters import SearchFilter, OrderingFilter
17-
from rest_framework import status
1817

1918
from config.viewsets import StandardViewSet
2019

2120
from apps.users.models import User
22-
from apps.surveys20.tasks import async_export_108, async_export_108_statistics
2321
from apps.surveys20.models import (
2422
Survey,
2523
Phone,
@@ -258,16 +256,6 @@ def patch(self, request):
258256
logger.exception('Update survey data failed.', exc_info=True)
259257
raise
260258

261-
@action(methods=["GET"], detail=False)
262-
def export(self, request):
263-
async_export_108.delay(request.user.email)
264-
return HttpResponse(status=status.HTTP_204_NO_CONTENT)
265-
266-
@action(methods=["GET"], detail=False)
267-
def export_statistics(self, request):
268-
async_export_108_statistics.delay(request.user.email)
269-
return HttpResponse(status=status.HTTP_204_NO_CONTENT)
270-
271259

272260
class PhoneViewSet(StandardViewSet):
273261
queryset = Phone.objects.all()

src/config/api.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from rest_framework.routers import DefaultRouter
2+
from .views import ExportViewSet
3+
4+
api = DefaultRouter()
5+
api.trailing_slash = "/?"
6+
7+
api.register(r"export", ExportViewSet, basename='export')

0 commit comments

Comments
 (0)