lingo: make it possible to mark a regie as default (#12758)

This commit is contained in:
Frédéric Péters 2016-09-27 17:06:17 +02:00
parent 396e6eb29a
commit 699e24f1f4
8 changed files with 110 additions and 4 deletions

View File

@ -31,6 +31,11 @@ class RegieCreateView(CreateView):
fields = '__all__'
success_url = reverse_lazy('lingo-manager-regie-list')
def get_initial(self):
if self.model.objects.all().count() == 0:
return {'is_default': True}
return {}
class RegieUpdateView(UpdateView):
model = Regie

View File

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lingo', '0021_transactionoperation'),
]
operations = [
migrations.AddField(
model_name='regie',
name='is_default',
field=models.BooleanField(default=False, verbose_name='Default Regie'),
),
]

View File

@ -81,6 +81,7 @@ class Regie(models.Model):
max_length=64, choices=SERVICES)
service_options = JSONField(blank=True,
verbose_name=_('Payment Service Options'))
is_default = models.BooleanField(verbose_name=_('Default Regie'), default=False)
webservice_url = models.URLField(_('Webservice URL to retrieve remote items'),
blank=True)
payment_min_amount = models.DecimalField(_('Minimal payment amount'),
@ -95,10 +96,18 @@ class Regie(models.Model):
class Meta:
verbose_name = _('Regie')
ordering = ('label',)
def save(self, *args, **kwargs):
if self.webservice_url and self.webservice_url.endswith('/'):
self.webservice_url = self.webservice_url.strip('/')
if self.is_default:
qs = self.__class__.objects.filter(is_default=True)
if self.pk:
qs = qs.exclude(pk=self.pk)
qs.update(is_default=False)
elif self.__class__.objects.filter(is_default=True).count() == 0:
self.is_default = True
super(Regie, self).save(*args, **kwargs)
def natural_key(self):

View File

@ -17,7 +17,10 @@
<div class="objects-list">
{% for regie in object_list %}
<div>
<a href="{% url 'lingo-manager-regie-edit' pk=regie.id %}">{{ regie.label }} <span>({{regie.service}})</span></a>
<a href="{% url 'lingo-manager-regie-edit' pk=regie.id %}">{{ regie.label }}
<span>({{regie.service}})</span>
{% if regie.is_default %}<span class="extra-info">{% trans "(default regie)" %}</span>{% endif %}
</a>
</div>
{% endfor %}
</div>

View File

@ -129,9 +129,12 @@ class AddBasketItemApiView(View):
if request.GET.get('regie_id'):
item.regie = Regie.objects.get(id=request.GET.get('regie_id'))
else:
# if there's no regie specified, use the first one we get from the
# database...
item.regie = Regie.objects.all()[0]
try:
item.regie = Regie.objects.get(is_default=True)
except Regie.DoesNotExist:
# if there's no default regie, use the first one we get from
# the database...
item.regie = Regie.objects.all()[0]
if request.GET.get('cancellable') == 'no':
item.user_cancellable = False

View File

@ -329,3 +329,8 @@ body.dragging-cell div.empty-cell-list {
border: 1px solid #eee;
box-shadow: rgba(0, 0, 0, 0.04) 0px 1px 1px 0px;
}
span.extra-info {
font-size: 80%;
opacity: 0.5;
}

View File

@ -38,11 +38,13 @@ def test_add_regie(app, admin_user):
resp.forms[0]['slug'] = 'test'
resp.forms[0]['description'] = 'description'
resp.forms[0]['service'] = 'dummy'
assert resp.form['is_default'].checked is True
resp = resp.forms[0].submit()
assert resp.location == 'http://localhost:80/manage/lingo/regies/'
assert Regie.objects.count() == 1
regie = Regie.objects.all()[0]
assert regie.label == 'Test'
assert regie.is_default is True
def test_edit_regie(app, admin_user):
test_add_regie(app, admin_user)
@ -66,3 +68,22 @@ def test_delete_regie(app, admin_user):
resp = resp.forms[0].submit()
assert resp.location == 'http://localhost:80/manage/lingo/regies/'
assert Regie.objects.count() == 0
def test_add_second_regie(app, admin_user):
test_add_regie(app, admin_user)
regie = Regie.objects.all()[0]
app = login(app)
resp = app.get('/manage/lingo/regies/', status=200)
resp = resp.click('New')
resp.forms[0]['label'] = 'Test2'
resp.forms[0]['slug'] = 'test2'
resp.forms[0]['description'] = 'description'
resp.forms[0]['service'] = 'dummy'
assert resp.form['is_default'].checked is False
resp = resp.forms[0].submit()
assert resp.location == 'http://localhost:80/manage/lingo/regies/'
assert Regie.objects.count() == 2
assert Regie.objects.get(id=regie.id).is_default is True
assert Regie.objects.exclude(id=regie.id)[0].is_default is False

View File

@ -52,6 +52,22 @@ def login(username='admin', password='admin'):
resp = client.post('/login/', {'username': username, 'password': password})
assert resp.status_code == 302
def test_default_regie():
Regie.objects.all().delete()
regie1 = Regie(label='foo', slug='foo')
regie1.save()
assert bool(regie1.is_default) is True
regie2 = Regie(label='bar', slug='bar')
regie2.save()
assert bool(regie2.is_default) is False
regie2.is_default = True
regie2.save()
regie2 = Regie.objects.get(id=regie2.id)
assert bool(regie2.is_default) is True
regie1 = Regie.objects.get(id=regie1.id)
assert bool(regie1.is_default) is False
def test_payment_min_amount(regie, user):
items = {'item1': {'amount': '1.5', 'source_url': '/item/1'},
'item2': {'amount': '2.4', 'source_url': '/item/2'}
@ -98,6 +114,9 @@ def test_successfull_items_payment(regie, user):
assert resp.status_code == 200
def test_add_amount_to_basket(regie, user):
other_regie = Regie(label='test2', slug='test2')
other_regie.save()
user_email = 'foo@example.com'
User.objects.get_or_create(email=user_email)
amount = 42
@ -109,6 +128,7 @@ def test_add_amount_to_basket(regie, user):
assert resp.status_code == 200
assert json.loads(resp.content)['result'] == 'success'
assert BasketItem.objects.filter(amount=amount).exists()
assert BasketItem.objects.filter(amount=amount)[0].regie_id == regie.id
data['extra'] = {'amount': '22.22'}
url = sign_url(url, settings.LINGO_API_SIGN_KEY)
@ -125,6 +145,27 @@ def test_add_amount_to_basket(regie, user):
assert json.loads(resp.content)['result'] == 'success'
assert BasketItem.objects.filter(amount=Decimal('81.22')).exists()
other_regie.is_default = True
other_regie.save()
data['amount'] = []
data['extra'] = {'amount': '22.23'}
url = sign_url(url, settings.LINGO_API_SIGN_KEY)
resp = client.post(url, json.dumps(data), content_type='application/json')
assert resp.status_code == 200
assert json.loads(resp.content)['result'] == 'success'
assert BasketItem.objects.filter(amount=Decimal('22.23')).exists()
assert BasketItem.objects.filter(amount=Decimal('22.23'))[0].regie_id == other_regie.id
url = '%s?email=%s&regie_id=%s' % (
reverse('api-add-basket-item'), user_email, regie.id)
data['extra'] = {'amount': '22.24'}
url = sign_url(url, settings.LINGO_API_SIGN_KEY)
resp = client.post(url, json.dumps(data), content_type='application/json')
assert resp.status_code == 200
assert json.loads(resp.content)['result'] == 'success'
assert BasketItem.objects.filter(amount=Decimal('22.24')).exists()
assert BasketItem.objects.filter(amount=Decimal('22.24'))[0].regie_id == regie.id
def test_cancel_basket_item(regie, user):
user_email = 'foo@example.com'
User.objects.get_or_create(email=user_email)