Skip to content

Commit e7b4713

Browse files
authored
Merge branch 'dev' into fix/presale-checkout-login-modal
2 parents f493e9e + 3a70953 commit e7b4713

File tree

35 files changed

+1613
-606
lines changed

35 files changed

+1613
-606
lines changed

app/eventyay/agenda/management/commands/export_schedule_html.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
from eventyay.common.signals import register_data_exporters
1717
from eventyay.base.models import Event
1818

19-
SERVER_NAME = settings.SITE_URL.split('://')[1]
19+
from urllib.parse import urlparse
20+
21+
SERVER_NAME = urlparse(settings.SITE_URL).netloc or 'localhost'
2022

2123

2224
@contextlib.contextmanager

app/eventyay/agenda/templates/agenda/schedule.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
{% load static %}
77
{% load phrases %}
88

9-
{% block container_width %}{% if not show_talk_list %}main-schedule{% else %}list-schedule{% endif %}{% endblock container_width %}
9+
{% block container_width %} main-schedule{% if show_talk_list %} list-schedule{% endif %}{% endblock container_width %}
1010

1111
{% block agenda_custom_header %}
1212
<script id="pretalx-messages" data-logged-in="{% if request.user.is_anonymous %}false{% else %}true{% endif %}" src="{{ request.event.urls.schedule }}widget/messages.js"></script>

app/eventyay/agenda/templates/agenda/speaker.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
<script id="pretalx-messages" data-logged-in="{% if request.user.is_anonymous %}false{% else %}true{% endif %}" src="{{ request.event.urls.schedule }}widget/messages.js"></script>
2323
{% endblock agenda_custom_header %}
2424

25+
{% block container_width %} main-schedule{% endblock container_width %}
26+
2527
{% block agenda_content %}
2628
{% html_signal "eventyay.agenda.signals.html_above_speaker_pages" sender=request.event request=request profile=profile %}
2729
<div>

app/eventyay/agenda/templates/agenda/speakers.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
<script id="pretalx-messages" data-logged-in="{% if request.user.is_anonymous %}false{% else %}true{% endif %}" src="{{ request.event.urls.schedule }}widget/messages.js"></script>
99
{% endblock agenda_custom_header %}
1010

11+
{% block container_width %} main-schedule{% endblock container_width %}
12+
1113
{% block agenda_content %}
1214
{% html_signal "eventyay.agenda.signals.html_above_speakers_list" sender=request.event request=request %}
1315
<div>

app/eventyay/agenda/templates/agenda/talk.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
<script id="pretalx-messages" data-logged-in="{% if request.user.is_anonymous %}false{% else %}true{% endif %}" src="{{ request.event.urls.schedule }}widget/messages.js"></script>
2222
{% endblock agenda_custom_header %}
2323

24+
{% block container_width %} main-schedule{% endblock container_width %}
25+
2426
{% block agenda_content %}
2527
{% html_signal "eventyay.agenda.signals.html_above_session_pages" sender=request.event request=request submission=submission %}
2628
<div>

app/eventyay/agenda/views/talk.py

Lines changed: 33 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -559,17 +559,14 @@ def get(self, request, *args, **kwargs):
559559

560560
event = request.event
561561
logger.info('Checking video settings for event %s', event)
562-
if not (venueless_settings := event.venueless_settings):
563-
logger.info('venueless settings is missing.')
564-
return HttpResponse(status=HTTPStatus.FORBIDDEN, content=VideoJoinError.MISCONFIGURED)
565-
required_fields = (
566-
('join_url', 'venueless_settings.join_url'),
567-
('secret', 'venueless_settings.secret'),
568-
('issuer', 'venueless_settings.issuer'),
569-
('audience', 'venueless_settings.audience'),
570-
)
562+
required_fields = [
563+
('venueless_url', 'event.settings.venueless_url'),
564+
('venueless_secret', 'event.settings.venueless_secret'),
565+
('venueless_issuer', 'event.settings.venueless_issuer'),
566+
('venueless_audience', 'event.settings.venueless_audience'),
567+
]
571568
for attr, label in required_fields:
572-
if not getattr(venueless_settings, attr):
569+
if not getattr(event.settings, attr):
573570
logger.info('%s is missing.', label)
574571
return HttpResponse(status=HTTPStatus.FORBIDDEN, content=VideoJoinError.MISCONFIGURED)
575572

@@ -595,22 +592,23 @@ def get(self, request, *args, **kwargs):
595592
profile["profile_picture"] = request.user.get_avatar_url(request.event)
596593

597594
payload = {
598-
"iss": venueless_settings.issuer,
599-
"aud": venueless_settings.audience,
595+
"iss": event.settings.venueless_issuer,
596+
"aud": event.settings.venueless_audience,
600597
"exp": exp,
601598
"iat": iat,
602599
"uid": encode_email(request.user.email),
603600
"profile": profile,
604601
"traits": list(
605602
{
603+
"attendee",
606604
f"eventyay-video-event-{request.event.slug}",
607605
}
608606
),
609607
}
610608
token = jwt.encode(
611-
payload, venueless_settings.secret, algorithm="HS256"
609+
payload, event.settings.venueless_secret, algorithm="HS256"
612610
)
613-
redirect_url = urljoin(venueless_settings.join_url, f'#token={token}')
611+
redirect_url = urljoin(event.settings.venueless_url, f'#token={token}')
614612
logger.info('Redirect URL to Video: %s', redirect_url)
615613
return JsonResponse(
616614
{
@@ -625,38 +623,33 @@ def get(self, request, *args, **kwargs):
625623
# The annotation `tuple[str, str | None, str | None]` doesn't satisfy this requirement.
626624
def extract_event_info_from_url(url: str) -> tuple[str, _T, _T]:
627625
parsed_url = urlparse(url)
628-
ticket_host = settings.EVENTYAY_TICKET_BASE_PATH
629626
path = parsed_url.path
630627
parts = path.strip("/").split("/")
631628
if len(parts) >= 2:
632629
organizer, event = parts[-2:]
633-
return ticket_host, unquote(organizer), unquote(event)
634-
return ticket_host, None, None
630+
return None, unquote(organizer), unquote(event)
631+
return None, None, None
635632

636633

637634
def check_user_owning_ticket(user: User, event: Event) -> TicketCheckResult:
638635
"""
639-
Call eventyay-ticket API to check if user owns ticket for this event.
640-
641-
# NOTE: It doesn't work with the Docker setup for development, because we use fake domain then,
642-
and inside the container, the fake domain points to the container itself, not the host.
636+
Check if the user owns a valid ticket for this event using the local database, matching presale logic.
643637
"""
644-
# Use unified ticket base path and event slugs; no manual URL needed
645-
base_url = settings.EVENTYAY_TICKET_BASE_PATH
646-
# Normalize base URL to keep urljoin from dropping path segments
647-
if not base_url.endswith('/'):
648-
base_url = f'{base_url}/'
649-
organizer_slug = event.organizer.slug
650-
event_slug = event.slug
651-
check_payload = {'user_email': user.email}
652-
# call to ticket to check if user order ticket yet or not
653-
api_url = urljoin(base_url, f'api/v1/{organizer_slug}/{event_slug}/ticket-check')
654-
logger.info('To call API %s', api_url)
655-
# In development, we disable the SSL verification.
656-
response = requests.post(api_url, json=check_payload, verify=(not settings.DEBUG))
657-
658-
if response.status_code != HTTPStatus.OK:
659-
logger.debug('Response from eventyay-ticket: %s', response.text)
660-
logger.info('user is not allowed to join online event.')
661-
return TicketCheckResult.NO_TICKET
662-
return TicketCheckResult.HAS_TICKET
638+
from eventyay.base.models import OrderPosition, Order
639+
from django_scopes import scope
640+
allowed_statuses = [Order.STATUS_PAID]
641+
if event.settings.venueless_allow_pending:
642+
allowed_statuses.append(Order.STATUS_PENDING)
643+
with scope(organizer=event.organizer):
644+
with scope(event=event):
645+
has_ticket = OrderPosition.objects.filter(
646+
order__event=event,
647+
order__email__iexact=user.email,
648+
order__status__in=allowed_statuses,
649+
product__admission=True,
650+
canceled=False,
651+
addon_to__isnull=True,
652+
).exists()
653+
if has_ticket:
654+
return TicketCheckResult.HAS_TICKET
655+
return TicketCheckResult.NO_TICKET
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 5.2.12 on 2026-03-31 11:37
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('base', '0021_alter_question_type_add_dropdown'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='event',
15+
name='currency',
16+
field=models.CharField(choices=[('AED', 'AED - UAE Dirham'), ('AFN', 'AFN - Afghani'), ('ALL', 'ALL - Lek'), ('AMD', 'AMD - Armenian Dram'), ('AOA', 'AOA - Kwanza'), ('ARS', 'ARS - Argentine Peso'), ('AUD', 'AUD - Australian Dollar'), ('AWG', 'AWG - Aruban Florin'), ('AZN', 'AZN - Azerbaijan Manat'), ('BAM', 'BAM - Convertible Mark'), ('BBD', 'BBD - Barbados Dollar'), ('BDT', 'BDT - Taka'), ('BHD', 'BHD - Bahraini Dinar'), ('BIF', 'BIF - Burundi Franc'), ('BMD', 'BMD - Bermudian Dollar'), ('BND', 'BND - Brunei Dollar'), ('BOB', 'BOB - Boliviano'), ('BOV', 'BOV - Mvdol'), ('BRL', 'BRL - Brazilian Real'), ('BSD', 'BSD - Bahamian Dollar'), ('BTN', 'BTN - Ngultrum'), ('BWP', 'BWP - Pula'), ('BYN', 'BYN - Belarusian Ruble'), ('BZD', 'BZD - Belize Dollar'), ('CAD', 'CAD - Canadian Dollar'), ('CDF', 'CDF - Congolese Franc'), ('CHE', 'CHE - WIR Euro'), ('CHF', 'CHF - Swiss Franc'), ('CHW', 'CHW - WIR Franc'), ('CLF', 'CLF - Unidad de Fomento'), ('CLP', 'CLP - Chilean Peso'), ('CNY', 'CNY - Yuan Renminbi'), ('COP', 'COP - Colombian Peso'), ('COU', 'COU - Unidad de Valor Real'), ('CRC', 'CRC - Costa Rican Colon'), ('CUP', 'CUP - Cuban Peso'), ('CVE', 'CVE - Cabo Verde Escudo'), ('CZK', 'CZK - Czech Koruna'), ('DJF', 'DJF - Djibouti Franc'), ('DKK', 'DKK - Danish Krone'), ('DOP', 'DOP - Dominican Peso'), ('DZD', 'DZD - Algerian Dinar'), ('EGP', 'EGP - Egyptian Pound'), ('ERN', 'ERN - Nakfa'), ('ETB', 'ETB - Ethiopian Birr'), ('EUR', 'EUR - Euro'), ('FJD', 'FJD - Fiji Dollar'), ('FKP', 'FKP - Falkland Islands Pound'), ('GBP', 'GBP - Pound Sterling'), ('GEL', 'GEL - Lari'), ('GHS', 'GHS - Ghana Cedi'), ('GIP', 'GIP - Gibraltar Pound'), ('GMD', 'GMD - Dalasi'), ('GNF', 'GNF - Guinean Franc'), ('GTQ', 'GTQ - Quetzal'), ('GYD', 'GYD - Guyana Dollar'), ('HKD', 'HKD - Hong Kong Dollar'), ('HNL', 'HNL - Lempira'), ('HTG', 'HTG - Gourde'), ('HUF', 'HUF - Forint'), ('IDR', 'IDR - Rupiah'), ('ILS', 'ILS - New Israeli Sheqel'), ('INR', 'INR - Indian Rupee'), ('IQD', 'IQD - Iraqi Dinar'), ('IRR', 'IRR - Iranian Rial'), ('ISK', 'ISK - Iceland Krona'), ('JMD', 'JMD - Jamaican Dollar'), ('JOD', 'JOD - Jordanian Dinar'), ('JPY', 'JPY - Yen'), ('KES', 'KES - Kenyan Shilling'), ('KGS', 'KGS - Som'), ('KHR', 'KHR - Riel'), ('KMF', 'KMF - Comorian Franc'), ('KPW', 'KPW - North Korean Won'), ('KRW', 'KRW - Won'), ('KWD', 'KWD - Kuwaiti Dinar'), ('KYD', 'KYD - Cayman Islands Dollar'), ('KZT', 'KZT - Tenge'), ('LAK', 'LAK - Lao Kip'), ('LBP', 'LBP - Lebanese Pound'), ('LKR', 'LKR - Sri Lanka Rupee'), ('LRD', 'LRD - Liberian Dollar'), ('LSL', 'LSL - Loti'), ('LYD', 'LYD - Libyan Dinar'), ('MAD', 'MAD - Moroccan Dirham'), ('MDL', 'MDL - Moldovan Leu'), ('MGA', 'MGA - Malagasy Ariary'), ('MKD', 'MKD - Denar'), ('MMK', 'MMK - Kyat'), ('MNT', 'MNT - Tugrik'), ('MOP', 'MOP - Pataca'), ('MRU', 'MRU - Ouguiya'), ('MUR', 'MUR - Mauritius Rupee'), ('MVR', 'MVR - Rufiyaa'), ('MWK', 'MWK - Malawi Kwacha'), ('MXN', 'MXN - Mexican Peso'), ('MXV', 'MXV - Mexican Unidad de Inversion (UDI)'), ('MYR', 'MYR - Malaysian Ringgit'), ('MZN', 'MZN - Mozambique Metical'), ('NAD', 'NAD - Namibia Dollar'), ('NGN', 'NGN - Naira'), ('NIO', 'NIO - Cordoba Oro'), ('NOK', 'NOK - Norwegian Krone'), ('NPR', 'NPR - Nepalese Rupee'), ('NZD', 'NZD - New Zealand Dollar'), ('OMR', 'OMR - Rial Omani'), ('PAB', 'PAB - Balboa'), ('PEN', 'PEN - Sol'), ('PGK', 'PGK - Kina'), ('PHP', 'PHP - Philippine Peso'), ('PKR', 'PKR - Pakistan Rupee'), ('PLN', 'PLN - Zloty'), ('PYG', 'PYG - Guarani'), ('QAR', 'QAR - Qatari Rial'), ('RON', 'RON - Romanian Leu'), ('RSD', 'RSD - Serbian Dinar'), ('RUB', 'RUB - Russian Ruble'), ('RWF', 'RWF - Rwanda Franc'), ('SAR', 'SAR - Saudi Riyal'), ('SBD', 'SBD - Solomon Islands Dollar'), ('SCR', 'SCR - Seychelles Rupee'), ('SDG', 'SDG - Sudanese Pound'), ('SEK', 'SEK - Swedish Krona'), ('SGD', 'SGD - Singapore Dollar'), ('SHP', 'SHP - Saint Helena Pound'), ('SLE', 'SLE - Leone'), ('SOS', 'SOS - Somali Shilling'), ('SRD', 'SRD - Surinam Dollar'), ('SSP', 'SSP - South Sudanese Pound'), ('STN', 'STN - Dobra'), ('SVC', 'SVC - El Salvador Colon'), ('SYP', 'SYP - Syrian Pound'), ('SZL', 'SZL - Lilangeni'), ('THB', 'THB - Baht'), ('TJS', 'TJS - Somoni'), ('TMT', 'TMT - Turkmenistan New Manat'), ('TND', 'TND - Tunisian Dinar'), ('TOP', 'TOP - Pa’anga'), ('TRY', 'TRY - Turkish Lira'), ('TTD', 'TTD - Trinidad and Tobago Dollar'), ('TWD', 'TWD - New Taiwan Dollar'), ('TZS', 'TZS - Tanzanian Shilling'), ('UAH', 'UAH - Hryvnia'), ('UGX', 'UGX - Uganda Shilling'), ('USD', 'USD - US Dollar'), ('USN', 'USN - US Dollar (Next day)'), ('UYI', 'UYI - Uruguay Peso en Unidades Indexadas (UI)'), ('UYU', 'UYU - Peso Uruguayo'), ('UYW', 'UYW - Unidad Previsional'), ('UZS', 'UZS - Uzbekistan Sum'), ('VED', 'VED - Bolívar Soberano'), ('VES', 'VES - Bolívar Soberano'), ('VND', 'VND - Dong'), ('VUV', 'VUV - Vatu'), ('WST', 'WST - Tala'), ('XAD', 'XAD - Arab Accounting Dinar'), ('XAF', 'XAF - CFA Franc BEAC'), ('XAG', 'XAG - Silver'), ('XAU', 'XAU - Gold'), ('XBA', 'XBA - Bond Markets Unit European Composite Unit (EURCO)'), ('XBB', 'XBB - Bond Markets Unit European Monetary Unit (E.M.U.-6)'), ('XBC', 'XBC - Bond Markets Unit European Unit of Account 9 (E.U.A.-9)'), ('XBD', 'XBD - Bond Markets Unit European Unit of Account 17 (E.U.A.-17)'), ('XCD', 'XCD - East Caribbean Dollar'), ('XCG', 'XCG - Caribbean Guilder'), ('XDR', 'XDR - SDR (Special Drawing Right)'), ('XOF', 'XOF - CFA Franc BCEAO'), ('XPD', 'XPD - Palladium'), ('XPF', 'XPF - CFP Franc'), ('XPT', 'XPT - Platinum'), ('XSU', 'XSU - Sucre'), ('XTS', 'XTS - Codes specifically reserved for testing purposes'), ('XUA', 'XUA - ADB Unit of Account'), ('XXX', 'XXX - The codes assigned for transactions where no currency is involved'), ('YER', 'YER - Yemeni Rial'), ('ZAR', 'ZAR - Rand'), ('ZMW', 'ZMW - Zambian Kwacha'), ('ZWG', 'ZWG - Zimbabwe Gold')], default='USD', max_length=10, verbose_name='Event currency'),
17+
),
18+
migrations.AlterField(
19+
model_name='giftcard',
20+
name='currency',
21+
field=models.CharField(choices=[('AED', 'AED - UAE Dirham'), ('AFN', 'AFN - Afghani'), ('ALL', 'ALL - Lek'), ('AMD', 'AMD - Armenian Dram'), ('AOA', 'AOA - Kwanza'), ('ARS', 'ARS - Argentine Peso'), ('AUD', 'AUD - Australian Dollar'), ('AWG', 'AWG - Aruban Florin'), ('AZN', 'AZN - Azerbaijan Manat'), ('BAM', 'BAM - Convertible Mark'), ('BBD', 'BBD - Barbados Dollar'), ('BDT', 'BDT - Taka'), ('BHD', 'BHD - Bahraini Dinar'), ('BIF', 'BIF - Burundi Franc'), ('BMD', 'BMD - Bermudian Dollar'), ('BND', 'BND - Brunei Dollar'), ('BOB', 'BOB - Boliviano'), ('BOV', 'BOV - Mvdol'), ('BRL', 'BRL - Brazilian Real'), ('BSD', 'BSD - Bahamian Dollar'), ('BTN', 'BTN - Ngultrum'), ('BWP', 'BWP - Pula'), ('BYN', 'BYN - Belarusian Ruble'), ('BZD', 'BZD - Belize Dollar'), ('CAD', 'CAD - Canadian Dollar'), ('CDF', 'CDF - Congolese Franc'), ('CHE', 'CHE - WIR Euro'), ('CHF', 'CHF - Swiss Franc'), ('CHW', 'CHW - WIR Franc'), ('CLF', 'CLF - Unidad de Fomento'), ('CLP', 'CLP - Chilean Peso'), ('CNY', 'CNY - Yuan Renminbi'), ('COP', 'COP - Colombian Peso'), ('COU', 'COU - Unidad de Valor Real'), ('CRC', 'CRC - Costa Rican Colon'), ('CUP', 'CUP - Cuban Peso'), ('CVE', 'CVE - Cabo Verde Escudo'), ('CZK', 'CZK - Czech Koruna'), ('DJF', 'DJF - Djibouti Franc'), ('DKK', 'DKK - Danish Krone'), ('DOP', 'DOP - Dominican Peso'), ('DZD', 'DZD - Algerian Dinar'), ('EGP', 'EGP - Egyptian Pound'), ('ERN', 'ERN - Nakfa'), ('ETB', 'ETB - Ethiopian Birr'), ('EUR', 'EUR - Euro'), ('FJD', 'FJD - Fiji Dollar'), ('FKP', 'FKP - Falkland Islands Pound'), ('GBP', 'GBP - Pound Sterling'), ('GEL', 'GEL - Lari'), ('GHS', 'GHS - Ghana Cedi'), ('GIP', 'GIP - Gibraltar Pound'), ('GMD', 'GMD - Dalasi'), ('GNF', 'GNF - Guinean Franc'), ('GTQ', 'GTQ - Quetzal'), ('GYD', 'GYD - Guyana Dollar'), ('HKD', 'HKD - Hong Kong Dollar'), ('HNL', 'HNL - Lempira'), ('HTG', 'HTG - Gourde'), ('HUF', 'HUF - Forint'), ('IDR', 'IDR - Rupiah'), ('ILS', 'ILS - New Israeli Sheqel'), ('INR', 'INR - Indian Rupee'), ('IQD', 'IQD - Iraqi Dinar'), ('IRR', 'IRR - Iranian Rial'), ('ISK', 'ISK - Iceland Krona'), ('JMD', 'JMD - Jamaican Dollar'), ('JOD', 'JOD - Jordanian Dinar'), ('JPY', 'JPY - Yen'), ('KES', 'KES - Kenyan Shilling'), ('KGS', 'KGS - Som'), ('KHR', 'KHR - Riel'), ('KMF', 'KMF - Comorian Franc'), ('KPW', 'KPW - North Korean Won'), ('KRW', 'KRW - Won'), ('KWD', 'KWD - Kuwaiti Dinar'), ('KYD', 'KYD - Cayman Islands Dollar'), ('KZT', 'KZT - Tenge'), ('LAK', 'LAK - Lao Kip'), ('LBP', 'LBP - Lebanese Pound'), ('LKR', 'LKR - Sri Lanka Rupee'), ('LRD', 'LRD - Liberian Dollar'), ('LSL', 'LSL - Loti'), ('LYD', 'LYD - Libyan Dinar'), ('MAD', 'MAD - Moroccan Dirham'), ('MDL', 'MDL - Moldovan Leu'), ('MGA', 'MGA - Malagasy Ariary'), ('MKD', 'MKD - Denar'), ('MMK', 'MMK - Kyat'), ('MNT', 'MNT - Tugrik'), ('MOP', 'MOP - Pataca'), ('MRU', 'MRU - Ouguiya'), ('MUR', 'MUR - Mauritius Rupee'), ('MVR', 'MVR - Rufiyaa'), ('MWK', 'MWK - Malawi Kwacha'), ('MXN', 'MXN - Mexican Peso'), ('MXV', 'MXV - Mexican Unidad de Inversion (UDI)'), ('MYR', 'MYR - Malaysian Ringgit'), ('MZN', 'MZN - Mozambique Metical'), ('NAD', 'NAD - Namibia Dollar'), ('NGN', 'NGN - Naira'), ('NIO', 'NIO - Cordoba Oro'), ('NOK', 'NOK - Norwegian Krone'), ('NPR', 'NPR - Nepalese Rupee'), ('NZD', 'NZD - New Zealand Dollar'), ('OMR', 'OMR - Rial Omani'), ('PAB', 'PAB - Balboa'), ('PEN', 'PEN - Sol'), ('PGK', 'PGK - Kina'), ('PHP', 'PHP - Philippine Peso'), ('PKR', 'PKR - Pakistan Rupee'), ('PLN', 'PLN - Zloty'), ('PYG', 'PYG - Guarani'), ('QAR', 'QAR - Qatari Rial'), ('RON', 'RON - Romanian Leu'), ('RSD', 'RSD - Serbian Dinar'), ('RUB', 'RUB - Russian Ruble'), ('RWF', 'RWF - Rwanda Franc'), ('SAR', 'SAR - Saudi Riyal'), ('SBD', 'SBD - Solomon Islands Dollar'), ('SCR', 'SCR - Seychelles Rupee'), ('SDG', 'SDG - Sudanese Pound'), ('SEK', 'SEK - Swedish Krona'), ('SGD', 'SGD - Singapore Dollar'), ('SHP', 'SHP - Saint Helena Pound'), ('SLE', 'SLE - Leone'), ('SOS', 'SOS - Somali Shilling'), ('SRD', 'SRD - Surinam Dollar'), ('SSP', 'SSP - South Sudanese Pound'), ('STN', 'STN - Dobra'), ('SVC', 'SVC - El Salvador Colon'), ('SYP', 'SYP - Syrian Pound'), ('SZL', 'SZL - Lilangeni'), ('THB', 'THB - Baht'), ('TJS', 'TJS - Somoni'), ('TMT', 'TMT - Turkmenistan New Manat'), ('TND', 'TND - Tunisian Dinar'), ('TOP', 'TOP - Pa’anga'), ('TRY', 'TRY - Turkish Lira'), ('TTD', 'TTD - Trinidad and Tobago Dollar'), ('TWD', 'TWD - New Taiwan Dollar'), ('TZS', 'TZS - Tanzanian Shilling'), ('UAH', 'UAH - Hryvnia'), ('UGX', 'UGX - Uganda Shilling'), ('USD', 'USD - US Dollar'), ('USN', 'USN - US Dollar (Next day)'), ('UYI', 'UYI - Uruguay Peso en Unidades Indexadas (UI)'), ('UYU', 'UYU - Peso Uruguayo'), ('UYW', 'UYW - Unidad Previsional'), ('UZS', 'UZS - Uzbekistan Sum'), ('VED', 'VED - Bolívar Soberano'), ('VES', 'VES - Bolívar Soberano'), ('VND', 'VND - Dong'), ('VUV', 'VUV - Vatu'), ('WST', 'WST - Tala'), ('XAD', 'XAD - Arab Accounting Dinar'), ('XAF', 'XAF - CFA Franc BEAC'), ('XAG', 'XAG - Silver'), ('XAU', 'XAU - Gold'), ('XBA', 'XBA - Bond Markets Unit European Composite Unit (EURCO)'), ('XBB', 'XBB - Bond Markets Unit European Monetary Unit (E.M.U.-6)'), ('XBC', 'XBC - Bond Markets Unit European Unit of Account 9 (E.U.A.-9)'), ('XBD', 'XBD - Bond Markets Unit European Unit of Account 17 (E.U.A.-17)'), ('XCD', 'XCD - East Caribbean Dollar'), ('XCG', 'XCG - Caribbean Guilder'), ('XDR', 'XDR - SDR (Special Drawing Right)'), ('XOF', 'XOF - CFA Franc BCEAO'), ('XPD', 'XPD - Palladium'), ('XPF', 'XPF - CFP Franc'), ('XPT', 'XPT - Platinum'), ('XSU', 'XSU - Sucre'), ('XTS', 'XTS - Codes specifically reserved for testing purposes'), ('XUA', 'XUA - ADB Unit of Account'), ('XXX', 'XXX - The codes assigned for transactions where no currency is involved'), ('YER', 'YER - Yemeni Rial'), ('ZAR', 'ZAR - Rand'), ('ZMW', 'ZMW - Zambian Kwacha'), ('ZWG', 'ZWG - Zimbabwe Gold')], max_length=10),
22+
),
23+
]

0 commit comments

Comments
 (0)