Skip to content

Commit 52c7de9

Browse files
Hieu Lam - TMAkhangon
andauthored
feature-8972: Export CSV files of Attendees with random, duplicate an… (#9005)
* feature-8972: Export CSV files of Attendees with random, duplicate and unsorted data * feature-8972: Export CSV files of Attendees with random, duplicate and unsorted data --------- Co-authored-by: Khang On - TMA <[email protected]>
1 parent ea7b07d commit 52c7de9

File tree

2 files changed

+42
-20
lines changed

2 files changed

+42
-20
lines changed

app/api/helpers/csv_jobs_util.py

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -72,25 +72,28 @@ def export_attendees_csv(attendees, custom_forms, attendee_form_dict):
7272
'Payment Type': str(attendee.order.paid_via)
7373
if attendee.order and attendee.order.paid_via
7474
else '',
75-
'Payment Mode': str(attendee.order.payment_mode)
75+
'Payment Mode': str(attendee.order.payment_mode)
7676
if attendee.order and attendee.order.payment_mode
7777
else '',
78-
'Ticket Name': str(attendee.ticket.name)
79-
if attendee.ticket and attendee.ticket.name else '',
78+
'Ticket Name': str(attendee.ticket.name)
79+
if attendee.ticket and attendee.ticket.name
80+
else '',
8081
'Ticket Price': str(attendee.ticket.price)
8182
if attendee.ticket and attendee.ticket.price
8283
else '0',
8384
'Ticket Type': str(attendee.ticket.type)
84-
if attendee.ticket and attendee.ticket.type else '',
85+
if attendee.ticket and attendee.ticket.type
86+
else '',
8587
'Tax ID': str(attendee.order.tax_business_info)
8688
if attendee.order.tax_business_info
8789
else '',
8890
'Address': str(attendee.order.address) if attendee.order.address else '',
89-
'Company': str(attendee.order.company) if attendee.order.company else '',
91+
'Company': str(attendee.order.company) if attendee.order.company else '',
9092
'Country': str(attendee.order.country) if attendee.order.country else '',
91-
'State': str(attendee.order.state) if attendee.order.state else '',
93+
'State': str(attendee.order.state) if attendee.order.state else '',
9294
'City': str(attendee.order.city) if attendee.order.city else '',
9395
'Zipcode': str(attendee.order.zipcode) if attendee.order.zipcode else '',
96+
'Email': '',
9497
}
9598

9699
for field in custom_forms:
@@ -106,12 +109,19 @@ def export_attendees_csv(attendees, custom_forms, attendee_form_dict):
106109
converted_header = attendee_form_dict.get(key)
107110
if field.is_complex:
108111
fields_dict = attendee.complex_field_values
109-
data[converted_header] = fields_dict.get(
110-
field.identifier, '') if fields_dict else ''
112+
converted_header = field.identifier
113+
data[converted_header] = (
114+
fields_dict.get(field.identifier, '') if fields_dict else ''
115+
)
111116
else:
112-
dict_value = (getattr(attendee, field.identifier, ''))
113-
dict_value = "Yes" if str(dict_value) == "True" \
114-
else "No" if str(dict_value) == "False" else dict_value
117+
dict_value = getattr(attendee, field.identifier, '')
118+
dict_value = (
119+
"Yes"
120+
if str(dict_value) == "True"
121+
else "No"
122+
if str(dict_value) == "False"
123+
else dict_value
124+
)
115125
data[converted_header] = dict_value
116126
return_dict_list.append(data)
117127

app/api/helpers/tasks.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@
2121
From,
2222
Mail,
2323
)
24+
from sqlalchemy import asc, desc, func
2425

2526
from app.api.chat.rocket_chat import rename_rocketchat_room
2627
from app.api.exports import event_export_task_base
28+
from app.api.helpers.csv_jobs_util import export_attendees_csv
2729
from app.api.helpers.db import safe_query, save_to_db
2830
from app.api.helpers.files import (
2931
create_save_image_sizes,
@@ -39,7 +41,7 @@
3941
from app.api.imports import import_event_task_base
4042
from app.instance import create_app
4143
from app.models import db
42-
from app.models.custom_form import CustomForms, ATTENDEE_CUSTOM_FORM
44+
from app.models.custom_form import ATTENDEE_CUSTOM_FORM, CustomForms
4345
from app.models.discount_code import DiscountCode
4446
from app.models.event import Event
4547
from app.models.exhibitor import Exhibitor
@@ -52,8 +54,8 @@
5254
from app.models.user import User
5355
from app.models.user_follow_group import UserFollowGroup
5456
from app.settings import get_settings
57+
5558
from .import_helpers import update_import_job
56-
from app.api.helpers.csv_jobs_util import export_attendees_csv
5759

5860
"""
5961
Define all API v2 celery tasks here
@@ -537,9 +539,15 @@ def export_order_pdf_task(self, event_id):
537539

538540
@celery.task(base=RequestContextTask, name='export.attendees.csv', bind=True)
539541
def export_attendees_csv_task(self, event_id):
540-
attendees = db.session.query(TicketHolder).filter_by(event_id=event_id)
541-
custom_forms = db.session.query(CustomForms).filter_by(
542-
event_id=event_id, form=CustomForms.TYPE.ATTENDEE, is_included=True
542+
attendees = (
543+
db.session.query(TicketHolder)
544+
.filter_by(event_id=event_id)
545+
.order_by(desc(func.date(TicketHolder.created_at)))
546+
)
547+
custom_forms = (
548+
db.session.query(CustomForms)
549+
.filter_by(event_id=event_id, form=CustomForms.TYPE.ATTENDEE, is_included=True)
550+
.order_by(asc("position"))
543551
)
544552

545553
field_headers = list(ATTENDEE_CUSTOM_FORM.keys())
@@ -548,14 +556,14 @@ def custom_form_validation(cf_orm, field_headers):
548556
# set() is O(1) in membership testing
549557
field_headers_set = set(field_headers)
550558
forms_result = [None] * len(field_headers_set)
559+
index_append = 0
551560

552561
for row in cf_orm:
553562
if row.field_identifier in field_headers_set:
554-
555563
field_headers_set.discard(row.field_identifier)
556-
index_append = field_headers.index(row.field_identifier)
557564
# forms_result.append(row)
558-
forms_result.insert(index_append, row)
565+
forms_result.insert(index_append, row)
566+
index_append += 1
559567

560568
forms_result = [e for e in forms_result if e is not None]
561569
return forms_result
@@ -569,7 +577,11 @@ def custom_form_validation(cf_orm, field_headers):
569577
file_path = os.path.join(filedir, filename)
570578

571579
dict_list = export_attendees_csv(attendees, custom_forms, ATTENDEE_CUSTOM_FORM)
572-
csv_headers = list(dict_list[0].keys())
580+
csv_headers = []
581+
for row in dict_list:
582+
for key in row.keys():
583+
if key is not None and key not in csv_headers:
584+
csv_headers.append(key)
573585

574586
with open(file_path, "w") as temp_file:
575587
writer = csv.DictWriter(temp_file, fieldnames=csv_headers)

0 commit comments

Comments
 (0)