mirror of
https://github.com/pretix/pretix.git
synced 2026-09-14 16:24:43 +00:00
Implement hidden_if_item_available_mode option
This commit is contained in:
@@ -272,7 +272,7 @@ class ItemSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer):
|
|||||||
'require_voucher', 'hide_without_voucher', 'allow_cancel', 'require_bundling',
|
'require_voucher', 'hide_without_voucher', 'allow_cancel', 'require_bundling',
|
||||||
'min_per_order', 'max_per_order', 'checkin_attention', 'checkin_text', 'has_variations', 'variations',
|
'min_per_order', 'max_per_order', 'checkin_attention', 'checkin_text', 'has_variations', 'variations',
|
||||||
'addons', 'bundles', 'original_price', 'require_approval', 'generate_tickets',
|
'addons', 'bundles', 'original_price', 'require_approval', 'generate_tickets',
|
||||||
'show_quota_left', 'hidden_if_available', 'hidden_if_item_available', 'allow_waitinglist',
|
'show_quota_left', 'hidden_if_available', 'hidden_if_item_available', 'hidden_if_item_available_mode', 'allow_waitinglist',
|
||||||
'issue_giftcard', 'meta_data',
|
'issue_giftcard', 'meta_data',
|
||||||
'require_membership', 'require_membership_types', 'require_membership_hidden', 'grant_membership_type',
|
'require_membership', 'require_membership_types', 'require_membership_hidden', 'grant_membership_type',
|
||||||
'grant_membership_duration_like_event', 'grant_membership_duration_days',
|
'grant_membership_duration_like_event', 'grant_membership_duration_days',
|
||||||
|
|||||||
@@ -600,6 +600,11 @@ class Item(LoggedModel):
|
|||||||
"be a short period in which both products are visible while all tickets of the referenced "
|
"be a short period in which both products are visible while all tickets of the referenced "
|
||||||
"product are reserved, but not yet sold.")
|
"product are reserved, but not yet sold.")
|
||||||
)
|
)
|
||||||
|
hidden_if_item_available_mode = models.CharField(
|
||||||
|
choices=UNAVAIL_MODES,
|
||||||
|
default=UNAVAIL_MODE_HIDDEN,
|
||||||
|
max_length=16,
|
||||||
|
)
|
||||||
require_voucher = models.BooleanField(
|
require_voucher = models.BooleanField(
|
||||||
verbose_name=_('This product can only be bought using a voucher.'),
|
verbose_name=_('This product can only be bought using a voucher.'),
|
||||||
default=False,
|
default=False,
|
||||||
@@ -889,6 +894,8 @@ class Item(LoggedModel):
|
|||||||
return 'available_from'
|
return 'available_from'
|
||||||
elif subevent_item and subevent_item.available_until and subevent_item.available_until < now_dt:
|
elif subevent_item and subevent_item.available_until and subevent_item.available_until < now_dt:
|
||||||
return 'available_until'
|
return 'available_until'
|
||||||
|
elif self.hidden_if_item_available and self._dependency_available:
|
||||||
|
return 'hidden_if_item_available'
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|||||||
@@ -476,6 +476,7 @@ class ItemCreateForm(I18nModelForm):
|
|||||||
'show_quota_left',
|
'show_quota_left',
|
||||||
'hidden_if_available',
|
'hidden_if_available',
|
||||||
'hidden_if_item_available',
|
'hidden_if_item_available',
|
||||||
|
'hidden_if_item_available_mode',
|
||||||
'require_bundling',
|
'require_bundling',
|
||||||
'require_membership',
|
'require_membership',
|
||||||
'grant_membership_type',
|
'grant_membership_type',
|
||||||
@@ -666,6 +667,11 @@ class ItemUpdateForm(I18nModelForm):
|
|||||||
attrs={'data-checkbox-dependency': '#id_require_voucher'}
|
attrs={'data-checkbox-dependency': '#id_require_voucher'}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self.fields['hidden_if_item_available_mode'].widget = ButtonGroupRadioSelect(
|
||||||
|
choices=self.fields['hidden_if_item_available_mode'].choices,
|
||||||
|
option_icons=Item.UNAVAIL_MODE_ICONS
|
||||||
|
)
|
||||||
|
|
||||||
if self.instance.hidden_if_available_id:
|
if self.instance.hidden_if_available_id:
|
||||||
self.fields['hidden_if_available'].queryset = self.event.quotas.all()
|
self.fields['hidden_if_available'].queryset = self.event.quotas.all()
|
||||||
self.fields['hidden_if_available'].help_text = format_html(
|
self.fields['hidden_if_available'].help_text = format_html(
|
||||||
@@ -847,6 +853,7 @@ class ItemUpdateForm(I18nModelForm):
|
|||||||
'show_quota_left',
|
'show_quota_left',
|
||||||
'hidden_if_available',
|
'hidden_if_available',
|
||||||
'hidden_if_item_available',
|
'hidden_if_item_available',
|
||||||
|
'hidden_if_item_available_mode',
|
||||||
'issue_giftcard',
|
'issue_giftcard',
|
||||||
'require_membership',
|
'require_membership',
|
||||||
'require_membership_types',
|
'require_membership_types',
|
||||||
|
|||||||
@@ -172,7 +172,7 @@
|
|||||||
{% if form.hidden_if_available %}
|
{% if form.hidden_if_available %}
|
||||||
{% bootstrap_field form.hidden_if_available layout="control" horizontal_field_class="col-md-7" %}
|
{% bootstrap_field form.hidden_if_available layout="control" horizontal_field_class="col-md-7" %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% bootstrap_field form.hidden_if_item_available layout="control" horizontal_field_class="col-md-7" %}
|
{% bootstrap_field form.hidden_if_item_available visibility_field=form.hidden_if_item_available_mode layout="control_with_visibility" %}
|
||||||
</fieldset>
|
</fieldset>
|
||||||
{% for v in formsets.values %}
|
{% for v in formsets.values %}
|
||||||
<fieldset>
|
<fieldset>
|
||||||
|
|||||||
@@ -5,6 +5,10 @@
|
|||||||
<div class="col-md-2 col-sm-3 col-xs-6 availability-box unavailable">
|
<div class="col-md-2 col-sm-3 col-xs-6 availability-box unavailable">
|
||||||
<p><small><a href="#voucher">{% trans "Enter a voucher code below to buy this product." %}</a></small></p>
|
<p><small><a href="#voucher">{% trans "Enter a voucher code below to buy this product." %}</a></small></p>
|
||||||
</div>
|
</div>
|
||||||
|
{% elif item.current_unavailability_reason == 'hidden_if_item_available' %}
|
||||||
|
<div class="col-md-2 col-sm-3 col-xs-6 availability-box unavailable">
|
||||||
|
<p><small>{% trans "Not available yet." %}</small></p>
|
||||||
|
</div>
|
||||||
{% elif item.current_unavailability_reason == 'available_from' or var.current_unavailability_reason == 'available_from' %}
|
{% elif item.current_unavailability_reason == 'available_from' or var.current_unavailability_reason == 'available_from' %}
|
||||||
<div class="col-md-2 col-sm-3 col-xs-6 availability-box unavailable">
|
<div class="col-md-2 col-sm-3 col-xs-6 availability-box unavailable">
|
||||||
<p><small>{% trans "Not available yet." %}</small></p>
|
<p><small>{% trans "Not available yet." %}</small></p>
|
||||||
|
|||||||
@@ -302,14 +302,14 @@ def get_grouped_items(event, *, channel: SalesChannel, subevent=None, voucher=No
|
|||||||
|
|
||||||
if item.hidden_if_item_available:
|
if item.hidden_if_item_available:
|
||||||
if item.hidden_if_item_available.has_variations:
|
if item.hidden_if_item_available.has_variations:
|
||||||
dependency_available = any(
|
item._dependency_available = any(
|
||||||
var.check_quotas(subevent=subevent, _cache=quota_cache, include_bundled=True)[0] == Quota.AVAILABILITY_OK
|
var.check_quotas(subevent=subevent, _cache=quota_cache, include_bundled=True)[0] == Quota.AVAILABILITY_OK
|
||||||
for var in item.hidden_if_item_available.available_variations
|
for var in item.hidden_if_item_available.available_variations
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
q = item.hidden_if_item_available.check_quotas(subevent=subevent, _cache=quota_cache, include_bundled=True)
|
q = item.hidden_if_item_available.check_quotas(subevent=subevent, _cache=quota_cache, include_bundled=True)
|
||||||
dependency_available = q[0] == Quota.AVAILABILITY_OK
|
item._dependency_available = q[0] == Quota.AVAILABILITY_OK
|
||||||
if dependency_available:
|
if item._dependency_available and item.hidden_if_item_available_mode == Item.UNAVAIL_MODE_HIDDEN:
|
||||||
item._remove = True
|
item._remove = True
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ var strings = {
|
|||||||
'unavailable_available_from': django.pgettext('widget', 'Not yet available'),
|
'unavailable_available_from': django.pgettext('widget', 'Not yet available'),
|
||||||
'unavailable_available_until': django.pgettext('widget', 'Not available anymore'),
|
'unavailable_available_until': django.pgettext('widget', 'Not available anymore'),
|
||||||
'unavailable_active': django.pgettext('widget', 'Currently not available'),
|
'unavailable_active': django.pgettext('widget', 'Currently not available'),
|
||||||
|
'unavailable_hidden_if_item_available': django.pgettext('widget', 'Not yet available'),
|
||||||
'order_min': django.pgettext('widget', 'minimum amount to order: %s'),
|
'order_min': django.pgettext('widget', 'minimum amount to order: %s'),
|
||||||
'exit': django.pgettext('widget', 'Close ticket shop'),
|
'exit': django.pgettext('widget', 'Close ticket shop'),
|
||||||
'loading_error': django.pgettext('widget', 'The ticket shop could not be loaded.'),
|
'loading_error': django.pgettext('widget', 'The ticket shop could not be loaded.'),
|
||||||
|
|||||||
Reference in New Issue
Block a user