started templates for members and jobs
This commit is contained in:
@@ -56,6 +56,8 @@ class Member(models.Model):
|
||||
('P', _('Pension')),
|
||||
]
|
||||
role = models.CharField(max_length=1, choices=__choices, default='A')
|
||||
|
||||
role_choices=[c[0] for c in __choices] # Letter from choices
|
||||
|
||||
description = models.TextField(null=True, blank=True)
|
||||
image = models.ImageField(null=True, blank=True)
|
||||
@@ -85,7 +87,11 @@ class Member(models.Model):
|
||||
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:
|
||||
verbose_name = "Mitglied"
|
||||
verbose_name_plural = "Mitglieder"
|
||||
@@ -125,13 +131,33 @@ class Job(models.Model):
|
||||
|
||||
description = models.TextField(null=True, blank=True)
|
||||
image = models.ImageField(null=True, blank=True)
|
||||
|
||||
#objects = models.Manager()
|
||||
job_group = models.ForeignKey(
|
||||
JobGroup,
|
||||
on_delete=models.CASCADE,
|
||||
verbose_name="Job Gruppe",
|
||||
)
|
||||
|
||||
@property
|
||||
def active_members(self):
|
||||
"Active Members for this job"
|
||||
def sorted_jobmembers():
|
||||
return sorted(list(self.jobmembers.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"
|
||||
return self.jobmembers.count()
|
||||
|
||||
@property
|
||||
def inactive_members(self):
|
||||
"return the inactive members"
|
||||
return [jm.member for jm in self.jobmembers.all()] # filter inactive fehlt noch
|
||||
|
||||
class Meta:
|
||||
verbose_name = "Tätigkeit"
|
||||
verbose_name_plural = "Tätigkeiten"
|
||||
@@ -151,17 +177,29 @@ class JobMember(models.Model):
|
||||
Member,
|
||||
on_delete=models.CASCADE,
|
||||
verbose_name="Mitglied",
|
||||
related_name="jobs"
|
||||
)
|
||||
job = models.ForeignKey(
|
||||
Job,
|
||||
on_delete=models.CASCADE,
|
||||
verbose_name="Tätigkeit",
|
||||
related_name="jobmembers"
|
||||
)
|
||||
|
||||
job_start = models.DateField('Job Start')
|
||||
job_end = models.DateField('Job Ende', null=True, blank=True)
|
||||
|
||||
__choices = [
|
||||
@property
|
||||
def member_with_role(self):
|
||||
"return the member with added role and job start and job end"
|
||||
m=self.member
|
||||
m.job_start=self.job_start
|
||||
m.job_end=self.job_end
|
||||
m.job_role=self.job_role
|
||||
m.job_role_text=dict(JobMember._choices)[self.job_role]
|
||||
return m
|
||||
|
||||
_choices = [
|
||||
('1V', _('VorsitzendeR')),
|
||||
('2V', _('stv VorsitzendeR')),
|
||||
('3V', _('2. stv VorsitzendeR')),
|
||||
@@ -169,7 +207,16 @@ class JobMember(models.Model):
|
||||
('E', _('Ersatzmitglied')),
|
||||
('V', _('VerantwortlicheR'))
|
||||
]
|
||||
job_role = models.CharField(max_length=2, choices=__choices, default='M')
|
||||
_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()
|
||||
active_member = ActiveMemberManager()
|
||||
|
||||
@@ -5,4 +5,7 @@ from . import views
|
||||
|
||||
urlpatterns = [
|
||||
path('', views.index, name='members.index'),
|
||||
path('list', views.list, name='members.list'),
|
||||
path('list/<str:filter>', views.list, name='members.list'),
|
||||
path('<str:slug>', views.show_job, name='members.show_job')
|
||||
]
|
||||
|
||||
@@ -26,6 +26,20 @@ def index(request):
|
||||
|
||||
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):
|
||||
"""
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
<div class="grid-x grid-x-padding">
|
||||
<div class="medium-8 cell">
|
||||
{% for post in posts %}
|
||||
{% include 'posts/_posts_hero.html' %}
|
||||
{% include 'posts/partials/_posts_hero.html' %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="medium-4 cell">
|
||||
|
||||
@@ -2,6 +2,14 @@
|
||||
|
||||
{% block content %}
|
||||
<div class="grid-container">
|
||||
|
||||
{% for job in jobs %}
|
||||
<a href="{% url 'members.show_job' job.slug %}">
|
||||
{{job.name}}
|
||||
</a>
|
||||
{% endfor %}
|
||||
|
||||
|
||||
<div class="grid-x">
|
||||
<div class="medium-8 cell">
|
||||
<h1>Members</h1>
|
||||
|
||||
22
fet2020/templates/members/list.html
Normal file
22
fet2020/templates/members/list.html
Normal file
@@ -0,0 +1,22 @@
|
||||
{% extends 'layout.html' %}
|
||||
|
||||
{% block content %}
|
||||
<h1> GRID </h1>
|
||||
<div class="grid-container">
|
||||
<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>
|
||||
</div>
|
||||
|
||||
<div class="grid-container">
|
||||
{% for member in members %}
|
||||
{% include 'members/partials/_member_details.html' %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
7
fet2020/templates/members/partials/_member.html
Normal file
7
fet2020/templates/members/partials/_member.html
Normal file
@@ -0,0 +1,7 @@
|
||||
{# only thumb and name of member #}
|
||||
{% if member.image %}
|
||||
<img src="{{member.image.url}}" class="thumbnail" style="width:150px;height:150px"/> </br>
|
||||
{% endif %}
|
||||
Name: {{member.firstname}} {{member.surname}} </br>
|
||||
Spitzname: {{member.nickname}} </br>
|
||||
|
||||
17
fet2020/templates/members/partials/_member_details.html
Normal file
17
fet2020/templates/members/partials/_member_details.html
Normal file
@@ -0,0 +1,17 @@
|
||||
{# This template shows one member and all the details (that are ment for public) including a list of current jobs #}
|
||||
|
||||
<div class="media-object">
|
||||
<div class="media-object-section">
|
||||
<div class="thumbnail">
|
||||
<img src= "{{member.image.url}}" style="width:150px;">
|
||||
</div>
|
||||
</div>
|
||||
<div class="media-object-section main-section">
|
||||
<h1>{{member.firstname}} {{member.surname}}</h1>
|
||||
<p>Spitzname: {{member.nickname}} </br>
|
||||
Name: {{member.firstname}} {{member.surname}} </br>
|
||||
Mailaccount: {{member.mailaccount}} </br>
|
||||
Beschreibung: {{member.description|safe}} </br>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
23
fet2020/templates/members/show_job.html
Normal file
23
fet2020/templates/members/show_job.html
Normal file
@@ -0,0 +1,23 @@
|
||||
{% 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:
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user