in the job are shown first the active members, second the inactive members.

add short term and slug - as first version.
delete unique filter.
This commit is contained in:
2020-07-14 16:44:58 +00:00
parent aac661fdc3
commit 5232ac5a8a
4 changed files with 97 additions and 40 deletions

View File

@@ -1,29 +1,12 @@
from django.contrib import admin from django.contrib import admin
from django.utils.translation import gettext as _
from .models import Member, Job, JobMember from .models import Member, Job, JobMember
from .forms import MyMemberForm, MyJobForm from .forms import MyMemberForm, MyJobForm
from django.utils.translation import gettext as _
class ActiveJobFilter(admin.SimpleListFilter):
title = _('Aktiv im Job')
parameter_name = 'is_active'
def lookups(self, request, model_admin):
return (
('yes', _('Yes')),
('no', _('No')),
)
def queryset(self, request, queryset):
if self.value() == 'yes':
return queryset.filter(job_end__isnull=True)
elif self.value() == 'no':
return queryset
class MemberRoleFilter(admin.SimpleListFilter): class MemberRoleFilter(admin.SimpleListFilter):
title = _('Rolle') title = _('Rolle')
parameter_name = 'role' parameter_name = 'role'
def lookups(self, request, model_admin): def lookups(self, request, model_admin):
@@ -39,19 +22,32 @@ class MemberRoleFilter(admin.SimpleListFilter):
return queryset.filter(role='P') return queryset.filter(role='P')
class JobMemberInline(admin.TabularInline): class JobMemberInline(admin.TabularInline):
list_filter = [ActiveJobFilter]
model = JobMember model = JobMember
extra = 0 extra = 0
#def get_queryset(self, request): class JobInline(JobMemberInline):
# qs = super().get_queryset(request) verbose_name = "Tätigkeit"
# return qs.filter(job_end__isnull=False) verbose_name_plural = "Tätigkeitsübersicht"
class ActiveMemberInline(JobMemberInline):
verbose_name = "Mitglied"
verbose_name_plural = "Aktive Mitglieder Liste"
def get_queryset(self, request):
return JobMember.active_member.all()
class InactiveMemberInline(JobMemberInline):
verbose_name = "Mitglied"
verbose_name_plural = "Inaktive Mitglieder Liste"
def get_queryset(self, request):
return JobMember.inactive_member.all()
class MyMemberAdmin(admin.ModelAdmin): class MyMemberAdmin(admin.ModelAdmin):
form = MyMemberForm form = MyMemberForm
model = Member model = Member
list_display = ['nickname', 'firstname', 'surname', 'mailaccount', 'role'] list_display = ['nickname', 'firstname', 'surname', 'mailaccount', 'role']
inlines = (JobMemberInline,) inlines = (JobInline,)
search_fields = ['firstname', 'surname','nickname','mailaccount'] search_fields = ['firstname', 'surname','nickname','mailaccount']
list_filter = [MemberRoleFilter] list_filter = [MemberRoleFilter]
@@ -66,7 +62,7 @@ class MyJobAdmin(admin.ModelAdmin):
form = MyJobForm form = MyJobForm
model = Job model = Job
list_display = ['name'] list_display = ['name']
inlines = (JobMemberInline,) inlines = (ActiveMemberInline, InactiveMemberInline)
search_fields = ['name'] search_fields = ['name']

View File

@@ -25,6 +25,6 @@ class MyMemberForm(forms.ModelForm):
class MyJobForm(forms.ModelForm): class MyJobForm(forms.ModelForm):
class Meta: class Meta:
model = Job model = Job
fields = ['name', 'description', 'image'] fields = ['name', 'shortterm', 'slug', 'description', 'image']
widgets = {'description': CKEditorUploadingWidget(config_name='default')} widgets = {'description': CKEditorUploadingWidget(config_name='default')}

View File

@@ -1,10 +1,15 @@
from django.core.validators import RegexValidator from django.core.validators import RegexValidator
from django.db import models from django.db import models
from django.db.models import Q
from django.utils import timezone
from django.utils.text import slugify
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from rest_framework import serializers from rest_framework import serializers
import uuid import uuid
from datetime import timedelta
class MemberManager(models.Manager): class MemberManager(models.Manager):
def get_queryset(self): def get_queryset(self):
@@ -14,6 +19,36 @@ class PensionManager(models.Manager):
def get_queryset(self): def get_queryset(self):
return super().get_queryset().filter(role='P') return super().get_queryset().filter(role='P')
class ActiveMemberManager(models.Manager):
'''
return a list of active member, and members who are still working
'''
def get_queryset(self):
date_today = timezone.now().date()
return super().get_queryset().filter(
Q(member__role='A') &
(
Q(job_end__gt=date_today) |
Q(job_end__isnull=True)
)
)
class InactiveMemberManager(models.Manager):
'''
return a list of inactive member
'''
def get_queryset(self):
date_today = timezone.now().date()
return super().get_queryset().filter(
Q(member__role='P') |
(
Q(job_end__lt=date_today + timedelta(days=1)) &
Q(job_end__isnull=False)
)
)
class Member(models.Model): class Member(models.Model):
firstname = models.CharField(max_length=128) firstname = models.CharField(max_length=128)
surname = models.CharField(max_length=128) surname = models.CharField(max_length=128)
@@ -31,8 +66,10 @@ class Member(models.Model):
birthday = models.DateField(null=True, blank=True) birthday = models.DateField(null=True, blank=True)
phone_error_msg =_(("Phone number must be entered in the format: " phone_error_msg =_((
"+999999999'. Up to 15 digits allowed.")) "Phone number must be entered in the format: "
"+999999999'. Up to 15 digits allowed."
))
phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message=phone_error_msg) phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message=phone_error_msg)
phone = models.CharField(validators=[phone_regex], max_length=17, blank=True) phone = models.CharField(validators=[phone_regex], max_length=17, blank=True)
@@ -44,7 +81,7 @@ class Member(models.Model):
has_jobs = models.ManyToManyField( has_jobs = models.ManyToManyField(
'Job', 'Job',
through='JobMember', through='JobMember',
through_fields=('member', 'job') through_fields=('member', 'job'),
) )
# Managers # Managers
@@ -52,6 +89,10 @@ class Member(models.Model):
active_member = MemberManager() active_member = MemberManager()
pension_member = PensionManager() pension_member = PensionManager()
class Meta:
verbose_name = "Mitglied"
verbose_name_plural = "Mitglieder"
def __str__(self): def __str__(self):
return self.firstname + " " + self.surname return self.firstname + " " + self.surname
@@ -70,6 +111,9 @@ class MemberSerializer(serializers.HyperlinkedModelSerializer):
class Job(models.Model): class Job(models.Model):
name = models.CharField(max_length=128) name = models.CharField(max_length=128)
shortterm = models.CharField(max_length=128)
slug = models.SlugField(unique=True, null=True, blank=True)
description = models.TextField(null=True, blank=True) description = models.TextField(null=True, blank=True)
image = models.ImageField(null=True, blank=True) image = models.ImageField(null=True, blank=True)
@@ -77,15 +121,33 @@ class Job(models.Model):
has_members = models.ManyToManyField( has_members = models.ManyToManyField(
'Member', 'Member',
through='JobMember', through='JobMember',
through_fields=('job', 'member') through_fields=('job', 'member'),
) )
class Meta:
verbose_name = "Tätigkeit"
verbose_name_plural = "Tätigkeiten"
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.shortterm)
super().save(*args, **kwargs)
def __str__(self): def __str__(self):
return self.name return self.shortterm
class JobMember(models.Model): class JobMember(models.Model):
member = models.ForeignKey(Member, on_delete=models.CASCADE) member = models.ForeignKey(
job = models.ForeignKey(Job, on_delete=models.CASCADE) Member,
on_delete=models.CASCADE,
verbose_name = "Mitglied",
)
job = models.ForeignKey(
Job,
on_delete=models.CASCADE,
verbose_name = "Tätigkeit",
)
job_start = models.DateField('Job Start') job_start = models.DateField('Job Start')
job_end = models.DateField('Job Ende', null=True, blank=True) job_end = models.DateField('Job Ende', null=True, blank=True)
@@ -100,7 +162,6 @@ class JobMember(models.Model):
] ]
job_role = models.CharField(max_length=2, choices=__choices, default='M') job_role = models.CharField(max_length=2, choices=__choices, default='M')
class Meta:
unique_together = [['member', 'job']]
jobmember = models.Manager() jobmember = models.Manager()
active_member = ActiveMemberManager()
inactive_member = InactiveMemberManager()

View File

@@ -13,11 +13,11 @@ from django_filters.rest_framework import DjangoFilterBackend
def index(request): def index(request):
#members = deque(Member.all_members.all()) #members = deque(Member.all_members.all())
members = deque(Member.all_members.prefetch_related('has_jobs')) members = deque(Member.all_members.prefetch_related('has_jobs'))
jobmembers = deque(JobMember.jobmember.all())
#jobmember = deque(JobMember.jobmember.all())
context = { context = {
"member": members "members": members,
"jobmembers" : jobmembers,
} }
return render(request, 'members/index.html', context) return render(request, 'members/index.html', context)