From 9ab3c20b2ebf0465284a170935f413b8ce952964 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Sat, 24 Sep 2016 17:22:09 +0200 Subject: [PATCH] Add a read-only view for quotas --- .../templates/pretixcontrol/items/quota.html | 130 +++++++----------- .../pretixcontrol/items/quota_edit.html | 61 ++++++++ .../templates/pretixcontrol/items/quotas.html | 7 +- src/pretix/control/urls.py | 3 +- src/pretix/control/views/dashboards.py | 2 +- src/pretix/control/views/item.py | 38 +++-- src/tests/control/test_items.py | 5 +- 7 files changed, 147 insertions(+), 99 deletions(-) create mode 100644 src/pretix/control/templates/pretixcontrol/items/quota_edit.html diff --git a/src/pretix/control/templates/pretixcontrol/items/quota.html b/src/pretix/control/templates/pretixcontrol/items/quota.html index dba341fc48..a08b0cfa20 100644 --- a/src/pretix/control/templates/pretixcontrol/items/quota.html +++ b/src/pretix/control/templates/pretixcontrol/items/quota.html @@ -1,91 +1,57 @@ {% extends "pretixcontrol/items/base.html" %} {% load i18n %} {% load bootstrap3 %} -{% block title %}{% trans "Quota" %}{% endblock %} +{% block title %}{% blocktrans with name=quota.name %}Quota: {{ name }}{% endblocktrans %}{% endblock %} {% block inside %} -

{% trans "Quota" %}

-
-
-
- {% csrf_token %} - {% bootstrap_form_errors form %} -
- {% trans "General information" %} - {% bootstrap_field form.name layout="horizontal" %} - {% bootstrap_field form.size layout="horizontal" %} - {% trans "Items" %} -

- {% blocktrans trimmed %} - Please select the products or product variations this quota should be applied to. If you apply two - quotas to the same product, it will only be available if - both quotas have capacity - left. - {% endblocktrans %} -

-
- {% for item in items %} -
- -
-
-
- {% bootstrap_field item.field layout="horizontal" %} -
-
-
-
- {% endfor %} -
-
+

+ {% blocktrans with name=quota.name %}Quota: {{ name }}{% endblocktrans %} + {% if request.eventperm.can_change_quotas %} + + + {% trans "Edit quota" %} + + {% endif %} +

+
+
+ {% trans "Usage overview" %} +
+
- {% if quota.pk and quota.size != None %} -
-
- {% trans "Availability calculation" %} -
+ +
+
+ {% trans "Availability calculation" %} -
- -
-
{% trans "Total quota" %}
-
{{ quota.size }}
-
-
-
{% trans "Paid orders" %}
-
– {{ quota.count_paid_orders }}
-
-
-
{% trans "Pending orders" %}
-
– {{ quota.count_pending_orders }}
-
-
-
{% trans "Vouchers" %}
-
– {{ quota.count_blocking_vouchers }}
-
-
-
{% trans "Current user's carts" %}
-
– {{ quota.count_in_cart }}
-
-
-
{% trans "Current availability" %}
-
{{ quota.availability.1 }}
-
-
+
+
{% trans "Total quota" %}
+
+ {% if quota.size == None %}{% trans "Infinite" %}{% else %}{{ quota.size }}{% endif %}
- - {% endif %} +
+
+
{% trans "Paid orders" %}
+
– {{ quota.count_paid_orders }}
+
+
+
{% trans "Pending orders" %}
+
– {{ quota.count_pending_orders }}
+
+
+
{% trans "Vouchers" %}
+
– {{ quota.count_blocking_vouchers }}
+
+
+
{% trans "Current user's carts" %}
+
– {{ quota.count_in_cart }}
+
+
+
{% trans "Current availability" %}
+
+ {% if quota.size == None %}{% trans "Infinite" %}{% else %}{{ quota.availability.1 }}{% endif %} +
+
-
- -
- +
{% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/items/quota_edit.html b/src/pretix/control/templates/pretixcontrol/items/quota_edit.html new file mode 100644 index 0000000000..e9891be0f2 --- /dev/null +++ b/src/pretix/control/templates/pretixcontrol/items/quota_edit.html @@ -0,0 +1,61 @@ +{% extends "pretixcontrol/items/base.html" %} +{% load i18n %} +{% load bootstrap3 %} +{% block title %} + {% if question %} + {% blocktrans with name=quota.name %}Quota: {{ name }}{% endblocktrans %} + {% else %} + {% trans "Quota" %} + {% endif %} +{% endblock %} +{% block inside %} + {% if question %} +

{% blocktrans with name=quota.name %}Quota: {{ name }}{% endblocktrans %}

+ {% else %} +

{% trans "Quota" %}

+ {% endif %} +
+ {% csrf_token %} + {% bootstrap_form_errors form %} +
+ {% trans "General information" %} + {% bootstrap_field form.name layout="horizontal" %} + {% bootstrap_field form.size layout="horizontal" %} + {% trans "Items" %} +

+ {% blocktrans trimmed %} + Please select the products or product variations this quota should be applied to. If you apply two + quotas to the same product, it will only be available if + both quotas have capacity + left. + {% endblocktrans %} +

+
+ {% for item in items %} +
+ +
+
+
+ {% bootstrap_field item.field layout="horizontal" %} +
+
+
+
+ {% endfor %} +
+
+
+ +
+
+{% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/items/quotas.html b/src/pretix/control/templates/pretixcontrol/items/quotas.html index f859a94717..2dbcc100a8 100644 --- a/src/pretix/control/templates/pretixcontrol/items/quotas.html +++ b/src/pretix/control/templates/pretixcontrol/items/quotas.html @@ -43,20 +43,19 @@ {% for q in quotas %} - {{ q.name }} + {{ q.name }} {% if q.size == None %}Unlimited{% else %}{{ q.size }}{% endif %} {% include "pretixcontrol/items/fragment_quota_availability.html" with availability=q.availability %} + diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py index 7749695071..1c731a5670 100644 --- a/src/pretix/control/urls.py +++ b/src/pretix/control/urls.py @@ -59,7 +59,8 @@ urlpatterns = [ name='event.items.questions.edit'), url(r'^questions/add$', item.QuestionCreate.as_view(), name='event.items.questions.add'), url(r'^quotas/$', item.QuotaList.as_view(), name='event.items.quotas'), - url(r'^quotas/(?P\d+)/$', item.QuotaUpdate.as_view(), name='event.items.quotas.edit'), + url(r'^quotas/(?P\d+)/$', item.QuotaView.as_view(), name='event.items.quotas.show'), + url(r'^quotas/(?P\d+)/change$', item.QuotaUpdate.as_view(), name='event.items.quotas.edit'), url(r'^quotas/(?P\d+)/delete$', item.QuotaDelete.as_view(), name='event.items.quotas.delete'), url(r'^quotas/add$', item.QuotaCreate.as_view(), name='event.items.quotas.add'), diff --git a/src/pretix/control/views/dashboards.py b/src/pretix/control/views/dashboards.py index f8b5056086..9a7e713a40 100644 --- a/src/pretix/control/views/dashboards.py +++ b/src/pretix/control/views/dashboards.py @@ -89,7 +89,7 @@ def quota_widgets(sender, **kwargs): text=_('{quota} left').format(quota=q.name)), 'width': 3, 'priority': 50, - 'url': reverse('control:event.items.quotas.edit', kwargs={ + 'url': reverse('control:event.items.quotas.show', kwargs={ 'event': sender.slug, 'organizer': sender.organizer.slug, 'quota': q.id diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index 6734a73000..10b1637c62 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -572,7 +572,7 @@ class QuotaEditorMixin: class QuotaCreate(EventPermissionRequiredMixin, QuotaEditorMixin, CreateView): model = Quota form_class = QuotaForm - template_name = 'pretixcontrol/items/quota.html' + template_name = 'pretixcontrol/items/quota_edit.html' permission = 'can_change_items' context_object_name = 'quota' @@ -591,16 +591,14 @@ class QuotaCreate(EventPermissionRequiredMixin, QuotaEditorMixin, CreateView): return ret -class QuotaUpdate(EventPermissionRequiredMixin, QuotaEditorMixin, ChartContainingView, UpdateView): +class QuotaView(ChartContainingView, DetailView): model = Quota - form_class = QuotaForm template_name = 'pretixcontrol/items/quota.html' - permission = 'can_change_items' context_object_name = 'quota' def get_context_data(self, *args, **kwargs): ctx = super().get_context_data() - ctx['quota_chart_data'] = json.dumps([ + data = [ { 'label': ugettext('Paid orders'), 'value': self.object.count_paid_orders() @@ -616,12 +614,34 @@ class QuotaUpdate(EventPermissionRequiredMixin, QuotaEditorMixin, ChartContainin { 'label': ugettext('Current user\'s carts'), 'value': self.object.count_in_cart() - }, - { + } + ] + if self.object.size is not None: + data.append({ 'label': ugettext('Current availability'), 'value': self.object.availability()[1] - } - ]) + }) + ctx['quota_chart_data'] = json.dumps(data) + return ctx + + def get_object(self, queryset=None) -> Quota: + try: + return self.request.event.quotas.get( + id=self.kwargs['quota'] + ) + except Quota.DoesNotExist: + raise Http404(_("The requested quota does not exist.")) + + +class QuotaUpdate(EventPermissionRequiredMixin, QuotaEditorMixin, UpdateView): + model = Quota + form_class = QuotaForm + template_name = 'pretixcontrol/items/quota_edit.html' + permission = 'can_change_items' + context_object_name = 'quota' + + def get_context_data(self, *args, **kwargs): + ctx = super().get_context_data() return ctx def get_object(self, queryset=None) -> Quota: diff --git a/src/tests/control/test_items.py b/src/tests/control/test_items.py index 396c2d6eb5..0cb404f321 100644 --- a/src/tests/control/test_items.py +++ b/src/tests/control/test_items.py @@ -231,11 +231,12 @@ class QuotaTest(ItemFormTest): item2 = Item.objects.create(event=self.event1, name="Business", default_price=0) ItemVariation.objects.create(item=item2, value="Silver") ItemVariation.objects.create(item=item2, value="Gold") - doc = self.get_doc('/control/event/%s/%s/quotas/%s/' % (self.orga1.slug, self.event1.slug, c.id)) + doc = self.get_doc('/control/event/%s/%s/quotas/%s/change' % (self.orga1.slug, self.event1.slug, c.id)) doc.select('[name=item_%s]' % item1.id)[0]['checked'] = 'checked' form_data = extract_form_fields(doc.select('.container-fluid form')[0]) form_data['size'] = '350' - doc = self.post_doc('/control/event/%s/%s/quotas/%s/' % (self.orga1.slug, self.event1.slug, c.id), form_data) + doc = self.post_doc('/control/event/%s/%s/quotas/%s/change' % (self.orga1.slug, self.event1.slug, c.id), + form_data) self.assertIn("350", doc.select("#page-wrapper table")[0].text) self.assertNotIn("500", doc.select("#page-wrapper table")[0].text) assert Quota.objects.get(id=c.id).size == 350