Remove Officials
This commit is contained in:
+9
-3
@@ -5,15 +5,21 @@ from webapp.utils import month_from_now
|
|||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from auditlog.registry import auditlog
|
from auditlog.registry import auditlog
|
||||||
from phonenumber_field.modelfields import PhoneNumberField
|
from phonenumber_field.modelfields import PhoneNumberField
|
||||||
|
from webapp.models import BaseRole
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
import webapp.models
|
|
||||||
|
# TODO: Move BaseRole to Kaehmt App; will fuck up the DB since table is removed, if no data migration is done before-hand.
|
||||||
|
# Either reconstruct all kaehmy roles from scratch then, or do these migrations:
|
||||||
|
# 1. Create table here
|
||||||
|
# 2. Data migrate from webapp BaseRole to new kaehmy BaseRole
|
||||||
|
# 3. Delete webapp BaseRole table
|
||||||
|
|
||||||
VERBOSE_NAME = _('Kaehmy')
|
VERBOSE_NAME = _('Kaehmy')
|
||||||
|
|
||||||
|
|
||||||
class KaehmyBaseRole(webapp.models.BaseRole):
|
class KaehmyBaseRole(BaseRole):
|
||||||
|
"""ABC"""
|
||||||
|
|
||||||
CATEGORIES = (
|
CATEGORIES = (
|
||||||
('corporate', _('Corporate affairs')),
|
('corporate', _('Corporate affairs')),
|
||||||
|
|||||||
+1
-6
@@ -1,8 +1,7 @@
|
|||||||
"""File containing webapp app admin registers."""
|
"""File containing webapp app admin registers."""
|
||||||
|
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from webapp.models import JobAd, Official, Role, Committee, Occupation
|
from webapp.models import Feed, Tag, Event, Signup, SignupForm, TemplateQuestion, JobAd
|
||||||
from webapp.models import Feed, Tag, Event, Signup, SignupForm, TemplateQuestion
|
|
||||||
from modeltranslation.admin import TranslationAdmin
|
from modeltranslation.admin import TranslationAdmin
|
||||||
from django.contrib.auth.models import Permission
|
from django.contrib.auth.models import Permission
|
||||||
# this is needed so that the models get registered for translation
|
# this is needed so that the models get registered for translation
|
||||||
@@ -16,8 +15,4 @@ admin.site.register(Event, TranslationAdmin)
|
|||||||
admin.site.register(SignupForm, TranslationAdmin)
|
admin.site.register(SignupForm, TranslationAdmin)
|
||||||
admin.site.register(Signup, TranslationAdmin)
|
admin.site.register(Signup, TranslationAdmin)
|
||||||
admin.site.register(TemplateQuestion, TranslationAdmin)
|
admin.site.register(TemplateQuestion, TranslationAdmin)
|
||||||
admin.site.register(Committee, TranslationAdmin)
|
|
||||||
admin.site.register(Official)
|
|
||||||
admin.site.register(Occupation)
|
|
||||||
admin.site.register(Role, TranslationAdmin)
|
|
||||||
admin.site.register(JobAd, TranslationAdmin)
|
admin.site.register(JobAd, TranslationAdmin)
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
# Generated by Django 2.1.5 on 2020-11-07 17:16
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('webapp', '0072_jobad'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='occupation',
|
||||||
|
name='role',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='official',
|
||||||
|
name='role_history',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='official',
|
||||||
|
name='user',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='presetrole',
|
||||||
|
name='baserole_ptr',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='role',
|
||||||
|
name='committee',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='role',
|
||||||
|
name='presetrole_ptr',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='baserole',
|
||||||
|
name='name_en',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='baserole',
|
||||||
|
name='name_fi',
|
||||||
|
),
|
||||||
|
migrations.DeleteModel(
|
||||||
|
name='Committee',
|
||||||
|
),
|
||||||
|
migrations.DeleteModel(
|
||||||
|
name='Occupation',
|
||||||
|
),
|
||||||
|
migrations.DeleteModel(
|
||||||
|
name='Official',
|
||||||
|
),
|
||||||
|
migrations.DeleteModel(
|
||||||
|
name='PresetRole',
|
||||||
|
),
|
||||||
|
migrations.DeleteModel(
|
||||||
|
name='Role',
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -171,105 +171,6 @@ class BaseRole(models.Model):
|
|||||||
return '{} ({})'.format(n, _('board member')) if self.is_board else n
|
return '{} ({})'.format(n, _('board member')) if self.is_board else n
|
||||||
|
|
||||||
|
|
||||||
class PresetRole(BaseRole):
|
|
||||||
"""Model representing a preset occupation in the guild."""
|
|
||||||
description = models.TextField(_('Description'))
|
|
||||||
|
|
||||||
|
|
||||||
class Committee(models.Model):
|
|
||||||
"""
|
|
||||||
Committee model
|
|
||||||
Has many Roles found under variable roles
|
|
||||||
"""
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = _('Committee')
|
|
||||||
verbose_name_plural = _('Committees')
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return _('Committee: {}').format(self.name)
|
|
||||||
|
|
||||||
name = models.CharField(_("Name"), max_length=255)
|
|
||||||
|
|
||||||
@property
|
|
||||||
def current_roles(self):
|
|
||||||
return self.roles.all().filter(end_date__gte=timezone.now()).filter(start_date__lte=timezone.now())
|
|
||||||
|
|
||||||
|
|
||||||
class Role(PresetRole):
|
|
||||||
"""
|
|
||||||
Model representing an active or historical occupation
|
|
||||||
in the guild.
|
|
||||||
"""
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = _('Role')
|
|
||||||
verbose_name_plural = _('Roles')
|
|
||||||
|
|
||||||
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 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'))
|
|
||||||
role = models.ForeignKey('Role', on_delete=models.SET_NULL, null=True)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def by_year(year):
|
|
||||||
return Occupation.objects.filter(
|
|
||||||
end_date__gte=timezone.datetime(year, 1, 1)).filter(
|
|
||||||
start_date__lte=timezone.datetime(year, 12, 31))
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return '{}: {} - {}'.format(self.role.name, self.start_date, self.end_date)
|
|
||||||
|
|
||||||
|
|
||||||
class Official(models.Model):
|
|
||||||
"""Model representing a guild official."""
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = _('Official')
|
|
||||||
verbose_name_plural = _('Officials')
|
|
||||||
|
|
||||||
user = models.OneToOneField(User, on_delete=models.CASCADE)
|
|
||||||
|
|
||||||
first_name = models.CharField(_('First name'), max_length=30)
|
|
||||||
last_name = models.CharField(_('Last name'), max_length=150)
|
|
||||||
email = models.EmailField(_('Email address'))
|
|
||||||
phone_number = PhoneNumberField(_('Phone number'))
|
|
||||||
role_history = models.ManyToManyField('Occupation', 'officials', blank=True)
|
|
||||||
image = models.ImageField(blank=True, null=True)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def by_year(year):
|
|
||||||
return Official.objects.filter(
|
|
||||||
role_history__in=Occupation.occupations_by_year(year)).distinct()
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return '{} {}'.format(self.first_name, self.last_name)
|
|
||||||
|
|
||||||
|
|
||||||
@receiver(post_save, sender=Official)
|
|
||||||
def save_user_official(sender, instance, **kwargs):
|
|
||||||
instance.user.first_name = instance.first_name
|
|
||||||
instance.user.last_name = instance.last_name
|
|
||||||
instance.user.email = instance.email
|
|
||||||
instance.user.save()
|
|
||||||
|
|
||||||
|
|
||||||
class JobAd(models.Model):
|
class JobAd(models.Model):
|
||||||
"""Job advertisements shown on Corporate relations page"""
|
"""Job advertisements shown on Corporate relations page"""
|
||||||
|
|
||||||
@@ -291,9 +192,4 @@ auditlog.register(Feed)
|
|||||||
auditlog.register(Event)
|
auditlog.register(Event)
|
||||||
auditlog.register(SignupForm)
|
auditlog.register(SignupForm)
|
||||||
auditlog.register(Signup)
|
auditlog.register(Signup)
|
||||||
auditlog.register(PresetRole)
|
|
||||||
auditlog.register(Role)
|
|
||||||
auditlog.register(Committee)
|
|
||||||
auditlog.register(Occupation)
|
|
||||||
auditlog.register(Official)
|
|
||||||
auditlog.register(JobAd)
|
auditlog.register(JobAd)
|
||||||
|
|||||||
@@ -141,36 +141,6 @@ class FeedSerializer(serializers.ModelSerializer):
|
|||||||
return feed
|
return feed
|
||||||
|
|
||||||
|
|
||||||
class CommitteeSerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = Committee
|
|
||||||
fields = ['name_fi', 'name_en']
|
|
||||||
|
|
||||||
|
|
||||||
class RoleSerializer(serializers.ModelSerializer):
|
|
||||||
committee = CommitteeSerializer(read_only=True)
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
model = Role
|
|
||||||
fields = ('name_fi', 'name_en', 'description_fi', 'description_en', 'committee', 'is_board')
|
|
||||||
|
|
||||||
|
|
||||||
class ContactsSerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = Official
|
|
||||||
fields = ('first_name', 'last_name', 'email', 'phone_number', 'image')
|
|
||||||
depth = 2
|
|
||||||
|
|
||||||
|
|
||||||
class OccupationSerializer(serializers.ModelSerializer):
|
|
||||||
role = RoleSerializer(read_only=True)
|
|
||||||
officials = ContactsSerializer(many=True, read_only=True)
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
model = Occupation
|
|
||||||
fields = ('role', 'start_date', 'end_date', 'officials')
|
|
||||||
|
|
||||||
|
|
||||||
class JobAdSerializer(serializers.ModelSerializer):
|
class JobAdSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = JobAd
|
model = JobAd
|
||||||
|
|||||||
@@ -1,98 +0,0 @@
|
|||||||
from django.test import TestCase
|
|
||||||
from django.contrib.auth.models import User
|
|
||||||
from django.utils import timezone
|
|
||||||
from rest_framework import status
|
|
||||||
from rest_framework.test import APITestCase
|
|
||||||
|
|
||||||
from webapp.models import Official, Role, Occupation, Committee
|
|
||||||
from webapp.serializers import OccupationSerializer
|
|
||||||
|
|
||||||
|
|
||||||
URL = "/api/contacts/"
|
|
||||||
COMMITTEE = Committee.objects.create(
|
|
||||||
name_fi="Viestintä",
|
|
||||||
name_en="Communications"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def createRoleBoard():
|
|
||||||
return Role.objects.create(
|
|
||||||
name_fi="Metsuri",
|
|
||||||
name_en="The lumberjack",
|
|
||||||
is_board=True,
|
|
||||||
description_fi="Toimikunta PJ",
|
|
||||||
description_en="Committee Chair"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def createRoleNoBoard():
|
|
||||||
return Role.objects.create(
|
|
||||||
name_fi="Toimari",
|
|
||||||
name_en="Official",
|
|
||||||
is_board=False,
|
|
||||||
description_fi="Toimikunta jäbä",
|
|
||||||
description_en="Committee dude(tte)",
|
|
||||||
committee=COMMITTEE
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def createOccupation(year, role=createRoleNoBoard(), dummydata=1):
|
|
||||||
occupation = Occupation.objects.create(
|
|
||||||
start_date=timezone.datetime(year, 1, 1),
|
|
||||||
end_date=timezone.datetime(year, 12, 31),
|
|
||||||
role=role
|
|
||||||
)
|
|
||||||
|
|
||||||
occupation.officials.add(
|
|
||||||
createPerson(dummydata)
|
|
||||||
)
|
|
||||||
|
|
||||||
return occupation
|
|
||||||
|
|
||||||
|
|
||||||
def createPerson(name):
|
|
||||||
return Official.objects.create(
|
|
||||||
user=User.objects.create_user(f"testi{name}", "test@test.tld", "password123"),
|
|
||||||
first_name=f"first{name}",
|
|
||||||
last_name=f"last{name}",
|
|
||||||
email="test@test.tld",
|
|
||||||
phone_number="+358501234567",
|
|
||||||
image=""
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class ContactsTestCase(APITestCase):
|
|
||||||
current_year = timezone.now().year
|
|
||||||
old_year = 1970
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
createOccupation(self.current_year, role=createRoleBoard(), dummydata=1)
|
|
||||||
createOccupation(self.current_year, dummydata=2)
|
|
||||||
createOccupation(self.old_year, role=createRoleBoard(), dummydata=3)
|
|
||||||
createOccupation(self.old_year, dummydata=4)
|
|
||||||
|
|
||||||
def test_get(self):
|
|
||||||
response = self.client.get(f"{URL}", format='json')
|
|
||||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
||||||
|
|
||||||
serializer = OccupationSerializer(
|
|
||||||
Occupation.by_year(self.current_year),
|
|
||||||
many=True
|
|
||||||
)
|
|
||||||
self.assertEqual(response.data["results"], serializer.data)
|
|
||||||
|
|
||||||
def test_get_by_year(self):
|
|
||||||
response = self.client.get(f"{URL}?year={self.old_year}", format='json')
|
|
||||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
||||||
|
|
||||||
serializer = OccupationSerializer(
|
|
||||||
Occupation.by_year(self.old_year),
|
|
||||||
many=True
|
|
||||||
)
|
|
||||||
|
|
||||||
self.assertEqual(response.data["results"], serializer.data)
|
|
||||||
|
|
||||||
def test_by_year_empty(self):
|
|
||||||
response = self.client.get(f"{URL}?year=1971")
|
|
||||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
||||||
self.assertEqual(response.data["results"], [])
|
|
||||||
@@ -39,26 +39,6 @@ class TemplateQuestionTranslationOptions(TranslationOptions):
|
|||||||
fields = ()
|
fields = ()
|
||||||
|
|
||||||
|
|
||||||
@register(BaseRole)
|
|
||||||
class BaseRoleTranslationOptions(TranslationOptions):
|
|
||||||
fields = ('name',)
|
|
||||||
|
|
||||||
|
|
||||||
@register(PresetRole)
|
|
||||||
class PresetRoleTranslationOptions(TranslationOptions):
|
|
||||||
fields = ('description',)
|
|
||||||
|
|
||||||
|
|
||||||
@register(Role)
|
|
||||||
class RoleTranslationOptions(TranslationOptions):
|
|
||||||
fields = ()
|
|
||||||
|
|
||||||
|
|
||||||
@register(Committee)
|
|
||||||
class CommitteeTranslationOptions(TranslationOptions):
|
|
||||||
fields = ('name',)
|
|
||||||
|
|
||||||
|
|
||||||
@register(JobAd)
|
@register(JobAd)
|
||||||
class JobAdTranslationOptions(TranslationOptions):
|
class JobAdTranslationOptions(TranslationOptions):
|
||||||
fields = ('title', 'description', 'content',)
|
fields = ('title', 'description', 'content',)
|
||||||
|
|||||||
@@ -18,8 +18,6 @@ router.register(r'events', EventViewSet)
|
|||||||
router.register(r'signupForm', SignupFormViewSet)
|
router.register(r'signupForm', SignupFormViewSet)
|
||||||
router.register(r'signup', SignupViewSet)
|
router.register(r'signup', SignupViewSet)
|
||||||
router.register(r'feed', FeedViewSet)
|
router.register(r'feed', FeedViewSet)
|
||||||
router.register(r'contacts', ContactsViewSet)
|
|
||||||
router.register(r'committees', CommitteeViewSet)
|
|
||||||
router.register(r'questions', SavedQuestionsViewSet)
|
router.register(r'questions', SavedQuestionsViewSet)
|
||||||
router.register(r'tags', TagsViewSet)
|
router.register(r'tags', TagsViewSet)
|
||||||
router.register(r'jobads', JobAdViewSet)
|
router.register(r'jobads', JobAdViewSet)
|
||||||
|
|||||||
@@ -189,24 +189,6 @@ class FeedViewSet(ModelViewSet):
|
|||||||
return Feed.objects.filter(id__in=result_ids)
|
return Feed.objects.filter(id__in=result_ids)
|
||||||
|
|
||||||
|
|
||||||
class ContactsViewSet(ReadOnlyModelViewSet):
|
|
||||||
queryset = Occupation.objects.all()
|
|
||||||
serializer_class = OccupationSerializer
|
|
||||||
permission_classes = [IsAuthenticatedOrReadOnly]
|
|
||||||
|
|
||||||
def get_queryset(self):
|
|
||||||
year = self.request.query_params.get('year')
|
|
||||||
if not year:
|
|
||||||
return Occupation.by_year(timezone.now().year)
|
|
||||||
return Occupation.by_year(int(year))
|
|
||||||
|
|
||||||
|
|
||||||
class CommitteeViewSet(ReadOnlyModelViewSet):
|
|
||||||
queryset = Committee.objects.all()
|
|
||||||
serializer_class = CommitteeSerializer
|
|
||||||
permission_classes = [IsAuthenticatedOrReadOnly]
|
|
||||||
|
|
||||||
|
|
||||||
class TagsViewSet(ReadOnlyModelViewSet):
|
class TagsViewSet(ReadOnlyModelViewSet):
|
||||||
queryset = Tag.objects.all()
|
queryset = Tag.objects.all()
|
||||||
serializer_class = TagSerializer
|
serializer_class = TagSerializer
|
||||||
|
|||||||
Reference in New Issue
Block a user