From 791027bae510784fcd14fd4b6e49522a3136d74c Mon Sep 17 00:00:00 2001 From: Yingtong Li Date: Thu, 17 Jan 2019 23:24:49 +1100 Subject: [PATCH] Implement view/edit membership details --- ssmembership/jinja2/ssmembership/index.html | 75 ++++++++++++++++++++- ssmembership/models.py | 50 ++++++++++---- ssmembership/views.py | 29 +++++++- 3 files changed, 140 insertions(+), 14 deletions(-) diff --git a/ssmembership/jinja2/ssmembership/index.html b/ssmembership/jinja2/ssmembership/index.html index d7e8fd5..f6125b3 100644 --- a/ssmembership/jinja2/ssmembership/index.html +++ b/ssmembership/jinja2/ssmembership/index.html @@ -23,6 +23,79 @@

No membership records

This email address is not associated with a current membership.

{% else %} -

Membership details

+

Membership details

+ +
+
+ +
{{ member.id }}
+
+
+
+ + +
+
+ +
{{ member.email }}
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+
+
+ +
{{ member.expires.strftime('%d %B %Y') }}
+
+
+ {% if errors %} +
    + {% for error in errors %} +
  • {{ error }}
  • + {% endfor %} +
+ {% endif %} + + +
+ {% endif %} +{% endblock %} + +{% block script %} + {{ super() }} + {% if member %} + {% endif %} {% endblock %} diff --git a/ssmembership/models.py b/ssmembership/models.py index 8d79202..72f4c0f 100644 --- a/ssmembership/models.py +++ b/ssmembership/models.py @@ -16,6 +16,8 @@ from django.db import models +import re + class Member(models.Model): email = models.CharField(max_length=100) @@ -25,20 +27,44 @@ class Member(models.Model): student_id = models.CharField(max_length=8) is_msa = models.BooleanField() - year = models.IntegerField( - choices = ( - (0, 'Year A'), - (1, 'Year 1'), - (2, 'Year 2'), - (3, 'Year 3B'), - (4, 'Year 4C'), - (5, 'Year 5D'), - (97, 'BMedSc(Hons)'), - (98, 'PhD'), - (99, 'Intermission'), - ) + YEARS = ( + (0, 'Year A'), + (1, 'Year 1'), + (2, 'Year 2'), + (3, 'Year 3B'), + (4, 'Year 4C'), + (5, 'Year 5D'), + (97, 'BMedSc(Hons)'), + (98, 'PhD'), + (99, 'Intermission'), ) + year = models.IntegerField(choices=YEARS) phone = models.CharField(max_length=20) expires = models.DateField() + + def validation_problems(self): + result = [] + + if not self.email.strip(): + result.append('Email is required') + if not self.first_name.strip(): + result.append('First name is required') + if not self.last_name.strip(): + result.append('Last name is required') + if not self.student_id.strip(): + result.append('Student ID is required') + if not any(x[0] == self.year for x in Member.YEARS): + result.append('A valid year is required') + if not self.phone.strip(): + result.append('Phone number is required') + + if not self.email.strip().endswith('@student.monash.edu'): + result.append('Email must be a Monash student email address') + if not re.match(r'^[0-9]{8}$', self.student_id.strip()): + result.append('Student ID must be an 8 digit number') + if not re.match(r'^[0-9+ ]+$', self.phone.strip()): + result.append('Phone number must contain only numbers and +') + + return result diff --git a/ssmembership/views.py b/ssmembership/views.py index 573f8bb..8e198f8 100644 --- a/ssmembership/views.py +++ b/ssmembership/views.py @@ -16,7 +16,11 @@ from django.contrib.auth.decorators import login_required -from django.shortcuts import render +from django.conf import settings +from django.db import transaction +from django.http import HttpResponse +from django.shortcuts import render, redirect +from django.urls import reverse from . import models @@ -26,5 +30,28 @@ def index(request): member = models.Member.objects.get(email=request.user.email) except models.Member.DoesNotExist: member = None + return render(request, 'ssmembership/index.html', {'member': member, 'years': models.Member.YEARS}) + + if request.method != 'POST': + return render(request, 'ssmembership/index.html', {'member': member, 'years': models.Member.YEARS}) + + # Update membership + member.student_id = request.POST['student_id'] + member.first_name = request.POST['first_name'] + member.last_name = request.POST['last_name'] + member.phone = request.POST['phone'] + member.year = int(request.POST['year']) + member.is_msa = True if request.POST['is_msa'] == '1' else '0' + + errors = member.validation_problems() + if not member or len(errors) > 0: + return render(request, 'ssmembership/index.html', { + 'member': member, + 'years': models.Member.YEARS, + 'errors': errors + }) + + member.save() + return render(request, 'ssmembership/index.html', {'member': member, 'years': models.Member.YEARS}) return render(request, 'ssmembership/index.html', {'member': member})