Add deprecated fields

This commit is contained in:
Mira Weller
2025-03-10 13:13:12 +01:00
parent e251f5c5b8
commit bea3f32251
4 changed files with 113 additions and 53 deletions

View File

@@ -217,8 +217,8 @@ class OutboundSyncProvider:
@cached_property @cached_property
def data_fields(self): def data_fields(self):
return { return {
key: (from_model, label, ptype, enum_opts, getter) f.key: (f.required_input, f.label, f.type, f.enum_opts, f.getter)
for (from_model, key, label, ptype, enum_opts, getter) in get_data_fields(self.event) for f in get_data_fields(self.event)
} }
def get_field_value(self, inputs, mapping_entry): def get_field_value(self, inputs, mapping_entry):

View File

@@ -1,4 +1,5 @@
import json import json
from collections import namedtuple
from functools import partial from functools import partial
from django.db.models import Max from django.db.models import Max
@@ -65,6 +66,10 @@ def first_checkin_on_list(list_pk, position):
if checkin: if checkin:
return isoformat_or_none(checkin.datetime) return isoformat_or_none(checkin.datetime)
def split_name_on_last_space(name, part):
name_parts = name.rsplit(" ", 1)
return name_parts[part] if len(name_parts) > part else ""
ORDER_POSITION = 'position' ORDER_POSITION = 'position'
ORDER = 'order' ORDER = 'order'
@@ -76,6 +81,13 @@ AVAILABLE_MODELS = {
} }
DataFieldInfo = namedtuple(
'DataFieldInfo',
field_names=('required_input', 'key', 'label', 'type', 'enum_opts', 'getter', 'deprecated'),
defaults=[False]
)
def get_data_fields(event, for_model=None): def get_data_fields(event, for_model=None):
""" """
Returns tuple of (required_input, key, label, type, enum_opts, getter) Returns tuple of (required_input, key, label, type, enum_opts, getter)
@@ -91,7 +103,7 @@ def get_data_fields(event, for_model=None):
src_fields = ( src_fields = (
[ [
( DataFieldInfo(
ORDER_POSITION, ORDER_POSITION,
"attendee_name", "attendee_name",
_("Attendee name"), _("Attendee name"),
@@ -102,7 +114,7 @@ def get_data_fields(event, for_model=None):
), ),
] ]
+ [ + [
( DataFieldInfo(
ORDER_POSITION, ORDER_POSITION,
"attendee_name_" + k, "attendee_name_" + k,
_("Attendee") + ": " + label, _("Attendee") + ": " + label,
@@ -116,11 +128,12 @@ def get_data_fields(event, for_model=None):
).get(k, ""), ).get(k, ""),
k, k,
), ),
deprecated=len(name_scheme["fields"]) == 1,
) )
for k, label, w in name_scheme["fields"] for k, label, w in name_scheme["fields"]
] ]
+ [ + [
( DataFieldInfo(
ORDER_POSITION, ORDER_POSITION,
"attendee_email", "attendee_email",
_("Attendee email"), _("Attendee email"),
@@ -129,7 +142,7 @@ def get_data_fields(event, for_model=None):
lambda position: position.attendee_email lambda position: position.attendee_email
or (position.addon_to.attendee_email if position.addon_to else None), or (position.addon_to.attendee_email if position.addon_to else None),
), ),
( DataFieldInfo(
ORDER_POSITION, ORDER_POSITION,
"attendee_or_order_email", "attendee_or_order_email",
_("Attendee or order email"), _("Attendee or order email"),
@@ -139,7 +152,7 @@ def get_data_fields(event, for_model=None):
or (position.addon_to.attendee_email if position.addon_to else None) or (position.addon_to.attendee_email if position.addon_to else None)
or position.order.email, or position.order.email,
), ),
( DataFieldInfo(
ORDER_POSITION, ORDER_POSITION,
"attendee_company", "attendee_company",
_("Attendee company"), _("Attendee company"),
@@ -147,7 +160,7 @@ def get_data_fields(event, for_model=None):
None, None,
lambda position: position.company or (position.addon_to.company if position.addon_to else None), lambda position: position.company or (position.addon_to.company if position.addon_to else None),
), ),
( DataFieldInfo(
ORDER_POSITION, ORDER_POSITION,
"attendee_street", "attendee_street",
_("Attendee address street"), _("Attendee address street"),
@@ -155,7 +168,7 @@ def get_data_fields(event, for_model=None):
None, None,
lambda position: position.street or (position.addon_to.street if position.addon_to else None), lambda position: position.street or (position.addon_to.street if position.addon_to else None),
), ),
( DataFieldInfo(
ORDER_POSITION, ORDER_POSITION,
"attendee_zipcode", "attendee_zipcode",
_("Attendee address ZIP code"), _("Attendee address ZIP code"),
@@ -163,7 +176,7 @@ def get_data_fields(event, for_model=None):
None, None,
lambda position: position.zipcode or (position.addon_to.zipcode if position.addon_to else None), lambda position: position.zipcode or (position.addon_to.zipcode if position.addon_to else None),
), ),
( DataFieldInfo(
ORDER_POSITION, ORDER_POSITION,
"attendee_city", "attendee_city",
_("Attendee address city"), _("Attendee address city"),
@@ -171,7 +184,7 @@ def get_data_fields(event, for_model=None):
None, None,
lambda position: position.city or (position.addon_to.city if position.addon_to else None), lambda position: position.city or (position.addon_to.city if position.addon_to else None),
), ),
( DataFieldInfo(
ORDER_POSITION, ORDER_POSITION,
"attendee_country", "attendee_country",
_("Attendee address country"), _("Attendee address country"),
@@ -181,7 +194,7 @@ def get_data_fields(event, for_model=None):
position.country or (position.addon_to.attendee_name if position.addon_to else "") position.country or (position.addon_to.attendee_name if position.addon_to else "")
), ),
), ),
( DataFieldInfo(
ORDER, ORDER,
"invoice_address_company", "invoice_address_company",
_("Invoice address company"), _("Invoice address company"),
@@ -189,7 +202,7 @@ def get_data_fields(event, for_model=None):
None, None,
lambda order: order.invoice_address.company, lambda order: order.invoice_address.company,
), ),
( DataFieldInfo(
ORDER, ORDER,
"invoice_address_name", "invoice_address_name",
_("Invoice address name"), _("Invoice address name"),
@@ -199,7 +212,7 @@ def get_data_fields(event, for_model=None):
), ),
] ]
+ [ + [
( DataFieldInfo(
ORDER, ORDER,
"invoice_address_name_" + k, "invoice_address_name_" + k,
_("Invoice address") + ": " + label, _("Invoice address") + ": " + label,
@@ -211,11 +224,12 @@ def get_data_fields(event, for_model=None):
), ),
k, k,
), ),
deprecated=len(name_scheme["fields"]) == 1,
) )
for k, label, w in name_scheme["fields"] for k, label, w in name_scheme["fields"]
] ]
+ [ + [
( DataFieldInfo(
ORDER, ORDER,
"invoice_address_street", "invoice_address_street",
_("Invoice address street"), _("Invoice address street"),
@@ -223,7 +237,7 @@ def get_data_fields(event, for_model=None):
None, None,
lambda order: order.invoice_address.street, lambda order: order.invoice_address.street,
), ),
( DataFieldInfo(
ORDER, ORDER,
"invoice_address_zipcode", "invoice_address_zipcode",
_("Invoice address ZIP code"), _("Invoice address ZIP code"),
@@ -231,7 +245,7 @@ def get_data_fields(event, for_model=None):
None, None,
lambda order: order.invoice_address.zipcode, lambda order: order.invoice_address.zipcode,
), ),
( DataFieldInfo(
ORDER, ORDER,
"invoice_address_city", "invoice_address_city",
_("Invoice address city"), _("Invoice address city"),
@@ -239,7 +253,7 @@ def get_data_fields(event, for_model=None):
None, None,
lambda order: order.invoice_address.city, lambda order: order.invoice_address.city,
), ),
( DataFieldInfo(
ORDER, ORDER,
"invoice_address_country", "invoice_address_country",
_("Invoice address country"), _("Invoice address country"),
@@ -247,7 +261,7 @@ def get_data_fields(event, for_model=None):
None, None,
lambda order: str(order.invoice_address.country), lambda order: str(order.invoice_address.country),
), ),
( DataFieldInfo(
ORDER, ORDER,
"email", "email",
_("Order email"), _("Order email"),
@@ -255,7 +269,7 @@ def get_data_fields(event, for_model=None):
None, None,
lambda order: order.email, lambda order: order.email,
), ),
( DataFieldInfo(
ORDER, ORDER,
"order_code", "order_code",
_("Order code"), _("Order code"),
@@ -263,7 +277,7 @@ def get_data_fields(event, for_model=None):
None, None,
lambda order: order.code, lambda order: order.code,
), ),
( DataFieldInfo(
ORDER, ORDER,
"event_order_code", "event_order_code",
_("Event and order code"), _("Event and order code"),
@@ -271,7 +285,7 @@ def get_data_fields(event, for_model=None):
None, None,
lambda order: order.full_code, lambda order: order.full_code,
), ),
( DataFieldInfo(
ORDER, ORDER,
"order_total", "order_total",
_("Order total"), _("Order total"),
@@ -279,7 +293,7 @@ def get_data_fields(event, for_model=None):
None, None,
lambda order: str(order.total), lambda order: str(order.total),
), ),
( DataFieldInfo(
ORDER_POSITION, ORDER_POSITION,
"product", "product",
_("Product and variation name"), _("Product and variation name"),
@@ -290,7 +304,7 @@ def get_data_fields(event, for_model=None):
+ ((" " + str(position.variation.value)) if position.variation else "") + ((" " + str(position.variation.value)) if position.variation else "")
), ),
), ),
( DataFieldInfo(
ORDER_POSITION, ORDER_POSITION,
"product_id", "product_id",
_("Product ID"), _("Product ID"),
@@ -298,7 +312,7 @@ def get_data_fields(event, for_model=None):
None, None,
lambda position: position.item.pk, lambda position: position.item.pk,
), ),
( DataFieldInfo(
EVENT, EVENT,
"event_slug", "event_slug",
_("Event short form"), _("Event short form"),
@@ -306,7 +320,7 @@ def get_data_fields(event, for_model=None):
None, None,
lambda event: str(event.slug), lambda event: str(event.slug),
), ),
( DataFieldInfo(
EVENT, EVENT,
"event_name", "event_name",
_("Event name"), _("Event name"),
@@ -314,7 +328,7 @@ def get_data_fields(event, for_model=None):
None, None,
lambda event: str(event.name), lambda event: str(event.name),
), ),
( DataFieldInfo(
EVENT_OR_SUBEVENT, EVENT_OR_SUBEVENT,
"event_date_from", "event_date_from",
_("Event start date"), _("Event start date"),
@@ -322,7 +336,7 @@ def get_data_fields(event, for_model=None):
None, None,
lambda event_or_subevent: isoformat_or_none(event_or_subevent.date_from), lambda event_or_subevent: isoformat_or_none(event_or_subevent.date_from),
), ),
( DataFieldInfo(
EVENT_OR_SUBEVENT, EVENT_OR_SUBEVENT,
"event_date_to", "event_date_to",
_("Event end date"), _("Event end date"),
@@ -330,7 +344,7 @@ def get_data_fields(event, for_model=None):
None, None,
lambda event_or_subevent: isoformat_or_none(event_or_subevent.date_to), lambda event_or_subevent: isoformat_or_none(event_or_subevent.date_to),
), ),
( DataFieldInfo(
ORDER_POSITION, ORDER_POSITION,
"voucher_code", "voucher_code",
_("Voucher code"), _("Voucher code"),
@@ -338,7 +352,7 @@ def get_data_fields(event, for_model=None):
None, None,
lambda position: position.voucher.code if position.voucher_id else "", lambda position: position.voucher.code if position.voucher_id else "",
), ),
( DataFieldInfo(
ORDER_POSITION, ORDER_POSITION,
"ticket_id", "ticket_id",
_("Ticket ID"), _("Ticket ID"),
@@ -346,7 +360,7 @@ def get_data_fields(event, for_model=None):
None, None,
lambda position: position.code, lambda position: position.code,
), ),
( DataFieldInfo(
ORDER_POSITION, ORDER_POSITION,
"ticket_price", "ticket_price",
_("Ticket price"), _("Ticket price"),
@@ -354,7 +368,7 @@ def get_data_fields(event, for_model=None):
None, None,
lambda position: str(position.price), lambda position: str(position.price),
), ),
( DataFieldInfo(
ORDER, ORDER,
"order_status", "order_status",
_("Order status"), _("Order status"),
@@ -362,7 +376,7 @@ def get_data_fields(event, for_model=None):
Order.STATUS_CHOICE, Order.STATUS_CHOICE,
lambda order: [str(order.status)], lambda order: [str(order.status)],
), ),
( DataFieldInfo(
ORDER, ORDER,
"order_date", "order_date",
_("Order date and time"), _("Order date and time"),
@@ -370,7 +384,7 @@ def get_data_fields(event, for_model=None):
None, None,
lambda order: order.datetime.isoformat(), lambda order: order.datetime.isoformat(),
), ),
( DataFieldInfo(
ORDER, ORDER,
"payment_date", "payment_date",
_("Payment date and time"), _("Payment date and time"),
@@ -378,7 +392,7 @@ def get_data_fields(event, for_model=None):
None, None,
get_payment_date, get_payment_date,
), ),
( DataFieldInfo(
ORDER, ORDER,
"order_locale", "order_locale",
_("Order locale country code"), _("Order locale country code"),
@@ -388,7 +402,7 @@ def get_data_fields(event, for_model=None):
), ),
] ]
+ [ + [
( DataFieldInfo(
ORDER_POSITION, ORDER_POSITION,
"checkin_date_" + str(cl.pk), "checkin_date_" + str(cl.pk),
_("Check-in datetime on list {}").format(cl.name), _("Check-in datetime on list {}").format(cl.name),
@@ -399,7 +413,7 @@ def get_data_fields(event, for_model=None):
for cl in event.checkin_lists.all() for cl in event.checkin_lists.all()
] ]
+ [ + [
( DataFieldInfo(
ORDER_POSITION, ORDER_POSITION,
"question_" + q.identifier, "question_" + q.identifier,
_("Question: {name}").format(name=str(q.question)), _("Question: {name}").format(name=str(q.question)),
@@ -410,12 +424,54 @@ def get_data_fields(event, for_model=None):
for q in event.questions.all().prefetch_related("options") for q in event.questions.all().prefetch_related("options")
] ]
) )
if not any(field_name == "given_name" for field_name, label, weight in name_scheme["fields"]):
src_fields += [
DataFieldInfo(
ORDER_POSITION,
"attendee_name_given_name",
_("Attendee") + ": " + _("Given name") + " (⚠️ auto-generated, not recommended)",
Question.TYPE_STRING,
None,
lambda position: split_name_on_last_space(position.attendee_name, part=0),
deprecated=True,
),
DataFieldInfo(
ORDER,
"invoice_address_name_given_name",
_("Invoice address") + ": " + _("Given name") + " (⚠️ auto-generated, not recommended)",
Question.TYPE_STRING,
None,
lambda order: split_name_on_last_space(order.invoice_address.name, part=0),
deprecated=True,
),
]
if not any(field_name == "family_name" for field_name, label, weight in name_scheme["fields"]):
src_fields += [
DataFieldInfo(
ORDER_POSITION,
"attendee_name_family_name",
_("Attendee") + ": " + _("Family name") + " (⚠️ auto-generated, not recommended)",
Question.TYPE_STRING,
None,
lambda position: split_name_on_last_space(position.attendee_name.rsplit, part=1),
deprecated=True,
),
DataFieldInfo(
ORDER,
"invoice_address_name_family_name",
_("Invoice address") + ": " + _("Family name") + " (⚠️ auto-generated, not recommended)",
Question.TYPE_STRING,
None,
lambda order: split_name_on_last_space(order.invoice_address.name, part=1),
deprecated=True,
),
]
if for_model: if for_model:
available_inputs = AVAILABLE_MODELS[for_model] available_inputs = AVAILABLE_MODELS[for_model]
return [ return [
(required_input, key, label, qtype, enum_opts, getter) f for f in src_fields if f.required_input in available_inputs
for required_input, key, label, qtype, enum_opts, getter in src_fields
if required_input in available_inputs
] ]
else: else:
return src_fields return src_fields

View File

@@ -21,11 +21,11 @@ class PropertyMappingForm(forms.Form):
] ]
) )
def __init__(self, pretix_fields, external_fields_id, *args, **kwargs): def __init__(self, pretix_fields, external_fields_id, available_modes, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.fields["pretix_field"] = forms.ChoiceField( self.fields["pretix_field"] = forms.ChoiceField(
label=_("pretix Field"), label=_("pretix Field"),
choices=pretix_fields_choices(pretix_fields), choices=pretix_fields_choices(pretix_fields, kwargs.get("initial", {}).get("pretix_field")),
required=False, required=False,
) )
if external_fields_id: if external_fields_id:
@@ -40,6 +40,9 @@ class PropertyMappingForm(forms.Form):
self.fields["external_field"].choices = [ self.fields["external_field"].choices = [
(self["external_field"].value(), self["external_field"].value()), (self["external_field"].value(), self["external_field"].value()),
] ]
self.fields["overwrite"].choices = [
(key, label) for (key, label) in self.fields["overwrite"].choices if key in available_modes
]
print(self.fields) print(self.fields)
@@ -51,11 +54,12 @@ class PropertyMappingFormSet(formset_factory(
)): )):
template_name = "pretixcontrol/datasync/property_mapping_formset.html" template_name = "pretixcontrol/datasync/property_mapping_formset.html"
def __init__(self, pretix_fields, external_fields, prefix, *args, **kwargs): def __init__(self, pretix_fields, external_fields, available_modes, prefix, *args, **kwargs):
super().__init__( super().__init__(
form_kwargs={ form_kwargs={
"pretix_fields": pretix_fields, "pretix_fields": pretix_fields,
"external_fields_id": prefix + "external-fields" if external_fields else None, "external_fields_id": prefix + "external-fields" if external_fields else None,
"available_modes": available_modes,
}, },
prefix=prefix, prefix=prefix,
*args, **kwargs) *args, **kwargs)
@@ -68,8 +72,9 @@ class PropertyMappingFormSet(formset_factory(
return ctx return ctx
def pretix_fields_choices(pretix_fields): def pretix_fields_choices(pretix_fields, initial_choice):
return [ return [
(key, label + " [" + QUESTION_TYPE_IDENTIFIERS[ptype] + "]") (f.key, f.label + " [" + QUESTION_TYPE_IDENTIFIERS[f.type] + "]")
for (required_input, key, label, ptype, enum_opts, getter) in pretix_fields for f in pretix_fields
if not f.deprecated or f.key == initial_choice
] ]

View File

@@ -9,7 +9,6 @@
</h3> </h3>
</div> </div>
<div class="panel-body"> <div class="panel-body">
{{ test.hello }}
<table class="table table-condensed"> <table class="table table-condensed">
<tbody> <tbody>
{% for identifier, display_name, pending, objects in providers %} {% for identifier, display_name, pending, objects in providers %}
@@ -20,20 +19,20 @@
{% if pending.failed_attempts %} {% if pending.failed_attempts %}
<i class="fa fa-warning"></i> <i class="fa fa-warning"></i>
{% blocktrans trimmed with num=pending.failed_attempts max=pending.max_retry_attempts %} {% blocktrans trimmed with num=pending.failed_attempts max=pending.max_retry_attempts %}
Error, retry {{ num }} of {{ max }} Error, retry {{ num }} of {{ max }}.
{% endblocktrans %}{% if pending.not_before %}, {% endblocktrans %}{% if pending.not_before %},
{% blocktrans trimmed with datetime=pending.not_before %} {% blocktrans trimmed with datetime=pending.not_before|date:"SHORT_DATETIME_FORMAT" %}
waiting until {{ datetime }} Waiting until {{ datetime }}.
{% endblocktrans %} {% endblocktrans %}
{% endif %} {% endif %}
{% elif pending.not_before %} {% elif pending.not_before %}
{% blocktrans trimmed with datetime=pending.not_before %} {% blocktrans trimmed with datetime=pending.not_before|date:"SHORT_DATETIME_FORMAT" %}
Waiting until {{ datetime }} Waiting until {{ datetime }}.
{% endblocktrans %} {% endblocktrans %}
{% else %} {% else %}
<i class="fa fa-hourglass"></i> {% trans "Pending" %} <i class="fa fa-hourglass"></i> {% trans "Pending" %}
{% endif %} {% endif %}
(triggered by {{ pending.triggered_by }} at {{ pending.triggered }}) (triggered by {{ pending.triggered_by }} at {{ pending.triggered|date:"SHORT_DATETIME_FORMAT" }})
{% else %} {% else %}
- -
{% endif %} {% endif %}