Fixed #133 -- Transparent quota calculation

This commit is contained in:
Raphael Michel
2016-03-26 15:26:30 +01:00
parent 0b111ef1fc
commit 6e60332948
2 changed files with 87 additions and 52 deletions

View File

@@ -488,15 +488,11 @@ class Quota(LoggedModel):
return Quota.AVAILABILITY_OK, None return Quota.AVAILABILITY_OK, None
# TODO: Test for interference with old versions of Item-Quota-relations, etc. # TODO: Test for interference with old versions of Item-Quota-relations, etc.
# TODO: Prevent corner-cases like people having ordered an item before it got size_left -= self.count_paid_orders()
# its first variationsadde
paid, pending = self.count_orders()
size_left -= paid
if size_left <= 0: if size_left <= 0:
return Quota.AVAILABILITY_GONE, 0 return Quota.AVAILABILITY_GONE, 0
size_left -= pending size_left -= self.count_pending_orders()
if size_left <= 0: if size_left <= 0:
return Quota.AVAILABILITY_ORDERED, 0 return Quota.AVAILABILITY_ORDERED, 0
@@ -527,17 +523,20 @@ class Quota(LoggedModel):
self._position_lookup self._position_lookup
).distinct().count() ).distinct().count()
def count_orders(self) -> dict: def count_pending_orders(self) -> dict:
from pretix.base.models import Order, OrderPosition from pretix.base.models import Order, OrderPosition
paid = OrderPosition.objects.filter( return OrderPosition.objects.filter(
self._position_lookup, order__status=Order.STATUS_PAID
).distinct().count()
pending = OrderPosition.objects.filter(
self._position_lookup, order__status=Order.STATUS_PENDING, self._position_lookup, order__status=Order.STATUS_PENDING,
order__expires__gte=now() order__expires__gte=now()
).distinct().count() ).distinct().count()
return paid, pending
def count_paid_orders(self):
from pretix.base.models import Order, OrderPosition
return OrderPosition.objects.filter(
self._position_lookup, order__status=Order.STATUS_PAID
).distinct().count()
@cached_property @cached_property
def _position_lookup(self) -> Q: def _position_lookup(self) -> Q:

View File

@@ -3,48 +3,84 @@
{% load bootstrap3 %} {% load bootstrap3 %}
{% block title %}{% trans "Quota" %}{% endblock %} {% block title %}{% trans "Quota" %}{% endblock %}
{% block inside %} {% block inside %}
<h1>{% trans "Quota" %}</h1> <h1>{% trans "Quota" %}</h1>
<form action="" method="post" class="form-horizontal"> <div class="row">
{% csrf_token %} <div class="col-xs-12 {% if quota.pk and quota.size != None %}col-lg-9{% else %}col-lg-12{% endif %}">
{% bootstrap_form_errors form %} <form action="" method="post" class="form-horizontal">
<fieldset> {% csrf_token %}
<legend>{% trans "General information" %}</legend> {% bootstrap_form_errors form %}
{% bootstrap_field form.name layout="horizontal" %} <fieldset>
{% bootstrap_field form.size layout="horizontal" %} <legend>{% trans "General information" %}</legend>
<legend>{% trans "Items" %}</legend> {% bootstrap_field form.name layout="horizontal" %}
<p> {% bootstrap_field form.size layout="horizontal" %}
{% blocktrans trimmed %} <legend>{% trans "Items" %}</legend>
Please select the products or product variations this quota should be applied to. If you apply two <p>
quotas to the same product, it will only be available if <strong>both</strong> quotas have capacity {% blocktrans trimmed %}
left. Please select the products or product variations this quota should be applied to. If you apply two
{% endblocktrans %} quotas to the same product, it will only be available if
</p> <strong>both</strong> quotas have capacity
<div class="panel-group items-on-quota"> left.
{% for item in items %} {% endblocktrans %}
<div class="panel panel-default" data-formset-form> </p>
<div class="panel-heading"> <div class="panel-group items-on-quota">
<h4 class="panel-title"> {% for item in items %}
<a data-toggle="collapse" data-parent="#accordion" <div class="panel panel-default" data-formset-form>
href="#collapse{{ item.id }}"> <div class="panel-heading">
{{ item.name }} <h4 class="panel-title">
</a> <a data-toggle="collapse" data-parent="#accordion"
</h4> href="#collapse{{ item.id }}">
</div> {{ item.name }}
<div id="collapse{{ item.id }}" class="panel-collapse collapse in"> </a>
<div class="panel-body"> </h4>
<div class="form-horizontal"> </div>
{% bootstrap_field item.field layout="horizontal" %} <div id="collapse{{ item.id }}" class="panel-collapse collapse in">
<div class="panel-body">
<div class="form-horizontal">
{% bootstrap_field item.field layout="horizontal" %}
</div>
</div>
</div> </div>
</div> </div>
</div> {% endfor %}
</div> </div>
{% endfor %} </fieldset>
</form>
</div>
{% if quota.pk and quota.size != None %}
<div class="col-xs-12 col-lg-3">
<fieldset>
<legend>{% trans "Availability calculation" %}</legend>
<div class="row">
<div class="col-xs-9">{% trans "Total quota" %}</div>
<div class="col-xs-3 text-right">{{ quota.size }}</div>
</div>
<div class="row">
<div class="col-xs-9">{% trans "Paid orders" %}</div>
<div class="col-xs-3 text-right"> {{ quota.count_paid_orders }}</div>
</div>
<div class="row">
<div class="col-xs-9">{% trans "Pending orders" %}</div>
<div class="col-xs-3 text-right"> {{ quota.count_pending_orders }}</div>
</div>
<div class="row">
<div class="col-xs-9">{% trans "Vouchers" %}</div>
<div class="col-xs-3 text-right"> {{ quota.count_blocking_vouchers }}</div>
</div>
<div class="row">
<div class="col-xs-9">{% trans "Current user's carts" %}</div>
<div class="col-xs-3 text-right"> {{ quota.count_in_cart }}</div>
</div>
<div class="row">
<div class="col-xs-9"><strong>{% trans "Current availability" %}</strong></div>
<div class="col-xs-3 text-right"><strong>{{ quota.availability.1 }}</strong></div>
</div>
</fieldset>
</div> </div>
</fieldset> {% endif %}
<div class="form-group submit-group"> </div>
<button type="submit" class="btn btn-primary btn-save"> <div class="form-group submit-group">
{% trans "Save" %} <button type="submit" class="btn btn-primary btn-save">
</button> {% trans "Save" %}
</div> </button>
</form> </div>
{% endblock %} {% endblock %}