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

@@ -4,6 +4,8 @@
{% block title %}{% trans "Quota" %}{% endblock %} {% block title %}{% trans "Quota" %}{% endblock %}
{% block inside %} {% block inside %}
<h1>{% trans "Quota" %}</h1> <h1>{% trans "Quota" %}</h1>
<div class="row">
<div class="col-xs-12 {% if quota.pk and quota.size != None %}col-lg-9{% else %}col-lg-12{% endif %}">
<form action="" method="post" class="form-horizontal"> <form action="" method="post" class="form-horizontal">
{% csrf_token %} {% csrf_token %}
{% bootstrap_form_errors form %} {% bootstrap_form_errors form %}
@@ -15,7 +17,8 @@
<p> <p>
{% blocktrans trimmed %} {% blocktrans trimmed %}
Please select the products or product variations this quota should be applied to. If you apply two 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 <strong>both</strong> quotas have capacity quotas to the same product, it will only be available if
<strong>both</strong> quotas have capacity
left. left.
{% endblocktrans %} {% endblocktrans %}
</p> </p>
@@ -41,10 +44,43 @@
{% endfor %} {% endfor %}
</div> </div>
</fieldset> </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>
{% endif %}
</div>
<div class="form-group submit-group"> <div class="form-group submit-group">
<button type="submit" class="btn btn-primary btn-save"> <button type="submit" class="btn btn-primary btn-save">
{% trans "Save" %} {% trans "Save" %}
</button> </button>
</div> </div>
</form>
{% endblock %} {% endblock %}