mirror of
https://github.com/pretix/pretix.git
synced 2026-05-07 15:34:02 +00:00
Order overview: Try to make linked filters behave as expected for line-level cancellations (Z#23203500)
This commit is contained in:
@@ -197,6 +197,7 @@ def order_overview(
|
|||||||
item.all_variations = list(item.variations.all())
|
item.all_variations = list(item.variations.all())
|
||||||
item.has_variations = (len(item.all_variations) > 0)
|
item.has_variations = (len(item.all_variations) > 0)
|
||||||
item.num = {}
|
item.num = {}
|
||||||
|
item.subevent = subevent
|
||||||
if item.has_variations:
|
if item.has_variations:
|
||||||
for var in item.all_variations:
|
for var in item.all_variations:
|
||||||
variid = var.id
|
variid = var.id
|
||||||
|
|||||||
@@ -220,6 +220,7 @@ class OrderFilterForm(FilterForm):
|
|||||||
(_('Cancellations'), (
|
(_('Cancellations'), (
|
||||||
(Order.STATUS_CANCELED, _('Canceled (fully)')),
|
(Order.STATUS_CANCELED, _('Canceled (fully)')),
|
||||||
('cp', _('Canceled (fully or with paid fee)')),
|
('cp', _('Canceled (fully or with paid fee)')),
|
||||||
|
('cany', _('Canceled (at least one position)')),
|
||||||
('rc', _('Cancellation requested')),
|
('rc', _('Cancellation requested')),
|
||||||
('cni', _('Fully canceled but invoice not canceled')),
|
('cni', _('Fully canceled but invoice not canceled')),
|
||||||
)),
|
)),
|
||||||
@@ -396,6 +397,16 @@ class OrderFilterForm(FilterForm):
|
|||||||
).filter(
|
).filter(
|
||||||
Q(status=Order.STATUS_PAID, has_pc=False) | Q(status=Order.STATUS_CANCELED)
|
Q(status=Order.STATUS_PAID, has_pc=False) | Q(status=Order.STATUS_CANCELED)
|
||||||
)
|
)
|
||||||
|
elif s == 'cany':
|
||||||
|
s = OrderPosition.all.filter(
|
||||||
|
order=OuterRef('pk'),
|
||||||
|
canceled=True,
|
||||||
|
)
|
||||||
|
qs = qs.annotate(
|
||||||
|
has_pc_c=Exists(s)
|
||||||
|
).filter(
|
||||||
|
Q(has_pc_c=True) | Q(status=Order.STATUS_CANCELED)
|
||||||
|
)
|
||||||
|
|
||||||
if fdata.get('ordering'):
|
if fdata.get('ordering'):
|
||||||
qs = qs.order_by(*get_deterministic_ordering(Order, self.get_order_by()))
|
qs = qs.order_by(*get_deterministic_ordering(Order, self.get_order_by()))
|
||||||
@@ -474,16 +485,31 @@ class EventOrderFilterForm(OrderFilterForm):
|
|||||||
fdata = self.cleaned_data
|
fdata = self.cleaned_data
|
||||||
qs = super().filter_qs(qs)
|
qs = super().filter_qs(qs)
|
||||||
|
|
||||||
|
# This is a little magic, but there's no option that does not confuse people and let's hope this confuses less
|
||||||
|
# people.
|
||||||
|
only_match_noncanceled_products = fdata.get('status') in (
|
||||||
|
Order.STATUS_PAID,
|
||||||
|
Order.STATUS_PAID + 'v',
|
||||||
|
Order.STATUS_PENDING,
|
||||||
|
Order.STATUS_PENDING + Order.STATUS_PAID,
|
||||||
|
)
|
||||||
|
if only_match_noncanceled_products:
|
||||||
|
canceled_filter = Q(all_positions__canceled=False)
|
||||||
|
elif fdata.get('status') in ('cp', 'cany'):
|
||||||
|
canceled_filter = Q(all_positions__canceled=True) | Q(status=Order.STATUS_CANCELED)
|
||||||
|
else:
|
||||||
|
canceled_filter = Q()
|
||||||
|
|
||||||
item = fdata.get('item')
|
item = fdata.get('item')
|
||||||
if item:
|
if item:
|
||||||
if '-' in item:
|
if '-' in item:
|
||||||
var = item.split('-')[1]
|
var = item.split('-')[1]
|
||||||
qs = qs.filter(all_positions__variation_id=var, all_positions__canceled=False).distinct()
|
qs = qs.filter(canceled_filter, all_positions__variation_id=var).distinct()
|
||||||
else:
|
else:
|
||||||
qs = qs.filter(all_positions__item_id=fdata.get('item'), all_positions__canceled=False).distinct()
|
qs = qs.filter(canceled_filter, all_positions__item_id=fdata.get('item')).distinct()
|
||||||
|
|
||||||
if fdata.get('subevent'):
|
if fdata.get('subevent'):
|
||||||
qs = qs.filter(all_positions__subevent=fdata.get('subevent'), all_positions__canceled=False).distinct()
|
qs = qs.filter(canceled_filter, all_positions__subevent=fdata.get('subevent')).distinct()
|
||||||
|
|
||||||
if fdata.get('question') and fdata.get('answer') is not None:
|
if fdata.get('question') and fdata.get('answer') is not None:
|
||||||
q = fdata.get('question')
|
q = fdata.get('question')
|
||||||
|
|||||||
@@ -74,7 +74,7 @@
|
|||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{% trans "Product" %}</th>
|
<th>{% trans "Product" %}</th>
|
||||||
<th>{% trans "Canceled" %}¹</th>
|
<th>{% trans "Canceled" %}</th>
|
||||||
<th>{% trans "Expired" %}</th>
|
<th>{% trans "Expired" %}</th>
|
||||||
<th>{% trans "Approval pending" %}</th>
|
<th>{% trans "Approval pending" %}</th>
|
||||||
<th colspan="3" class="text-center">{% trans "Purchased" %}</th>
|
<th colspan="3" class="text-center">{% trans "Purchased" %}</th>
|
||||||
@@ -106,27 +106,27 @@
|
|||||||
<tr class="item {% if tup.0 %}categorized{% endif %}">
|
<tr class="item {% if tup.0 %}categorized{% endif %}">
|
||||||
<td>{{ item }}</td>
|
<td>{{ item }}</td>
|
||||||
<td>
|
<td>
|
||||||
<a href="{{ listurl }}?item={{ item.id }}&status=c&provider={{ item.provider }}">
|
<a href="{{ listurl }}?item={{ item.id }}&status=cany&provider={{ item.provider }}{% if subevent %}&subevent={{ subevent.pk }}{% endif %}">
|
||||||
{{ item.num.canceled|togglesum:request.event.currency }}
|
{{ item.num.canceled|togglesum:request.event.currency }}
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<a href="{{ listurl }}?item={{ item.id }}&status=e&provider={{ item.provider }}">
|
<a href="{{ listurl }}?item={{ item.id }}&status=e&provider={{ item.provider }}{% if subevent %}&subevent={{ subevent.pk }}{% endif %}">
|
||||||
{{ item.num.expired|togglesum:request.event.currency }}
|
{{ item.num.expired|togglesum:request.event.currency }}
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<a href="{{ listurl }}?item={{ item.id }}&status=pa&provider={{ item.provider }}">
|
<a href="{{ listurl }}?item={{ item.id }}&status=pa&provider={{ item.provider }}{% if subevent %}&subevent={{ subevent.pk }}{% endif %}">
|
||||||
{{ item.num.unapproved|togglesum:request.event.currency }}
|
{{ item.num.unapproved|togglesum:request.event.currency }}
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<a href="{{ listurl }}?item={{ item.id }}&status=na&provider={{ item.provider }}">
|
<a href="{{ listurl }}?item={{ item.id }}&status=na&provider={{ item.provider }}{% if subevent %}&subevent={{ subevent.pk }}{% endif %}">
|
||||||
{{ item.num.pending|togglesum:request.event.currency }}
|
{{ item.num.pending|togglesum:request.event.currency }}
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<a href="{{ listurl }}?item={{ item.id }}&status=p&provider={{ item.provider }}">
|
<a href="{{ listurl }}?item={{ item.id }}&status=p&provider={{ item.provider }}{% if subevent %}&subevent={{ subevent.pk }}{% endif %}">
|
||||||
{{ item.num.paid|togglesum:request.event.currency }}
|
{{ item.num.paid|togglesum:request.event.currency }}
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
@@ -139,27 +139,27 @@
|
|||||||
<tr class="variation {% if tup.0 %}categorized{% endif %}">
|
<tr class="variation {% if tup.0 %}categorized{% endif %}">
|
||||||
<td>{{ var }}</td>
|
<td>{{ var }}</td>
|
||||||
<td>
|
<td>
|
||||||
<a href="{{ listurl }}?item={{ item.id }}-{{ var.id }}&status=c&provider={{ item.provider }}">
|
<a href="{{ listurl }}?item={{ item.id }}-{{ var.id }}&status=cany&provider={{ item.provider }}{% if subevent %}&subevent={{ subevent.pk }}{% endif %}">
|
||||||
{{ var.num.canceled|togglesum:request.event.currency }}
|
{{ var.num.canceled|togglesum:request.event.currency }}
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<a href="{{ listurl }}?item={{ item.id }}-{{ var.id }}&status=e&provider={{ item.provider }}">
|
<a href="{{ listurl }}?item={{ item.id }}-{{ var.id }}&status=e&provider={{ item.provider }}{% if subevent %}&subevent={{ subevent.pk }}{% endif %}">
|
||||||
{{ var.num.expired|togglesum:request.event.currency }}
|
{{ var.num.expired|togglesum:request.event.currency }}
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<a href="{{ listurl }}?item={{ item.id }}-{{ var.id }}&status=pa&provider={{ item.provider }}">
|
<a href="{{ listurl }}?item={{ item.id }}-{{ var.id }}&status=pa&provider={{ item.provider }}{% if subevent %}&subevent={{ subevent.pk }}{% endif %}">
|
||||||
{{ var.num.unapproved|togglesum:request.event.currency }}
|
{{ var.num.unapproved|togglesum:request.event.currency }}
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<a href="{{ listurl }}?item={{ item.id }}-{{ var.id }}&status=na&provider={{ item.provider }}">
|
<a href="{{ listurl }}?item={{ item.id }}-{{ var.id }}&status=na&provider={{ item.provider }}{% if subevent %}&subevent={{ subevent.pk }}{% endif %}">
|
||||||
{{ var.num.pending|togglesum:request.event.currency }}
|
{{ var.num.pending|togglesum:request.event.currency }}
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<a href="{{ listurl }}?item={{ item.id }}-{{ var.id }}&status=p&provider={{ item.provider }}">
|
<a href="{{ listurl }}?item={{ item.id }}-{{ var.id }}&status=p&provider={{ item.provider }}{% if subevent %}&subevent={{ subevent.pk }}{% endif %}">
|
||||||
{{ var.num.paid|togglesum:request.event.currency }}
|
{{ var.num.paid|togglesum:request.event.currency }}
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
@@ -185,7 +185,4 @@
|
|||||||
</tfoot>
|
</tfoot>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<p class="help-block">
|
|
||||||
¹ {% trans "If you click links in this column, you will only find orders that are canceled completely, while the numbers also include single canceled positions within valid orders." %}
|
|
||||||
</p>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -2575,6 +2575,11 @@ class OverView(EventPermissionRequiredMixin, TemplateView):
|
|||||||
self.request.event,
|
self.request.event,
|
||||||
fees=True
|
fees=True
|
||||||
)
|
)
|
||||||
|
ctx['subevent'] = (
|
||||||
|
self.request.event.has_subevents and
|
||||||
|
self.filter_form.is_valid() and
|
||||||
|
self.filter_form.cleaned_data.get('subevent')
|
||||||
|
)
|
||||||
ctx['subevent_warning'] = (
|
ctx['subevent_warning'] = (
|
||||||
self.request.event.has_subevents and
|
self.request.event.has_subevents and
|
||||||
self.filter_form.is_valid() and
|
self.filter_form.is_valid() and
|
||||||
|
|||||||
Reference in New Issue
Block a user