update members templates and views
members layout is not finished
This commit is contained in:
@@ -34,5 +34,5 @@ urlpatterns = [
|
|||||||
path('index.html', views.index, name='home'),
|
path('index.html', views.index, name='home'),
|
||||||
path('ckeditor/', include('ckeditor_uploader.urls')),
|
path('ckeditor/', include('ckeditor_uploader.urls')),
|
||||||
path('api/', include(router.urls)),
|
path('api/', include(router.urls)),
|
||||||
path('members/', include('members.urls')),
|
path('members/', include('members.urls'), name='members'),
|
||||||
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||||
|
|||||||
@@ -16,10 +16,8 @@ class MemberRoleFilter(admin.SimpleListFilter):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def queryset(self, request, queryset):
|
def queryset(self, request, queryset):
|
||||||
if self.value() == 'A':
|
if self.value() in Member.MemberRole:
|
||||||
return queryset.filter(role='A')
|
return queryset.filter(role=self.value())
|
||||||
elif self.value() == 'P':
|
|
||||||
return queryset.filter(role='P')
|
|
||||||
|
|
||||||
|
|
||||||
class JobMemberInline(admin.TabularInline):
|
class JobMemberInline(admin.TabularInline):
|
||||||
@@ -37,7 +35,7 @@ class ActiveMemberInline(JobMemberInline):
|
|||||||
verbose_name_plural = "Aktive Mitglieder Liste"
|
verbose_name_plural = "Aktive Mitglieder Liste"
|
||||||
|
|
||||||
def get_queryset(self, request):
|
def get_queryset(self, request):
|
||||||
return JobMember.active_member.all()
|
return JobMember.active_member.get_all()
|
||||||
|
|
||||||
|
|
||||||
class InactiveMemberInline(JobMemberInline):
|
class InactiveMemberInline(JobMemberInline):
|
||||||
@@ -45,7 +43,7 @@ class InactiveMemberInline(JobMemberInline):
|
|||||||
verbose_name_plural = "Inaktive Mitglieder Liste"
|
verbose_name_plural = "Inaktive Mitglieder Liste"
|
||||||
|
|
||||||
def get_queryset(self, request):
|
def get_queryset(self, request):
|
||||||
return JobMember.inactive_member.all()
|
return JobMember.inactive_member.get_all()
|
||||||
|
|
||||||
|
|
||||||
class JobInline(admin.TabularInline):
|
class JobInline(admin.TabularInline):
|
||||||
|
|||||||
@@ -45,4 +45,4 @@ class MyJobForm(forms.ModelForm):
|
|||||||
class MyJobGroupForm(forms.ModelForm):
|
class MyJobGroupForm(forms.ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = JobGroup
|
model = JobGroup
|
||||||
fields = ['name', 'shortterm', 'is_pinned']
|
fields = ['name', 'shortterm', 'slug', 'is_pinned']
|
||||||
|
|||||||
@@ -4,45 +4,78 @@ from django.db.models import Q
|
|||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.utils.text import slugify
|
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
|
|
||||||
|
|
||||||
# import uuid
|
|
||||||
|
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
|
from rest_framework import serializers
|
||||||
|
|
||||||
|
|
||||||
class MemberManager(models.Manager):
|
class MemberQuerySet(models.QuerySet):
|
||||||
def get_queryset(self):
|
def get_members(self):
|
||||||
return super().get_queryset().filter(role='A')
|
date_today = timezone.now().date()
|
||||||
|
|
||||||
|
return self.filter(
|
||||||
|
Q(member__role=Member.MemberRole.ACTIVE)
|
||||||
|
& (Q(job_end__gt=date_today) | Q(job_end__isnull=True))
|
||||||
|
)
|
||||||
|
|
||||||
class PensionManager(models.Manager):
|
def get_inactive(self):
|
||||||
def get_queryset(self):
|
date_today = timezone.now().date()
|
||||||
return super().get_queryset().filter(role='P')
|
|
||||||
|
return self.filter(
|
||||||
|
Q(member__role=Member.MemberRole.PENSION)
|
||||||
|
| (Q(job_end__lt=date_today + timedelta(days=1)) & Q(job_end__isnull=False))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class ActiveMemberManager(models.Manager):
|
class ActiveMemberManager(models.Manager):
|
||||||
'''
|
'''
|
||||||
return a list of active member, and members who are still working
|
return a list of active member, and members who are still working
|
||||||
'''
|
'''
|
||||||
def get_queryset(self):
|
def get_members_of_job(self, job_names):
|
||||||
date_today = timezone.now().date()
|
tmp_list = []
|
||||||
|
for job_name in job_names:
|
||||||
|
tmp_list.append(self.get_queryset().get_members().filter(Q(job__name=job_name)))
|
||||||
|
return tmp_list
|
||||||
|
|
||||||
return super().get_queryset().filter(
|
def get_all(self):
|
||||||
Q(member__role='A')
|
return self.get_queryset().get_members()
|
||||||
& (Q(job_end__gt=date_today) | Q(job_end__isnull=True)))
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return MemberQuerySet(self.model, using=self._db)
|
||||||
|
|
||||||
|
|
||||||
class InactiveMemberManager(models.Manager):
|
class InactiveMemberManager(models.Manager):
|
||||||
'''
|
'''
|
||||||
return a list of inactive member
|
return a list of inactive member
|
||||||
'''
|
'''
|
||||||
def get_queryset(self):
|
def get_members_of_job(self, job_names):
|
||||||
date_today = timezone.now().date()
|
tmp_list = []
|
||||||
|
for job_name in job_names:
|
||||||
|
tmp_list.append(self.get_queryset().get_inactive().filter(Q(job__name=job_name)))
|
||||||
|
return tmp_list
|
||||||
|
|
||||||
return super().get_queryset().filter(
|
def get_all(self):
|
||||||
Q(member__role='P')
|
return self.get_queryset().get_inactive()
|
||||||
| (Q(job_end__lt=date_today + timedelta(days=1)) & Q(job_end__isnull=False)))
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return MemberQuerySet(self.model, using=self._db)
|
||||||
|
|
||||||
|
|
||||||
|
class MemberManager(models.Manager):
|
||||||
|
def get_members(self, role):
|
||||||
|
return self.get_queryset().filter(Q(member__role=role))
|
||||||
|
|
||||||
|
def get_all(self):
|
||||||
|
return self.get_queryset()
|
||||||
|
|
||||||
|
|
||||||
|
class JobManager(models.Manager):
|
||||||
|
def get_job_names(self, slug):
|
||||||
|
tmp_list = []
|
||||||
|
for i in self.get_queryset().filter(Q(job__job_group__slug=slug)):
|
||||||
|
if i.job.name not in tmp_list:
|
||||||
|
tmp_list.append(i.job.name)
|
||||||
|
return tmp_list
|
||||||
|
|
||||||
|
|
||||||
class Member(models.Model):
|
class Member(models.Model):
|
||||||
@@ -51,13 +84,11 @@ class Member(models.Model):
|
|||||||
nickname = models.CharField(max_length=128)
|
nickname = models.CharField(max_length=128)
|
||||||
mailaccount = models.CharField(max_length=128)
|
mailaccount = models.CharField(max_length=128)
|
||||||
|
|
||||||
__choices = [
|
class MemberRole(models.TextChoices):
|
||||||
('A', _('Active')),
|
ACTIVE = 'A', _('Active')
|
||||||
('P', _('Pension')),
|
PENSION = 'P', _('Pension')
|
||||||
]
|
|
||||||
role = models.CharField(max_length=1, choices=__choices, default='A')
|
|
||||||
|
|
||||||
role_choices=[c[0] for c in __choices] # Letter from choices
|
role = models.CharField(max_length=1, choices=MemberRole.choices, default=MemberRole.ACTIVE)
|
||||||
|
|
||||||
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)
|
||||||
@@ -65,18 +96,10 @@ class Member(models.Model):
|
|||||||
birthday = models.DateField(null=True, blank=True)
|
birthday = models.DateField(null=True, blank=True)
|
||||||
|
|
||||||
phone_error_msg = _((
|
phone_error_msg = _((
|
||||||
"Phone number must be entered in the format: "
|
"Phone number must be entered in the format: +999999999'. Up to 15 digits allowed."
|
||||||
"+999999999'. Up to 15 digits allowed."
|
|
||||||
))
|
))
|
||||||
phone_regex = RegexValidator(
|
phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message=phone_error_msg)
|
||||||
regex=r'^\+?1?\d{9,15}$',
|
phone = models.CharField(validators=[phone_regex], max_length=17, blank=True)
|
||||||
message=phone_error_msg,
|
|
||||||
)
|
|
||||||
phone = models.CharField(
|
|
||||||
validators=[phone_regex],
|
|
||||||
max_length=17,
|
|
||||||
blank=True,
|
|
||||||
)
|
|
||||||
|
|
||||||
address = models.TextField(null=True, blank=True)
|
address = models.TextField(null=True, blank=True)
|
||||||
|
|
||||||
@@ -85,12 +108,6 @@ class Member(models.Model):
|
|||||||
|
|
||||||
# Managers
|
# Managers
|
||||||
all_members = models.Manager()
|
all_members = models.Manager()
|
||||||
active_member = MemberManager()
|
|
||||||
pension_member = PensionManager()
|
|
||||||
|
|
||||||
@property
|
|
||||||
def all_jobs(self):
|
|
||||||
return [j.job for j in self.jobs.all()]
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = "Mitglied"
|
verbose_name = "Mitglied"
|
||||||
@@ -117,6 +134,9 @@ class MemberSerializer(serializers.HyperlinkedModelSerializer):
|
|||||||
class JobGroup(models.Model):
|
class JobGroup(models.Model):
|
||||||
name = models.CharField(max_length=128)
|
name = models.CharField(max_length=128)
|
||||||
shortterm = models.CharField(max_length=128)
|
shortterm = models.CharField(max_length=128)
|
||||||
|
|
||||||
|
slug = models.SlugField(unique=True, null=True, blank=True)
|
||||||
|
|
||||||
is_pinned = models.BooleanField(default=False)
|
is_pinned = models.BooleanField(default=False)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
@@ -131,40 +151,13 @@ class Job(models.Model):
|
|||||||
|
|
||||||
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)
|
||||||
#objects = models.Manager()
|
|
||||||
job_group = models.ForeignKey(
|
job_group = models.ForeignKey(
|
||||||
JobGroup,
|
JobGroup,
|
||||||
on_delete=models.CASCADE,
|
on_delete=models.CASCADE,
|
||||||
verbose_name="Job Gruppe",
|
verbose_name="Job Gruppe",
|
||||||
)
|
)
|
||||||
|
|
||||||
@property
|
|
||||||
def active_members(self):
|
|
||||||
"Active Members for this job"
|
|
||||||
date_today = timezone.now().date()
|
|
||||||
def sorted_jobmembers():
|
|
||||||
return sorted(list(self.jobmembers.filter(Q(member__role ='A') &
|
|
||||||
(Q(job_end__gt=date_today) | Q(job_end__isnull=True))).all()), # filter active fehlt noch
|
|
||||||
key=lambda x: (JobMember._role_sort[x.job_role], JobMember.job_start))
|
|
||||||
m =[jm.member_with_role for jm in sorted_jobmembers()]
|
|
||||||
|
|
||||||
return m
|
|
||||||
|
|
||||||
@property
|
|
||||||
def active_members_count(self):
|
|
||||||
"Count Active Members"
|
|
||||||
date_today = timezone.now().date()
|
|
||||||
return self.jobmembers.filter(Q(member__role ='A') &
|
|
||||||
(Q(job_end__gt=date_today) | Q(job_end__isnull=True))).count()
|
|
||||||
|
|
||||||
@property
|
|
||||||
def inactive_members(self):
|
|
||||||
"return the inactive members"
|
|
||||||
date_today = timezone.now().date()
|
|
||||||
return [jm.member for jm in self.jobmembers.filter(~Q(member__role ='A') |
|
|
||||||
(Q(job_end__lt=date_today) & Q(job_end__isnull=False))).all()] # filter inactive fehlt noch
|
|
||||||
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = "Tätigkeit"
|
verbose_name = "Tätigkeit"
|
||||||
verbose_name_plural = "Tätigkeiten"
|
verbose_name_plural = "Tätigkeiten"
|
||||||
@@ -184,47 +177,28 @@ class JobMember(models.Model):
|
|||||||
Member,
|
Member,
|
||||||
on_delete=models.CASCADE,
|
on_delete=models.CASCADE,
|
||||||
verbose_name="Mitglied",
|
verbose_name="Mitglied",
|
||||||
related_name="jobs"
|
|
||||||
)
|
)
|
||||||
job = models.ForeignKey(
|
job = models.ForeignKey(
|
||||||
Job,
|
Job,
|
||||||
on_delete=models.CASCADE,
|
on_delete=models.CASCADE,
|
||||||
verbose_name="Tätigkeit",
|
verbose_name="Tätigkeit",
|
||||||
related_name="jobmembers"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
@property
|
class JobRole(models.TextChoices):
|
||||||
def member_with_role(self):
|
PRESIDENT = '1V', _('VorsitzendeR')
|
||||||
"return the member with added role and job start and job end"
|
VICE_PRESIDENT = '2V', _('stv VorsitzendeR')
|
||||||
m=self.member
|
SECOND_VICE_PRESIDENT = '3V', _('2. stv VorsitzendeR')
|
||||||
m.job_start=self.job_start
|
MEMBER = 'M', _('Mitglied')
|
||||||
m.job_end=self.job_end
|
SUBSTITUTE_MEMBER = 'E', _('Ersatzmitglied')
|
||||||
m.job_role=self.job_role
|
PERSON_RESPONSIBLE = 'V', _('VerantwortlicheR')
|
||||||
m.job_role_text=dict(JobMember._choices)[self.job_role]
|
|
||||||
return m
|
|
||||||
|
|
||||||
_choices = [
|
job_role = models.CharField(max_length=2, choices=JobRole.choices, default=JobRole.MEMBER)
|
||||||
('1V', _('VorsitzendeR')),
|
|
||||||
('2V', _('stv VorsitzendeR')),
|
|
||||||
('3V', _('2. stv VorsitzendeR')),
|
|
||||||
('M', _('Mitglied')),
|
|
||||||
('E', _('Ersatzmitglied')),
|
|
||||||
('V', _('VerantwortlicheR'))
|
|
||||||
]
|
|
||||||
_role_sort = {
|
|
||||||
'1V': 1,
|
|
||||||
'2V': 2,
|
|
||||||
'3V': 3,
|
|
||||||
'4V': 4,
|
|
||||||
'M':5,
|
|
||||||
'E':6,
|
|
||||||
'V':7
|
|
||||||
}
|
|
||||||
job_role = models.CharField(max_length=2, choices=_choices, default='M')
|
|
||||||
|
|
||||||
jobmember = models.Manager()
|
members = MemberManager()
|
||||||
active_member = ActiveMemberManager()
|
active_member = ActiveMemberManager()
|
||||||
inactive_member = InactiveMemberManager()
|
inactive_member = InactiveMemberManager()
|
||||||
|
|
||||||
|
jobs = JobManager()
|
||||||
|
|||||||
@@ -4,8 +4,7 @@ from . import views
|
|||||||
|
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', views.index, name='members.index'),
|
path('', views.index, name='members'),
|
||||||
path('list', views.list, name='members.list'),
|
path('<str:filter>', views.index),
|
||||||
path('list/<str:filter>', views.list, name='members.list'),
|
path('jobs/<str:slug>', views.index),
|
||||||
path('<str:slug>', views.show_job, name='members.show_job')
|
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -3,43 +3,41 @@ from django.shortcuts import render
|
|||||||
|
|
||||||
from collections import deque
|
from collections import deque
|
||||||
|
|
||||||
from .models import Member, Job, JobMember, JobGroup, MemberSerializer
|
from .models import Member, JobMember, JobGroup, MemberSerializer
|
||||||
|
|
||||||
from rest_framework import viewsets
|
from rest_framework import viewsets
|
||||||
from rest_framework import permissions
|
from rest_framework import permissions
|
||||||
# from django_filters.rest_framework import DjangoFilterBackend
|
# from django_filters.rest_framework import DjangoFilterBackend
|
||||||
|
|
||||||
|
|
||||||
def index(request):
|
def index(request, slug=None, filter=None):
|
||||||
# members = deque(Member.all_members.all())
|
job_group = deque(JobGroup.objects.all())
|
||||||
members = deque(Member.all_members.all())
|
job_list = []
|
||||||
jobmembers = deque(JobMember.jobmember.all())
|
members = None
|
||||||
jobs = deque(Job.objects.all())
|
|
||||||
jobgroups = deque(JobGroup.objects.all())
|
if slug is not None:
|
||||||
|
job_names = JobMember.jobs.get_job_names(slug=slug)
|
||||||
|
active_members = JobMember.active_member.get_members_of_job(job_names=job_names)
|
||||||
|
inactive_members = JobMember.inactive_member.get_members_of_job(job_names=job_names)
|
||||||
|
|
||||||
|
for idx, item in enumerate(job_names):
|
||||||
|
job_list.append((job_names[idx], active_members[idx], inactive_members[idx]))
|
||||||
|
else:
|
||||||
|
if filter is None:
|
||||||
|
members = deque(Member.all_members.all())
|
||||||
|
elif filter in Member.MemberRole:
|
||||||
|
members = deque(Member.all_members.filter(role=filter))
|
||||||
|
else:
|
||||||
|
members = None
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
|
"job_group": job_group,
|
||||||
|
"job_list": job_list,
|
||||||
"members": members,
|
"members": members,
|
||||||
"jobmembers": jobmembers,
|
|
||||||
"jobgroups": jobgroups,
|
|
||||||
"jobs": jobs,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return render(request, 'members/index.html', context)
|
return render(request, 'members/index.html', context)
|
||||||
|
|
||||||
def show_job(request, slug=None):
|
|
||||||
job=Job.objects.get(slug=slug)
|
|
||||||
return render(request, 'members/show_job.html', {"job": job})
|
|
||||||
|
|
||||||
def list(request, filter=None):
|
|
||||||
"""
|
|
||||||
View for a list of members filtered or not
|
|
||||||
"""
|
|
||||||
if filter is None:
|
|
||||||
members = deque(Member.all_members.all())
|
|
||||||
if filter in Member.role_choices:
|
|
||||||
members=deque(Member.all_members.filter(role=filter).all())
|
|
||||||
|
|
||||||
return render(request, 'members/list.html',{"members": members})
|
|
||||||
|
|
||||||
class MemberViewSet(viewsets.ModelViewSet):
|
class MemberViewSet(viewsets.ModelViewSet):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
<li class=""><a href="{%url 'home'%}">Aktuelles</a> </li>
|
<li class=""><a href="{%url 'home'%}">Aktuelles</a> </li>
|
||||||
<li class=""><a href="/fotos">Fotos</a> </li>
|
<li class=""><a href="/fotos">Fotos</a> </li>
|
||||||
<li class=""><a href="{%url 'members.index'%}">Mitarbeiter</a>
|
<li class=""><a href="{%url 'members'%}">Mitarbeiter</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,89 +1,46 @@
|
|||||||
{% extends 'layout.html' %}
|
{% extends 'layout.html' %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
<div class="grid-container">
|
<div class="grid-container">
|
||||||
<a href="{% url 'members.list' 'A' %}">
|
<h1>Mitglieder / Tätigkeiten</h1>
|
||||||
Aktive Mitglieder
|
|
||||||
</a>
|
|
||||||
{% for job in jobs %}
|
|
||||||
<a href="{% url 'members.show_job' job.slug %}">
|
|
||||||
{{job.name}}
|
|
||||||
</a>
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
|
<!-- Nav tabs -->
|
||||||
|
<ul class="nav nav-tabs nav-fill">
|
||||||
|
<a class="active" id="members" data-toggle="tab" href="/members">Mitglieder</a>
|
||||||
|
<a id="members" data-toggle="tab" href="/members/A">Aktive Mitglieder</a>
|
||||||
|
<a id="members" data-toggle="tab" href="/members/P">Inaktive Mitglieder</a>
|
||||||
|
{% for job in job_group %}
|
||||||
|
<a id="jobs-{{job.id}}" data-toggle="tab" href="/members/jobs/{{job.slug}}">{{job.name}}</a>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
|
||||||
<div class="grid-x">
|
<!-- Tab panes -->
|
||||||
<div class="medium-8 cell">
|
<div class="tab-content" id="nav-tabContent">
|
||||||
<h1>Members</h1>
|
|
||||||
{% for m in members %}
|
<div id="members" class="tab-pane fade in active">
|
||||||
<div class="member-hero-text">
|
{% if members == None %}
|
||||||
{% if m.image %}
|
|
||||||
<img src={{m.image.url}} style="width:150px;"/> </br>
|
|
||||||
{% else %}
|
{% else %}
|
||||||
|
{% include 'members/members_list.html' %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
Name: {{m.firstname|safe}} {{m.surname}} </br>
|
|
||||||
Spitzname: {{m.nickname|safe}} </br>
|
|
||||||
Mailaccount: {{m.mailaccount|safe}} </br>
|
|
||||||
Beschreibung: {{m.description|safe}} </br>
|
|
||||||
Geburtstag: {{m.birthday}} </br>
|
|
||||||
Telefonnummer: {{m.phone}} </br>
|
|
||||||
Adresse: {{m.address}} </br>
|
|
||||||
</div>
|
</div>
|
||||||
</br>
|
|
||||||
<h2>Jobs</h2>
|
|
||||||
{% for jobm in jobmembers %}
|
|
||||||
{% if m == jobm.member %}
|
|
||||||
Job: {{ jobm.job.shortterm }} </br>
|
|
||||||
Job Start: {{ jobm.job_start }} </br>
|
|
||||||
Job Ende: {{ jobm.job_end }} </br>
|
|
||||||
{% else %}
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
<hr/>
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
<h1>Job Groups</h1>
|
<div id="jobs-{{job.id}}" class="tab-pane">
|
||||||
<h2>pinned JG</h2>
|
{% if members is None %}
|
||||||
{% for jg in jobgroups %}
|
|
||||||
{% if jg.is_pinned %}
|
|
||||||
JobGroup: {{ jg.name }} </br>
|
|
||||||
{% for job in jobs %}
|
|
||||||
{% if job.job_group.name == jg.name %}
|
|
||||||
Job: {{ job.name }} </br>
|
|
||||||
{% for jobm in jobmembers %}
|
|
||||||
{% if job.name == jobm.job.name %}
|
|
||||||
Member Name: {{ jobm.member.nickname }} </br>
|
|
||||||
{% else %}
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
{% else %}
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
{% else %}
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
<hr/>
|
|
||||||
<h2>unpinned JG</h2>
|
|
||||||
{% for jg in jobgroups %}
|
|
||||||
{% if jg.is_pinned %}
|
|
||||||
{% else %}
|
|
||||||
JobGroup: {{ jg.name }} </br>
|
|
||||||
{% for job in jobs %}
|
|
||||||
{% if job.job_group.name == jg.name %}
|
|
||||||
Job: {{ job.name }} </br>
|
|
||||||
{% for jobm in jobmembers %}
|
|
||||||
{% if job.name == jobm.job.name %}
|
|
||||||
Member Name: {{ jobm.member.nickname }} </br>
|
|
||||||
{% else %}
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
{% else %}
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
|
{% for job in job_list %}
|
||||||
|
{% if job_list|length > 1 %}
|
||||||
|
<h2>{{job.0}}</h2>
|
||||||
|
{% endif %}
|
||||||
|
{% with active_members=job.1 inactive_members=job.2 %}
|
||||||
|
{% include 'members/jobs_list.html' %}
|
||||||
|
{% endwith %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
26
fet2020/templates/members/jobs_list.html
Normal file
26
fet2020/templates/members/jobs_list.html
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
|
||||||
|
<div class="grid-container">
|
||||||
|
|
||||||
|
Aktuelle Mitglieder: {{active_members.count}}
|
||||||
|
<div class="grid-x">
|
||||||
|
{% for mem in active_members %}
|
||||||
|
<div class="medium-6 cell">
|
||||||
|
<h2>{{mem.get_job_role_display}} (seit {{mem.job_start}})</h2>
|
||||||
|
{% with member=mem.member %}
|
||||||
|
{% include 'members/partials/_member_details.html' %}
|
||||||
|
{% endwith %}
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
Vergangene Mitglieder: {{inactive_members.count}}
|
||||||
|
<div class="grid-x">
|
||||||
|
{% for mem in inactive_members %}
|
||||||
|
<div class="medium-6 cell">
|
||||||
|
<h2>{{mem.get_job_role_display}} ({{mem.job_start}} - {{mem.job_end}})</h2>
|
||||||
|
{% with member=mem.member %}
|
||||||
|
{% include 'members/partials/_member_details.html' %}
|
||||||
|
{% endwith %}
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
{% extends 'layout.html' %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
|
|
||||||
<div class="grid-container">
|
|
||||||
<h1> Mitarbeiter Liste </h1>
|
|
||||||
<h2> Grid Style</h2>
|
|
||||||
<div class="grid-x">
|
|
||||||
{% for member in members %}
|
|
||||||
<div class="medium-3 large-2 small-6 cell">
|
|
||||||
{% include 'members/partials/_member.html' %}
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h2> Grid Style 2</h2>
|
|
||||||
<div class="grid-x">
|
|
||||||
{% for member in members %}
|
|
||||||
{% include 'members/partials/_member.html' %}
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h2>Detail List</h2>
|
|
||||||
<div class="grid-container">
|
|
||||||
{% for member in members %}
|
|
||||||
{% include 'members/partials/_member_details.html' %}
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
26
fet2020/templates/members/members_list.html
Normal file
26
fet2020/templates/members/members_list.html
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
|
||||||
|
<div class="grid-container">
|
||||||
|
<h1> Mitarbeiter Liste </h1>
|
||||||
|
<h2> Grid Style</h2>
|
||||||
|
<div class="grid-x">
|
||||||
|
{% for member in members %}
|
||||||
|
<div class="medium-3 large-2 small-6 cell">
|
||||||
|
{% include 'members/partials/_member.html' %}
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2> Grid Style 2</h2>
|
||||||
|
<div class="grid-x">
|
||||||
|
{% for member in members %}
|
||||||
|
{% include 'members/partials/_member.html' %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Detail List</h2>
|
||||||
|
<div class="grid-container">
|
||||||
|
{% for member in members %}
|
||||||
|
{% include 'members/partials/_member_details.html' %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -9,9 +9,9 @@
|
|||||||
<div class="media-object-section main-section">
|
<div class="media-object-section main-section">
|
||||||
<h1>{{member.firstname}} {{member.surname}}</h1>
|
<h1>{{member.firstname}} {{member.surname}}</h1>
|
||||||
<p>Spitzname: {{member.nickname}} </br>
|
<p>Spitzname: {{member.nickname}} </br>
|
||||||
Name: {{member.firstname}} {{member.surname}} </br>
|
Name: {{member.firstname}} {{member.surname}} </br>
|
||||||
Mailaccount: {{member.mailaccount}} </br>
|
Mailaccount: {{member.mailaccount}} </br>
|
||||||
Beschreibung: {{member.description|safe}} </br>
|
Beschreibung: {{member.description|safe}} </br>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
{% extends 'layout.html' %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="grid-container">
|
|
||||||
<div class="grid-x">
|
|
||||||
|
|
||||||
<h1>{{job.name}}</h1>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
Aktuelle Mitglieder {{ job.active_members_count}}:
|
|
||||||
<div class="grid-x">
|
|
||||||
{% for member in job.active_members %}
|
|
||||||
<div class="medium-6 cell">
|
|
||||||
|
|
||||||
<h2>{{ member.job_role_text }}({{member.job_start }} - {{member.job_end}})</h2>
|
|
||||||
{% include 'members/partials/_member_details.html' %}
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
Vergangene Mitglieder:
|
|
||||||
<div class="grid-x">
|
|
||||||
{% for member in job.inactive_members %}
|
|
||||||
{% include 'members/partials/_member.html' %}
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
Reference in New Issue
Block a user