From 67b6316e381a9d2316ee0ec4d7034086c313c4a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Se=CC=81bastiaan=20Versteeg?= Date: Sun, 25 Nov 2018 18:00:12 +0100 Subject: [PATCH 1/9] Add processed and paid by fields to Payments --- website/payments/admin.py | 19 +++++++++----- .../migrations/0002_auto_20181125_0003.py | 25 +++++++++++++++++++ website/payments/models.py | 16 ++++++++++++ website/payments/services.py | 5 +++- website/payments/tests/test_admin.py | 19 +++++++++----- website/payments/tests/test_models.py | 6 +++++ website/registrations/services.py | 1 + 7 files changed, 78 insertions(+), 13 deletions(-) create mode 100644 website/payments/migrations/0002_auto_20181125_0003.py diff --git a/website/payments/admin.py b/website/payments/admin.py index 233dddc7..6f2a5a64 100644 --- a/website/payments/admin.py +++ b/website/payments/admin.py @@ -25,10 +25,11 @@ class PaymentAdmin(admin.ModelAdmin): 'processed', 'processing_date', 'type') list_filter = ('processed', 'amount',) date_hierarchy = 'created_at' - fields = ('created_at', 'amount', - 'type', 'processed', 'processing_date') - readonly_fields = ('created_at', 'amount', 'processed', - 'type', 'processing_date') + fields = ('created_at', 'amount', 'type', 'processed', + 'processing_date', 'paid_by', 'processed_by') + readonly_fields = ('created_at', 'amount', 'processed', 'type', + 'processing_date', 'paid_by', 'processed_by') + autocomplete_fields = ('paid_by', 'processed_by') actions = ['process_cash_selected', 'process_card_selected'] def changeform_view(self, request, object_id=None, form_url='', @@ -46,6 +47,12 @@ class PaymentAdmin(admin.ModelAdmin): return super().changeform_view( request, object_id, form_url, {'payment': obj}) + def get_readonly_fields(self, request, obj=None): + if not obj: + return ('created_at', 'processed', 'type', + 'processing_date', 'processed_by') + return super().get_readonly_fields(request, obj) + def get_actions(self, request): """Get the actions for the payments""" """Hide the processing actions if the right permissions are missing""" @@ -59,7 +66,7 @@ class PaymentAdmin(admin.ModelAdmin): """Process the selected payment as cash""" if request.user.has_perm('payments.process_payments'): updated_payments = services.process_payment( - queryset, Payment.CASH + queryset, request.member, Payment.CASH ) self._process_feedback(request, updated_payments) process_cash_selected.short_description = _( @@ -69,7 +76,7 @@ class PaymentAdmin(admin.ModelAdmin): """Process the selected payment as card""" if request.user.has_perm('payments.process_payments'): updated_payments = services.process_payment( - queryset, Payment.CARD + queryset, request.member, Payment.CARD ) self._process_feedback(request, updated_payments) process_card_selected.short_description = _( diff --git a/website/payments/migrations/0002_auto_20181125_0003.py b/website/payments/migrations/0002_auto_20181125_0003.py new file mode 100644 index 00000000..d7d63b5a --- /dev/null +++ b/website/payments/migrations/0002_auto_20181125_0003.py @@ -0,0 +1,25 @@ +# Generated by Django 2.0.9 on 2018-11-24 23:03 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('members', '0027_auto_20181024_2000'), + ('payments', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='payment', + name='paid_by', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='paid_payment_set', to='members.Member'), + ), + migrations.AddField( + model_name='payment', + name='processed_by', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='processed_payment_set', to='members.Member'), + ), + ] diff --git a/website/payments/models.py b/website/payments/models.py index 6a94c6f1..3e3e8d39 100644 --- a/website/payments/models.py +++ b/website/payments/models.py @@ -51,6 +51,22 @@ class Payment(models.Model): null=True, ) + paid_by = models.ForeignKey( + 'members.Member', + models.CASCADE, + related_name='paid_payment_set', + blank=False, + null=True, + ) + + processed_by = models.ForeignKey( + 'members.Member', + models.CASCADE, + related_name='processed_payment_set', + blank=False, + null=True, + ) + def save(self, force_insert=False, force_update=False, using=None, update_fields=None): if self.processed and not self.processing_date: diff --git a/website/payments/services.py b/website/payments/services.py index 901b82c4..00ea715d 100644 --- a/website/payments/services.py +++ b/website/payments/services.py @@ -2,12 +2,14 @@ from .models import Payment -def process_payment(queryset, pay_type=Payment.CARD): +def process_payment(queryset, processed_by, pay_type=Payment.CARD): """ Process the payment :param queryset: Queryset of payments that should be processed :type queryset: QuerySet[Payment] + :param processed_by: Member that processed this payment + :type processed_by: Member :param pay_type: Type of the payment :type pay_type: String """ @@ -21,6 +23,7 @@ def process_payment(queryset, pay_type=Payment.CARD): for payment in queryset: payment.processed = True payment.type = pay_type + payment.processed_by = processed_by payment.save() data.append(payment) diff --git a/website/payments/tests/test_admin.py b/website/payments/tests/test_admin.py index 5b6a0644..907196a4 100644 --- a/website/payments/tests/test_admin.py +++ b/website/payments/tests/test_admin.py @@ -12,6 +12,7 @@ from django.test import TestCase, SimpleTestCase, Client, RequestFactory from django.urls import reverse from django.utils.translation import ugettext_lazy as _ +from members.models import Member, Profile from payments import admin from payments.models import Payment @@ -36,10 +37,14 @@ class PaymentAdminTest(TestCase): @classmethod def setUpTestData(cls): - cls.user = get_user_model().objects.create_user( - username='username', - is_staff=True, - ) + cls.user = Member.objects.create( + username='test1', + first_name='Test1', + last_name='Example', + email='test1@example.org', + is_staff=True, + ) + Profile.objects.create(user=cls.user) def setUp(self): self.client = Client() @@ -132,7 +137,8 @@ class PaymentAdminTest(TestCase): process_payment.assert_not_called() self.admin.process_cash_selected(request_hasperms, queryset) - process_payment.assert_called_once_with(queryset, Payment.CASH) + process_payment.assert_called_once_with(queryset, + self.user, Payment.CASH) message_user.assert_called_once_with( request_hasperms, _('Successfully processed %(count)d %(items)s.') @@ -172,7 +178,8 @@ class PaymentAdminTest(TestCase): process_payment.assert_not_called() self.admin.process_card_selected(request_hasperms, queryset) - process_payment.assert_called_once_with(queryset, Payment.CARD) + process_payment.assert_called_once_with(queryset, + self.user, Payment.CARD) message_user.assert_called_once_with( request_hasperms, _('Successfully processed %(count)d %(items)s.') diff --git a/website/payments/tests/test_models.py b/website/payments/tests/test_models.py index a594f66d..4412c742 100644 --- a/website/payments/tests/test_models.py +++ b/website/payments/tests/test_models.py @@ -1,15 +1,21 @@ from django.test import TestCase +from members.models import Member from payments.models import Payment class PaymentTest(TestCase): """Tests Payments""" + fixtures = ['members.json'] + @classmethod def setUpTestData(cls): + cls.member = Member.objects.filter(last_name="Wiggers").first() cls.payment = Payment.objects.create( amount=10, + paid_by=cls.member, + processed_by=cls.member, ) def test_full_clean_works(self): diff --git a/website/registrations/services.py b/website/registrations/services.py index 6d65fee1..03b7928c 100644 --- a/website/registrations/services.py +++ b/website/registrations/services.py @@ -352,6 +352,7 @@ def process_payment(payment): # If member was retrieved, then create a new membership if member is not None: + Payment.objects.filter(pk=payment.pk).update(paid_by=member) membership = _create_membership_from_entry(entry, member) entry.membership = membership entry.status = Entry.STATUS_COMPLETED -- GitLab From 5cc081dd814be008149f1599757f9bac94f9dabe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Se=CC=81bastiaan=20Versteeg?= Date: Sun, 25 Nov 2018 18:03:24 +0100 Subject: [PATCH 2/9] Move payment process urls to admin --- website/payments/admin.py | 14 ++++- website/payments/{views.py => admin_views.py} | 7 ++- .../templates/admin/payments/change_form.html | 4 +- website/payments/tests/test_admin.py | 4 ++ .../{test_views.py => test_admin_views.py} | 63 ++++++++++++++----- website/payments/urls.py | 11 ---- website/thaliawebsite/urls.py | 1 - 7 files changed, 73 insertions(+), 31 deletions(-) rename website/payments/{views.py => admin_views.py} (87%) rename website/payments/tests/{test_views.py => test_admin_views.py} (65%) delete mode 100644 website/payments/urls.py diff --git a/website/payments/admin.py b/website/payments/admin.py index 6f2a5a64..22b26236 100644 --- a/website/payments/admin.py +++ b/website/payments/admin.py @@ -1,9 +1,10 @@ """Registers admin interfaces for the payments module""" from django.contrib import admin, messages from django.contrib.admin.utils import model_ngettext +from django.urls import path from django.utils.translation import ugettext_lazy as _ -from payments import services +from payments import services, admin_views from .models import Payment @@ -90,3 +91,14 @@ class PaymentAdmin(admin.ModelAdmin): message=_("Successfully processed %(count)d %(items)s."), error=_('The selected payment(s) could not be processed.') ) + + def get_urls(self): + urls = super().get_urls() + custom_urls = [ + path('/process/', + self.admin_site.admin_view( + admin_views.PaymentAdminView.as_view()), + name='payments_payment_process'), + ] + return custom_urls + urls + diff --git a/website/payments/views.py b/website/payments/admin_views.py similarity index 87% rename from website/payments/views.py rename to website/payments/admin_views.py index 3c71b751..a2461104 100644 --- a/website/payments/views.py +++ b/website/payments/admin_views.py @@ -1,4 +1,4 @@ -"""Views provided by the payments package""" +"""Admin views provided by the payments package""" from django.contrib import messages from django.contrib.admin.utils import model_ngettext from django.contrib.admin.views.decorators import staff_member_required @@ -26,7 +26,7 @@ class PaymentAdminView(View): return redirect('admin:payments_payment_change', kwargs['pk']) result = services.process_payment( - payment, request.POST['type'] + payment, request.member, request.POST['type'] ) if len(result) > 0: @@ -36,4 +36,7 @@ class PaymentAdminView(View): messages.error(request, _('Could not process %s.') % model_ngettext(payment, 1)) + if 'next' in request.POST: + return redirect(request.POST['next']) + return redirect('admin:payments_payment_change', kwargs['pk']) diff --git a/website/payments/templates/admin/payments/change_form.html b/website/payments/templates/admin/payments/change_form.html index b5b91afe..c24599ce 100644 --- a/website/payments/templates/admin/payments/change_form.html +++ b/website/payments/templates/admin/payments/change_form.html @@ -14,8 +14,8 @@ {% block submit_buttons_bottom %} {% if payment %} {% endif %} diff --git a/website/payments/tests/test_admin.py b/website/payments/tests/test_admin.py index 907196a4..11535328 100644 --- a/website/payments/tests/test_admin.py +++ b/website/payments/tests/test_admin.py @@ -204,3 +204,7 @@ class PaymentAdminTest(TestCase): self.assertCountEqual(actions, ['delete_selected', 'process_cash_selected', 'process_card_selected']) + + def test_get_urls(self): + urls = self.admin.get_urls() + self.assertEqual(urls[0].name, 'payments_payment_process') diff --git a/website/payments/tests/test_views.py b/website/payments/tests/test_admin_views.py similarity index 65% rename from website/payments/tests/test_views.py rename to website/payments/tests/test_admin_views.py index 3af210d6..c9b0a31f 100644 --- a/website/payments/tests/test_views.py +++ b/website/payments/tests/test_admin_views.py @@ -5,10 +5,11 @@ from django.contrib.admin.utils import model_ngettext from django.contrib.auth import get_user_model from django.contrib.auth.models import Permission from django.contrib.contenttypes.models import ContentType -from django.test import Client, TestCase +from django.test import Client, TestCase, override_settings from django.utils.translation import ugettext_lazy as _ -from payments import views +from members.models import Member, Profile +from payments import admin_views from payments.models import Payment @@ -20,12 +21,21 @@ class PaymentAdminViewTest(TestCase): processed=False, amount=7.5 ) - cls.user = get_user_model().objects.create_user(username='username') + cls.user = Member.objects.create( + username='test1', + first_name='Test1', + last_name='Example', + email='test1@example.org' + ) + Profile.objects.create( + user=cls.user, + language='nl', + ) def setUp(self): self.client = Client() self.client.force_login(self.user) - self.view = views.PaymentAdminView() + self.view = admin_views.PaymentAdminView() def _give_user_permissions(self): content_type = ContentType.objects.get_for_model(Payment) @@ -41,7 +51,7 @@ class PaymentAdminViewTest(TestCase): self.client.force_login(self.user) def test_permissions(self): - url = '/payment/admin/process/{}/'.format( + url = '/admin/payments/payment/{}/process/'.format( self.payment.pk) response = self.client.post(url, { 'type': 'cash_payment', @@ -50,7 +60,7 @@ class PaymentAdminViewTest(TestCase): self._give_user_permissions() - url = '/payment/admin/process/{}/'.format( + url = '/admin/payments/payment/{}/process/'.format( self.payment.pk) response = self.client.post(url, { 'type': 'cash_payment', @@ -74,7 +84,7 @@ class PaymentAdminViewTest(TestCase): self._give_user_permissions() with self.subTest('Send post without payload'): - response = self.client.post('/payment/admin/process/{}/' + response = self.client.post('/admin/payments/payment/{}/process/' .format(self.payment.pk)) self.assertEqual(response.status_code, 302) @@ -87,9 +97,9 @@ class PaymentAdminViewTest(TestCase): messages_error.assert_not_called() messages_success.assert_not_called() - with self.subTest('Send post with successful processing'): + with self.subTest('Send post with successful processing, no next'): payment_type = 'cash_payment' - response = self.client.post('/payment/admin/process/{}/' + response = self.client.post('/admin/payments/payment/{}/process/' .format(self.payment.pk), { 'type': payment_type, }) @@ -101,7 +111,31 @@ class PaymentAdminViewTest(TestCase): ) process_payment.assert_called_once_with( - payment_qs, payment_type) + payment_qs, self.user, payment_type) + + messages_success.assert_called_once_with( + response.wsgi_request, + _('Successfully processed %s.') % + model_ngettext(self.payment, 1) + ) + + process_payment.reset_mock() + messages_success.reset_mock() + + with self.subTest('Send post with successful processing and next'): + payment_type = 'cash_payment' + response = self.client.post( + '/admin/payments/payment/{}/process/' + .format(self.payment.pk), { + 'type': payment_type, + 'next': '/admin/events/' + }) + + self.assertEqual(response.status_code, 302) + self.assertEqual(response.url, '/admin/events/') + + process_payment.assert_called_once_with( + payment_qs, self.user, payment_type) messages_success.assert_called_once_with( response.wsgi_request, @@ -111,10 +145,11 @@ class PaymentAdminViewTest(TestCase): with self.subTest('Send post with failed processing'): process_payment.return_value = [] - response = self.client.post('/payment/admin/process/{}/' - .format(self.payment.pk), { - 'type': payment_type, - }) + response = self.client.post( + '/admin/payments/payment/{}/process/' + .format(self.payment.pk), { + 'type': payment_type, + }) messages_error.assert_called_once_with( response.wsgi_request, diff --git a/website/payments/urls.py b/website/payments/urls.py deleted file mode 100644 index 7040c7b3..00000000 --- a/website/payments/urls.py +++ /dev/null @@ -1,11 +0,0 @@ -"""The routes defined by the payments package""" -from django.urls import path - -from .views import PaymentAdminView - -app_name = 'payments' - -urlpatterns = [ - path('admin/process//', - PaymentAdminView.as_view(), name='admin-process'), -] diff --git a/website/thaliawebsite/urls.py b/website/thaliawebsite/urls.py index 4ecb3015..90bbc1e1 100644 --- a/website/thaliawebsite/urls.py +++ b/website/thaliawebsite/urls.py @@ -77,7 +77,6 @@ urlpatterns = [ # pylint: disable=invalid-name url(r'^alumni/$', AlumniEventsView.as_view(), name='alumni'), url(r'^members/', include('members.urls')), url(r'^registration/', include('registrations.urls')), - url(r'^payment/', include('payments.urls')), url(r'^account/$', members.views.account, name='account'), url(r'^events/', include('events.urls')), url(r'^pizzas/', include('pizzas.urls')), -- GitLab From 942016c8fbef80bbd6dca4e3184e7e65032b0fac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Se=CC=81bastiaan=20Versteeg?= Date: Sun, 25 Nov 2018 18:03:46 +0100 Subject: [PATCH 3/9] Add process buttons to payment widget --- .../static/admin/payments/js/payments.js | 11 +++++- .../payments/templates/payments/widget.html | 37 +++++++++++++------ website/payments/tests/test_widgets.py | 35 ++++++++++++++++++ website/payments/widgets.py | 5 ++- 4 files changed, 74 insertions(+), 14 deletions(-) create mode 100644 website/payments/tests/test_widgets.py diff --git a/website/payments/static/admin/payments/js/payments.js b/website/payments/static/admin/payments/js/payments.js index d5f1770a..d0bc80f2 100644 --- a/website/payments/static/admin/payments/js/payments.js +++ b/website/payments/static/admin/payments/js/payments.js @@ -1,8 +1,9 @@ django.jQuery(function () { var $ = django.jQuery; - $(".payments-row a").click(function(e) { + $(".payments-row a.process").click(function(e) { e.preventDefault(); var type = $(e.target).data('type'); + var next = $(e.target).data('next'); var href = $(e.target).data('href'); var form = $('
'); form.attr("method", "post"); @@ -14,6 +15,14 @@ django.jQuery(function () { field.attr("value", type); form.append(field); + if (next) { + var redirect = $(''); + redirect.attr("type", "hidden"); + redirect.attr("name", 'next'); + redirect.attr("value", window.location); + form.append(redirect); + } + var csrf = $(''); csrf.attr("type", "hidden"); csrf.attr("name", 'csrfmiddlewaretoken'); diff --git a/website/payments/templates/payments/widget.html b/website/payments/templates/payments/widget.html index a922eba9..d07fb82a 100644 --- a/website/payments/templates/payments/widget.html +++ b/website/payments/templates/payments/widget.html @@ -1,14 +1,27 @@ {% load i18n %} -
- {% if widget.value %} - - {% if processed %} - {% trans "Processed" %} - {% else %} - {% trans "Unprocessed" %} - {% endif %} - - {% else %} - - - {% endif %} +
+ {% if widget.value %} + {% if not payment.processed %} + + {% trans "Unprocessed" %} + + - + € {{ payment.amount }} + - + {% trans "Process (cash payment)" %} + {% trans "Process (card payment)" %} + {% else %} + + {% trans "Processed" %} + + - + {{ payment.processing_date }} - {{ payment.get_type_display }} + {% endif %} + {% else %} + - + {% endif %}
diff --git a/website/payments/tests/test_widgets.py b/website/payments/tests/test_widgets.py new file mode 100644 index 00000000..82472166 --- /dev/null +++ b/website/payments/tests/test_widgets.py @@ -0,0 +1,35 @@ +from django.test import TestCase + +from members.models import Member +from payments.models import Payment +from payments.widgets import PaymentWidget + + +class PaymentWidgetTest(TestCase): + """Tests widgets""" + + fixtures = ['members.json'] + + @classmethod + def setUpTestData(cls): + cls.member = Member.objects.filter(last_name="Wiggers").first() + cls.payment = Payment.objects.create( + amount=10, + paid_by=cls.member, + processed_by=cls.member, + ) + + def test_get_context(self): + widget = PaymentWidget() + + with self.subTest('With payment primary key'): + context = widget.get_context('payment', self.payment.pk, {}) + self.assertEqual(context['url'], + '/admin/payments/payment/{}/change/'.format( + self.payment.pk)) + self.assertEqual(context['payment'], self.payment) + + with self.subTest('Empty value'): + context = widget.get_context('payment', None, {}) + self.assertNotIn('url', context) + self.assertNotIn('payment', context) diff --git a/website/payments/widgets.py b/website/payments/widgets.py index df4e26bc..a2e28af2 100644 --- a/website/payments/widgets.py +++ b/website/payments/widgets.py @@ -18,5 +18,8 @@ class PaymentWidget(Widget): if value: payment = Payment.objects.get(pk=value) context['url'] = payment.get_admin_url() - context['processed'] = payment.processed + context['payment'] = payment return context + + class Media: + js = ('admin/payments/js/payments.js',) -- GitLab From 6fcbef5f7a40fd364ed6fdb23d2bfd4cf6b11591 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Se=CC=81bastiaan=20Versteeg?= Date: Sun, 25 Nov 2018 18:37:29 +0100 Subject: [PATCH 4/9] Add notes field to payments --- website/payments/admin.py | 6 ++++-- ...02_auto_20181125_0003.py => 0002_auto_20181125_1823.py} | 7 ++++++- website/payments/models.py | 2 ++ website/registrations/services.py | 3 +++ 4 files changed, 15 insertions(+), 3 deletions(-) rename website/payments/migrations/{0002_auto_20181125_0003.py => 0002_auto_20181125_1823.py} (78%) diff --git a/website/payments/admin.py b/website/payments/admin.py index 22b26236..910f7b84 100644 --- a/website/payments/admin.py +++ b/website/payments/admin.py @@ -27,9 +27,11 @@ class PaymentAdmin(admin.ModelAdmin): list_filter = ('processed', 'amount',) date_hierarchy = 'created_at' fields = ('created_at', 'amount', 'type', 'processed', - 'processing_date', 'paid_by', 'processed_by') + 'processing_date', 'paid_by', 'processed_by', + 'notes') readonly_fields = ('created_at', 'amount', 'processed', 'type', - 'processing_date', 'paid_by', 'processed_by') + 'processing_date', 'paid_by', 'processed_by', + 'notes') autocomplete_fields = ('paid_by', 'processed_by') actions = ['process_cash_selected', 'process_card_selected'] diff --git a/website/payments/migrations/0002_auto_20181125_0003.py b/website/payments/migrations/0002_auto_20181125_1823.py similarity index 78% rename from website/payments/migrations/0002_auto_20181125_0003.py rename to website/payments/migrations/0002_auto_20181125_1823.py index d7d63b5a..a5e32a9b 100644 --- a/website/payments/migrations/0002_auto_20181125_0003.py +++ b/website/payments/migrations/0002_auto_20181125_1823.py @@ -1,4 +1,4 @@ -# Generated by Django 2.0.9 on 2018-11-24 23:03 +# Generated by Django 2.1.3 on 2018-11-25 17:23 from django.db import migrations, models import django.db.models.deletion @@ -12,6 +12,11 @@ class Migration(migrations.Migration): ] operations = [ + migrations.AddField( + model_name='payment', + name='notes', + field=models.TextField(blank=True, null=True), + ), migrations.AddField( model_name='payment', name='paid_by', diff --git a/website/payments/models.py b/website/payments/models.py index 3e3e8d39..a33a593f 100644 --- a/website/payments/models.py +++ b/website/payments/models.py @@ -67,6 +67,8 @@ class Payment(models.Model): null=True, ) + notes = models.TextField(blank=True, null=True) + def save(self, force_insert=False, force_update=False, using=None, update_fields=None): if self.processed and not self.processing_date: diff --git a/website/registrations/services.py b/website/registrations/services.py index 03b7928c..0a0105e6 100644 --- a/website/registrations/services.py +++ b/website/registrations/services.py @@ -170,10 +170,12 @@ def _create_payment_for_entry(entry): :rtype: Payment """ amount = settings.MEMBERSHIP_PRICES[entry.length] + notes = 'Membership registration' try: renewal = entry.renewal membership = renewal.member.latest_membership + notes = 'Membership renewal' # Having a latest membership which has an until date implies that this # membership lasts/lasted till the end of the lecture year # This means it's possible to renew the 'year' membership @@ -195,6 +197,7 @@ def _create_payment_for_entry(entry): return Payment.objects.create( amount=amount, + notes=notes ) -- GitLab From 2f318de38cf6d25699b64c0f34be890be73a5f75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Se=CC=81bastiaan=20Versteeg?= Date: Sun, 25 Nov 2018 18:44:41 +0100 Subject: [PATCH 5/9] Add information to existing payments from registrations in migrations --- docs/payments.rst | 24 +++++-------- website/payments/admin.py | 1 - website/payments/tests/test_admin.py | 1 - website/payments/tests/test_admin_views.py | 19 ++++++----- .../0014_fill_new_payments_fields.py | 34 +++++++++++++++++++ 5 files changed, 53 insertions(+), 26 deletions(-) create mode 100644 website/registrations/migrations/0014_fill_new_payments_fields.py diff --git a/docs/payments.rst b/docs/payments.rst index e6e0d32e..c0b42779 100644 --- a/docs/payments.rst +++ b/docs/payments.rst @@ -17,6 +17,14 @@ payments.admin module :undoc-members: :show-inheritance: +payments.admin\_views module +---------------------------- + +.. automodule:: payments.admin_views + :members: + :undoc-members: + :show-inheritance: + payments.apps module -------------------- @@ -41,22 +49,6 @@ payments.services module :undoc-members: :show-inheritance: -payments.urls module --------------------- - -.. automodule:: payments.urls - :members: - :undoc-members: - :show-inheritance: - -payments.views module ---------------------- - -.. automodule:: payments.views - :members: - :undoc-members: - :show-inheritance: - payments.widgets module ----------------------- diff --git a/website/payments/admin.py b/website/payments/admin.py index 910f7b84..aa9ecc7d 100644 --- a/website/payments/admin.py +++ b/website/payments/admin.py @@ -103,4 +103,3 @@ class PaymentAdmin(admin.ModelAdmin): name='payments_payment_process'), ] return custom_urls + urls - diff --git a/website/payments/tests/test_admin.py b/website/payments/tests/test_admin.py index 11535328..52e2f64b 100644 --- a/website/payments/tests/test_admin.py +++ b/website/payments/tests/test_admin.py @@ -4,7 +4,6 @@ from unittest.mock import Mock from django.contrib import messages from django.contrib.admin import AdminSite from django.contrib.admin.utils import model_ngettext -from django.contrib.auth import get_user_model from django.contrib.auth.models import Permission from django.contrib.contenttypes.models import ContentType from django.http import HttpRequest diff --git a/website/payments/tests/test_admin_views.py b/website/payments/tests/test_admin_views.py index c9b0a31f..b3e28605 100644 --- a/website/payments/tests/test_admin_views.py +++ b/website/payments/tests/test_admin_views.py @@ -2,10 +2,9 @@ from unittest import mock from unittest.mock import Mock from django.contrib.admin.utils import model_ngettext -from django.contrib.auth import get_user_model from django.contrib.auth.models import Permission from django.contrib.contenttypes.models import ContentType -from django.test import Client, TestCase, override_settings +from django.test import Client, TestCase from django.utils.translation import ugettext_lazy as _ from members.models import Member, Profile @@ -84,8 +83,10 @@ class PaymentAdminViewTest(TestCase): self._give_user_permissions() with self.subTest('Send post without payload'): - response = self.client.post('/admin/payments/payment/{}/process/' - .format(self.payment.pk)) + response = self.client.post( + '/admin/payments/payment/{}/process/' + .format(self.payment.pk) + ) self.assertEqual(response.status_code, 302) self.assertEqual( @@ -99,10 +100,12 @@ class PaymentAdminViewTest(TestCase): with self.subTest('Send post with successful processing, no next'): payment_type = 'cash_payment' - response = self.client.post('/admin/payments/payment/{}/process/' - .format(self.payment.pk), { - 'type': payment_type, - }) + response = self.client.post( + '/admin/payments/payment/{}/process/' + .format(self.payment.pk), { + 'type': payment_type, + } + ) self.assertEqual(response.status_code, 302) self.assertEqual( diff --git a/website/registrations/migrations/0014_fill_new_payments_fields.py b/website/registrations/migrations/0014_fill_new_payments_fields.py new file mode 100644 index 00000000..67a478c0 --- /dev/null +++ b/website/registrations/migrations/0014_fill_new_payments_fields.py @@ -0,0 +1,34 @@ +from django.db import migrations + + +def forwards_func(apps, schema_editor): + Entry = apps.get_model('registrations', 'entry') + Renewal = apps.get_model('registrations', 'renewal') + db_alias = schema_editor.connection.alias + for entry in Entry.objects.using(db_alias).all(): + if entry.payment and entry.membership: + payment = entry.payment + membership = entry.membership + payment.paid_by = membership.user + payment.notes = 'Membership registration' + try: + renewal = entry.renewal + payment.notes = 'Membership renewal' + except Renewal.DoesNotExist: + pass + payment.save() + + +def reverse_func(apps, schema_editor): + pass + + +class Migration(migrations.Migration): + dependencies = [ + ('registrations', '0013_auto_20181114_2104'), + ('payments', '0002_auto_20181125_1823') + ] + + operations = [ + migrations.RunPython(forwards_func, reverse_func), + ] -- GitLab From 6efc31dcb7c265f0bd5f6615bcfde10dfaf6c585 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Se=CC=81bastiaan=20Versteeg?= Date: Mon, 26 Nov 2018 20:22:43 +0100 Subject: [PATCH 6/9] Change payment field of registration entry to PROTECT --- .../migrations/0015_auto_20181126_2021.py | 19 +++++++++++++++++++ website/registrations/models.py | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 website/registrations/migrations/0015_auto_20181126_2021.py diff --git a/website/registrations/migrations/0015_auto_20181126_2021.py b/website/registrations/migrations/0015_auto_20181126_2021.py new file mode 100644 index 00000000..1c402505 --- /dev/null +++ b/website/registrations/migrations/0015_auto_20181126_2021.py @@ -0,0 +1,19 @@ +# Generated by Django 2.1.3 on 2018-11-26 19:21 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('registrations', '0014_fill_new_payments_fields'), + ] + + operations = [ + migrations.AlterField( + model_name='entry', + name='payment', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='registrations_entry', to='payments.Payment'), + ), + ] diff --git a/website/registrations/models.py b/website/registrations/models.py index 901fdf7f..80f39c2e 100644 --- a/website/registrations/models.py +++ b/website/registrations/models.py @@ -77,7 +77,7 @@ class Entry(models.Model): payment = models.OneToOneField( 'payments.Payment', related_name='registrations_entry', - on_delete=models.SET_NULL, + on_delete=models.PROTECT, blank=True, null=True, ) -- GitLab From 09d94a5ecb899db3ffe2610e8727c4c1f1d3a688 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Se=CC=81bastiaan=20Versteeg?= Date: Tue, 27 Nov 2018 18:22:39 +0100 Subject: [PATCH 7/9] Make processed a property using payment type --- website/payments/admin.py | 16 +++++++--------- ...1125_1823.py => 0002_auto_20181127_1819.py} | 11 ++++++++++- website/payments/models.py | 18 ++++++++++-------- website/payments/services.py | 3 +-- website/payments/tests/test_admin.py | 2 +- website/payments/tests/test_models.py | 2 +- website/registrations/admin.py | 4 ++-- .../0014_fill_new_payments_fields.py | 2 +- website/registrations/tests/test_admin.py | 2 +- website/registrations/tests/test_services.py | 8 ++++---- website/registrations/tests/test_signals.py | 2 +- 11 files changed, 39 insertions(+), 31 deletions(-) rename website/payments/migrations/{0002_auto_20181125_1823.py => 0002_auto_20181127_1819.py} (66%) diff --git a/website/payments/admin.py b/website/payments/admin.py index aa9ecc7d..752f90b7 100644 --- a/website/payments/admin.py +++ b/website/payments/admin.py @@ -22,16 +22,15 @@ def _show_message(admin, request, n, message, error): class PaymentAdmin(admin.ModelAdmin): """Manage the payments""" - list_display = ('created_at', 'amount', - 'processed', 'processing_date', 'type') - list_filter = ('processed', 'amount',) + list_display = ('created_at', 'amount', 'processing_date', 'type') + list_filter = ('type', 'amount',) date_hierarchy = 'created_at' - fields = ('created_at', 'amount', 'type', 'processed', - 'processing_date', 'paid_by', 'processed_by', - 'notes') - readonly_fields = ('created_at', 'amount', 'processed', 'type', + fields = ('created_at', 'amount', 'type', 'processing_date', + 'paid_by', 'processed_by', 'notes') + readonly_fields = ('created_at', 'amount', 'type', 'processing_date', 'paid_by', 'processed_by', 'notes') + ordering = ('-created_at', 'processing_date') autocomplete_fields = ('paid_by', 'processed_by') actions = ['process_cash_selected', 'process_card_selected'] @@ -52,8 +51,7 @@ class PaymentAdmin(admin.ModelAdmin): def get_readonly_fields(self, request, obj=None): if not obj: - return ('created_at', 'processed', 'type', - 'processing_date', 'processed_by') + return ('created_at', 'type', 'processing_date', 'processed_by') return super().get_readonly_fields(request, obj) def get_actions(self, request): diff --git a/website/payments/migrations/0002_auto_20181125_1823.py b/website/payments/migrations/0002_auto_20181127_1819.py similarity index 66% rename from website/payments/migrations/0002_auto_20181125_1823.py rename to website/payments/migrations/0002_auto_20181127_1819.py index a5e32a9b..f05aabb9 100644 --- a/website/payments/migrations/0002_auto_20181125_1823.py +++ b/website/payments/migrations/0002_auto_20181127_1819.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.3 on 2018-11-25 17:23 +# Generated by Django 2.1.3 on 2018-11-27 17:19 from django.db import migrations, models import django.db.models.deletion @@ -12,6 +12,10 @@ class Migration(migrations.Migration): ] operations = [ + migrations.RemoveField( + model_name='payment', + name='processed', + ), migrations.AddField( model_name='payment', name='notes', @@ -27,4 +31,9 @@ class Migration(migrations.Migration): name='processed_by', field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='processed_payment_set', to='members.Member'), ), + migrations.AlterField( + model_name='payment', + name='type', + field=models.CharField(choices=[('no_payment', 'No payment'), ('cash_payment', 'Cash payment'), ('card_payment', 'Card payment')], default='no_payment', max_length=20, verbose_name='type'), + ), ] diff --git a/website/payments/models.py b/website/payments/models.py index a33a593f..047c8d13 100644 --- a/website/payments/models.py +++ b/website/payments/models.py @@ -17,10 +17,12 @@ class Payment(models.Model): created_at = models.DateTimeField(_('created at'), default=timezone.now) + NONE = 'no_payment' CASH = 'cash_payment' CARD = 'card_payment' PAYMENT_TYPE = ( + (NONE, _('No payment')), (CASH, _('Cash payment')), (CARD, _('Card payment')), ) @@ -29,8 +31,7 @@ class Payment(models.Model): choices=PAYMENT_TYPE, verbose_name=_('type'), max_length=20, - blank=True, - null=True, + default=NONE ) amount = models.DecimalField( @@ -40,11 +41,6 @@ class Payment(models.Model): decimal_places=2 ) - processed = models.BooleanField( - _('processed'), - default=False, - ) - processing_date = models.DateTimeField( _('processing date'), blank=True, @@ -69,10 +65,16 @@ class Payment(models.Model): notes = models.TextField(blank=True, null=True) + @property + def processed(self): + return self.type != self.NONE + def save(self, force_insert=False, force_update=False, using=None, update_fields=None): - if self.processed and not self.processing_date: + if self.type != self.NONE and not self.processing_date: self.processing_date = timezone.now() + elif self.type == self.NONE: + self.processing_date = None super().save(force_insert, force_update, using, update_fields) def get_admin_url(self): diff --git a/website/payments/services.py b/website/payments/services.py index 00ea715d..a93c92df 100644 --- a/website/payments/services.py +++ b/website/payments/services.py @@ -14,14 +14,13 @@ def process_payment(queryset, processed_by, pay_type=Payment.CARD): :type pay_type: String """ - queryset = queryset.filter(processed=False) + queryset = queryset.filter(type=Payment.NONE) data = [] # This should trigger post_save signals, thus a queryset update # is not appropriate, moreover save() automatically sets # the processing date for payment in queryset: - payment.processed = True payment.type = pay_type payment.processed_by = processed_by payment.save() diff --git a/website/payments/tests/test_admin.py b/website/payments/tests/test_admin.py index 52e2f64b..2163da62 100644 --- a/website/payments/tests/test_admin.py +++ b/website/payments/tests/test_admin.py @@ -98,7 +98,7 @@ class PaymentAdminTest(TestCase): self.assertEqual(response.status_code, 200) self.assertEqual(response.context['payment'], payment) - payment.processed = True + payment.type = Payment.CARD response = self.client.get('/admin/payments/payment/{}/change/' .format(object_id)) diff --git a/website/payments/tests/test_models.py b/website/payments/tests/test_models.py index 4412c742..0ac5b30e 100644 --- a/website/payments/tests/test_models.py +++ b/website/payments/tests/test_models.py @@ -27,7 +27,7 @@ class PaymentTest(TestCase): def test_change_processed_sets_processing_date(self): self.assertFalse(self.payment.processed) self.assertIsNone(self.payment.processing_date) - self.payment.processed = True + self.payment.type = Payment.CARD self.payment.save() self.assertTrue(self.payment.processed) self.assertIsNotNone(self.payment.processing_date) diff --git a/website/registrations/admin.py b/website/registrations/admin.py index 0ae00ac0..1ba8a92f 100644 --- a/website/registrations/admin.py +++ b/website/registrations/admin.py @@ -27,7 +27,7 @@ class RegistrationAdmin(admin.ModelAdmin): list_display = ('name', 'email', 'status', 'created_at', 'payment_status') - list_filter = ('status', 'programme', 'payment__processed', + list_filter = ('status', 'programme', 'payment__type', 'payment__amount') search_fields = ('first_name', 'last_name', 'email', 'phone_number', 'student_number',) @@ -161,7 +161,7 @@ class RenewalAdmin(RegistrationAdmin): list_display = ('name', 'email', 'status', 'created_at', 'payment_status',) - list_filter = ('status', 'payment__processed', 'payment__amount') + list_filter = ('status', 'payment__type', 'payment__amount') search_fields = ('member__first_name', 'member__last_name', 'member__email', 'member__profile__phone_number', 'member__profile__student_number',) diff --git a/website/registrations/migrations/0014_fill_new_payments_fields.py b/website/registrations/migrations/0014_fill_new_payments_fields.py index 67a478c0..2a67b72b 100644 --- a/website/registrations/migrations/0014_fill_new_payments_fields.py +++ b/website/registrations/migrations/0014_fill_new_payments_fields.py @@ -26,7 +26,7 @@ def reverse_func(apps, schema_editor): class Migration(migrations.Migration): dependencies = [ ('registrations', '0013_auto_20181114_2104'), - ('payments', '0002_auto_20181125_1823') + ('payments', '0002_auto_20181127_1819') ] operations = [ diff --git a/website/registrations/tests/test_admin.py b/website/registrations/tests/test_admin.py index e15bc89d..e2257103 100644 --- a/website/registrations/tests/test_admin.py +++ b/website/registrations/tests/test_admin.py @@ -290,7 +290,7 @@ class RegistrationAdminTest(TestCase): '/admin/payments/payment/123/change/', _('Unprocessed'))) - reg.payment.processed = True + reg.payment.type = Payment.CARD self.assertEqual( self.admin.payment_status(reg), diff --git a/website/registrations/tests/test_services.py b/website/registrations/tests/test_services.py index 47a85093..81fff665 100644 --- a/website/registrations/tests/test_services.py +++ b/website/registrations/tests/test_services.py @@ -486,7 +486,7 @@ class ServicesTest(TestCase): # Check that the DoesNotExist is caught p = Payment( amount=10, - processed=True, + type=Payment.CARD ) services.process_payment(p) @@ -508,7 +508,7 @@ class ServicesTest(TestCase): ).update(status=Entry.STATUS_ACCEPTED) payments = Payment.objects.filter(pk__in=[p0.pk, p2.pk, p3.pk]) - payments.update(processed=True) + payments.update(type=Payment.CARD) for payment in Payment.objects.filter(pk__in=[p0.pk, p1.pk, p2.pk]): services.process_payment(payment) @@ -521,7 +521,7 @@ class ServicesTest(TestCase): self.assertEqual(self.e1.status, Entry.STATUS_ACCEPTED) self.assertEqual(self.e2.status, Entry.STATUS_COMPLETED) - p0.processed = True + p0.type = Payment.CARD p0.save() self.e0.status = Entry.STATUS_ACCEPTED self.e0.save() @@ -545,7 +545,7 @@ class ServicesTest(TestCase): ).update(status=Entry.STATUS_ACCEPTED) payments = Payment.objects.filter(pk__in=[p1.pk, p2.pk]) - payments.update(processed=True) + payments.update(type=Payment.CARD) with mock.patch('registrations.services.' '_create_member_from_registration') as create_member: diff --git a/website/registrations/tests/test_signals.py b/website/registrations/tests/test_signals.py index 060a4ab0..fe2c9552 100644 --- a/website/registrations/tests/test_signals.py +++ b/website/registrations/tests/test_signals.py @@ -16,7 +16,7 @@ class ServicesTest(TestCase): @mock.patch('registrations.services.process_payment') def test_post_payment_save(self, process_payment): - self.payment.processed = True + self.payment.type = Payment.CARD self.payment.save() process_payment.assert_called_with(self.payment) -- GitLab From 41d282a4747ce6b3c52a27adf94e860060cd571c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Se=CC=81bastiaan=20Versteeg?= Date: Tue, 27 Nov 2018 18:26:22 +0100 Subject: [PATCH 8/9] Update translations --- .../payments/locale/nl/LC_MESSAGES/django.mo | Bin 1570 -> 1648 bytes .../payments/locale/nl/LC_MESSAGES/django.po | 68 ++++++++++-------- 2 files changed, 38 insertions(+), 30 deletions(-) diff --git a/website/payments/locale/nl/LC_MESSAGES/django.mo b/website/payments/locale/nl/LC_MESSAGES/django.mo index 5d0c6d65c0a334778bae6ac9b11ba63a04426b66..7dfc95bc29f7e0dbf15e3d9e37e4ff50e6e2f6d9 100644 GIT binary patch delta 638 zcmY+=yD!606u|M@7uD9IUV{)F(1eJzo)NKOQz1kwlwKm`r)huQl1?U*+!(AP29v~W z^9PtL9^oJGS_~H7)0S|O^ZWeH&CR{%+>^jtAp2P9K2k&tSx;V*4djZ05AlQnd@lHc zviA#p7<4M-#d@s8=7IxQK|O&XOcdP566!N-Q!1-2_^D&z9y{<8{TO!TFX+T#>Oqu? zhOr!D=*C%0(o6!S(Hjx)?%Kjo9BwVXYfMBH9qRrYpDt8X_kQ@Q{E delta 577 zcmY+=&r1S96bJC(%c*BSZizf^~-##aee^Lp(qo zK03Bx5P1gh$RnK5j9ilcxA^Q3kJP@w?!8N!6uEBx+DX_{XCwN*6-;Z(Z{5SIC zqy3w~#uIZ>JTX72$ro2zMwDZDqcmkoomQ-(+)(o=ku=O?%uMG*CLv5Ayjz>bw$&)t z%ez%$tzcWZSW=i-dqsw|Q+cZ$%B*KDWK+YcHLcoCxmv0h3-*46 J?1MdvegU-_L^J>Z diff --git a/website/payments/locale/nl/LC_MESSAGES/django.po b/website/payments/locale/nl/LC_MESSAGES/django.po index 75cbd084..aabb0c82 100644 --- a/website/payments/locale/nl/LC_MESSAGES/django.po +++ b/website/payments/locale/nl/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-07-11 20:07+0200\n" -"PO-Revision-Date: 2018-02-12 14:08+0100\n" +"POT-Creation-Date: 2018-11-27 18:25+0100\n" +"PO-Revision-Date: 2018-11-27 18:26+0100\n" "Last-Translator: Thom Wiggers \n" "Language-Team: \n" "Language: nl\n" @@ -16,79 +16,87 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.0.6\n" +"X-Generator: Poedit 2.2\n" -#: payments/admin.py +#: admin.py msgid "Process selected payments (cash)" msgstr "Verwerk geselecteerde betalingen (contant)" -#: payments/admin.py +#: admin.py msgid "Process selected payments (card)" msgstr "Verwerk geselecteerde betalingen (pin)" -#: payments/admin.py payments/tests/test_admin.py +#: admin.py tests/test_admin.py #, python-format msgid "Successfully processed %(count)d %(items)s." msgstr "%(count)d %(items)s succesvol verwerkt." -#: payments/admin.py +#: admin.py msgid "The selected payment(s) could not be processed." msgstr "De geselecteerde betaling(en) konden niet worden verwerkt." -#: payments/apps.py +#: admin_views.py tests/test_admin_views.py +#, python-format +msgid "Successfully processed %s." +msgstr "%s succesvol verwerkt." + +#: admin_views.py tests/test_admin_views.py +#, python-format +msgid "Could not process %s." +msgstr "%s kon niet worden verwerkt." + +#: apps.py msgid "Payments" msgstr "Betalingen" -#: payments/models.py +#: models.py msgid "created at" msgstr "aangemaakt op" -#: payments/models.py +#: models.py +msgid "No payment" +msgstr "Geen betaling" + +#: models.py msgid "Cash payment" msgstr "Contante betaling" -#: payments/models.py +#: models.py msgid "Card payment" msgstr "Pin betaling" -#: payments/models.py +#: models.py msgid "type" msgstr "type" -#: payments/models.py -msgid "processed" -msgstr "verwerkt" - -#: payments/models.py +#: models.py msgid "processing date" msgstr "verwerkingsdatum" -#: payments/models.py +#: models.py msgid "payment" msgstr "betaling" -#: payments/models.py +#: models.py msgid "payments" msgstr "betalingen" -#: payments/models.py +#: models.py msgid "Process payments" msgstr "Verwerk betalingen" -#: payments/templates/admin/payments/change_form.html +#: templates/admin/payments/change_form.html templates/payments/widget.html msgid "Process (cash payment)" msgstr "Verwerk (contant)" -#: payments/templates/admin/payments/change_form.html +#: templates/admin/payments/change_form.html templates/payments/widget.html msgid "Process (card payment)" msgstr "Verwerk (pin)" -#: payments/tests/test_views.py payments/views.py -#, python-format -msgid "Successfully processed %s." -msgstr "%s succesvol verwerkt." +#: templates/payments/widget.html +msgid "Unprocessed" +msgstr "Onverwerkt" -#: payments/tests/test_views.py payments/views.py -#, python-format -msgid "Could not process %s." -msgstr "%s kon niet worden verwerkt." +#: templates/payments/widget.html +msgid "Processed" +msgstr "Verwerkt" -- GitLab From d289914fe99d4fe1ea941c97f56c1b5d7b3adf7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Se=CC=81bastiaan=20Versteeg?= Date: Tue, 27 Nov 2018 18:29:33 +0100 Subject: [PATCH 9/9] Fix the tests --- website/payments/tests/test_admin.py | 3 --- website/payments/tests/test_admin_views.py | 1 - website/registrations/services.py | 6 ++++-- website/registrations/tests/test_admin.py | 1 - 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/website/payments/tests/test_admin.py b/website/payments/tests/test_admin.py index 2163da62..4a1e296d 100644 --- a/website/payments/tests/test_admin.py +++ b/website/payments/tests/test_admin.py @@ -76,7 +76,6 @@ class PaymentAdminTest(TestCase): def test_changeform_view(self, payment_get): object_id = 'c85ea333-3508-46f1-8cbb-254f8c138020' payment = Payment.objects.create(pk=object_id, - processed=False, amount=7.5) payment_get.return_value = payment @@ -111,7 +110,6 @@ class PaymentAdminTest(TestCase): def test_process_cash(self, process_payment, message_user): object_id = 'c85ea333-3508-46f1-8cbb-254f8c138020' payment = Payment.objects.create(pk=object_id, - processed=False, amount=7.5) queryset = Payment.objects.filter(pk=object_id) process_payment.return_value = [payment] @@ -152,7 +150,6 @@ class PaymentAdminTest(TestCase): def test_process_card(self, process_payment, message_user): object_id = 'c85ea333-3508-46f1-8cbb-254f8c138020' payment = Payment.objects.create(pk=object_id, - processed=False, amount=7.5) queryset = Payment.objects.filter(pk=object_id) process_payment.return_value = [payment] diff --git a/website/payments/tests/test_admin_views.py b/website/payments/tests/test_admin_views.py index b3e28605..a5ea25bb 100644 --- a/website/payments/tests/test_admin_views.py +++ b/website/payments/tests/test_admin_views.py @@ -17,7 +17,6 @@ class PaymentAdminViewTest(TestCase): @classmethod def setUpTestData(cls): cls.payment = Payment.objects.create( - processed=False, amount=7.5 ) cls.user = Member.objects.create( diff --git a/website/registrations/services.py b/website/registrations/services.py index 0a0105e6..49256daa 100644 --- a/website/registrations/services.py +++ b/website/registrations/services.py @@ -153,11 +153,13 @@ def revert_entry(entry): if not (entry.status in [Entry.STATUS_ACCEPTED, Entry.STATUS_REJECTED]): return + payment = entry.payment entry.status = Entry.STATUS_REVIEW entry.updated_at = timezone.now() + entry.payment = None entry.save() - if entry.payment is not None: - entry.payment.delete() + if payment is not None: + payment.delete() def _create_payment_for_entry(entry): diff --git a/website/registrations/tests/test_admin.py b/website/registrations/tests/test_admin.py index e2257103..e11aa9c7 100644 --- a/website/registrations/tests/test_admin.py +++ b/website/registrations/tests/test_admin.py @@ -280,7 +280,6 @@ class RegistrationAdminTest(TestCase): username='johnnytest', payment=Payment( pk='123', - processed=False ) ) -- GitLab