Skip to content
Open
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
193 commits
Select commit Hold shift + click to select a range
a2a1c49
Translated using Weblate (Chinese (Traditional Han script))
Sep 14, 2025
6b51662
Translated using Weblate (Chinese (Traditional Han script))
Supaplextw Sep 15, 2025
131c921
Translated using Weblate (Polish (pl_INFORMAL))
PINGWINIxPLa Sep 30, 2025
3a297a4
Added translation using Weblate (Persian)
abbasdp Oct 4, 2025
fef8ae3
Added translation using Weblate (Indonesian)
mariobehling Oct 8, 2025
74c3335
Added translation using Weblate (Japanese)
mariobehling Oct 8, 2025
5071335
Added translation using Weblate (Korean)
mariobehling Oct 8, 2025
1351deb
Added translation using Weblate (Malay)
mariobehling Oct 8, 2025
69f73ce
Added translation using Weblate (Thai)
mariobehling Oct 8, 2025
3531e00
Added translation using Weblate (Vietnamese)
mariobehling Oct 8, 2025
c380b53
i18n(translations): update localized strings from Weblate
Oct 9, 2025
b5baaf1
i18n(translations): update localized strings from Weblate
Supaplextw Oct 9, 2025
9576138
fix: remove unstable component selection and ensure initial event dat…
taanvi2205 Nov 11, 2025
5c78417
HTTP 500 error when accessing Orders Export page
ArnavBallinCode Nov 13, 2025
f89f964
Fix similar export bug in organizer.py
ArnavBallinCode Nov 13, 2025
009f9e1
refactor: sourcery suggested so
ArnavBallinCode Nov 13, 2025
417c745
fix: add JSON_FIELD_AVAILABLE setting and fix Event.items reference
ArnavBallinCode Nov 14, 2025
b261f08
Merge branch 'enext' into fix/order-export-500-clean
ArnavBallinCode Nov 14, 2025
fe447da
Merge branch 'enext' into fix/order-export-500-clean
ArnavBallinCode Nov 14, 2025
3da5c3d
Merge branch 'enext' into fix/order-export-500-clean
mariobehling Nov 14, 2025
882e917
fix: preserve partial form data and rename items to products
ArnavBallinCode Nov 14, 2025
e7d3afa
Merge branch 'enext' into fix/order-export-500-clean
ArnavBallinCode Nov 14, 2025
75255dc
Speaker acceptance email confirmation link returning 500 error
ArnavBallinCode Nov 15, 2025
53443bd
refactoring as said by copilot to use cleaner dispatch pattern for p…
ArnavBallinCode Nov 15, 2025
7b10f28
Merge branch 'enext' into fix/order-export-500-clean
ArnavBallinCode Nov 15, 2025
bf481dc
Revert to manual initialization - correct fix
ArnavBallinCode Nov 15, 2025
6fd06dd
..
ArnavBallinCode Nov 15, 2025
e38a7f6
Merge branch 'enext' into fix/order-export-500-clean
mariobehling Nov 15, 2025
f932d03
Merge branch 'enext' into fix/issue-1276-speaker-acceptance-link-oof
ArnavBallinCode Nov 15, 2025
12840b4
Merge branch 'enext' into fix/order-export-500-clean
ArnavBallinCode Nov 16, 2025
f416461
fix(ui) unify navigation button styling across Tickets and Talk views…
ArnavBallinCode Nov 16, 2025
38f84d7
fix(ui): prevent sidebar auto-collapse on navigation (#1306)
ArnavBallinCode Nov 16, 2025
a6636c2
Chore: remove ticket/video URL fields (#1309)
Saksham-Sirohi Nov 16, 2025
30c28a8
remove logout button on video component (#1313)
Saksham-Sirohi Nov 16, 2025
b7856b5
PostgreSQL syntax error in Room permission query (#1314)
suhailnadaf509 Nov 16, 2025
27d425e
Merge branch 'enext' into fix/order-export-500-clean
ArnavBallinCode Nov 17, 2025
7ca8ef7
fix unable to save config (#1295)
Saksham-Sirohi Nov 17, 2025
6266c3f
Refactored the entire system to replace all legacy 'pretix/pretalx' r…
ArnavBallinCode Nov 17, 2025
d6f5a67
Merge branch 'enext' into fix/order-export-500-clean
ArnavBallinCode Nov 17, 2025
f1ba6a7
bug: enable browser timezone for orders and mails optimizing filters …
Saksham-Sirohi Nov 18, 2025
021c73b
chore(deps): update reportlab requirement from ==4.2.* to ==4.4.* (#1…
dependabot[bot] Nov 18, 2025
7e65d34
chore: remove duplicate orga settings (#1320)
Saksham-Sirohi Nov 18, 2025
06b4377
Merge branch 'enext' into fix/issue-1276-speaker-acceptance-link-oof
ArnavBallinCode Nov 18, 2025
a81a1e0
chore(deps): update stripe requirement from ==13.2.* to ==14.0.* (#1327)
dependabot[bot] Nov 19, 2025
018f1ac
chore(deps): update sentry-sdk requirement from ==2.44.* to ==2.45.* …
dependabot[bot] Nov 19, 2025
3963cc7
Resolve Sidebar Icon Layout Shift (#1319)
ArnavBallinCode Nov 20, 2025
4c92d7e
Fix: socialauth URLs were not resolved (#1324)
hongquan Nov 20, 2025
a18c3f0
Merge branch 'enext' into fix/order-export-500-clean
mariobehling Nov 20, 2025
ad200eb
Merge branch 'enext' into fix-issue-ticket-warning
mariobehling Nov 20, 2025
cdaeb4b
removed copilot sugguestions
ArnavBallinCode Nov 20, 2025
8cda595
chore: add translations korean and indonesian (#1330)
Saksham-Sirohi Nov 20, 2025
16d750b
Merge branch 'enext' into fix/issue-1276-speaker-acceptance-link-oof
ArnavBallinCode Nov 21, 2025
87e560f
Merge branch 'enext' into fix/order-export-500-clean
ArnavBallinCode Nov 21, 2025
84dbee0
feature: added hidden rooms and ensure sync (#1184)
Saksham-Sirohi Nov 21, 2025
978e73a
chore(deps): update geoip2 requirement from ==4.* to ==5.* (#1333)
dependabot[bot] Nov 22, 2025
8d4d440
chore(deps): update redis requirement from ==7.0.* to ==7.1.* (#1329)
dependabot[bot] Nov 22, 2025
3efab3b
Fix: HTTP 500 error handling during room deletion (#1280)
ArnavBallinCode Nov 22, 2025
54f1945
Fix: gift card 500 error (#1260)
ArnavBallinCode Nov 22, 2025
ab3731d
Fix CSV Export Returns 500 Error (#1267)
prayag78 Nov 22, 2025
67d2ac5
Export orders with Wikimedia username (#1332)
hongquan Nov 22, 2025
0011de0
bug: image rescaling fix (#1292)
Saksham-Sirohi Nov 23, 2025
c32bcf6
Merge branch 'enext' into fix/order-export-500-clean
mariobehling Nov 23, 2025
70a8496
fix(ui): match top menu bar between eventyay talk and eventyay ticket…
prayag78 Nov 23, 2025
165591d
Merge branch 'enext' into fix/order-export-500-clean
ArnavBallinCode Nov 23, 2025
0d47b00
add polls to default_feature_flags (#1337)
suhailnadaf509 Nov 23, 2025
b59ae4c
chore(deps): update sentry-sdk requirement from ==2.45.* to ==2.46.* …
dependabot[bot] Nov 24, 2025
de46975
Delete URL redirection for legacy eventyay-xx websites (#1338)
hongquan Nov 24, 2025
c2a07de
fix: resolve PDF download issues (#1256)
ArnavBallinCode Nov 24, 2025
f1029e2
Merge branch 'enext' into fix/order-export-500-clean
ArnavBallinCode Nov 24, 2025
858357a
Merge branch 'enext' into fix/issue-1276-speaker-acceptance-link-oof
ArnavBallinCode Nov 24, 2025
4a8e658
chore(deps): update django-phonenumber-field requirement (#1347)
dependabot[bot] Nov 25, 2025
2a386ae
chore(deps): update django-countries requirement from ==8.1.* to ==8.…
dependabot[bot] Nov 25, 2025
11ce87b
Merge branch 'enext' into fix/issue-1276-speaker-acceptance-link-oof
Sak1012 Nov 25, 2025
31b3b13
Merge branch 'enext' into fix/order-export-500-clean
Sak1012 Nov 25, 2025
563ce6b
fix(badge): add missing item to product rename in badge view (#1349)
Sak1012 Nov 25, 2025
b0d2953
fix rooms not working on video (#1339)
Saksham-Sirohi Nov 25, 2025
ed8b429
fix(500): item to product renames (#1350)
Sak1012 Nov 25, 2025
7e66527
Show Wikimedia username in ticket checkout page (#1351)
hongquan Nov 27, 2025
7962edb
Fix translation weblate integration (#1353)
Sak1012 Nov 27, 2025
246cb3f
chore(deps): bump pydantic from 2.12.4 to 2.12.5 (#1354)
dependabot[bot] Nov 27, 2025
6730f31
refactor: remove JSON_FIELD_AVAILABLE checks from exporters
ArnavBallinCode Nov 27, 2025
19a0cbe
Fix issue #1276: Remove indentation from URLs in email templates
ArnavBallinCode Nov 27, 2025
1492848
Merge branch 'enext' into fix/order-export-500-clean
mariobehling Nov 28, 2025
c1fecb6
Merge remote-tracking branch 'main/enext' into translated
Sak1012 Nov 28, 2025
94791cc
Merge pull request #1258 from ArnavBallinCode/fix/order-export-500-clean
hpdang Nov 28, 2025
385875a
Merge branch 'enext' into fix/issue-1276-speaker-acceptance-link-oof
ArnavBallinCode Nov 28, 2025
57385bd
fix: Update Bank Transfer text and fix broken payment docs link (Fixe…
MohammedAnasNathani Nov 28, 2025
2c3b4be
Merge branch 'enext' into translated
Sak1012 Nov 28, 2025
2bc0cfb
Merge pull request #1355 from fossasia/translated
mariobehling Nov 28, 2025
11ab1d9
fix: Resolve multiple exporter failures after database migration (#1321)
ArnavBallinCode Nov 28, 2025
a435789
Merge branch 'enext' into fix/issue-1276-speaker-acceptance-link-oof
ArnavBallinCode Nov 28, 2025
1b95c01
chore: fixed featured sessions and 500 errors on sessions and reviews…
Saksham-Sirohi Nov 28, 2025
b6deb48
Fix: Replace 'CfP' with 'Call for Papers' to fix translations #997 (#…
krishmishra846-alt Nov 28, 2025
0e787fe
move api app (#1335)
Gagan-Ram Nov 28, 2025
c47d6cf
Merge branch 'enext' into fix/issue-1276-speaker-acceptance-link-oof
mariobehling Nov 28, 2025
3ba8c33
Fixes 404 and url rename (#1235)
Saksham-Sirohi Nov 28, 2025
d5cf4da
i18n(translations): update localized strings from Weblate
SantosSi Nov 27, 2025
4d3509a
added talk endpoint (#1362)
Saksham-Sirohi Nov 28, 2025
9741041
Fix CSS not updating after color settings change (#1360)
prayag78 Nov 28, 2025
5619f8b
Merge branch 'enext' into translated
Sak1012 Nov 29, 2025
61b053f
fix(translations): remove old translation files and merge redundant f…
Sak1012 Nov 29, 2025
bbd03e0
Merge pull request #1361 from fossasia/translated
mariobehling Nov 29, 2025
1087bc4
Merge branch 'enext' into fix/issue-1276-speaker-acceptance-link-oof
ArnavBallinCode Nov 29, 2025
8d3ed18
fix(locale): Update gettext location comments in the locale file (#1372)
Sak1012 Nov 30, 2025
aff478a
i18n(translations): update localized strings from Weblate
weblate Nov 29, 2025
547a058
i18n(translations): update localized strings from Weblate
weblate Nov 29, 2025
070d9cf
i18n(translations): update localized strings from Weblate
weblate Nov 29, 2025
f65a67a
i18n(translations): update localized strings from Weblate
weblate Nov 29, 2025
36ef340
i18n(translations): update localized strings from Weblate
weblate Nov 29, 2025
5a745e1
i18n(translations): update localized strings from Weblate
weblate Nov 29, 2025
ac2e695
i18n(translations): update localized strings from Weblate
weblate Nov 29, 2025
61cba87
i18n(translations): update localized strings from Weblate
weblate Nov 29, 2025
d342560
i18n(translations): update localized strings from Weblate
Nov 29, 2025
372214e
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
30fccdf
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
013226c
i18n(translations): update localized strings from Weblate
Nov 30, 2025
c63b658
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
8f641e4
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
8b0bbf5
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
cb2d07b
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
e9d81e2
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
7c5ae9b
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
38da9fd
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
7ae98c3
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
d7233c1
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
432efd2
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
de782bf
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
6201f0c
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
c9110ee
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
82b9894
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
57b9768
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
a4486bc
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
17cdd2a
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
b645a97
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
faaf649
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
dd4cead
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
d2b12a5
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
9ba012c
Fix: Hide unpublished sessions from talk component menu (#1318)
ArnavBallinCode Nov 30, 2025
515ae57
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
c41fe17
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
cc02379
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
a3e0da4
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
e2cb4da
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
f2adfc5
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
c342a4b
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
8a405ac
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
8784ccf
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
6892b32
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
b0a0793
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
2d80f39
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
3580b64
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
418ebea
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
5f72264
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
0645732
Update README with new repository links
mariobehling Nov 30, 2025
5919fd6
i18n(translations): update localized strings from Weblate
weblate Nov 30, 2025
c51830a
Merge remote-tracking branch 'origin/enext' into enext
weblate Nov 30, 2025
32a6c01
Merge pull request #1387 from fossasia/translated
mariobehling Nov 30, 2025
25dbc11
Merge branch 'enext' into fix/issue-1276-speaker-acceptance-link-oof
Sak1012 Dec 1, 2025
073f140
Remove redundant self.request/args/kwargs assignment in SubmissionCon…
ArnavBallinCode Dec 1, 2025
b00f5a5
Merge pull request #1300 from ArnavBallinCode/fix/issue-1276-speaker-…
hpdang Dec 1, 2025
408180c
fix(translations): Add missing languages (#1396)
Sak1012 Dec 1, 2025
7cd80c2
fix(translation): Move inline js to static file (#1397)
Sak1012 Dec 1, 2025
cb63c6e
chore(deps): update beautifulsoup4 requirement from ==4.12.* to ==4.1…
dependabot[bot] Dec 1, 2025
a37680c
chore(deps): update celery requirement from ==5.4.* to ==5.6.* (#1400)
dependabot[bot] Dec 1, 2025
0d41a22
fix navigation hover shifting by adding default transparent bottom bo…
aliciacilmora Dec 1, 2025
727bead
fix(voucher): Fix typo to return `True`
Sak1012 Dec 1, 2025
9a0cbb4
fix(product): item to product rename in CartPosition
Sak1012 Dec 1, 2025
9f0b8d0
fix: Fatal Server Error when creating room in video component (#1409)
suhailnadaf509 Dec 1, 2025
74f6b42
fix(mail): fix timezone mismatch in mail (#1411)
Sak1012 Dec 2, 2025
4576937
Fix "powered by eventyay" placement on Ticket Pages to match Talk Com…
prayag78 Dec 2, 2025
86933f8
fix: race condition in checkout allows overselling (#1359) (#1378)
MohammedAnasNathani Dec 2, 2025
015c8e6
room creation null fix (#1414)
Saksham-Sirohi Dec 2, 2025
436d29f
fix(language): Restore language selection to checkbox list (#1412)
Sak1012 Dec 2, 2025
afc1002
Fixing the Cfp custom fields (#1408)
ArnavBallinCode Dec 2, 2025
b31c8f4
i18n(translations): update localized strings from Weblate (#1413)
weblate Dec 2, 2025
0b80d26
Auto-expanding textarea for frontpage text in event settings (#1340)
jevinjojo Dec 2, 2025
788eaf0
add logging for room problem (#1415)
Saksham-Sirohi Dec 3, 2025
e0dadee
Implement drag sort cfp questions (#1422)
ArnavBallinCode Dec 3, 2025
2b08d74
Update question type labels for better clarity in both attendee and s…
ArnavBallinCode Dec 3, 2025
4fda201
fix(migrations): Add missing migrations (#1426)
Sak1012 Dec 3, 2025
cc13d31
room complete setup pass (#1425)
Saksham-Sirohi Dec 3, 2025
b16780f
fix(brand): rebranding (#1428)
Sak1012 Dec 3, 2025
ed8ad4e
chore: save room fix try (#1429)
Saksham-Sirohi Dec 4, 2025
18c82a3
i18n(translations): update localized strings from Weblate
robertsky Dec 4, 2025
0dda0ac
i18n(translations): update localized strings from Weblate
robertsky Dec 4, 2025
56f8e35
i18n(translations): update localized strings from Weblate
Dec 4, 2025
a20218f
i18n(translations): update localized strings from Weblate
robertsky Dec 4, 2025
c6466a4
i18n(translations): update localized strings from Weblate
Rachmat04 Dec 4, 2025
d475397
i18n(translations): update localized strings from Weblate
Dec 4, 2025
b80f84a
Merge pull request #1436 from fossasia/translated
mariobehling Dec 4, 2025
2388cae
chore(deps): update sentry-sdk requirement from ==2.46.* to ==2.47.* …
dependabot[bot] Dec 4, 2025
0ce5028
speaker form fixes (#1434)
Saksham-Sirohi Dec 4, 2025
525ab25
Merge branch 'enext' into fix-issue-ticket-warning
mariobehling Dec 4, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 7 additions & 9 deletions app/eventyay/agenda/views/talk.py
Original file line number Diff line number Diff line change
Expand Up @@ -360,15 +360,13 @@ def check_user_owning_ticket(user: User, event: Event) -> TicketCheckResult:
# NOTE: It doesn't work with the Docker setup for development, because we use fake domain then,
and inside the container, the fake domain points to the container itself, not the host.
"""
if 'ticket_link' not in event.display_settings:
logger.info('display_settings[ticket_link] is missing.')
return TicketCheckResult.MISCONFIGURED
base_url, organizer_slug, event_slug = extract_event_info_from_url(
event.display_settings['ticket_link']
)
if not organizer_slug or not event_slug or not base_url:
logger.info('display_settings[ticket_link] is not valid.')
return TicketCheckResult.MISCONFIGURED
# Use unified ticket base path and event slugs; no manual URL needed
base_url = settings.EVENTYAY_TICKET_BASE_PATH
# Normalize base URL to keep urljoin from dropping path segments
if not base_url.endswith('/'):
base_url = f'{base_url}/'
organizer_slug = event.organizer.slug
event_slug = event.slug
check_payload = {'user_email': user.email}
# call to ticket to check if user order ticket yet or not
api_url = urljoin(base_url, f'api/v1/{organizer_slug}/{event_slug}/ticket-check')
Expand Down
30 changes: 15 additions & 15 deletions app/eventyay/api/webhooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,51 +175,51 @@ def build_payload(self, logentry: LogEntry):
def register_default_webhook_events(sender, **kwargs):
return (
ParametrizedOrderWebhookEvent(
'pretix.event.order.placed',
'eventyay.event.order.placed',
_('New order placed'),
),
ParametrizedOrderWebhookEvent(
'pretix.event.order.placed.require_approval',
'eventyay.event.order.placed.require_approval',
_('New order requires approval'),
),
ParametrizedOrderWebhookEvent(
'pretix.event.order.paid',
'eventyay.event.order.paid',
_('Order marked as paid'),
),
ParametrizedOrderWebhookEvent(
'pretix.event.order.canceled',
'eventyay.event.order.canceled',
_('Order canceled'),
),
ParametrizedOrderWebhookEvent(
'pretix.event.order.reactivated',
'eventyay.event.order.reactivated',
_('Order reactivated'),
),
ParametrizedOrderWebhookEvent(
'pretix.event.order.expired',
'eventyay.event.order.expired',
_('Order expired'),
),
ParametrizedOrderWebhookEvent(
'pretix.event.order.modified',
'eventyay.event.order.modified',
_('Order information changed'),
),
ParametrizedOrderWebhookEvent(
'pretix.event.order.contact.changed',
'eventyay.event.order.contact.changed',
_('Order contact address changed'),
),
ParametrizedOrderWebhookEvent(
'pretix.event.order.changed.*',
'eventyay.event.order.changed.*',
_('Order changed'),
),
ParametrizedOrderWebhookEvent(
'pretix.event.order.refund.created.externally',
'eventyay.event.order.refund.created.externally',
_('External refund of payment'),
),
ParametrizedOrderWebhookEvent(
'pretix.event.order.approved',
'eventyay.event.order.approved',
_('Order approved'),
),
ParametrizedOrderWebhookEvent(
'pretix.event.order.denied',
'eventyay.event.order.denied',
_('Order denied'),
),
ParametrizedOrderPositionWebhookEvent(
Expand All @@ -243,15 +243,15 @@ def register_default_webhook_events(sender, **kwargs):
_('Event details changed'),
),
ParametrizedSubEventWebhookEvent(
'pretix.subevent.added',
'eventyay.subevent.added',
pgettext_lazy('subevent', 'Event series date added'),
),
ParametrizedSubEventWebhookEvent(
'pretix.subevent.changed',
'eventyay.subevent.changed',
pgettext_lazy('subevent', 'Event series date changed'),
),
ParametrizedSubEventWebhookEvent(
'pretix.subevent.deleted',
'eventyay.subevent.deleted',
pgettext_lazy('subevent', 'Event series date deleted'),
),
)
Expand Down
5 changes: 4 additions & 1 deletion app/eventyay/base/exporters/json.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import json
from decimal import Decimal

import pytz
from django.core.serializers.json import DjangoJSONEncoder
from django.dispatch import receiver

Expand All @@ -13,6 +14,7 @@ class JSONExporter(BaseExporter):
verbose_name = 'Order data (JSON)'

def render(self, form_data):
event_tz = pytz.timezone(self.event.settings.timezone)
jo = {
'event': {
'name': str(self.event.name),
Expand Down Expand Up @@ -62,12 +64,13 @@ def render(self, form_data):
}
for question in self.event.questions.all()
],
'timezone': str(event_tz),
'orders': [
{
'code': order.code,
'status': order.status,
'user': order.email,
'datetime': order.datetime,
'datetime': order.datetime.astimezone(event_tz).isoformat(),
'fees': [
{
'type': fee.fee_type,
Expand Down
29 changes: 14 additions & 15 deletions app/eventyay/base/exporters/orderlist.py
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,6 @@ def iterate_orders(self, form_data: dict):
yield self.ProgressSetTotal(total=qs.count())
for order in qs.order_by('datetime').iterator():
tz = pytz.timezone(self.event_object_cache[order.event_id].settings.timezone)

row = [
self.event_object_cache[order.event_id].slug,
order.code,
Expand All @@ -397,7 +396,7 @@ def iterate_orders(self, form_data: dict):
order.email,
str(order.phone) if order.phone else '',
order.datetime.astimezone(tz).strftime('%Y-%m-%d'),
order.datetime.astimezone(tz).strftime('%H:%M:%S'),
order.datetime.astimezone(tz).strftime('%H:%M:%S %Z'),
]
try:
row += [
Expand All @@ -424,7 +423,7 @@ def iterate_orders(self, form_data: dict):
)

row += [
order.payment_date.astimezone(tz).strftime('%Y-%m-%d') if order.payment_date else '',
order.payment_date.astimezone(tz).strftime('%Y-%m-%d %H:%M:%S %Z') if order.payment_date else '',
full_fee_sum_cache.get(order.id) or Decimal('0.00'),
order.locale,
]
Expand Down Expand Up @@ -548,7 +547,7 @@ def iterate_fees(self, form_data: dict):
order.email,
str(order.phone) if order.phone else '',
order.datetime.astimezone(tz).strftime('%Y-%m-%d'),
order.datetime.astimezone(tz).strftime('%H:%M:%S'),
order.datetime.astimezone(tz).strftime('%H:%M:%S %Z'),
op.get_fee_type_display(),
op.description,
op.value,
Expand Down Expand Up @@ -728,21 +727,21 @@ def iterate_positions(self, form_data: dict):
order.email,
str(order.phone) if order.phone else '',
order.datetime.astimezone(tz).strftime('%Y-%m-%d'),
order.datetime.astimezone(tz).strftime('%H:%M:%S'),
order.datetime.astimezone(tz).strftime('%H:%M:%S %Z'),
]
if has_subevents:
if op.subevent:
row.append(op.subevent.name)
row.append(
op.subevent.date_from.astimezone(self.event_object_cache[order.event_id].timezone).strftime(
'%Y-%m-%d %H:%M:%S'
'%Y-%m-%d %H:%M:%S %Z'
)
)
if op.subevent.date_to:
row.append(
op.subevent.date_to.astimezone(
self.event_object_cache[order.event_id].timezone
).strftime('%Y-%m-%d %H:%M:%S')
).strftime('%Y-%m-%d %H:%M:%S %Z')
)
else:
row.append('')
Expand Down Expand Up @@ -920,16 +919,16 @@ def iterate_list(self, form_data):
for obj in objs:
tz = pytz.timezone(obj.order.event.settings.timezone)
if isinstance(obj, OrderPayment) and obj.payment_date:
d2 = obj.payment_date.astimezone(tz).date().strftime('%Y-%m-%d')
d2 = obj.payment_date.astimezone(tz).strftime('%Y-%m-%d %H:%M:%S %Z')
elif isinstance(obj, OrderRefund) and obj.execution_date:
d2 = obj.execution_date.astimezone(tz).date().strftime('%Y-%m-%d')
d2 = obj.execution_date.astimezone(tz).strftime('%Y-%m-%d %H:%M:%S %Z')
else:
d2 = ''
row = [
obj.order.event.slug,
obj.order.code,
obj.full_id,
obj.created.astimezone(tz).date().strftime('%Y-%m-%d'),
obj.created.astimezone(tz).strftime('%Y-%m-%d %H:%M:%S %Z'),
d2,
obj.get_state_display(),
obj.state,
Expand Down Expand Up @@ -990,9 +989,9 @@ def iterate_list(self, form_data):
if has_subevents:
if quota.subevent:
row.append(quota.subevent.name)
row.append(quota.subevent.date_from.astimezone(self.event.timezone).strftime('%Y-%m-%d %H:%M:%S'))
row.append(quota.subevent.date_from.astimezone(self.event.timezone).strftime('%Y-%m-%d %H:%M:%S %Z'))
if quota.subevent.date_to:
row.append(quota.subevent.date_to.astimezone(self.event.timezone).strftime('%Y-%m-%d %H:%M:%S'))
row.append(quota.subevent.date_to.astimezone(self.event.timezone).strftime('%Y-%m-%d %H:%M:%S %Z'))
else:
row.append('')
else:
Expand Down Expand Up @@ -1044,7 +1043,7 @@ def iterate_list(self, form_data):
obj.order.event.slug,
obj.order.code,
obj.full_id,
obj.created.astimezone(tz).date().strftime('%Y-%m-%d'),
obj.created.astimezone(tz).strftime('%Y-%m-%d %H:%M:%S %Z'),
gc.secret,
obj.amount * (-1 if isinstance(obj, OrderRefund) else 1),
gc.issuer,
Expand Down Expand Up @@ -1169,8 +1168,8 @@ def iterate_list(self, form_data):
row = [
obj.secret,
_('Yes') if obj.testmode else _('No'),
obj.issuance.astimezone(tz).date().strftime('%Y-%m-%d'),
obj.expires.astimezone(tz).date().strftime('%Y-%m-%d') if obj.expires else '',
obj.issuance.astimezone(tz).strftime('%Y-%m-%d %H:%M:%S %Z'),
obj.expires.astimezone(tz).strftime('%Y-%m-%d %H:%M:%S %Z') if obj.expires else '',
obj.conditions or '',
obj.currency,
obj.cached_value,
Expand Down
2 changes: 1 addition & 1 deletion app/eventyay/base/exporters/waitinglist.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ def iterate_list(self, form_data):
# which event should be used to output dates in columns "Start date" and "End date"
event_for_date_columns = entry.subevent if entry.subevent else entry.event
tz = pytz.timezone(entry.event.settings.timezone)
datetime_format = '%Y-%m-%d %H:%M:%S'
datetime_format = '%Y-%m-%d %H:%M:%S %Z'

row = [
entry.created.astimezone(tz).strftime(datetime_format), # alternative: .isoformat(),
Expand Down
2 changes: 1 addition & 1 deletion app/eventyay/base/models/access_code.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ class SubmitterAccessCode(GenerateCode, PretalxModel):

_code_length = 32

log_prefix = 'pretalx.access_code'
log_prefix = 'eventyay.access_code'

class Meta:
unique_together = (('event', 'code'),)
Expand Down
2 changes: 1 addition & 1 deletion app/eventyay/base/models/information.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ class SpeakerInformation(PretalxModel):
upload_to=resource_path,
)

log_prefix = 'speaker_information'
log_prefix = 'eventyay.speaker_information'

@property
def log_parent(self):
Expand Down
2 changes: 1 addition & 1 deletion app/eventyay/base/models/mail.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ class MailTemplate(PretalxModel):
special cases, for now.
"""

log_prefix = 'pretalx.mail_template'
log_prefix = 'eventyay.mail_template'

event = models.ForeignKey(
to='Event',
Expand Down
2 changes: 1 addition & 1 deletion app/eventyay/base/models/question.py
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ class TalkQuestion(OrderedModel, PretalxModel):
objects = ScopedManager(event='event', _manager_class=TalkQuestionManager)
all_objects = ScopedManager(event='event', _manager_class=AllTalkQuestionManager)

log_prefix = 'pretalx.question'
log_prefix = 'eventyay.question'

class Meta:
ordering = ('position', 'id')
Expand Down
27 changes: 22 additions & 5 deletions app/eventyay/base/models/room.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,29 @@ def with_permission(
):
from .auth import RoomGrant, EventGrant

traits = traits or user.traits
# Normalize traits input
# - If traits is explicitly provided, use it; otherwise, read from user when available
# - Always coerce to a simple list[str] for proper DB array parameterization
if traits is None:
if user is not None:
traits = user.traits
else:
traits = []

allow_empty_traits = not user or user.type == User.UserType.PERSON

# Ensure traits is always a proper list of strings for SQL parameterization
if traits and isinstance(traits, str):
# e.g. "(trait1,trait2)" → ["trait1", "trait2"]
traits = [t.strip(" '") for t in traits.strip("()").split(",") if t.strip()]
if isinstance(traits, str):
# Accept legacy "(a,b,c)" string format by parsing it into a list
traits = [t.strip() for t in traits.strip("()").split(",") if t.strip()]
else:
try:
# Convert any iterable (set/tuple/queryset) to a list of strings
traits = [str(t) for t in list(traits or [])]
except TypeError:
# Non-iterables (shouldn't happen) fallback to empty list
traits = []

if event.has_permission_implicit(
traits=traits,
permissions=[permission],
Expand Down Expand Up @@ -160,7 +177,7 @@ class Room(VersionedModel, OrderedModel, PretalxModel):
are not in use right now.
"""

log_prefix = "pretalx.room"
log_prefix = "eventyay.room"

deleted = models.BooleanField(default=False)
description = I18nCharField(
Expand Down
2 changes: 1 addition & 1 deletion app/eventyay/base/models/schedule.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ def freeze(self, name: str, user=None, notify_speakers: bool = True, comment: st
wip_schedule = Schedule.objects.create(event=self.event)

self.save(update_fields=['published', 'version', 'comment'])
self.log_action('pretalx.schedule.release', person=user, orga=True)
self.log_action('eventyay.schedule.release', person=user, orga=True)

# Set visibility
self.talks.all().update(is_visible=False)
Expand Down
2 changes: 1 addition & 1 deletion app/eventyay/base/models/submission.py
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,7 @@ class comes with a ``method_names`` dictionary for method lookup.
deleted_objects = ScopedManager(event='event', _manager_class=DeletedSubmissionManager)
all_objects = ScopedManager(event='event', _manager_class=AllSubmissionManager)

log_prefix = 'pretalx.submission'
log_prefix = 'eventyay.submission'

class Meta:
rules_permissions = {
Expand Down
2 changes: 1 addition & 1 deletion app/eventyay/base/models/tag.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class Tag(PretalxModel):
),
)

log_prefix = 'pretalx.tag'
log_prefix = 'eventyay.tag'

class Meta:
rules_permissions = {
Expand Down
2 changes: 1 addition & 1 deletion app/eventyay/base/models/track.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ class Track(OrderedModel, PretalxModel):
default=False,
)

log_prefix = 'pretalx.track'
log_prefix = 'eventyay.track'

class Meta:
ordering = ('position',)
Expand Down
2 changes: 1 addition & 1 deletion app/eventyay/base/models/type.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ class SubmissionType(PretalxModel):
default=False,
)

log_prefix = 'pretalx.submission_type'
log_prefix = 'eventyay.submission_type'

class Meta:
ordering = ['default_duration']
Expand Down
Loading