intern implementation

This commit is contained in:
2021-02-28 00:29:26 +00:00
committed by Patrick Mayr
parent 59191a0909
commit 7da778189d
15 changed files with 543 additions and 1 deletions

View File

57
fet2020/intern/admin.py Normal file
View File

@@ -0,0 +1,57 @@
from django.contrib import admin
from .models import TopicGroup, Topic, Documentation
from .forms import TopicGroupAdminForm, TopicAdminForm
class DocumentationInline(admin.TabularInline):
model = Documentation
extra = 0
verbose_name = "Dokument"
verbose_name_plural = "Dokument-Übersicht"
class TopicInline(admin.TabularInline):
model = Topic
extra = 0
verbose_name = "Topic"
verbose_name_plural = "Topic-Übersicht"
class TopicGroupAdmin(admin.ModelAdmin):
form = TopicGroupAdminForm
model = TopicGroup
search_fields = ("title",)
inlines = (TopicInline,)
def save_model(self, request, obj, form, change):
obj.created_by = request.user
super().save_model(request, obj, form, change)
class TopicAdmin(admin.ModelAdmin):
form = TopicAdminForm
model = Topic
search_fields = ("title",)
inlines = (DocumentationInline,)
def save_model(self, request, obj, form, change):
obj.created_by = request.user
super().save_model(request, obj, form, change)
"""
class DocumentationAdmin(admin.ModelAdmin):
form = DocumentationAdminForm
model = Documentation
list_display = ["title", "topic"]
def save_model(self, request, obj, form, change):
obj.created_by = request.user
super().save_model(request, obj, form, change)
"""
admin.site.register(TopicGroup, TopicGroupAdmin)
admin.site.register(Topic, TopicAdmin)
# admin.site.register(Documentation, DocumentationAdmin)

5
fet2020/intern/apps.py Normal file
View File

@@ -0,0 +1,5 @@
from django.apps import AppConfig
class InternConfig(AppConfig):
name = "intern"

49
fet2020/intern/forms.py Normal file
View File

@@ -0,0 +1,49 @@
from django import forms
from django.utils.translation import gettext_lazy as _
from ckeditor_uploader.widgets import CKEditorUploadingWidget
from .models import TopicGroup, Topic, Documentation, Document
class TopicGroupAdminForm(forms.ModelForm):
class Meta:
model = TopicGroup
fields = [
"title",
]
class TopicAdminForm(forms.ModelForm):
class Meta:
model = Topic
fields = [
"title",
"description",
"topic_group",
]
widgets = {"description": CKEditorUploadingWidget(config_name="default")}
class DocumentationAdminForm(forms.ModelForm):
class Meta:
model = Documentation
fields = [
"title",
"description",
"topic",
]
class DocumentForm(forms.ModelForm):
class Meta:
model = Document
fields = [
"title",
]
labels = {
"title": _("Titel des Protokolls"),
}

101
fet2020/intern/models.py Normal file
View File

@@ -0,0 +1,101 @@
import logging
from django.db import models
from django.utils.text import slugify
from documents import createPadifNotExists
from urllib.request import URLError
logger = logging.getLogger(__name__)
class TopicGroup(models.Model):
title = models.CharField(max_length=128)
slug = models.SlugField(unique=True, blank=True)
objects = models.Manager()
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.title)
super().save(*args, **kwargs)
def __str__(self):
return self.title
class Topic(models.Model):
title = models.CharField(max_length=128)
slug = models.SlugField(unique=True, blank=True)
description = models.TextField(null=True, blank=True)
topic_group = models.ForeignKey(TopicGroup, on_delete=models.CASCADE)
objects = models.Manager()
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.title)
super().save(*args, **kwargs)
def __str__(self):
return self.title
class Documentation(models.Model):
title = models.CharField(max_length=128)
slug = models.SlugField(unique=True, blank=True)
description = models.TextField(null=True, blank=True)
topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
objects = models.Manager()
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.title)
super().save(*args, **kwargs)
def __str__(self):
return self.title
class Document(models.Model):
title = models.CharField(max_length=128)
etherpad_key = models.CharField(max_length=128, null=True, blank=True)
documentation = models.ForeignKey(Documentation, on_delete=models.CASCADE)
objects = models.Manager()
def save(self, *args, **kwargs):
try:
self.etherpad_key = createPadifNotExists(
self.documentation.topic.slug
+ "-"
+ self.documentation.slug
+ "-"
+ slugify(self.title)
)
except URLError as error:
logger.info(
"Can't create a Etherpad '%s' from the slug. Error: %s",
slugify(self.title),
error,
)
self.etherpad_key = None
super().save(*args, **kwargs)
def __str__(self):
return self.title
class Protocol(Document):
event_start = models.DateTimeField(null=True, blank=True)
event_end = models.DateTimeField(null=True, blank=True)

3
fet2020/intern/tests.py Normal file
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

10
fet2020/intern/urls.py Normal file
View File

@@ -0,0 +1,10 @@
from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="intern"),
path("<str:slug>", views.show_topic, name="topic"),
path("<str:slug>/<str:foo>", views.show_docu, name="docu"),
]

85
fet2020/intern/views.py Normal file
View File

@@ -0,0 +1,85 @@
import logging
from django.http import HttpResponseRedirect
from django.shortcuts import render
from documents.api import get_pad_link
from collections import deque
from .forms import DocumentForm
from .models import TopicGroup, Topic, Documentation, Document
logger = logging.getLogger(__name__)
def index(request):
topic_group = deque(TopicGroup.objects.all())
topic = Topic.objects.all()
context = {
"topic_group": topic_group,
"topic": topic,
}
return render(request, "intern/index.html", context)
def show_topic(request, slug=None):
topic_group = deque(TopicGroup.objects.all())
topic = deque(Topic.objects.all())
active_topic = Topic.objects.filter(slug=slug).first()
docu = deque(Documentation.objects.filter(topic__slug=slug))
context = {
"topic_group": topic_group,
"topic": topic,
"active_topic": active_topic,
"docus": docu,
}
return render(request, "intern/topic.html", context)
def show_docu(request, slug=None, foo=None):
active_docu = Documentation.objects.filter(slug=foo).first()
active_topic = Topic.objects.filter(slug=slug).first()
if request.method == "POST":
if "btn_input" in request.POST:
form = DocumentForm(request.POST)
if form.is_valid():
docu = form.save(commit=False)
docu.created_by = request.user
docu.documentation = active_docu
docu.save()
return HttpResponseRedirect(request.path)
form = DocumentForm()
docus = deque(Document.objects.filter(documentation=active_docu))
documents = deque([])
for elem in docus:
try:
documents.append(
{
"title": elem.title,
"etherpad_key": get_pad_link(elem.etherpad_key),
}
)
except Exception as e:
logger.error(
"Can't get the agenda link from '%s'. Error: %s", elem.etherpad_key, e
)
context = {
"formset": form,
"active_topic": active_topic,
"active_docu": active_docu,
"documents": documents,
}
return render(request, "intern/docu.html", context)