This commit is contained in:
2021-01-15 15:42:30 +00:00
parent b0df14e7ae
commit f6b9e2f741
43 changed files with 793 additions and 628 deletions

View File

@@ -6,13 +6,13 @@ from .forms import MemberForm, JobForm, JobGroupForm
class MemberRoleFilter(admin.SimpleListFilter):
title = _('Rolle')
parameter_name = 'role'
title = _("Rolle")
parameter_name = "role"
def lookups(self, request, model_admin):
return (
('A', _('Aktiv')),
('P', _('Pension')),
("A", _("Aktiv")),
("P", _("Pension")),
)
def queryset(self, request, queryset):
@@ -55,40 +55,53 @@ class MemberAdmin(admin.ModelAdmin):
form = MemberForm
model = Member
fieldsets = (
(None, {
'fields': (
('firstname', 'surname',),
'nickname',
'username',
'mailaccount',
'role',
'description',
'image',
'birthday',
'phone',
'address',
)
}),
(
None,
{
"fields": (
(
"firstname",
"surname",
),
"nickname",
"username",
"mailaccount",
"role",
"description",
"image",
"birthday",
"phone",
"address",
)
},
),
)
inlines = (JobOverviewInline,)
list_display = ['nickname', 'firstname', 'surname', 'mailaccount', 'role']
ordering = ['firstname', ]
search_fields = ['firstname', 'surname', 'nickname', 'mailaccount']
list_display = ["nickname", "firstname", "surname", "mailaccount", "role"]
ordering = [
"firstname",
]
search_fields = ["firstname", "surname", "nickname", "mailaccount"]
list_filter = [MemberRoleFilter]
def add_view(self, request, form_url='', extra_context=None):
def add_view(self, request, form_url="", extra_context=None):
extra_context = extra_context or {}
extra_context['help_text'] = "Fette Schriften sind Pflichtfelder."
extra_context["help_text"] = "Fette Schriften sind Pflichtfelder."
return super().add_view(
request, form_url, extra_context=extra_context,
request,
form_url,
extra_context=extra_context,
)
def change_view(self, request, object_id, form_url='', extra_context=None):
def change_view(self, request, object_id, form_url="", extra_context=None):
extra_context = extra_context or {}
extra_context['help_text'] = "Fette Schriften sind Pflichtfelder."
extra_context["help_text"] = "Fette Schriften sind Pflichtfelder."
return super().change_view(
request, object_id, form_url, extra_context=extra_context,
request,
object_id,
form_url,
extra_context=extra_context,
)
def save_model(self, request, obj, form, change):
@@ -101,22 +114,33 @@ class JobAdmin(admin.ModelAdmin):
model = Job
inlines = (ActiveMemberInline, InactiveMemberInline)
list_display = ['name', ]
ordering = ['name', ]
search_fields = ['name', ]
list_display = [
"name",
]
ordering = [
"name",
]
search_fields = [
"name",
]
def add_view(self, request, form_url='', extra_context=None):
def add_view(self, request, form_url="", extra_context=None):
extra_context = extra_context or {}
extra_context['help_text'] = "Fette Schriften sind Pflichtfelder."
extra_context["help_text"] = "Fette Schriften sind Pflichtfelder."
return super().add_view(
request, form_url, extra_context=extra_context,
request,
form_url,
extra_context=extra_context,
)
def change_view(self, request, object_id, form_url='', extra_context=None):
def change_view(self, request, object_id, form_url="", extra_context=None):
extra_context = extra_context or {}
extra_context['help_text'] = "Fette Schriften sind Pflichfelder."
extra_context["help_text"] = "Fette Schriften sind Pflichfelder."
return super().change_view(
request, object_id, form_url, extra_context=extra_context,
request,
object_id,
form_url,
extra_context=extra_context,
)
def save_model(self, request, obj, form, change):
@@ -127,24 +151,36 @@ class JobAdmin(admin.ModelAdmin):
class JobGroupAdmin(admin.ModelAdmin):
form = JobGroupForm
model = JobGroup
inlines = (JobInline, )
inlines = (JobInline,)
list_display = ['name', 'is_pinned', ]
ordering = ['name', ]
search_fields = ['name', ]
list_display = [
"name",
"is_pinned",
]
ordering = [
"name",
]
search_fields = [
"name",
]
def add_view(self, request, form_url='', extra_context=None):
def add_view(self, request, form_url="", extra_context=None):
extra_context = extra_context or {}
extra_context['help_text'] = "Fette Schriften sind Pflichtfelder."
extra_context["help_text"] = "Fette Schriften sind Pflichtfelder."
return super().add_view(
request, form_url, extra_context=extra_context,
request,
form_url,
extra_context=extra_context,
)
def change_view(self, request, object_id, form_url='', extra_context=None):
def change_view(self, request, object_id, form_url="", extra_context=None):
extra_context = extra_context or {}
extra_context['help_text'] = "Fette Schriften sind Pflichfelder."
extra_context["help_text"] = "Fette Schriften sind Pflichfelder."
return super().change_view(
request, object_id, form_url, extra_context=extra_context,
request,
object_id,
form_url,
extra_context=extra_context,
)
def save_model(self, request, obj, form, change):

View File

@@ -2,4 +2,4 @@ from django.apps import AppConfig
class MembersConfig(AppConfig):
name = 'members'
name = "members"

View File

@@ -10,56 +10,68 @@ class MemberForm(forms.ModelForm):
class Meta:
model = Member
fields = [
'firstname', 'surname', 'nickname', 'username', 'mailaccount', 'role', 'description',
'image', 'birthday', 'phone', 'address',
"firstname",
"surname",
"nickname",
"username",
"mailaccount",
"role",
"description",
"image",
"birthday",
"phone",
"address",
]
widgets = {
'description': CKEditorUploadingWidget(config_name='default')
}
widgets = {"description": CKEditorUploadingWidget(config_name="default")}
labels = {
'description': _("Beschreibung zu der Person"),
'image': _("Porträt"),
'birthday': _("Geburtstag"),
'phone': _("Telefonnummer"),
'address': _("Wohnadresse"),
"description": _("Beschreibung zu der Person"),
"image": _("Porträt"),
"birthday": _("Geburtstag"),
"phone": _("Telefonnummer"),
"address": _("Wohnadresse"),
}
help_texts = {
'image': _(
"Mindestgröße: 150*150 px, Verwendbare Formate: ..."
),
'mailaccount': _(
"Die Mailadresse mit '@fet.at' angeben."
),
"image": _("Mindestgröße: 150*150 px, Verwendbare Formate: ..."),
"mailaccount": _("Die Mailadresse mit '@fet.at' angeben."),
}
class JobForm(forms.ModelForm):
class Meta:
model = Job
fields = ['name', 'shortterm', 'slug', 'job_group',]
fields = [
"name",
"shortterm",
"slug",
"job_group",
]
labels = {
'shortterm': _("Kürzel der Tätigkeit"),
'job_group': _("Tätigkeitsbereich"),
"shortterm": _("Kürzel der Tätigkeit"),
"job_group": _("Tätigkeitsbereich"),
}
class JobGroupForm(forms.ModelForm):
class Meta:
model = JobGroup
fields = ['name', 'shortterm', 'slug', 'description', 'is_pinned',]
fields = [
"name",
"shortterm",
"slug",
"description",
"is_pinned",
]
widgets = {
'description': CKEditorUploadingWidget(config_name='default')
}
widgets = {"description": CKEditorUploadingWidget(config_name="default")}
labels = {
'shortterm': _("Kürzel des Tätigkeitsbereichs"),
'description': _("Beschreibung des Tätigkeitsbereichs"),
'is_pinned': _(
"shortterm": _("Kürzel des Tätigkeitsbereichs"),
"description": _("Beschreibung des Tätigkeitsbereichs"),
"is_pinned": _(
"Dieser Tätigkeitsbereich soll im Fachschaftsbereich angeheftet werden, damit es sofort ersichtlich ist."
),
}

View File

@@ -10,15 +10,20 @@ from easy_thumbnails.fields import ThumbnailerImageField
class ActiveJobMemberManager(models.Manager):
'''
"""
return a list of active member, and members who are still working
'''
"""
def get_all_by_slug(self, slug):
return self.get_queryset().filter(job__job_group__slug=slug).order_by('job__slug', 'job_role', 'member__firstname')
return (
self.get_queryset()
.filter(job__job_group__slug=slug)
.order_by("job__slug", "job_role", "member__firstname")
)
def get_queryset(self):
date_today = timezone.now().date()
qs = super().get_queryset().order_by('member__firstname')
qs = super().get_queryset().order_by("member__firstname")
return qs.filter(
Q(member__role=Member.MemberRole.ACTIVE)
@@ -27,15 +32,20 @@ class ActiveJobMemberManager(models.Manager):
class InactiveJobMemberManager(models.Manager):
'''
"""
return a list of inactive member
'''
"""
def get_all_by_slug(self, slug):
return self.get_queryset().filter(job__job_group__slug=slug).order_by('job__slug', 'job_role', 'member__firstname')
return (
self.get_queryset()
.filter(job__job_group__slug=slug)
.order_by("job__slug", "job_role", "member__firstname")
)
def get_queryset(self):
date_today = timezone.now().date()
qs = super().get_queryset().order_by('member__firstname')
qs = super().get_queryset().order_by("member__firstname")
return qs.filter(
Q(member__role=Member.MemberRole.PENSION)
@@ -45,7 +55,7 @@ class InactiveJobMemberManager(models.Manager):
class JobMemberManager(models.Manager):
def get_members(self, role):
qs = self.get_queryset().order_by('member__firstname')
qs = self.get_queryset().order_by("member__firstname")
return qs.filter(Q(member__role=role))
@@ -82,19 +92,19 @@ class JobGroupManager(models.Manager):
class MemberManager(models.Manager):
def get_queryset(self):
return super().get_queryset().order_by('firstname')
return super().get_queryset().order_by("firstname")
class Member(models.Model):
firstname = models.CharField("Vorname", max_length=128)
surname = models.CharField("Nachname", max_length=128)
nickname = models.CharField("Spitzname", max_length=128)
nickname = models.CharField("Spitzname", max_length=128)
username = models.CharField("Benutzername", blank=True, max_length=128)
mailaccount = models.CharField("Mailadresse", unique=True, max_length=128)
class MemberRole(models.TextChoices):
ACTIVE = 'A', _('Active')
PENSION = 'P', _('Pension')
ACTIVE = "A", _("Active")
PENSION = "P", _("Pension")
role = models.CharField(
"Rolle",
@@ -104,14 +114,16 @@ class Member(models.Model):
)
description = models.TextField(null=True, blank=True)
image = ThumbnailerImageField(upload_to='uploads/members/image/')
image = ThumbnailerImageField(upload_to="uploads/members/image/")
birthday = models.DateField(null=True, blank=True)
phone_error_msg = _((
"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_error_msg = _(
(
"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 = models.CharField(validators=[phone_regex], max_length=17, blank=True)
address = models.TextField(null=True, blank=True)
@@ -134,15 +146,12 @@ class Member(models.Model):
if self.image.height < 150 or self.image.width < 150:
raise ValidationError(
_("Das Bild ist zu klein. (Höhe: {}, Breite: {})").format(
self.image.height,
self.image.width
self.image.height, self.image.width
)
)
if not "@fet.at" in self.mailaccount:
raise ValidationError(
_("In der Mailadresse fehlt die Domäne.")
)
raise ValidationError(_("In der Mailadresse fehlt die Domäne."))
def __str__(self):
return self.firstname + " " + self.surname
@@ -198,7 +207,7 @@ class Job(models.Model):
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.shortterm)
#if type(self.job_group) = str:
# if type(self.job_group) = str:
# self.job_group=JobGroup.objects.filter(slug=self.job)
super().save(*args, **kwargs)
@@ -218,18 +227,20 @@ class JobMember(models.Model):
verbose_name="Tätigkeit",
)
job_start = models.DateField('Job Start')
job_end = models.DateField('Job Ende', null=True, blank=True)
job_start = models.DateField("Job Start")
job_end = models.DateField("Job Ende", null=True, blank=True)
class JobRole(models.TextChoices):
PRESIDENT = ('10', _('VorsitzendeR'))
VICE_PRESIDENT = ('20', _('stv VorsitzendeR'))
SECOND_VICE_PRESIDENT = ('30', _('2. stv VorsitzendeR'))
PERSON_RESPONSIBLE = ('40', _('VerantwortlicheR'))
MEMBER = ('50', _('Mitglied'))
SUBSTITUTE_MEMBER = ('60', _('Ersatzmitglied'))
PRESIDENT = ("10", _("VorsitzendeR"))
VICE_PRESIDENT = ("20", _("stv VorsitzendeR"))
SECOND_VICE_PRESIDENT = ("30", _("2. stv VorsitzendeR"))
PERSON_RESPONSIBLE = ("40", _("VerantwortlicheR"))
MEMBER = ("50", _("Mitglied"))
SUBSTITUTE_MEMBER = ("60", _("Ersatzmitglied"))
job_role = models.CharField(max_length=2, choices=JobRole.choices, default=JobRole.MEMBER)
job_role = models.CharField(
max_length=2, choices=JobRole.choices, default=JobRole.MEMBER
)
objects = models.Manager()
members = JobMemberManager()

View File

@@ -4,65 +4,50 @@ from rest_framework import serializers
class MemberSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Member
fields = ['id',
'firstname',
'surname',
'nickname',
'mailaccount',
'role',
'description',
'image',
'birthday',
fields = [
"id",
"firstname",
"surname",
"nickname",
"mailaccount",
"role",
"description",
"image",
"birthday",
]
class JobGroupSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = JobGroup
fields = [
'id',
'name',
'shortterm',
'slug'
]
fields = ["id", "name", "shortterm", "slug"]
class JobSerializer(serializers.HyperlinkedModelSerializer):
#job_group = JobGroupSerializer()
# job_group = JobGroupSerializer()
job_group = serializers.SlugRelatedField(
slug_field='slug',queryset = JobGroup.objects
)
slug_field="slug", queryset=JobGroup.objects
)
class Meta:
model = Job
fields = [
'id',
'name',
'shortterm',
'job_group',
'slug'
]
fields = ["id", "name", "shortterm", "job_group", "slug"]
class JobMemberSerializer(serializers.HyperlinkedModelSerializer):
#member = MemberSerializer()
#job = JobSerializer()
job = serializers.SlugRelatedField(
slug_field='slug',queryset = Job.objects
)
member= serializers.SlugRelatedField(
slug_field='mailaccount',queryset = Member.objects
)
# member = MemberSerializer()
# job = JobSerializer()
job = serializers.SlugRelatedField(slug_field="slug", queryset=Job.objects)
member = serializers.SlugRelatedField(
slug_field="mailaccount", queryset=Member.objects
)
class Meta:
model = JobMember
fields = [
'id',
'job_start',
'job_end',
'member',
'job',
'job_role'
]
fields = ["id", "job_start", "job_end", "member", "job", "job_role"]
# def create(self, validated_data):
# member_data = validated_data.pop('member')

View File

@@ -4,14 +4,14 @@ from . import views
urlpatterns = [
path('', views.index, name='members'),
path('<str:filter>', views.members_view),
path("", views.index, name="members"),
path("<str:filter>", views.members_view),
]
member_urlpatterns = [
path('<str:member_id>', views.profile_view, name='member'),
path("<str:member_id>", views.profile_view, name="member"),
]
jobs_urlpatterns = [
path('<str:slug>', views.jobs_view, name='jobs'),
path("<str:slug>", views.jobs_view, name="jobs"),
]

View File

@@ -7,6 +7,7 @@ from .models import Member, JobMember, JobGroup, Job
from posts.models import Post
import logging
logger = logging.getLogger(__name__)
@@ -41,7 +42,7 @@ def index(request):
pinned_job_groups, unpinned_job_groups = __get_job_groups()
members = deque(Member.all_members.all())
fs_info = Post.objects.filter(slug='fachschaft-info').first()
fs_info = Post.objects.filter(slug="fachschaft-info").first()
context = {
"pinned_job_groups": pinned_job_groups,
@@ -50,14 +51,16 @@ def index(request):
"fs_info": fs_info,
}
return render(request, 'members/index.html', context)
return render(request, "members/index.html", context)
def jobs_view(request, slug=None):
pinned_job_groups, unpinned_job_groups = __get_job_groups()
try:
description = JobGroup.all_jobgroups.filter(slug=slug).values().first()['description']
description = (
JobGroup.all_jobgroups.filter(slug=slug).values().first()["description"]
)
except Exception as e:
logger.info("Wrong job '{}'".format(slug))
raise Http404("wrong job")
@@ -71,7 +74,7 @@ def jobs_view(request, slug=None):
"job_members": job_members,
}
return render(request, 'members/index.html', context)
return render(request, "members/index.html", context)
def members_view(request, filter=None):
@@ -83,7 +86,7 @@ def members_view(request, filter=None):
logger.info("Wrong member role '{}'".format(filter))
raise Http404("no member role")
fs_info = Post.objects.filter(slug='fachschaft-info').first()
fs_info = Post.objects.filter(slug="fachschaft-info").first()
context = {
"pinned_job_groups": pinned_job_groups,
@@ -92,7 +95,7 @@ def members_view(request, filter=None):
"fs_info": fs_info,
}
return render(request, 'members/index.html', context)
return render(request, "members/index.html", context)
def profile_view(request, member_id=None):
@@ -112,4 +115,4 @@ def profile_view(request, member_id=None):
"jobs": jobs,
}
return render(request, 'members/member.html', context)
return render(request, "members/member.html", context)

View File

@@ -2,54 +2,63 @@ from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import viewsets
from .models import Member, JobMember, JobGroup, Job
from .serializers import MemberSerializer, JobSerializer, JobGroupSerializer, JobMemberSerializer
from .serializers import (
MemberSerializer,
JobSerializer,
JobGroupSerializer,
JobMemberSerializer,
)
class MemberViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows users to be viewed or edited.
"""
queryset = Member.all_members.order_by('nickname')
queryset = Member.all_members.order_by("nickname")
serializer_class = MemberSerializer
#permission_classes = [permissions.IsAuthenticated]
# permission_classes = [permissions.IsAuthenticated]
filter_backends = [DjangoFilterBackend]
filterset_fields = ['nickname','mailaccount']
#lookup_field = 'name'
filterset_fields = ["nickname", "mailaccount"]
# lookup_field = 'name'
def pre_save(self, obj):
obj.image = self.request.FILES.get('image')
obj.image = self.request.FILES.get("image")
class JobGroupViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows users to be viewed or edited.
"""
queryset = JobGroup.all_jobgroups.all()
serializer_class = JobGroupSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['name','slug']
#lookup_field = 'name'
filterset_fields = ["name", "slug"]
# lookup_field = 'name'
class JobViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows users to be viewed or edited.
"""
queryset = Job.objects.all()
serializer_class = JobSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['name','slug']
#lookup_field = 'slug'
filterset_fields = ["name", "slug"]
# lookup_field = 'slug'
class JobMemberViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows users to be viewed or edited.
"""
queryset = JobMember.objects.all()
serializer_class = JobMemberSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['member','job','job_role','job_start']
#lookup_field = 'nickname'
filterset_fields = ["member", "job", "job_role", "job_start"]
# lookup_field = 'nickname'