mirror of
https://github.com/nottinghamtec/PyRIGS.git
synced 2026-02-05 22:58:21 +00:00
Add authorisation models.
Add EventAuthorisation model + migrations Add authorised property to Event. Add appropriate tests
This commit is contained in:
28
RIGS/migrations/0025_eventauthorisation.py
Normal file
28
RIGS/migrations/0025_eventauthorisation.py
Normal 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')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -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')
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user