Add occupation model to function as history of roles

This commit is contained in:
Aarni Halinen
2019-09-26 19:17:01 +03:00
parent 6c77fe4da6
commit 32feb46f88
5 changed files with 147 additions and 8 deletions
+2 -1
View File
@@ -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)
@@ -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'
)
]
@@ -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),
),
]
@@ -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'),
),
]
+45 -7
View File
@@ -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)