Add authorisation models.

Add EventAuthorisation model + migrations

Add authorised property to Event.

Add appropriate tests
This commit is contained in:
Tom Price
2017-03-29 20:35:25 +01:00
parent 3269e92ef2
commit c2787d54b0
3 changed files with 107 additions and 0 deletions

View File

@@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('RIGS', '0024_auto_20160229_2042'),
]
operations = [
migrations.CreateModel(
name='EventAuthorisation',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('email', models.EmailField(max_length=254)),
('name', models.CharField(max_length=255)),
('uni_id', models.CharField(max_length=10, null=True, verbose_name=b'University ID', blank=True)),
('account_code', models.CharField(max_length=50, null=True, blank=True)),
('po', models.CharField(max_length=255, null=True, verbose_name=b'purchase order', blank=True)),
('amount', models.DecimalField(verbose_name=b'authorisation amount', max_digits=10, decimal_places=2)),
('created_at', models.DateTimeField(auto_now_add=True)),
('event', models.ForeignKey(related_name='authroisations', to='RIGS.Event')),
],
),
]

View File

@@ -385,6 +385,10 @@ class Event(models.Model, RevisionMixin):
def confirmed(self): def confirmed(self):
return (self.status == self.BOOKED or self.status == self.CONFIRMED) return (self.status == self.BOOKED or self.status == self.CONFIRMED)
@property
def authorised(self):
return self.authroisations.latest('created_at').amount >= self.total
@property @property
def has_start_time(self): def has_start_time(self):
return self.start_time is not None return self.start_time is not None
@@ -501,6 +505,30 @@ class EventCrew(models.Model):
notes = models.TextField(blank=True, null=True) notes = models.TextField(blank=True, null=True)
class EventAuthorisation(models.Model):
event = models.ForeignKey('Event', related_name='authroisations')
email = models.EmailField()
name = models.CharField(max_length=255)
uni_id = models.CharField(max_length=10, blank=True, null=True, verbose_name="University ID")
account_code = models.CharField(max_length=50, blank=True, null=True)
po = models.CharField(max_length=255, blank=True, null=True, verbose_name="purchase order")
amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="authorisation amount")
created_at = models.DateTimeField(auto_now_add=True)
def clean(self):
if self.amount != self.event.total:
raise ValidationError("The amount authorised must equal the total for the event")
if self.event.organisation and self.event.organisation.union_account:
# Is a union account, requires username and account number
if self.uni_id is None or self.uni_id == "" or self.account_code is None or self.account_code == "":
raise ValidationError("Internal clients require a University ID number and an account code")
else:
# Is an external client, only requires PO
if self.po is None or self.po == "":
raise ValidationError("External clients require a Purchase Order number")
return super(EventAuthorisation, self).clean()
@python_2_unicode_compatible @python_2_unicode_compatible
class Invoice(models.Model): class Invoice(models.Model):
event = models.OneToOneField('Event') event = models.OneToOneField('Event')

View File

@@ -1,5 +1,6 @@
import pytz import pytz
from django.conf import settings from django.conf import settings
from django.core.exceptions import ValidationError
from django.test import TestCase from django.test import TestCase
from RIGS import models from RIGS import models
from datetime import date, timedelta, datetime, time from datetime import date, timedelta, datetime, time
@@ -327,3 +328,53 @@ class EventPricingTestCase(TestCase):
def test_grand_total(self): def test_grand_total(self):
self.assertEqual(self.e1.total, Decimal('84.48')) self.assertEqual(self.e1.total, Decimal('84.48'))
self.assertEqual(self.e2.total, Decimal('419.32')) self.assertEqual(self.e2.total, Decimal('419.32'))
class EventAuthorisationTestCase(TestCase):
@classmethod
def setUpTestData(cls):
cls.person = models.Person.objects.create(name='Authorisation Test Person')
cls.organisation = models.Organisation.objects.create(name='Authorisation Test Organisation')
cls.event = models.Event.objects.create(name="AuthorisationTestCase", person=cls.person,
start_date=date.today())
# Add some items
models.EventItem.objects.create(event=cls.event, name="Authorisation test item", quantity=2, cost=123.45,
order=1)
def test_validation(self):
auth = models.EventAuthorisation(event=self.event, email="authroisation@model.test.case", name="Test Auth")
auth.amount = self.event.total - 1
self.assertRaises(ValidationError, auth.clean)
auth.amount = self.event.total
# Test for externals first
self.assertRaises(ValidationError, auth.clean)
self.event.organisation = self.organisation
self.assertRaises(ValidationError, auth.clean)
auth.po = "TEST123"
self.assertIsNone(auth.clean())
auth.po = None
self.organisation.union_account = True
self.assertRaises(ValidationError, auth.clean)
auth.uni_id = "1234567"
self.assertRaises(ValidationError, auth.clean)
auth.account_code = "TST AUTH 12345"
self.assertIsNone(auth.clean())
def test_event_property(self):
auth1 = models.EventAuthorisation.objects.create(event=self.event, email="authroisation@model.test.case",
name="Test Auth 1", amount=self.event.total - 1)
self.assertFalse(self.event.authorised)
auth1.amount = self.event.total
auth1.save()
self.assertTrue(self.event.authorised)
auth2 = models.EventAuthorisation.objects.create(event=self.event, email="authroisation@model.test.case",
name="Test Auth 2", amount=self.event.total - 1)
self.assertEqual(auth2.pk, self.event.authroisations.latest('created_at').pk)
self.assertFalse(self.event.authorised)
auth2.amount = self.event.total + 1
auth2.save()
self.assertTrue(self.event.authorised)