Skip to content

Commit dba3ccb

Browse files
author
Hieu Lam - TMA
authored
fix-9127: Add the unique ticket code into the downlad CSV file (#9130)
* fix-9127: Add the unique ticket code into the downlad CSV file * fix-9127: Add the unique ticket code into the downlad CSV file * fix-9127: Add the unique ticket code into the downlad CSV file * fix-9127: Add the unique ticket code into the downlad CSV file * fix-9127: Add the unique ticket code into the downlad CSV file * fix-9127: Add the unique ticket code into the downlad CSV file * fix-9127: Add the unique ticket code into the downlad CSV file * fix-9127: Add the unique ticket code into the downlad CSV file * fix-9127: Add the unique ticket code into the downlad CSV file
1 parent c5183ca commit dba3ccb

File tree

4 files changed

+136
-71
lines changed

4 files changed

+136
-71
lines changed

app/api/helpers/csv_jobs_util.py

Lines changed: 118 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -82,75 +82,127 @@ def export_orders_csv(orders):
8282
return rows
8383

8484

85-
def export_attendees_csv(attendees, custom_forms, attendee_form_dict):
86-
return_dict_list = []
85+
def get_order_ticket_data(order, ticket):
86+
"""Get order ticket data"""
87+
data = {}
88+
if not order:
89+
return {
90+
'Order#': '',
91+
'Order Date': '',
92+
'Status': '',
93+
'Payment Type': '',
94+
'Payment Mode': '',
95+
'Ticket ID': '',
96+
'Ticket Name': '',
97+
'Ticket Price': '0',
98+
'Ticket Type': '',
99+
'Tax ID': '',
100+
'Address': '',
101+
'Company': '',
102+
'Country': '',
103+
'State': '',
104+
'City': '',
105+
'Zipcode': '',
106+
}
87107

88-
for attendee in attendees:
89-
data = {
90-
'Order#': str(attendee.order.get_invoice_number()) if attendee.order else '-',
91-
'Order Date': str(attendee.order.created_at.strftime('%B %-d, %Y %H:%M %z'))
92-
if attendee.order and attendee.order.created_at
93-
else '-',
94-
'Status': str(attendee.order.status)
95-
if attendee.order and attendee.order.status
96-
else '-',
97-
'Payment Type': str(attendee.order.paid_via)
98-
if attendee.order and attendee.order.paid_via
99-
else '',
100-
'Payment Mode': str(attendee.order.payment_mode)
101-
if attendee.order and attendee.order.payment_mode
102-
else '',
103-
'Ticket Name': str(attendee.ticket.name)
104-
if attendee.ticket and attendee.ticket.name
105-
else '',
106-
'Ticket Price': str(attendee.ticket.price)
107-
if attendee.ticket and attendee.ticket.price
108-
else '0',
109-
'Ticket Type': str(attendee.ticket.type)
110-
if attendee.ticket and attendee.ticket.type
111-
else '',
112-
'Tax ID': str(attendee.order.tax_business_info)
113-
if attendee.order.tax_business_info
114-
else '',
115-
'Address': str(attendee.order.address) if attendee.order.address else '',
116-
'Company': str(attendee.order.company) if attendee.order.company else '',
117-
'Country': str(attendee.order.country) if attendee.order.country else '',
118-
'State': str(attendee.order.state) if attendee.order.state else '',
119-
'City': str(attendee.order.city) if attendee.order.city else '',
120-
'Zipcode': str(attendee.order.zipcode) if attendee.order.zipcode else '',
121-
'Email': '',
108+
data = {
109+
'Order#': str(order.get_invoice_number()),
110+
'Order Date': str(order.created_at.strftime('%B %-d, %Y %H:%M %z'))
111+
if order.created_at
112+
else '-',
113+
'Status': str(order.status) if order.status else '-',
114+
'Payment Type': str(order.paid_via) if order.paid_via else '',
115+
'Payment Mode': str(order.payment_mode) if order.payment_mode else '',
116+
'Ticket ID': str(order.identifier) if order.identifier else '',
117+
}
118+
119+
if ticket:
120+
data.update(get_ticket_data(ticket))
121+
122+
data.update(get_order_data(order))
123+
124+
return data
125+
126+
127+
def get_order_data(order):
128+
"""Get order data from order object"""
129+
if not order:
130+
return {
131+
'Tax ID': '',
132+
'Address': '',
133+
'Company': '',
134+
'Country': '',
135+
'State': '',
136+
'City': '',
137+
'Zipcode': '',
122138
}
123139

124-
for field in custom_forms:
125-
# keys don't match up, for keys like
126-
# acceptVideoRecording vs accept_video_recording ..
127-
key_mapping = {}
128-
129-
for k in attendee_form_dict.keys():
130-
key_mapping[k.replace("_", "").lower()] = k
131-
132-
field_raw = field.identifier.replace("_", "").lower()
133-
key = key_mapping.get(field_raw)
134-
converted_header = attendee_form_dict.get(key)
135-
if field.is_complex:
136-
fields_dict = attendee.complex_field_values
137-
converted_header = field.name
138-
data[converted_header] = (
139-
fields_dict.get(field.identifier, '') if fields_dict else ''
140-
)
141-
else:
142-
dict_value = getattr(attendee, field.identifier, '')
143-
dict_value = (
144-
"Yes"
145-
if str(dict_value) == "True"
146-
else "No"
147-
if str(dict_value) == "False"
148-
else dict_value
149-
)
150-
converted_header = field.name
151-
data[converted_header] = dict_value
152-
data['virtual_event_checkin_times'] = get_virtual_checkin_times(attendee.id)
153-
return_dict_list.append(data)
140+
return {
141+
'Tax ID': str(order.tax_business_info) if order.tax_business_info else '',
142+
'Address': str(order.address) if order.address else '',
143+
'Company': str(order.company) if order.company else '',
144+
'Country': str(order.country) if order.country else '',
145+
'State': str(order.state) if order.state else '',
146+
'City': str(order.city) if order.city else '',
147+
'Zipcode': str(order.zipcode) if order.zipcode else '',
148+
}
149+
150+
151+
def get_ticket_data(ticket):
152+
"""Get ticket data from ticket object"""
153+
if not ticket:
154+
return {'Ticket Name': '', 'Ticket Price': '0', 'Ticket Type': ''}
155+
156+
return {
157+
'Ticket Name': str(ticket.name) if ticket.name else '',
158+
'Ticket Price': str(ticket.price) if ticket.price else '0',
159+
'Ticket Type': str(ticket.type) if ticket.type else '',
160+
}
161+
162+
163+
def get_attendee_data(attendee, custom_forms, attendee_form_dict):
164+
"""Get attendee data from attendee object"""
165+
order_ticket_data = get_order_ticket_data(attendee.order, attendee.ticket)
166+
data = {
167+
**order_ticket_data,
168+
'Email': '',
169+
}
170+
171+
for field in custom_forms:
172+
key_mapping = {k.replace("_", "").lower(): k for k in attendee_form_dict.keys()}
173+
field_raw = field.identifier.replace("_", "").lower()
174+
key = key_mapping.get(field_raw)
175+
converted_header = attendee_form_dict.get(key)
176+
177+
if field.is_complex:
178+
fields_dict = attendee.complex_field_values
179+
converted_header = field.name
180+
data[converted_header] = (
181+
fields_dict.get(field.identifier, '') if fields_dict else ''
182+
)
183+
else:
184+
dict_value = getattr(attendee, field.identifier, '')
185+
dict_value = (
186+
"Yes"
187+
if str(dict_value) == "True"
188+
else "No"
189+
if str(dict_value) == "False"
190+
else dict_value
191+
)
192+
converted_header = field.name
193+
data[converted_header] = dict_value
194+
195+
data['virtual_event_checkin_times'] = get_virtual_checkin_times(attendee.id)
196+
return data
197+
198+
199+
def export_attendees_csv(attendees, custom_forms, attendee_form_dict):
200+
"""Export attendees csv"""
201+
return_dict_list = []
202+
for attendee in attendees:
203+
attendee_data = get_attendee_data(attendee, custom_forms, attendee_form_dict)
204+
if attendee_data:
205+
return_dict_list.append(attendee_data)
154206

155207
return return_dict_list
156208

app/templates/pdf/attendees_pdf.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ <h3 style="text-align:center;">{{ holders[0].event.name }} - {{ ("Attendees List
111111
{{ field.name }} <br>
112112
{% endfor %}
113113
Amount:<br>
114+
Ticket ID:<br>
114115
Ticket Name:<br>
115116
Status:<br>
116117
</td>
@@ -127,6 +128,7 @@ <h3 style="text-align:center;">{{ holders[0].event.name }} - {{ ("Attendees List
127128
{% else %}
128129
{{ "Free Ticket" }} <br>
129130
{% endif %}
131+
{{ holder.order.identifier }}<br>
130132
{{ holder.ticket.name }}<br>
131133
{% if holder.is_checked_in %}
132134
{{ ("Checked In") }}<br>

migrations/versions/rev-2023-08-17-15:38:43-bce7acfe5a4f_.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""empty message
22
33
Revision ID: bce7acfe5a4f
4-
Revises: 24271525a263
4+
Revises: 1af4cc4f7cd5
55
Create Date: 2023-08-17 15:38:43.387065
66
77
"""
@@ -12,7 +12,7 @@
1212

1313
# revision identifiers, used by Alembic.
1414
revision = 'bce7acfe5a4f'
15-
down_revision = '24271525a263'
15+
down_revision = '1af4cc4f7cd5'
1616

1717

1818
def upgrade():

tests/all/integration/api/helpers/test_csv_jobs_util.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,35 @@
11
import unittest
22
from datetime import datetime
33

4-
from app.api.helpers.csv_jobs_util import *
4+
import pytz
5+
6+
from app.api.helpers.csv_jobs_util import (
7+
export_attendees_csv,
8+
export_orders_csv,
9+
export_sessions_csv,
10+
export_speakers_csv,
11+
)
512
from app.models import db
13+
from app.models.custom_form import ATTENDEE_CUSTOM_FORM
614
from tests.all.integration.auth_helper import create_user
715
from tests.all.integration.utils import OpenEventTestCase
816
from tests.factories import common
917
from tests.factories.attendee import AttendeeFactory
1018
from tests.factories.custom_form import CustomFormFactory
19+
from tests.factories.event import EventFactoryBasic
1120
from tests.factories.order import OrderFactory
1221
from tests.factories.session import SessionSubFactory
1322
from tests.factories.speaker import SpeakerFactory
14-
from app.models.custom_form import ATTENDEE_CUSTOM_FORM
1523

1624

1725
class TestExportCSV(OpenEventTestCase):
1826
def test_export_orders_csv(self):
1927
"""Method to check the orders data export"""
2028

2129
with self.app.test_request_context():
30+
test_event = EventFactoryBasic()
2231
test_order = OrderFactory(created_at=datetime.now())
32+
test_order.event = test_event
2333
test_order.amount = 2
2434
field_data = export_orders_csv([test_order])
2535
assert field_data[1][2] == 'initializing'
@@ -34,7 +44,8 @@ def test_export_attendees_csv(self):
3444
test_attendee.order = test_order
3545
custom_forms = CustomFormFactory()
3646
field_data = export_attendees_csv(
37-
[test_attendee], [custom_forms], ATTENDEE_CUSTOM_FORM)
47+
[test_attendee], [custom_forms], ATTENDEE_CUSTOM_FORM
48+
)
3849
# new export_attendees_csv will return list of dictionary for csv_writer
3950
assert field_data[0].get("Tax ID") == "tax id"
4051

0 commit comments

Comments
 (0)