Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
No results found
Show changes
Showing
with 105 additions and 26 deletions
......@@ -103,6 +103,7 @@ def gen_stats_year(member_types):
def verify_email_change(change_request):
"""
Mark the email change request as verified
:param change_request: the email change request
"""
change_request.verified = True
......@@ -114,6 +115,7 @@ def verify_email_change(change_request):
def confirm_email_change(change_request):
"""
Mark the email change request as verified
:param change_request: the email change request
"""
change_request.confirmed = True
......@@ -126,6 +128,7 @@ def process_email_change(change_request):
"""
Change the user's email address if the request was completed and
send the completion email
:param change_request: the email change request
"""
if not change_request.completed:
......
......@@ -11,6 +11,7 @@ from partners.models import Partner
def send_newsletter(request, newsletter):
"""
Sends the newsletter as HTML and plaintext email
:param request: the request object
:param newsletter: the newsletter to be send
"""
......
......@@ -14,6 +14,7 @@ from partners.models import Partner
def preview(request, pk, lang=None):
"""
View that renders the newsletter as HTML
:param request: the request object
:param pk: the newsletter's primary key
:param lang: the language of the render
......@@ -46,6 +47,7 @@ def legacy_redirect(request, year, week):
"""
View that redirect you to the right newsletter by
using the previously used URL format of /{year}/{week}
:param request: the request object
:param year: the year of the newsletter
:param week: the week of the newsletter
......@@ -68,6 +70,7 @@ def admin_send(request, pk):
If this is a GET request this view will render a confirmation
page for the administrator. If it is a POST request the newsletter
will be sent to all recipients
:param request: the request object
:param pk: the newsletter's primary key
:return: 302 RedirectResponse if POST else 200 with the
......
{% load i18n %}
<div class="readonly">
{% if widget.value %}
<a href="{{ url }}">
{% if processed %}
{% trans "Processed" %}
{% else %}
{% trans "Unprocessed" %}
{% endif %}
</a>
{% else %}
-
{% endif %}
</div>
from django.forms import Widget
from payments.models import Payment
class PaymentWidget(Widget):
template_name = 'payments/widget.html'
def value_from_datadict(self, data, files, name):
return super().value_from_datadict(data, files, name)
def get_context(self, name, value, attrs):
context = super().get_context(name, value, attrs)
if value:
payment = Payment.objects.get(pk=value)
context['url'] = payment.get_admin_url()
context['processed'] = payment.processed
return context
"""Registers admin interfaces for the registrations module"""
from django.contrib import admin, messages
from django.contrib.admin.utils import model_ngettext
from django.forms import Field
from django.utils.html import format_html
from django.utils.translation import ugettext_lazy as _
from payments.widgets import PaymentWidget
from . import services
from .models import Entry, Registration, Renewal
......@@ -64,6 +66,14 @@ class RegistrationAdmin(admin.ModelAdmin):
)
actions = ['accept_selected', 'reject_selected']
def formfield_for_dbfield(self, db_field, request, **kwargs):
field = super().formfield_for_dbfield(db_field, request, **kwargs)
if db_field.name == 'payment':
return Field(widget=PaymentWidget,
initial=field.initial,
required=False)
return field
def changeform_view(self, request, object_id=None, form_url='',
extra_context=None):
"""
......@@ -93,10 +103,10 @@ class RegistrationAdmin(admin.ModelAdmin):
def get_readonly_fields(self, request, obj=None):
if obj is None or not (obj.status == Entry.STATUS_REJECTED or
obj.status == Entry.STATUS_ACCEPTED):
return ['status', 'created_at', 'updated_at', 'payment']
return ['status', 'created_at', 'updated_at']
else:
return [field.name for field in self.model._meta.get_fields()
if field.editable]
if field.editable and not field.name == 'payment']
@staticmethod
def name(obj):
......@@ -155,6 +165,7 @@ class RenewalAdmin(RegistrationAdmin):
'length',
'membership_type',
'status',
'payment',
'remarks',
'member',)
}),
......
......@@ -13,6 +13,7 @@ from . import models
def send_registration_email_confirmation(registration):
"""
Send the email confirmation message
:param registration: the registration entry
"""
with translation.override(registration.language):
......@@ -34,6 +35,7 @@ def send_registration_email_confirmation(registration):
def send_registration_accepted_message(registration, payment):
"""
Send the registration acceptance email
:param registration: the registration entry
:param payment: the payment entry
"""
......@@ -52,6 +54,7 @@ def send_registration_accepted_message(registration, payment):
def send_registration_rejected_message(registration):
"""
Send the registration rejection email
:param registration: the registration entry
"""
with translation.override(registration.language):
......@@ -68,6 +71,7 @@ def send_registration_rejected_message(registration):
def send_new_registration_board_message(entry):
"""
Send a notification to the board about a new registration
:param entry: the registration entry
"""
try:
......@@ -88,6 +92,7 @@ def send_new_registration_board_message(entry):
def send_renewal_accepted_message(renewal, payment):
"""
Send the renewal acceptation email
:param renewal: the renewal entry
:param payment: the payment entry
"""
......@@ -106,12 +111,13 @@ def send_renewal_accepted_message(renewal, payment):
def send_renewal_rejected_message(renewal):
"""
Send the renewal rejection email
:param renewal: the renewal entry
"""
with translation.override(renewal.member.profile.language):
_send_email(
renewal.member.email,
_('Registration rejected'),
_('Renewal rejected'),
'registrations/email/renewal_rejected.txt',
{
'name': renewal.member.get_full_name()
......@@ -122,6 +128,7 @@ def send_renewal_rejected_message(renewal):
def send_renewal_complete_message(renewal):
"""
Send the email completing the renewal
:param renewal: the renewal entry
"""
with translation.override(renewal.member.profile.language):
......@@ -138,6 +145,7 @@ def send_renewal_complete_message(renewal):
def send_new_renewal_board_message(renewal):
"""
Send a notification to the board about a new renewal
:param renewal: the renewal entry
"""
_send_email(
......@@ -155,6 +163,7 @@ def send_new_renewal_board_message(renewal):
def _send_email(to, subject, body_template, context):
"""
Easily send an email with the right subject and a body template
:param to: where should the email go?
:param subject: what is the email about?
:param body_template: what is the content of the email?
......
......@@ -4,6 +4,7 @@ from django.forms import TypedChoiceField
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
from payments.widgets import PaymentWidget
from utils.snippets import datetime_to_lectureyear
from .models import Registration, Renewal
......
File suppressed by a .gitattributes entry or the file's encoding is unsupported.
......@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-08-19 16:41+0200\n"
"PO-Revision-Date: 2018-08-24 20:50+0200\n"
"Last-Translator: Sébastiaan Versteeg <se_bastiaan@outlook.com>\n"
"POT-Creation-Date: 2018-08-28 16:41+0200\n"
"PO-Revision-Date: 2018-08-28 16:41+0200\n"
"Last-Translator: Thom Wiggers <thom@thomwiggers.nl>\n"
"Language-Team: \n"
"Language: nl\n"
"MIME-Version: 1.0\n"
......@@ -88,6 +88,10 @@ msgstr "Registratie afgekeurd"
msgid "Renewal accepted"
msgstr "Verlenging goedgekeurd"
#: emails.py tests/test_emails.py
msgid "Renewal rejected"
msgstr "Verlenging afgekeurd"
#: emails.py tests/test_emails.py
msgid "Renewal successful"
msgstr "Verlenging succesvol"
......@@ -268,8 +272,10 @@ msgstr "Er bestaat al een gebruiker met deze gebruikersnaam."
msgid "This field is required."
msgstr "Dit veld is verplicht."
#: models.py
msgid "registation"
#: models.py templates/registrations/confirm_email.html
#: templates/registrations/register_member.html
#: templates/registrations/register_success.html
msgid "registration"
msgstr "registratie"
#: models.py
......@@ -400,12 +406,6 @@ msgstr ""
msgid "confirm email address"
msgstr "bevestig e-mailadres"
#: templates/registrations/confirm_email.html
#: templates/registrations/register_member.html
#: templates/registrations/register_success.html
msgid "registration"
msgstr "registratie"
#: templates/registrations/confirm_email.html
msgid ""
"\n"
......
# Generated by Django 2.0.8 on 2018-08-28 14:10
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('registrations', '0009_auto_20180704_2338'),
]
operations = [
migrations.AlterModelOptions(
name='registration',
options={'verbose_name': 'registration', 'verbose_name_plural': 'registrations'},
),
]
......@@ -291,7 +291,7 @@ class Registration(Entry):
return '{} {} ({})'.format(self.first_name, self.last_name, self.email)
class Meta:
verbose_name = _('registation')
verbose_name = _('registration')
verbose_name_plural = _('registrations')
......
......@@ -146,13 +146,13 @@ class RegistrationAdminTest(TestCase):
fields = self.admin.get_readonly_fields(request)
self.assertEqual(fields, ['status', 'created_at',
'updated_at', 'payment'])
'updated_at'])
fields = self.admin.get_readonly_fields(request, Registration(
status=Entry.STATUS_CONFIRM
))
self.assertEqual(fields, ['status', 'created_at',
'updated_at', 'payment'])
'updated_at'])
fields = self.admin.get_readonly_fields(request, Registration(
status=Entry.STATUS_REJECTED
......@@ -166,8 +166,8 @@ class RegistrationAdminTest(TestCase):
'programme', 'starting_year',
'address_street', 'address_street2',
'address_postal_code', 'address_city',
'payment', 'membership',
'optin_mailinglist', 'optin_birthday'])
'membership', 'optin_mailinglist',
'optin_birthday'])
fields = self.admin.get_readonly_fields(request, Registration(
status=Entry.STATUS_ACCEPTED
......@@ -181,8 +181,8 @@ class RegistrationAdminTest(TestCase):
'programme', 'starting_year',
'address_street', 'address_street2',
'address_postal_code', 'address_city',
'payment', 'membership',
'optin_mailinglist', 'optin_birthday'])
'membership', 'optin_mailinglist',
'optin_birthday'])
def test_get_actions(self):
actions = self.admin.get_actions(_get_mock_request([]))
......@@ -285,20 +285,20 @@ class RenewalAdminTest(TestCase):
fields = self.admin.get_readonly_fields(request)
self.assertEqual(fields, ['status', 'created_at',
'updated_at', 'payment'])
'updated_at'])
fields = self.admin.get_readonly_fields(request, Renewal(
status=Entry.STATUS_CONFIRM
))
self.assertEqual(fields, ['status', 'created_at',
'updated_at', 'payment', 'member'])
'updated_at', 'member'])
fields = self.admin.get_readonly_fields(request, Renewal(
status=Entry.STATUS_REJECTED
))
self.assertCountEqual(fields, ['created_at', 'updated_at', 'status',
'length', 'membership_type', 'remarks',
'entry_ptr', 'member', 'payment',
'entry_ptr', 'member',
'membership'])
fields = self.admin.get_readonly_fields(request, Renewal(
......@@ -306,7 +306,7 @@ class RenewalAdminTest(TestCase):
))
self.assertCountEqual(fields, ['created_at', 'updated_at', 'status',
'length', 'membership_type', 'remarks',
'entry_ptr', 'member', 'payment',
'entry_ptr', 'member',
'membership'])
def test_get_actions(self):
......
......@@ -176,7 +176,7 @@ class EmailsTest(TestCase):
with translation.override(renewal.member.profile.language):
send_email.assert_called_once_with(
renewal.member.email,
_('Registration rejected'),
_('Renewal rejected'),
'registrations/email/renewal_rejected.txt',
{
'name': renewal.member.get_full_name()
......