forked from CGM_Public/pretix_original
Fixed #133 -- Transparent quota calculation
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
@@ -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 %}
|
||||||
|
|||||||
Reference in New Issue
Block a user