From 1666d06599ad692d10c3a0fb2e82411c188d8601 Mon Sep 17 00:00:00 2001 From: Arnav Angarkar Date: Mon, 17 Nov 2025 21:43:40 +0530 Subject: [PATCH 1/7] fix: Resolve multiple exporter failures after database migration --- app/eventyay/base/exporter.py | 7 +++-- app/eventyay/base/exporters/dekodi.py | 2 +- app/eventyay/base/exporters/json.py | 8 ++--- app/eventyay/base/exporters/orderlist.py | 14 ++++----- app/eventyay/base/exporters/waitinglist.py | 22 +++++++------- app/eventyay/base/services/export.py | 24 ++++++++++++++- app/eventyay/config/settings.py | 3 ++ app/eventyay/plugins/badges/exporters.py | 5 ++-- .../plugins/checkinlists/exporters.py | 29 +++++++++++-------- app/eventyay/plugins/reports/exporters.py | 21 +++++++++----- .../plugins/ticketoutputpdf/exporters.py | 13 ++++++--- 11 files changed, 95 insertions(+), 53 deletions(-) diff --git a/app/eventyay/base/exporter.py b/app/eventyay/base/exporter.py index 76412480f1..774afa4a5e 100644 --- a/app/eventyay/base/exporter.py +++ b/app/eventyay/base/exporter.py @@ -345,10 +345,11 @@ def _render_xlsx(self, form_data, output_file=None): ) def render(self, form_data: dict, output_file=None) -> Tuple[str, str, bytes]: - if form_data.get('_format') == 'xlsx': + format_value = form_data.get('_format') + if format_value == 'xlsx': return self._render_xlsx(form_data, output_file=output_file) - elif ':' in form_data.get('_format'): - sheet, f = form_data.get('_format').split(':') + elif format_value and ':' in format_value: + sheet, f = format_value.split(':') if f == 'default': return self._render_sheet_csv( form_data, diff --git a/app/eventyay/base/exporters/dekodi.py b/app/eventyay/base/exporters/dekodi.py index 8e88715dc5..b8e44561ff 100644 --- a/app/eventyay/base/exporters/dekodi.py +++ b/app/eventyay/base/exporters/dekodi.py @@ -23,7 +23,7 @@ class DekodiNREIExporter(BaseExporter): def _encode_invoice(self, invoice: Invoice): p_last = invoice.order.payments.filter( - state=[ + state__in=[ OrderPayment.PAYMENT_STATE_CONFIRMED, OrderPayment.PAYMENT_STATE_REFUNDED, ] diff --git a/app/eventyay/base/exporters/json.py b/app/eventyay/base/exporters/json.py index 926a4f9115..567e7df124 100644 --- a/app/eventyay/base/exporters/json.py +++ b/app/eventyay/base/exporters/json.py @@ -52,7 +52,7 @@ def render(self, form_data): for variation in item.variations.all() ], } - for item in self.event.items.select_related('tax_rule').prefetch_related('variations') + for item in self.event.products.select_related('tax_rule').prefetch_related('variations') ], 'questions': [ { @@ -80,7 +80,7 @@ def render(self, form_data): 'positions': [ { 'id': position.id, - 'item': position.item_id, + 'item': position.product_id, 'variation': position.variation_id, 'price': position.price, 'attendee_name': position.attendee_name, @@ -104,10 +104,10 @@ def render(self, form_data): { 'id': quota.id, 'size': quota.size, - 'items': [item.id for item in quota.items.all()], + 'items': [item.id for item in quota.products.all()], 'variations': [variation.id for variation in quota.variations.all()], } - for quota in self.event.quotas.all().prefetch_related('items', 'variations') + for quota in self.event.quotas.all().prefetch_related('products', 'variations') ], } } diff --git a/app/eventyay/base/exporters/orderlist.py b/app/eventyay/base/exporters/orderlist.py index ed6d9bac44..67759ba54f 100644 --- a/app/eventyay/base/exporters/orderlist.py +++ b/app/eventyay/base/exporters/orderlist.py @@ -290,7 +290,7 @@ def iterate_orders(self, form_data: dict): qs = self._date_filter(qs, form_data, rel='') - if form_data['paid_only']: + if form_data.get('paid_only', True): qs = qs.filter(status=Order.STATUS_PAID) tax_rates = self._get_all_tax_rates(qs) @@ -499,7 +499,7 @@ def iterate_fees(self, form_data: dict): ) .select_related('order', 'order__invoice_address', 'tax_rule') ) - if form_data['paid_only']: + if form_data.get('paid_only', True): qs = qs.filter(order__status=Order.STATUS_PAID) qs = self._date_filter(qs, form_data, rel='order__') @@ -615,14 +615,14 @@ def iterate_positions(self, form_data: dict): .select_related( 'order', 'order__invoice_address', - 'item', + 'product', 'variation', 'voucher', 'tax_rule', ) .prefetch_related('answers', 'answers__question', 'answers__options') ) - if form_data['paid_only']: + if form_data.get('paid_only', True): qs = qs.filter(order__status=Order.STATUS_PAID) qs = self._date_filter(qs, form_data, rel='order__') @@ -679,7 +679,7 @@ def iterate_positions(self, form_data: dict): for q in questions: if q.type == Question.TYPE_CHOICE_MULTIPLE: options[q.pk] = [] - if form_data['group_multiple_choice']: + if form_data.get('group_multiple_choice', False): for o in q.options.all(): options[q.pk].append(o) headers.append(str(q.question)) @@ -751,7 +751,7 @@ def iterate_positions(self, form_data: dict): row.append('') row.append('') row += [ - str(op.item), + str(op.product), str(op.variation) if op.variation else '', op.price, op.tax_rate, @@ -798,7 +798,7 @@ def iterate_positions(self, form_data: dict): acache[a.question_id] = str(a) for q in questions: if q.type == Question.TYPE_CHOICE_MULTIPLE: - if form_data['group_multiple_choice']: + if form_data.get('group_multiple_choice', False): row.append( ', '.join(str(o.answer) for o in options[q.pk] if o.pk in acache.get(q.pk, set())) ) diff --git a/app/eventyay/base/exporters/waitinglist.py b/app/eventyay/base/exporters/waitinglist.py index 9ae2818df7..5ef97004f6 100644 --- a/app/eventyay/base/exporters/waitinglist.py +++ b/app/eventyay/base/exporters/waitinglist.py @@ -71,7 +71,7 @@ def iterate_list(self, form_data): WaitingListEntry.objects.filter( event__in=self.events, ) - .select_related('item', 'variation', 'voucher', 'subevent') + .select_related('product', 'variation', 'voucher', 'subevent') .order_by('created') ) @@ -118,16 +118,16 @@ def iterate_list(self, form_data): datetime_format = '%Y-%m-%d %H:%M:%S' row = [ - entry.created.astimezone(tz).strftime(datetime_format), # alternative: .isoformat(), - entry.name, - entry.email, - entry.phone, - str(entry.item) if entry.item else '', - str(entry.variation) if entry.variation else '', - entry.event.slug, - entry.event.name, - entry.subevent.name if entry.subevent else '', - event_for_date_columns.date_from.astimezone(tz).strftime(datetime_format), + entry.created.astimezone(tz).strftime(datetime_format), # alternative: .isoformat(), + entry.name, + entry.email, + entry.phone, + str(entry.product) if entry.product else '', + str(entry.variation) if entry.variation else '', + entry.event.slug, + entry.event.name, + entry.subevent.name if entry.subevent else '', + event_for_date_columns.date_from.astimezone(tz).strftime(datetime_format), event_for_date_columns.date_to.astimezone(tz).strftime(datetime_format) if event_for_date_columns.date_to else '', diff --git a/app/eventyay/base/services/export.py b/app/eventyay/base/services/export.py index 9a7e171438..61716d21e5 100644 --- a/app/eventyay/base/services/export.py +++ b/app/eventyay/base/services/export.py @@ -57,6 +57,14 @@ def set_progress(val): 'Your data table is too big for a PDF page. Please reduce the amount of data you are exporting.' ) raise ExportError(msg) from e + except Exception as e: + logger.exception(f'Error during export with provider {provider}.') + # Provide specific error message based on exception type + error_msg = str(e) if str(e) else type(e).__name__ + msg = gettext( + 'An error occurred while generating your export: {error}. Please try again or contact support if the problem persists.' + ).format(error=error_msg) + raise ExportError(msg) from e if d is None: raise ExportError(gettext('Your export did not contain any data.')) file.filename, file.type, data = d @@ -113,7 +121,21 @@ def set_progress(val): continue ex = response(events, set_progress) if ex.identifier == provider: - d = ex.render(form_data) + try: + d = ex.render(form_data) + except LayoutError as e: + logger.exception('Error while making PDF.') + msg = gettext( + 'Your data table is too big for a PDF page. Please reduce the amount of data you are exporting.' + ) + raise ExportError(msg) from e + except Exception as e: + logger.exception(f'Error during multi-event export with provider {provider}.') + error_msg = str(e) if str(e) else type(e).__name__ + msg = gettext( + 'An error occurred while generating your export: {error}. Please try again or contact support if the problem persists.' + ).format(error=error_msg) + raise ExportError(msg) from e if d is None: raise ExportError(gettext('Your export did not contain any data.')) file.filename, file.type, data = d diff --git a/app/eventyay/config/settings.py b/app/eventyay/config/settings.py index 1893ef69dc..82c607f9a0 100644 --- a/app/eventyay/config/settings.py +++ b/app/eventyay/config/settings.py @@ -380,6 +380,9 @@ def instance_name(request): } } +# Feature flag for JSON field support (PostgreSQL only) +JSON_FIELD_AVAILABLE = DATABASES['default']['ENGINE'].split('.')[-1] == 'postgresql' + AUTHENTICATION_BACKENDS = ( 'rules.permissions.ObjectPermissionBackend', diff --git a/app/eventyay/plugins/badges/exporters.py b/app/eventyay/plugins/badges/exporters.py index f789e11089..d52b7fccf7 100644 --- a/app/eventyay/plugins/badges/exporters.py +++ b/app/eventyay/plugins/badges/exporters.py @@ -232,6 +232,9 @@ def render_page(positions): if pagebuffer: render_page(pagebuffer) + if not any: + raise OrderError(_('None of the selected products is configured to print badges.')) + output_pdf_writer.add_metadata( { '/Title': 'Badges', @@ -240,8 +243,6 @@ def render_page(positions): ) output_pdf_writer.write(outbuffer) outbuffer.seek(0) - if not any: - raise OrderError(_('None of the selected products is configured to print badges.')) return outbuffer diff --git a/app/eventyay/plugins/checkinlists/exporters.py b/app/eventyay/plugins/checkinlists/exporters.py index 5f8900625b..2875034dc2 100644 --- a/app/eventyay/plugins/checkinlists/exporters.py +++ b/app/eventyay/plugins/checkinlists/exporters.py @@ -185,7 +185,7 @@ def _get_queryset(self, cl, form_data): ) .select_related( 'order', - 'item', + 'product', 'variation', 'addon_to', 'order__invoice_address', @@ -195,7 +195,7 @@ def _get_queryset(self, cl, form_data): ) if not cl.all_products: - qs = qs.filter(item__in=cl.limit_products.values_list('id', flat=True)) + qs = qs.filter(product__in=cl.limit_products.values_list('id', flat=True)) if cl.subevent: qs = qs.filter(subevent=cl.subevent) @@ -311,9 +311,14 @@ def pagesize(self): return pagesizes.landscape(pagesizes.A4) def get_story(self, doc, form_data): + if 'list' not in form_data or not form_data['list']: + # Return empty story instead of None + from reportlab.platypus import Paragraph + return [Paragraph("No check-in list selected.", self.get_style())] + cl = self.event.checkin_lists.get(pk=form_data['list']) - questions = tuple(Question.objects.filter(event=self.event, id__in=form_data['questions'])) + questions = tuple(Question.objects.filter(event=self.event, id__in=form_data.get('questions', []))) headlinestyle = self.get_style() headlinestyle.fontSize = 15 @@ -397,7 +402,7 @@ def get_story(self, doc, form_data): name += '
' + iac item = '{} ({})'.format( - str(op.item) + (' – ' + str(op.variation.value) if op.variation else ''), + str(op.product) + (' – ' + str(op.variation.value) if op.variation else ''), money_filter(op.price, self.event.currency), ) if self.event.has_subevents and not cl.subevent: @@ -411,7 +416,7 @@ def get_story(self, doc, form_data): if op.seat: item += '
' + str(op.seat) row = [ - '!!' if op.item.checkin_attention or op.order.checkin_attention else '', + '!!' if op.product.checkin_attention or op.order.checkin_attention else '', CBFlowable(bool(op.last_checked_in)), '✘' if op.order.status != Order.STATUS_PAID else '✔', op.order.code, @@ -577,7 +582,7 @@ def iterate_list(self, form_data): ).get(k, '') ) row += [ - str(op.item) + (' – ' + str(op.variation.value) if op.variation else ''), + str(op.product) + (' – ' + str(op.variation.value) if op.variation else ''), op.price, date_format( last_checked_in.astimezone(self.event.timezone), @@ -639,7 +644,7 @@ def iterate_list(self, form_data): row.append(op.voucher.code if op.voucher else '') row.append(op.order.datetime.astimezone(self.event.timezone).strftime('%Y-%m-%d')) row.append(op.order.datetime.astimezone(self.event.timezone).strftime('%H:%M:%S')) - row.append(_('Yes') if op.order.checkin_attention or op.item.checkin_attention else _('No')) + row.append(_('Yes') if op.order.checkin_attention or op.product.checkin_attention else _('No')) row.append(op.order.comment or '') if op.seat: @@ -698,12 +703,12 @@ def iterate_list(self, form_data): if form_data.get('list'): qs = qs.filter(list_id=form_data.get('list')) if form_data.get('items'): - qs = qs.filter(position__item_id__in=form_data['items']) + qs = qs.filter(position__product_id__in=form_data['items']) yield self.ProgressSetTotal(total=qs.count()) qs = qs.select_related( - 'position__item', + 'position__product', 'position__order', 'position__order__invoice_address', 'position', @@ -724,7 +729,7 @@ def iterate_list(self, form_data): ci.position.order.code, ci.position.positionid, ci.position.secret, - str(ci.position.item), + str(ci.position.product), ci.position.attendee_name or ia.name, str(ci.device), _('Yes') if ci.forced else _('No'), @@ -749,10 +754,10 @@ def _fields(self): ( 'items', forms.ModelMultipleChoiceField( - queryset=self.event.items.all(), + queryset=self.event.products.all(), label=_('Limit to products'), widget=forms.CheckboxSelectMultiple(attrs={'class': 'scrolling-multiple-choice'}), - initial=self.event.items.all(), + initial=self.event.products.all(), ), ), ] diff --git a/app/eventyay/plugins/reports/exporters.py b/app/eventyay/plugins/reports/exporters.py index 40c066bee6..0f4eeea03b 100644 --- a/app/eventyay/plugins/reports/exporters.py +++ b/app/eventyay/plugins/reports/exporters.py @@ -374,19 +374,22 @@ def _table_story(self, doc, form_data, net=False): if tup[0]: tdata.append([Paragraph(str(tup[0].name), tstyle_bold)]) for l, s in states: - tdata[-1].append(str(tup[0].num[l][0])) - tdata[-1].append(floatformat(tup[0].num[l][2 if net else 1], places)) + num_data = tup[0].num.get(l, (0, 0, 0)) if hasattr(tup[0], 'num') and tup[0].num else (0, 0, 0) + tdata[-1].append(str(num_data[0] if len(num_data) > 0 else 0)) + tdata[-1].append(floatformat(num_data[2 if net else 1] if len(num_data) > (2 if net else 1) else 0, places)) for item in tup[1]: tdata.append([str(item)]) for l, s in states: - tdata[-1].append(str(item.num[l][0])) - tdata[-1].append(floatformat(item.num[l][2 if net else 1], places)) + num_data = item.num.get(l, (0, 0, 0)) if hasattr(item, 'num') and item.num else (0, 0, 0) + tdata[-1].append(str(num_data[0] if len(num_data) > 0 else 0)) + tdata[-1].append(floatformat(num_data[2 if net else 1] if len(num_data) > (2 if net else 1) else 0, places)) if item.has_variations: for var in item.all_variations: tdata.append([Paragraph(' ' + str(var), tstyle)]) for l, s in states: - tdata[-1].append(str(var.num[l][0])) - tdata[-1].append(floatformat(var.num[l][2 if net else 1], places)) + num_data = var.num.get(l, (0, 0, 0)) if hasattr(var, 'num') and var.num else (0, 0, 0) + tdata[-1].append(str(num_data[0] if len(num_data) > 0 else 0)) + tdata[-1].append(floatformat(num_data[2 if net else 1] if len(num_data) > (2 if net else 1) else 0, places)) tdata.append( [ @@ -394,8 +397,10 @@ def _table_story(self, doc, form_data, net=False): ] ) for l, s in states: - tdata[-1].append(str(total['num'][l][0])) - tdata[-1].append(floatformat(total['num'][l][2 if net else 1], places)) + # Safeguard for empty data + num_data = total.get('num', {}).get(l, (0, 0, 0)) + tdata[-1].append(str(num_data[0] if len(num_data) > 0 else 0)) + tdata[-1].append(floatformat(num_data[2 if net else 1] if len(num_data) > (2 if net else 1) else 0, places)) table = Table(tdata, colWidths=colwidths, repeatRows=3) table.setStyle(TableStyle(tstyledata)) diff --git a/app/eventyay/plugins/ticketoutputpdf/exporters.py b/app/eventyay/plugins/ticketoutputpdf/exporters.py index 2c54ad716a..307b6b6aec 100644 --- a/app/eventyay/plugins/ticketoutputpdf/exporters.py +++ b/app/eventyay/plugins/ticketoutputpdf/exporters.py @@ -90,7 +90,7 @@ def render(self, form_data): qs = ( OrderPosition.objects.filter(order__event__in=self.events) .prefetch_related('answers', 'answers__question') - .select_related('order', 'item', 'variation', 'addon_to') + .select_related('order', 'product', 'variation', 'addon_to') ) if form_data.get('include_pending'): @@ -141,21 +141,26 @@ def render(self, form_data): ) o = PdfTicketOutput(Event.objects.none()) + any_tickets = False for op in qs: if not op.generate_ticket: continue - + + any_tickets = True if op.order.event != o.event: o = PdfTicketOutput(op.event) with language(op.order.locale, o.event.settings.region): layout = o.layout_map.get( - (op.item_id, op.order.sales_channel), - o.layout_map.get((op.item_id, 'web'), o.default_layout), + (op.product_id, op.order.sales_channel), + o.layout_map.get((op.product_id, 'web'), o.default_layout), ) outbuffer = o._draw_page(layout, op, op.order) merger.append(ContentFile(outbuffer.read())) + if not any_tickets: + return None + outbuffer = BytesIO() merger.write(outbuffer) merger.close() From 597d5e0c362aef3a846343b840a529b866456d1a Mon Sep 17 00:00:00 2001 From: Arnav Angarkar Date: Mon, 24 Nov 2025 20:41:56 +0530 Subject: [PATCH 2/7] Update app/eventyay/base/exporters/waitinglist.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- app/eventyay/base/exporters/waitinglist.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/app/eventyay/base/exporters/waitinglist.py b/app/eventyay/base/exporters/waitinglist.py index e81f4b29e6..13a05f794f 100644 --- a/app/eventyay/base/exporters/waitinglist.py +++ b/app/eventyay/base/exporters/waitinglist.py @@ -118,16 +118,16 @@ def iterate_list(self, form_data): datetime_format = '%Y-%m-%d %H:%M:%S %Z' row = [ - entry.created.astimezone(tz).strftime(datetime_format), # alternative: .isoformat(), - entry.name, - entry.email, - entry.phone, - str(entry.product) if entry.product else '', - str(entry.variation) if entry.variation else '', - entry.event.slug, - entry.event.name, - entry.subevent.name if entry.subevent else '', - event_for_date_columns.date_from.astimezone(tz).strftime(datetime_format), + entry.created.astimezone(tz).strftime(datetime_format), # alternative: .isoformat(), + entry.name, + entry.email, + entry.phone, + str(entry.product) if entry.product else '', + str(entry.variation) if entry.variation else '', + entry.event.slug, + entry.event.name, + entry.subevent.name if entry.subevent else '', + event_for_date_columns.date_from.astimezone(tz).strftime(datetime_format), event_for_date_columns.date_to.astimezone(tz).strftime(datetime_format) if event_for_date_columns.date_to else '', From 6710ee311b30a3c7e28f6eab9a82ab2333130f12 Mon Sep 17 00:00:00 2001 From: Arnav Angarkar Date: Mon, 24 Nov 2025 20:47:44 +0530 Subject: [PATCH 3/7] removed redundant length checks in reports exporter --- app/eventyay/plugins/reports/exporters.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/eventyay/plugins/reports/exporters.py b/app/eventyay/plugins/reports/exporters.py index 30537e1303..5d77838fa3 100644 --- a/app/eventyay/plugins/reports/exporters.py +++ b/app/eventyay/plugins/reports/exporters.py @@ -376,21 +376,21 @@ def _table_story(self, doc, form_data, net=False): tdata.append([Paragraph(str(tup[0].name), tstyle_bold)]) for l, s in states: num_data = tup[0].num.get(l, (0, 0, 0)) if hasattr(tup[0], 'num') and tup[0].num else (0, 0, 0) - tdata[-1].append(str(num_data[0] if len(num_data) > 0 else 0)) - tdata[-1].append(floatformat(num_data[2 if net else 1] if len(num_data) > (2 if net else 1) else 0, places)) + tdata[-1].append(str(num_data[0])) + tdata[-1].append(floatformat(num_data[2 if net else 1], places)) for item in tup[1]: tdata.append([str(item)]) for l, s in states: num_data = item.num.get(l, (0, 0, 0)) if hasattr(item, 'num') and item.num else (0, 0, 0) - tdata[-1].append(str(num_data[0] if len(num_data) > 0 else 0)) - tdata[-1].append(floatformat(num_data[2 if net else 1] if len(num_data) > (2 if net else 1) else 0, places)) + tdata[-1].append(str(num_data[0])) + tdata[-1].append(floatformat(num_data[2 if net else 1], places)) if item.has_variations: for var in item.all_variations: tdata.append([Paragraph(' ' + str(var), tstyle)]) for l, s in states: num_data = var.num.get(l, (0, 0, 0)) if hasattr(var, 'num') and var.num else (0, 0, 0) - tdata[-1].append(str(num_data[0] if len(num_data) > 0 else 0)) - tdata[-1].append(floatformat(num_data[2 if net else 1] if len(num_data) > (2 if net else 1) else 0, places)) + tdata[-1].append(str(num_data[0])) + tdata[-1].append(floatformat(num_data[2 if net else 1], places)) tdata.append( [ @@ -400,8 +400,8 @@ def _table_story(self, doc, form_data, net=False): for l, s in states: # Safeguard for empty data num_data = total.get('num', {}).get(l, (0, 0, 0)) - tdata[-1].append(str(num_data[0] if len(num_data) > 0 else 0)) - tdata[-1].append(floatformat(num_data[2 if net else 1] if len(num_data) > (2 if net else 1) else 0, places)) + tdata[-1].append(str(num_data[0])) + tdata[-1].append(floatformat(num_data[2 if net else 1], places)) table = Table(tdata, colWidths=colwidths, repeatRows=3) table.setStyle(TableStyle(tstyledata)) From 1fb344c841f8873444462ace3bd272d38cf7338c Mon Sep 17 00:00:00 2001 From: Arnav Angarkar Date: Mon, 24 Nov 2025 20:56:29 +0530 Subject: [PATCH 4/7] Update app/eventyay/plugins/ticketoutputpdf/exporters.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- app/eventyay/plugins/ticketoutputpdf/exporters.py | 1 - 1 file changed, 1 deletion(-) diff --git a/app/eventyay/plugins/ticketoutputpdf/exporters.py b/app/eventyay/plugins/ticketoutputpdf/exporters.py index 307b6b6aec..35ca3c4fef 100644 --- a/app/eventyay/plugins/ticketoutputpdf/exporters.py +++ b/app/eventyay/plugins/ticketoutputpdf/exporters.py @@ -145,7 +145,6 @@ def render(self, form_data): for op in qs: if not op.generate_ticket: continue - any_tickets = True if op.order.event != o.event: o = PdfTicketOutput(op.event) From 23d1209b1d0c75c8124952bed507da5006ac02a1 Mon Sep 17 00:00:00 2001 From: Arnav Angarkar Date: Mon, 24 Nov 2025 20:56:37 +0530 Subject: [PATCH 5/7] Update app/eventyay/plugins/checkinlists/exporters.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- app/eventyay/plugins/checkinlists/exporters.py | 1 - 1 file changed, 1 deletion(-) diff --git a/app/eventyay/plugins/checkinlists/exporters.py b/app/eventyay/plugins/checkinlists/exporters.py index ee060530b7..4c401afd5b 100644 --- a/app/eventyay/plugins/checkinlists/exporters.py +++ b/app/eventyay/plugins/checkinlists/exporters.py @@ -315,7 +315,6 @@ def get_story(self, doc, form_data): # Return empty story instead of None from reportlab.platypus import Paragraph return [Paragraph("No check-in list selected.", self.get_style())] - cl = self.event.checkin_lists.get(pk=form_data['list']) questions = tuple(Question.objects.filter(event=self.event, id__in=form_data.get('questions', []))) From 471b2a646bbb443fd26e5254476b220678eea00a Mon Sep 17 00:00:00 2001 From: Arnav Angarkar Date: Mon, 24 Nov 2025 20:56:44 +0530 Subject: [PATCH 6/7] Update app/eventyay/plugins/badges/exporters.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- app/eventyay/plugins/badges/exporters.py | 1 - 1 file changed, 1 deletion(-) diff --git a/app/eventyay/plugins/badges/exporters.py b/app/eventyay/plugins/badges/exporters.py index d52b7fccf7..24f60ece58 100644 --- a/app/eventyay/plugins/badges/exporters.py +++ b/app/eventyay/plugins/badges/exporters.py @@ -234,7 +234,6 @@ def render_page(positions): if not any: raise OrderError(_('None of the selected products is configured to print badges.')) - output_pdf_writer.add_metadata( { '/Title': 'Badges', From 304baa33d1112ab60480465088903e3c12a83d8d Mon Sep 17 00:00:00 2001 From: Arnav Angarkar Date: Mon, 24 Nov 2025 21:03:37 +0530 Subject: [PATCH 7/7] fix: remove duplicate JSON_FIELD_AVAILABLE definition --- app/eventyay/config/settings.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/eventyay/config/settings.py b/app/eventyay/config/settings.py index 288ff0c215..fad4464269 100644 --- a/app/eventyay/config/settings.py +++ b/app/eventyay/config/settings.py @@ -380,9 +380,6 @@ def instance_name(request): } } -# Feature flag for JSON field support (PostgreSQL only) -JSON_FIELD_AVAILABLE = DATABASES['default']['ENGINE'].split('.')[-1] == 'postgresql' - AUTHENTICATION_BACKENDS = ( 'rules.permissions.ObjectPermissionBackend', @@ -814,6 +811,7 @@ def instance_name(request): REDIS_URL = config.get('redis', 'location') HAS_REDIS = bool(REDIS_URL) +# eventyay only supports PostgreSQL, so JSONField is always available JSON_FIELD_AVAILABLE = True REDIS_HOSTS = [ {