This commit is contained in:
2020-08-29 11:49:54 +00:00
21 changed files with 256 additions and 62 deletions

View File

@@ -5,12 +5,12 @@ from django.utils.text import slugify
import urllib.parse import urllib.parse
t = datetime.now() + timedelta(days=1) t = datetime.now() + timedelta(days=1)
from .etherpadlib import get_ep_sessionid2, add_ep_cookie from .etherpadlib import get_ep_sessionid2, add_ep_cookie
SERVER_URL = "https://etherpad2.2020.fet.at/" SERVER_URL = "https://etherpad2.2020.fet.at/"
with open("/srv/andis_test/etherpad_test2/etherpad-lite/APIKEY.txt", "r") as f: with open("/srv/andis_test/etherpad_test2/etherpad-lite/APIKEY.txt", "r") as f:
k = f.read() k = f.read()
epc = EtherpadLiteClient( epc = EtherpadLiteClient(

View File

@@ -13,7 +13,9 @@ class FETHeaderMiddleware(RemoteUserMiddleware):
self.header, self.header,
request.headers.get(self.header, None) request.headers.get(self.header, None)
) )
# logger = logging.getLogger(__name__)
super().process_request(request) super().process_request(request)
# logger.info('User: ' + str(request.user))
if request.user.is_authenticated: if request.user.is_authenticated:
request.user.is_admin = True request.user.is_admin = True
request.user.is_superuser = True request.user.is_superuser = True

View File

@@ -116,6 +116,7 @@ DATABASES = {
AUTHENTICATION_BACKENDS = [ AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.RemoteUserBackend', 'django.contrib.auth.backends.RemoteUserBackend',
'django.contrib.auth.backends.ModelBackend',
] ]
# Password validation # Password validation

View File

@@ -20,7 +20,7 @@ def index(request):
context = { context = {
'posts': posts, 'posts': posts,
'events': Event.objects.order_by("-event_start").all(), 'events': Event.objects.get_all_events(),
'featured_post': featured_post, 'featured_post': featured_post,
'featured_post2': FetMeeting.objects.first(), 'featured_post2': FetMeeting.objects.first(),
'tags_list': ", ".join(t) 'tags_list': ", ".join(t)

View File

@@ -54,12 +54,41 @@ class JobInline(admin.TabularInline):
class MyMemberAdmin(admin.ModelAdmin): class MyMemberAdmin(admin.ModelAdmin):
form = MyMemberForm form = MyMemberForm
model = Member model = Member
fieldsets = (
(None, {
'fields': (
('firstname', 'surname',),
'nickname',
'mailaccount',
'role',
'description',
'image',
'birthday',
'phone',
'address',
)
}),
)
list_display = ['nickname', 'firstname', 'surname', 'mailaccount', 'role'] list_display = ['nickname', 'firstname', 'surname', 'mailaccount', 'role']
inlines = (JobOverviewInline,) inlines = (JobOverviewInline,)
search_fields = ['firstname', 'surname', 'nickname', 'mailaccount'] search_fields = ['firstname', 'surname', 'nickname', 'mailaccount']
list_filter = [MemberRoleFilter] list_filter = [MemberRoleFilter]
def add_view(self, request, form_url='', extra_context=None):
extra_context = extra_context or {}
extra_context['help_text'] = "Fette Schriften sind Pflichtfelder."
return super().add_view(
request, form_url, extra_context=extra_context,
)
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."
return super().change_view(
request, object_id, form_url, extra_context=extra_context,
)
def save_model(self, request, obj, form, change): def save_model(self, request, obj, form, change):
obj.author = request.user obj.author = request.user
super().save_model(request, obj, form, change) super().save_model(request, obj, form, change)
@@ -76,6 +105,20 @@ class MyJobAdmin(admin.ModelAdmin):
search_fields = ['name'] search_fields = ['name']
def add_view(self, request, form_url='', extra_context=None):
extra_context = extra_context or {}
extra_context['help_text'] = "Fette Schriften sind Pflichtfelder."
return super().add_view(
request, form_url, extra_context=extra_context,
)
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."
return super().change_view(
request, object_id, form_url, extra_context=extra_context,
)
def save_model(self, request, obj, form, change): def save_model(self, request, obj, form, change):
obj.author = request.user obj.author = request.user
super().save_model(request, obj, form, change) super().save_model(request, obj, form, change)
@@ -92,6 +135,20 @@ class MyJobGroupAdmin(admin.ModelAdmin):
search_fields = ['name'] search_fields = ['name']
def add_view(self, request, form_url='', extra_context=None):
extra_context = extra_context or {}
extra_context['help_text'] = "Fette Schriften sind Pflichtfelder."
return super().add_view(
request, form_url, extra_context=extra_context,
)
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."
return super().change_view(
request, object_id, form_url, extra_context=extra_context,
)
def save_model(self, request, obj, form, change): def save_model(self, request, obj, form, change):
obj.author = request.user obj.author = request.user
super().save_model(request, obj, form, change) super().save_model(request, obj, form, change)

View File

@@ -1,4 +1,4 @@
from django.core.validators import RegexValidator from django.core.validators import RegexValidator, ValidationError
from django.db import models from django.db import models
from django.db.models import Q from django.db.models import Q
from django.utils import timezone from django.utils import timezone
@@ -6,6 +6,7 @@ from django.utils.text import slugify
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from datetime import timedelta from datetime import timedelta
from easy_thumbnails.fields import ThumbnailerImageField
from rest_framework import serializers from rest_framework import serializers
@@ -91,7 +92,7 @@ class Member(models.Model):
role = models.CharField(max_length=1, choices=MemberRole.choices, default=MemberRole.ACTIVE) 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 = ThumbnailerImageField()
birthday = models.DateField(null=True, blank=True) birthday = models.DateField(null=True, blank=True)
@@ -113,6 +114,15 @@ class Member(models.Model):
verbose_name = "Mitglied" verbose_name = "Mitglied"
verbose_name_plural = "Mitglieder" verbose_name_plural = "Mitglieder"
def clean(self):
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
)
)
def __str__(self): def __str__(self):
return self.firstname + " " + self.surname return self.firstname + " " + self.surname
@@ -139,6 +149,10 @@ class JobGroup(models.Model):
is_pinned = models.BooleanField(default=False) is_pinned = models.BooleanField(default=False)
class Meta:
verbose_name = "Tätigkeit-Gruppierung"
verbose_name_plural = "Tätigkeit-Gruppierungen"
def __str__(self): def __str__(self):
return self.name return self.name

View File

@@ -5,7 +5,8 @@ from . import views
urlpatterns = [ urlpatterns = [
path('', views.index, name='members'), path('', views.index, name='members'),
path('<str:filter>', views.index),
path('jobs/<str:slug>', views.index), path('<str:filter>', views.members_view),
path('m/<str:nickname>',views.show, name="member") path('jobs/<str:slug>', views.jobs_view),
path('member/<str:member_name>', views.profile_view, name="member"),
] ]

View File

@@ -10,23 +10,15 @@ from rest_framework import permissions
# from django_filters.rest_framework import DjangoFilterBackend # from django_filters.rest_framework import DjangoFilterBackend
<<<<<<< HEAD
def show(request,nickname=None): def show(request,nickname=None):
return render(request, 'members/index.html', context) return render(request, 'members/index.html', context)
def index(request, slug=None, filter=None): def index(request, slug=None, filter=None):
job_group = deque(JobGroup.objects.all()) job_group = deque(JobGroup.objects.all())
job_list = []
members = None members = None
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: if filter is None:
members = deque(Member.all_members.all()) members = deque(Member.all_members.all())
elif filter in Member.MemberRole: elif filter in Member.MemberRole:
@@ -36,13 +28,63 @@ def index(request, slug=None, filter=None):
context = { context = {
"job_group": job_group, "job_group": job_group,
"job_list": job_list,
"members": members, "members": members,
} }
return render(request, 'members/index.html', context) return render(request, 'members/index.html', context)
def jobs_view(request, slug=None):
job_group = deque(JobGroup.objects.all())
job_list = []
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]))
context = {
"job_group": job_group,
"job_list": job_list,
}
return render(request, 'members/index.html', context)
def members_view(request, filter=None):
job_group = deque(JobGroup.objects.all())
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 = {
"job_group": job_group,
"members": members,
}
return render(request, 'members/index.html', context)
def profile_view(request, member_name=None):
job_group = deque(JobGroup.objects.all())
member = None
member = deque(Member.all_members.filter(nickname=member_name))
context = {
"job_group": job_group,
"member": member,
}
return render(request, 'members/index.html', context)
class MemberViewSet(viewsets.ModelViewSet): class MemberViewSet(viewsets.ModelViewSet):
""" """
API endpoint that allows users to be viewed or edited. API endpoint that allows users to be viewed or edited.

View File

@@ -25,6 +25,20 @@ class MyPostAdmin(admin.ModelAdmin):
list_filter = ['is_event'] list_filter = ['is_event']
list_display = ['title', 'subtitle', 'slug', 'public_date'] list_display = ['title', 'subtitle', 'slug', 'public_date']
def add_view(self, request, form_url='', extra_context=None):
extra_context = extra_context or {}
extra_context['help_text'] = "Fette Schriften sind Pflichtfelder."
return super().add_view(
request, form_url, extra_context=extra_context,
)
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."
return super().change_view(
request, object_id, form_url, extra_context=extra_context,
)
def save_model(self, request, obj, form, change): def save_model(self, request, obj, form, change):
obj.author = request.user obj.author = request.user
super().save_model(request, obj, form, change) super().save_model(request, obj, form, change)

View File

@@ -1,4 +1,5 @@
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.validators import ValidationError
from django.db import models from django.db import models
from django.db.models import Q from django.db.models import Q
from django.urls import reverse from django.urls import reverse
@@ -61,7 +62,7 @@ class EventManager(models.Manager):
return super().get_queryset().filter( return super().get_queryset().filter(
Q(is_event=True) Q(is_event=True)
& Q(event_start__gt=date_today) & Q(event_start__gt=date_today)
).order_by('-public_date') ).order_by('-event_start')
class FetMeetingManager(models.Manager): class FetMeetingManager(models.Manager):
@@ -168,7 +169,8 @@ class Post(models.Model):
# TODO: Explain why this image is selected on save of the image # TODO: Explain why this image is selected on save of the image
# Query all posts that have a slug that equals one of the tags # Query all posts that have a slug that equals one of the tags
posts1 = Post.objects.filter( posts1 = Post.objects.filter(
slug__in=self.tags.names()).filter(image__isnull=False)[0:1].all() slug__in=self.tags.names()
).filter(image__isnull=False)[0:1].all()
if len(posts1) > 0: if len(posts1) > 0:
return posts1.get().image return posts1.get().image
@@ -190,11 +192,12 @@ class Post(models.Model):
"save the post with some defaults" "save the post with some defaults"
if (self.id is None) and (not self.slug): if (self.id is None) and (not self.slug):
self.slug = slugify(self.public_date.date()) + "-" + slugify(self.title) self.slug = slugify(self.public_date.date()) + "-" + slugify(self.title)
super().save(*args, **kwargs) super().save(*args, **kwargs)
self.tags.set(*re.findall(r'\#([\d\w-]+)', str(self.subtitle)), self.tags.set(
*re.findall(r'\#([\d\w-]+)', str(self.title))) *re.findall(r'\#([\d\w-]+)', str(self.subtitle)),
*re.findall(r'\#([\d\w-]+)', str(self.title))
)
def __str__(self): def __str__(self):
return "Post (%s, %s): %s " % (self.slug, self.public_date.strftime("%d.%m.%Y"), self.title) return "Post (%s, %s): %s " % (self.slug, self.public_date.strftime("%d.%m.%Y"), self.title)
@@ -239,12 +242,24 @@ class Event(Post):
class Meta: class Meta:
proxy = True proxy = True
verbose_name = "Event"
verbose_name_plural = "Events"
@property @property
def event_start_month(self): def event_start_month(self):
return self.event_start.strftime("%b") return self.event_start.strftime("%b")
@property @property
def event_start_day(self): def event_start_day(self):
return self.event_start.strftime("%d") return self.event_start.strftime("%d")
def clean(self):
if self.event_end is None or self.event_start is None:
raise ValidationError(_('Das Datum des Events fehlt.'))
elif self.event_end < self.event_start:
raise ValidationError(_('Das Ende des Events liegt vor dem Beginn.'))
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
self.is_event = True self.is_event = True
@@ -263,6 +278,15 @@ class FetMeeting(Event):
verbose_name = "Fet Sitzung" verbose_name = "Fet Sitzung"
verbose_name_plural = "Fet Sitzungen" verbose_name_plural = "Fet Sitzungen"
def clean(self):
if self.event_start is None:
raise ValidationError(_('Das Datum des Events fehlt.'))
slug = slugify(self.event_start.date()) + "-" + slugify("Fachschaftssitzung")
if Post.objects.filter(slug=slug).count() != 0:
raise ValidationError(_('Es existiert bereits eine Sitzung mit demselben Datum.'))
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
self.title = "Fachschaftssitzung" self.title = "Fachschaftssitzung"
self.slug = slugify(self.event_start.date()) + "-" + slugify(self.title) self.slug = slugify(self.event_start.date()) + "-" + slugify(self.title)

View File

@@ -10,6 +10,7 @@ from rest_framework import viewsets
# from rest_framework import permissions # from rest_framework import permissions
from .models import Post, PostSerializer from .models import Post, PostSerializer
from members.models import Member
# from documents import add_ep_to_response # from documents import add_ep_to_response
from documents import get_ep_sessionid2, get_pad_link,add_ep_cookie from documents import get_ep_sessionid2, get_pad_link,add_ep_cookie
@@ -41,14 +42,42 @@ def show(request, id=None):
elif id != "" and id is not None: elif id != "" and id is not None:
p = Post.objects.get(slug=(id)) p = Post.objects.get(slug=(id))
post_author = Member.all_members.filter(nickname=p.author)
context = { context = {
"post": p, "post": p,
"next": get_next_dict().get(p.slug, None), "next": get_next_dict().get(p.slug, None),
"related_posts": p.tags.similar_objects(), "related_posts": p.tags.similar_objects(),
"ep_link": get_pad_link(p.slug + "-agenda") "ep_link": get_pad_link(p.slug + "-agenda"),
"author_image": post_author[0].image['avatar'].url
} }
response = render(request, 'posts/show.html', context) response = render(request, 'posts/show.html', context)
<<<<<<< HEAD
return add_ep_cookie(request,response) return add_ep_cookie(request,response)
=======
response.set_cookie("HelloWorld", "TestWert", domain="https://etherpad2.2020.fet.at")
ep_sessid, expires = get_ep_sessionid(request)
response.set_cookie(
"sessionID",
ep_sessid,
expires=expires,
domain=".2020.fet.at",
path="/"
)
'''
response.set_cookie(
"express_sid",
ep_sessid,
expires=expires,
domain="https://andis.2020.fet.at",
path="/etherpad"
)
'''
# response=add_ep_to_response(request, response )
return response
>>>>>>> 7fff88d1679058b52a4e2804534ea2dc76782873
########### ###########
# HELPERS # # HELPERS #

View File

@@ -0,0 +1,6 @@
{% extends "admin/change_form.html" %}
{% load i18n admin_urls %}
{% block form_top %}
{% if help_text %}<p>{{ help_text }}</p>{% endif %}
{% endblock %}

View File

@@ -0,0 +1,7 @@
{% extends "admin/submit_line.html" %}
{% load i18n admin_urls %}
{% block submit-row %}
<a href="{% url opts|admin_urlname:'changelist' %}" class="closelink">{% trans 'Close' %}</a>
{{ block.super }}
{% endblock %}

View File

@@ -13,7 +13,7 @@
<div class="news-hero-text" > <div class="news-hero-text" >
<hr> <hr>
<div class="article-date"> <div class="article-date">
<p>Published on Jan 12, 2020 Just added now</p> <p>{{post.public_date}}</p>
</div> </div>
<div class="article-title"> <div class="article-title">
<h1>{{post.title| safe}}</h1> <h1>{{post.title| safe}}</h1>

View File

@@ -11,34 +11,38 @@
<a id="members" data-toggle="tab" href="/members/A">Aktive 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> <a id="members" data-toggle="tab" href="/members/P">Inaktive Mitglieder</a>
{% for job in job_group %} {% for job in job_group %}
<a id="jobs-{{job.id}}" data-toggle="tab" href="/members/jobs/{{job.slug}}">{{job.name}}</a> <a id="jobs-{{job.slug}}" data-toggle="tab" href="/members/jobs/{{job.slug}}">{{job.name}}</a>
{% endfor %} {% endfor %}
</ul> </ul>
<!-- Tab panes --> <!-- Tab panes -->
<div class="tab-content" id="nav-tabContent"> <div class="tab-content" id="nav-tabContent">
{% for mem in member %}
{% with member=mem %}
{% include 'members/partials/_member_details.html' %}
{% endwith %}
{% endfor %}
<div id="members" class="tab-pane fade in active"> <div id="members" class="tab-pane fade in active">
{% if members == None %} {% if members is not None %}
{% else %}
{% include 'members/members_list.html' %} {% include 'members/members_list.html' %}
{% endif %} {% endif %}
</div> </div>
<div id="jobs-{{job.id}}" class="tab-pane">
{% if members is None %}
{% for job in job_list %} {% for job in job_list %}
<div id="jobs-{{job.slug}}" class="tab-pane">
<div class="grid-container">
{% if job_list|length > 1 %} {% if job_list|length > 1 %}
<h2>{{job.0}}</h2> <h2>{{job.0}}</h2>
{% endif %} {% endif %}
{% with active_members=job.1 inactive_members=job.2 %} {% with active_members=job.1 inactive_members=job.2 %}
{% include 'members/jobs_list.html' %} {% include 'members/jobs_list.html' %}
{% endwith %} {% endwith %}
{% endfor %}
{% endif %}
</div> </div>
{% endfor %}
</div> </div>
</div> </div>

View File

@@ -1,6 +1,4 @@
<div class="grid-container">
Aktuelle Mitglieder: {{active_members.count}} Aktuelle Mitglieder: {{active_members.count}}
<div class="grid-x"> <div class="grid-x">
{% for mem in active_members %} {% for mem in active_members %}

View File

@@ -1,6 +1,5 @@
<div class="grid-container"> <div class="grid-container">
<h1> Mitarbeiter Liste </h1>
<h2> Grid Style</h2> <h2> Grid Style</h2>
<div class="grid-x"> <div class="grid-x">
{% for member in members %} {% for member in members %}
@@ -16,11 +15,4 @@
{% include 'members/partials/_member.html' %} {% include 'members/partials/_member.html' %}
{% endfor %} {% endfor %}
</div> </div>
<h2>Detail List</h2>
<div class="grid-container">
{% for member in members %}
{% include 'members/partials/_member_details.html' %}
{% endfor %}
</div>
</div> </div>

View File

@@ -2,7 +2,7 @@
{# only thumb and name of member #} {# only thumb and name of member #}
{% load thumbnail %} {% load thumbnail %}
<a class="thumbnail member-thumb" style="width:150px;height:150px"> <a class="thumbnail member-thumb" href="/members/member/{{member.nickname}}" style="width:150px;height:150px">
{% if member.image %}<img src="{{member.image | thumbnail_url:'thumb'}}" />{% endif %} <img src="{{member.image.thumb.url}}" alt="" />
<div class="thumb-layer"><div><h1>{{member.nickname}}</h1> <p>{{member.firstname}} {{member.surname}}</p></div></div> <div class="thumb-layer"><div><h1>{{member.nickname}}</h1> <p>{{member.firstname}} {{member.surname}}</p></div></div>
</a> </a>

View File

@@ -1,4 +1,4 @@
<a href =""> <a href ="posts/{{post.slug}}">
<div class="date-box"> <div class="date-box">
<span> <span>
<span class="date-badge badge primary" style=""> <span class="date-badge badge primary" style="">

View File

@@ -16,9 +16,12 @@
<div class="article-details"> <div class="article-details">
{{post.subtitle | tags_to_url }} {{post.subtitle | tags_to_url }}
{% if post.username != None %} {% if post.username != None %}
<div class="article-author"> <div class="arti
<img src="{{post.username.image | thumbnail_url:'avatar'}}" alt="" /> <img src="{{post.username.image | thumbnail_url:'avatar'}}" alt="" />
<a href="{% url 'member' post.username.nickname %}">{{post.username.nickname}}</a> <a href="{% url 'member' post.username.nickname %}">{{post.username.nickname}}</a>
<img src="{{author_image}}" alt="" />
<a href="/members/member/{{post.author}}">{{post.author}}</a>
</div> </div>
{% endif %} {% endif %}