From 32feb46f886591cb310eb814e989eabcd32da05c Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Thu, 26 Sep 2019 19:17:01 +0300 Subject: [PATCH] Add occupation model to function as history of roles --- webapp/admin.py | 3 +- webapp/migrations/0055_auto_20190926_1850.py | 31 ++++++++++++ webapp/migrations/0056_auto_20190926_1857.py | 51 +++++++++++++++++++ webapp/migrations/0057_auto_20190926_1915.py | 18 +++++++ webapp/models.py | 52 +++++++++++++++++--- 5 files changed, 147 insertions(+), 8 deletions(-) create mode 100644 webapp/migrations/0055_auto_20190926_1850.py create mode 100644 webapp/migrations/0056_auto_20190926_1857.py create mode 100644 webapp/migrations/0057_auto_20190926_1915.py diff --git a/webapp/admin.py b/webapp/admin.py index 2059a1d..dd0c36f 100644 --- a/webapp/admin.py +++ b/webapp/admin.py @@ -1,7 +1,7 @@ """File containing webapp app admin registers.""" from django.contrib import admin -from webapp.models import Official, Role, Committee +from webapp.models import Official, Role, Committee, Occupation from webapp.models import Feed, Tag, BaseFeed, Event, Signup, SignupForm, TemplateQuestion from modeltranslation.admin import TranslationAdmin from django.contrib.auth.models import Permission @@ -17,5 +17,6 @@ admin.site.register(SignupForm, TranslationAdmin) admin.site.register(Signup, TranslationAdmin) admin.site.register(TemplateQuestion, TranslationAdmin) admin.site.register(Official) +admin.site.register(Occupation) admin.site.register(Role) admin.site.register(Committee) diff --git a/webapp/migrations/0055_auto_20190926_1850.py b/webapp/migrations/0055_auto_20190926_1850.py new file mode 100644 index 0000000..a1fb4ff --- /dev/null +++ b/webapp/migrations/0055_auto_20190926_1850.py @@ -0,0 +1,31 @@ +# Generated by Django 2.1.5 on 2019-09-26 15:50 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('webapp', '0054_auto_20190313_1642'), + ] + + operations = [ + migrations.CreateModel( + name='Occupation', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('start_date', models.DateField(verbose_name='Start date')), + ('end_date', models.DateField(verbose_name='End date')), + ], + options={ + 'verbose_name': 'Occupation', + 'verbose_name_plural': 'Occupations', + }, + ), + migrations.DeleteModel( + name='official' + ) + ] diff --git a/webapp/migrations/0056_auto_20190926_1857.py b/webapp/migrations/0056_auto_20190926_1857.py new file mode 100644 index 0000000..6f99cba --- /dev/null +++ b/webapp/migrations/0056_auto_20190926_1857.py @@ -0,0 +1,51 @@ +# Generated by Django 2.1.5 on 2019-09-26 15:57 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import phonenumber_field.modelfields + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('webapp', '0055_auto_20190926_1850'), + ] + + operations = [ + migrations.CreateModel( + name='Official', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, verbose_name='Phone number')), + ], + options={ + 'verbose_name': 'Official', + 'verbose_name_plural': 'Officials', + }, + ), + migrations.RemoveField( + model_name='role', + name='end_date', + ), + migrations.RemoveField( + model_name='role', + name='start_date', + ), + migrations.AddField( + model_name='occupation', + name='occupation', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='webapp.Role'), + ), + migrations.AddField( + model_name='official', + name='role_history', + field=models.ManyToManyField(to='webapp.Occupation'), + ), + migrations.AddField( + model_name='official', + name='user', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/webapp/migrations/0057_auto_20190926_1915.py b/webapp/migrations/0057_auto_20190926_1915.py new file mode 100644 index 0000000..ae2c01f --- /dev/null +++ b/webapp/migrations/0057_auto_20190926_1915.py @@ -0,0 +1,18 @@ +# Generated by Django 2.1.5 on 2019-09-26 16:15 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('webapp', '0056_auto_20190926_1857'), + ] + + operations = [ + migrations.AlterField( + model_name='official', + name='role_history', + field=models.ManyToManyField(blank=True, to='webapp.Occupation'), + ), + ] diff --git a/webapp/models.py b/webapp/models.py index 348d8d7..9325702 100644 --- a/webapp/models.py +++ b/webapp/models.py @@ -4,9 +4,10 @@ from django.db import models from django.utils import timezone # from datetime import timedelta from django.contrib.auth.models import User +from django.db.models.signals import post_save +from django.dispatch import receiver from webapp.utils import month_from_now from django.utils.translation import ugettext_lazy as _ -# from django.contrib.auth.models import User from auditlog.registry import auditlog from phonenumber_field.modelfields import PhoneNumberField # from django.contrib.postgres.fields import JSONField @@ -163,7 +164,7 @@ class Role(PresetRole): Model for Role. Model representing an active or historical occupation - in an official's history. + in the guild. """ class Meta: @@ -172,12 +173,32 @@ class Role(PresetRole): verbose_name = _('Role') verbose_name_plural = _('Roles') - start_date = models.DateField(_('Start date')) - end_date = models.DateField(_('End date')) committee = models.ForeignKey('Committee', related_name='roles', on_delete=models.SET_NULL, null=True) + def __str__(self): + return '{} (Hallitus: {}) ({})'.format(self.name, _("Yes") if self.is_board else _("No"), self.committee) -class Official(User): + +class Occupation(models.Model): + """ + Model for a occupation in guild. + + Model links Official into a role he/she has or has had in the guild. + """ + + class Meta: + verbose_name = _('Occupation') + verbose_name_plural = _('Occupations') + + start_date = models.DateField(_('Start date')) + end_date = models.DateField(_('End date')) + occupation = models.ForeignKey('Role', on_delete=models.SET_NULL, null=True) + + def __str__(self): + return '{}: {} - {}'.format(self.occupation.name, self.start_date, self.end_date) + + +class Official(models.Model): """Model representing a guild official.""" class Meta: @@ -186,11 +207,28 @@ class Official(User): verbose_name = _('Official') verbose_name_plural = _('Officials') + user = models.OneToOneField(User, on_delete=models.CASCADE) + phone_number = PhoneNumberField(_('Phone number')) - role = models.ManyToManyField('Role', related_name='official') + role_history = models.ManyToManyField('Occupation', blank=True) + + @property + def current_roles(self): + return self.role_history.all().filter(end_date__gte=timezone.now()).filter(start_date__lte=timezone.now()) def __str__(self): - return '{} {}'.format(self.first_name, self.last_name) + return '{} {}'.format(self.user.first_name, self.user.last_name) + + +@receiver(post_save, sender=User) +def create_user_profile(sender, instance, created, **kwargs): + if created: + Official.objects.create(user=instance) + + +@receiver(post_save, sender=User) +def save_user_profile(sender, instance, **kwargs): + instance.official.save() auditlog.register(Tag)