Skip to content

Commit 11ab1d9

Browse files
ArnavBallinCodemariobehlingSak1012
authored
fix: Resolve multiple exporter failures after database migration (#1321)
* fix: Resolve multiple exporter failures after database migration * Update app/eventyay/base/exporters/waitinglist.py * removed redundant length checks in reports exporter * Update app/eventyay/plugins/ticketoutputpdf/exporters.py * Update app/eventyay/plugins/checkinlists/exporters.py * Update app/eventyay/plugins/badges/exporters.py * fix: remove duplicate JSON_FIELD_AVAILABLE definition --------- Co-authored-by: Mario Behling <mb@mariobehling.de> Co-authored-by: Srivatsav Auswin <75414859+Sak1012@users.noreply.github.com>
1 parent 2bc0cfb commit 11ab1d9

File tree

10 files changed

+67
-30
lines changed

10 files changed

+67
-30
lines changed

app/eventyay/base/exporter.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -345,10 +345,11 @@ def _render_xlsx(self, form_data, output_file=None):
345345
)
346346

347347
def render(self, form_data: dict, output_file=None) -> Tuple[str, str, bytes]:
348-
if form_data.get('_format') == 'xlsx':
348+
format_value = form_data.get('_format')
349+
if format_value == 'xlsx':
349350
return self._render_xlsx(form_data, output_file=output_file)
350-
elif ':' in form_data.get('_format'):
351-
sheet, f = form_data.get('_format').split(':')
351+
elif format_value and ':' in format_value:
352+
sheet, f = format_value.split(':')
352353
if f == 'default':
353354
return self._render_sheet_csv(
354355
form_data,

app/eventyay/base/exporters/dekodi.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class DekodiNREIExporter(BaseExporter):
2323

2424
def _encode_invoice(self, invoice: Invoice):
2525
p_last = invoice.order.payments.filter(
26-
state=[
26+
state__in=[
2727
OrderPayment.PAYMENT_STATE_CONFIRMED,
2828
OrderPayment.PAYMENT_STATE_REFUNDED,
2929
]

app/eventyay/base/exporters/json.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ def render(self, form_data):
5454
for variation in product.variations.all()
5555
],
5656
}
57+
5758
for product in self.event.products.select_related('tax_rule').prefetch_related('variations')
5859
],
5960
'questions': [

app/eventyay/base/exporters/orderlist.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ def iterate_orders(self, form_data: dict):
298298

299299
qs = self._date_filter(qs, form_data, rel='')
300300

301-
if form_data['paid_only']:
301+
if form_data.get('paid_only', True):
302302
qs = qs.filter(status=Order.STATUS_PAID)
303303
tax_rates = self._get_all_tax_rates(qs)
304304

@@ -529,7 +529,7 @@ def iterate_fees(self, form_data: dict):
529529
)
530530
.select_related('order', 'order__invoice_address', 'tax_rule')
531531
)
532-
if form_data['paid_only']:
532+
if form_data.get('paid_only', True):
533533
qs = qs.filter(order__status=Order.STATUS_PAID)
534534

535535
qs = self._date_filter(qs, form_data, rel='order__')
@@ -645,14 +645,14 @@ def iterate_positions(self, form_data: dict):
645645
.select_related(
646646
'order',
647647
'order__invoice_address',
648-
'item',
648+
'product',
649649
'variation',
650650
'voucher',
651651
'tax_rule',
652652
)
653653
.prefetch_related('answers', 'answers__question', 'answers__options')
654654
)
655-
if form_data['paid_only']:
655+
if form_data.get('paid_only', True):
656656
qs = qs.filter(order__status=Order.STATUS_PAID)
657657

658658
qs = self._date_filter(qs, form_data, rel='order__')
@@ -709,7 +709,7 @@ def iterate_positions(self, form_data: dict):
709709
for q in questions:
710710
if q.type == Question.TYPE_CHOICE_MULTIPLE:
711711
options[q.pk] = []
712-
if form_data['group_multiple_choice']:
712+
if form_data.get('group_multiple_choice', False):
713713
for o in q.options.all():
714714
options[q.pk].append(o)
715715
headers.append(str(q.question))
@@ -781,7 +781,7 @@ def iterate_positions(self, form_data: dict):
781781
row.append('')
782782
row.append('')
783783
row += [
784-
str(op.item),
784+
str(op.product),
785785
str(op.variation) if op.variation else '',
786786
op.price,
787787
op.tax_rate,
@@ -828,7 +828,7 @@ def iterate_positions(self, form_data: dict):
828828
acache[a.question_id] = str(a)
829829
for q in questions:
830830
if q.type == Question.TYPE_CHOICE_MULTIPLE:
831-
if form_data['group_multiple_choice']:
831+
if form_data.get('group_multiple_choice', False):
832832
row.append(
833833
', '.join(str(o.answer) for o in options[q.pk] if o.pk in acache.get(q.pk, set()))
834834
)

app/eventyay/base/exporters/waitinglist.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def iterate_list(self, form_data):
7171
WaitingListEntry.objects.filter(
7272
event__in=self.events,
7373
)
74-
.select_related('item', 'variation', 'voucher', 'subevent')
74+
.select_related('product', 'variation', 'voucher', 'subevent')
7575
.order_by('created')
7676
)
7777

@@ -122,7 +122,7 @@ def iterate_list(self, form_data):
122122
entry.name,
123123
entry.email,
124124
entry.phone,
125-
str(entry.item) if entry.item else '',
125+
str(entry.product) if entry.product else '',
126126
str(entry.variation) if entry.variation else '',
127127
entry.event.slug,
128128
entry.event.name,

app/eventyay/base/services/export.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,14 @@ def set_progress(val):
5757
'Your data table is too big for a PDF page. Please reduce the amount of data you are exporting.'
5858
)
5959
raise ExportError(msg) from e
60+
except Exception as e:
61+
logger.exception(f'Error during export with provider {provider}.')
62+
# Provide specific error message based on exception type
63+
error_msg = str(e) if str(e) else type(e).__name__
64+
msg = gettext(
65+
'An error occurred while generating your export: {error}. Please try again or contact support if the problem persists.'
66+
).format(error=error_msg)
67+
raise ExportError(msg) from e
6068
if d is None:
6169
raise ExportError(gettext('Your export did not contain any data.'))
6270
file.filename, file.type, data = d
@@ -113,7 +121,21 @@ def set_progress(val):
113121
continue
114122
ex = response(events, set_progress)
115123
if ex.identifier == provider:
116-
d = ex.render(form_data)
124+
try:
125+
d = ex.render(form_data)
126+
except LayoutError as e:
127+
logger.exception('Error while making PDF.')
128+
msg = gettext(
129+
'Your data table is too big for a PDF page. Please reduce the amount of data you are exporting.'
130+
)
131+
raise ExportError(msg) from e
132+
except Exception as e:
133+
logger.exception(f'Error during multi-event export with provider {provider}.')
134+
error_msg = str(e) if str(e) else type(e).__name__
135+
msg = gettext(
136+
'An error occurred while generating your export: {error}. Please try again or contact support if the problem persists.'
137+
).format(error=error_msg)
138+
raise ExportError(msg) from e
117139
if d is None:
118140
raise ExportError(gettext('Your export did not contain any data.'))
119141
file.filename, file.type, data = d

app/eventyay/plugins/badges/exporters.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,8 @@ def render_page(positions):
232232
if pagebuffer:
233233
render_page(pagebuffer)
234234

235+
if not any:
236+
raise OrderError(_('None of the selected products is configured to print badges.'))
235237
output_pdf_writer.add_metadata(
236238
{
237239
'/Title': 'Badges',
@@ -240,8 +242,6 @@ def render_page(positions):
240242
)
241243
output_pdf_writer.write(outbuffer)
242244
outbuffer.seek(0)
243-
if not any:
244-
raise OrderError(_('None of the selected products is configured to print badges.'))
245245
return outbuffer
246246

247247

app/eventyay/plugins/checkinlists/exporters.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ def _get_queryset(self, cl, form_data):
185185
)
186186
.select_related(
187187
'order',
188-
'item',
188+
'product',
189189
'variation',
190190
'addon_to',
191191
'order__invoice_address',
@@ -195,7 +195,7 @@ def _get_queryset(self, cl, form_data):
195195
)
196196

197197
if not cl.all_products:
198-
qs = qs.filter(item__in=cl.limit_products.values_list('id', flat=True))
198+
qs = qs.filter(product__in=cl.limit_products.values_list('id', flat=True))
199199

200200
if cl.subevent:
201201
qs = qs.filter(subevent=cl.subevent)
@@ -311,9 +311,13 @@ def pagesize(self):
311311
return pagesizes.landscape(pagesizes.A4)
312312

313313
def get_story(self, doc, form_data):
314+
if 'list' not in form_data or not form_data['list']:
315+
# Return empty story instead of None
316+
from reportlab.platypus import Paragraph
317+
return [Paragraph("No check-in list selected.", self.get_style())]
314318
cl = self.event.checkin_lists.get(pk=form_data['list'])
315319

316-
questions = tuple(Question.objects.filter(event=self.event, id__in=form_data['questions']))
320+
questions = tuple(Question.objects.filter(event=self.event, id__in=form_data.get('questions', [])))
317321

318322
headlinestyle = self.get_style()
319323
headlinestyle.fontSize = 15
@@ -703,7 +707,7 @@ def iterate_list(self, form_data):
703707
yield self.ProgressSetTotal(total=qs.count())
704708

705709
qs = qs.select_related(
706-
'position__item',
710+
'position__product',
707711
'position__order',
708712
'position__order__invoice_address',
709713
'position',
@@ -724,7 +728,7 @@ def iterate_list(self, form_data):
724728
ci.position.order.code,
725729
ci.position.positionid,
726730
ci.position.secret,
727-
str(ci.position.item),
731+
str(ci.position.product),
728732
ci.position.attendee_name or ia.name,
729733
str(ci.device),
730734
_('Yes') if ci.forced else _('No'),

app/eventyay/plugins/reports/exporters.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -375,28 +375,33 @@ def _table_story(self, doc, form_data, net=False):
375375
if tup[0]:
376376
tdata.append([Paragraph(str(tup[0].name), tstyle_bold)])
377377
for l, s in states:
378-
tdata[-1].append(str(tup[0].num[l][0]))
379-
tdata[-1].append(floatformat(tup[0].num[l][2 if net else 1], places))
378+
num_data = tup[0].num.get(l, (0, 0, 0)) if hasattr(tup[0], 'num') and tup[0].num else (0, 0, 0)
379+
tdata[-1].append(str(num_data[0]))
380+
tdata[-1].append(floatformat(num_data[2 if net else 1], places))
380381
for item in tup[1]:
381382
tdata.append([str(item)])
382383
for l, s in states:
383-
tdata[-1].append(str(item.num[l][0]))
384-
tdata[-1].append(floatformat(item.num[l][2 if net else 1], places))
384+
num_data = item.num.get(l, (0, 0, 0)) if hasattr(item, 'num') and item.num else (0, 0, 0)
385+
tdata[-1].append(str(num_data[0]))
386+
tdata[-1].append(floatformat(num_data[2 if net else 1], places))
385387
if item.has_variations:
386388
for var in item.all_variations:
387389
tdata.append([Paragraph(' ' + str(var), tstyle)])
388390
for l, s in states:
389-
tdata[-1].append(str(var.num[l][0]))
390-
tdata[-1].append(floatformat(var.num[l][2 if net else 1], places))
391+
num_data = var.num.get(l, (0, 0, 0)) if hasattr(var, 'num') and var.num else (0, 0, 0)
392+
tdata[-1].append(str(num_data[0]))
393+
tdata[-1].append(floatformat(num_data[2 if net else 1], places))
391394

392395
tdata.append(
393396
[
394397
_('Total'),
395398
]
396399
)
397400
for l, s in states:
398-
tdata[-1].append(str(total['num'][l][0]))
399-
tdata[-1].append(floatformat(total['num'][l][2 if net else 1], places))
401+
# Safeguard for empty data
402+
num_data = total.get('num', {}).get(l, (0, 0, 0))
403+
tdata[-1].append(str(num_data[0]))
404+
tdata[-1].append(floatformat(num_data[2 if net else 1], places))
400405

401406
table = Table(tdata, colWidths=colwidths, repeatRows=3)
402407
table.setStyle(TableStyle(tstyledata))

app/eventyay/plugins/ticketoutputpdf/exporters.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,11 @@ def render(self, form_data):
141141
)
142142

143143
o = PdfTicketOutput(Event.objects.none())
144+
any_tickets = False
144145
for op in qs:
145146
if not op.generate_ticket:
146147
continue
147-
148+
any_tickets = True
148149
if op.order.event != o.event:
149150
o = PdfTicketOutput(op.event)
150151

@@ -156,6 +157,9 @@ def render(self, form_data):
156157
outbuffer = o._draw_page(layout, op, op.order)
157158
merger.append(ContentFile(outbuffer.read()))
158159

160+
if not any_tickets:
161+
return None
162+
159163
outbuffer = BytesIO()
160164
merger.write(outbuffer)
161165
merger.close()

0 commit comments

Comments
 (0)