lingo: factor items to be paid queryset in a classmethod (#19383)

This commit is contained in:
Frédéric Péters 2017-10-11 17:20:56 +02:00 committed by Thomas NOEL
parent 30ed33eaf4
commit 055151fc8b
3 changed files with 22 additions and 38 deletions

View File

@ -173,10 +173,7 @@ class Regie(models.Model):
if not self.extra_fees_ws_url:
return
post_data = {'data': []}
basketitems = BasketItem.objects.filter(
user=user, regie=self,
cancellation_date__isnull=True,
payment_date__isnull=True)
basketitems = BasketItem.get_items_to_be_paid(user).filter(regie=self)
for basketitem in basketitems.filter(extra_fee=False):
basketitem_data = {
'subject': basketitem.subject,
@ -226,6 +223,13 @@ class BasketItem(models.Model):
class Meta:
ordering = ['regie', 'extra_fee', 'subject']
@classmethod
def get_items_to_be_paid(cls, user):
return cls.objects.filter(
user=user,
payment_date__isnull=True,
cancellation_date__isnull=True)
def notify(self, status):
if not self.source_url:
return
@ -396,17 +400,12 @@ class LingoBasketCell(CellBase):
def is_relevant(self, context):
if not (getattr(context['request'], 'user', None) and context['request'].user.is_authenticated()):
return False
items = BasketItem.objects.filter(
user=context['request'].user, payment_date__isnull=True
).exclude(cancellation_date__isnull=False)
return len(items) > 0
return BasketItem.get_items_to_be_paid(context['request'].user).count() > 0
def get_badge(self, context):
if not (getattr(context['request'], 'user', None) and context['request'].user.is_authenticated()):
return
items = BasketItem.objects.filter(
user=context['request'].user, payment_date__isnull=True
).exclude(cancellation_date__isnull=False)
items = BasketItem.get_items_to_be_paid(context['request'].user)
if not items:
return
total = sum([x.amount for x in items])
@ -414,9 +413,7 @@ class LingoBasketCell(CellBase):
def render(self, context):
basket_template = template.loader.get_template('lingo/combo/basket.html')
items = BasketItem.objects.filter(
user=context['request'].user, payment_date__isnull=True
).exclude(cancellation_date__isnull=False)
items = BasketItem.get_items_to_be_paid(context['request'].user)
regies = {}
for item in items:
if not item.regie_id in regies:
@ -473,10 +470,7 @@ class LingoBasketLinkCell(CellBase):
def is_relevant(self, context):
if not (getattr(context['request'], 'user', None) and context['request'].user.is_authenticated()):
return False
items = BasketItem.objects.filter(
user=context['request'].user, payment_date__isnull=True
).exclude(cancellation_date__isnull=False)
return len(items) > 0
return BasketItem.get_items_to_be_paid(context['request'].user).count() > 0
def render(self, context):
if not (getattr(context['request'], 'user', None) and context['request'].user.is_authenticated()):
@ -486,9 +480,7 @@ class LingoBasketLinkCell(CellBase):
except IndexError:
return ''
basket_template = template.loader.get_template('lingo/combo/basket_link.html')
context['items'] = BasketItem.objects.filter(
user=context['request'].user, payment_date__isnull=True
).exclude(cancellation_date__isnull=False)
context['items'] = BasketItem.get_items_to_be_paid(user=context['request'].user)
context['total'] = sum([x.amount for x in context['items']])
return basket_template.render(context)

View File

@ -307,9 +307,7 @@ class PayView(View):
else:
if not regie_id:
# take all items but check they're from the same regie
items = BasketItem.objects.filter(user=self.request.user,
payment_date__isnull=True,
cancellation_date__isnull=True)
items = BasketItem.get_items_to_be_paid(user=self.request.user)
regie_id = items[0].regie_id
for item in items:
if item.regie_id != regie_id:
@ -319,10 +317,7 @@ class PayView(View):
regie = Regie.objects.get(id=regie_id)
regie.compute_extra_fees(user=self.request.user)
items = BasketItem.objects.filter(user=self.request.user,
payment_date__isnull=True,
cancellation_date__isnull=True,
regie=regie)
items = BasketItem.get_items_to_be_paid(user=self.request.user).filter(regie=regie)
transaction = Transaction()
if request.user.is_authenticated():
@ -491,9 +486,8 @@ class ReturnView(View):
# return to basket page if there are still items to pay
if request.user.is_authenticated():
remaining_basket_items = BasketItem.objects.filter(
user=self.request.user, payment_date__isnull=True,
cancellation_date__isnull=False).count()
remaining_basket_items = BasketItem.get_items_to_be_paid(
user=self.request.user).count()
if remaining_basket_items:
return HttpResponseRedirect(get_basket_url())
return HttpResponseRedirect('/')
@ -570,9 +564,7 @@ class CancelItemView(DetailView):
return context
def get_queryset(self):
return BasketItem.objects.filter(user=self.request.user.id,
payment_date__isnull=True,
cancellation_date__isnull=True)
return BasketItem.get_items_to_be_paid(user=self.request.user)
def post(self, request, *args, **kwargs):
if not request.user.is_authenticated():

View File

@ -134,14 +134,14 @@ def test_successfull_items_payment(regie, user):
# make sure return url is the user return URL
assert urlparse.urlparse(qs['return_url'][0]).path.startswith(
reverse('lingo-return', kwargs={'regie_pk': regie.id}))
# simulate successful return URL
resp = client.get(qs['return_url'][0], args)
assert resp.status_code == 302
assert urlparse.urlparse(resp.url).path == '/'
# simulate successful call to callback URL
with mock.patch('combo.utils.RequestsSession.request') as request:
resp = client.get(reverse('lingo-callback', kwargs={'regie_pk': regie.id}), args)
assert resp.status_code == 200
# simulate successful return URL
resp = client.get(qs['return_url'][0], args)
assert resp.status_code == 302
assert urlparse.urlparse(resp.url).path == '/'
def test_add_amount_to_basket(key, regie, user):
other_regie = Regie(label='test2', slug='test2')