Introduces new forms, models, admin integrations

Post
     ____|___
     |       |
    News   Event   // Events + News = Article, ArticleManager shows without FetMeeting!!
             |
         FetMeeting
This commit is contained in:
2020-06-07 12:33:13 +00:00
parent d2955be8e8
commit 9e670c289f
3 changed files with 148 additions and 44 deletions

View File

@@ -1,8 +1,6 @@
from django.contrib import admin
from .models import Post, Event, Category
# Register your models here.
from .forms import MyPostForm, MyEventForm
from .models import Post, Event, Category, News, FetMeeting
from .forms import MyPostForm, MyEventForm, MyNewsForm, MyFetMeetingForm
class MyCategoryAdmin(admin.ModelAdmin):
model = Category
@@ -13,6 +11,7 @@ class MyPostAdmin(admin.ModelAdmin):
model = Post
list_filter = ['is_event']
list_display = ['title','subtitle','slug','public_date']
def save_model(self, request, obj, form, change):
obj.author = request.user
super().save_model(request, obj, form, change)
@@ -28,10 +27,21 @@ class MyPostAdmin(admin.ModelAdmin):
"jquery-ui/jquery-ui.min.js",
]
admin.site.register(Post,MyPostAdmin)
class MyEventAdmin(MyPostAdmin):
form = MyEventForm
model = Event
list_display = ['title','subtitle','slug','event_start','public_date']
admin.site.register(Event, MyEventAdmin)
class MyNewsAdmin(MyPostAdmin):
form = MyNewsForm
model = News
admin.site.register(News, MyNewsAdmin)
class MyFetMeetingAdmin(MyEventAdmin):
form = MyFetMeetingForm
model = FetMeeting
admin.site.register(FetMeeting, MyFetMeetingAdmin)

View File

@@ -1,7 +1,7 @@
from django import forms
from ckeditor_uploader.widgets import CKEditorUploadingWidget
from .models import Post, Event
from .models import Post, Event, News, FetMeeting
class MyPostForm(forms.ModelForm):
class Meta:
@@ -16,6 +16,17 @@ class MyPostForm(forms.ModelForm):
'js/tag_completion.js', # to get a list for tag autocompletion via ajax
)
class MyNewsForm(MyPostForm):
class Meta:
model = News
fields = ['title','subtitle','tags', 'image','body',
'slug','author']
widgets = {'body': CKEditorUploadingWidget(config_name='default')}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # to get the self.fields set
class MyEventForm(MyPostForm):
class Meta:
model = Event
@@ -29,5 +40,17 @@ class MyEventForm(MyPostForm):
self.fields['event_start'].required = True
self.fields['event_end'].required = True
if 'event_place' in self.fields:
self.fields['event_place'].required = True
class MyFetMeetingForm(MyEventForm):
class Meta:
model = FetMeeting
fields = ['event_start', 'event_end', 'tags']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # to get the self.fields set
self.fields['event_start'].required = True
self.fields['event_end'].required = False

View File

@@ -11,22 +11,45 @@ import re
from rest_framework import serializers
from django.db.models import Q
from datetime import timedelta
#TODO: is_fetsitzung -> is_fetmeeting
############
# MANAGERS #
############
class PostManager(models.Manager):
def get_queryset(self):
return super().get_queryset()
class NewsPostManager(models.Manager):
class ArticleManager(models.Manager):
"""
Provide a query set only for "News"
regular meetings should not be contained in the news stream
Provide a query set only for "Article"
regular fet meetings should not be contained in the news stream
"""
def get_queryset(self):
return super().get_queryset().filter(~Q(is_fetsitzung=True))
class EventManager(models.Manager):
class NewsManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(Q(is_event=True))
return super().get_queryset().filter(~Q(is_event=True))
class EventManager(models.Manager):
"""
Provide a query set only for "Events"
regular fet meetings should not be contained in the news stream
"""
def get_queryset(self):
return super().get_queryset().filter(Q(is_event=True) & Q(is_fetsitzung=False))
class FetMeetingManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(Q(is_fetsitzung=True))
##########
# MODELS #
##########
class Category(models.Model):
title = models.CharField(max_length=200) # Titel des Posts
@@ -39,7 +62,6 @@ class Category(models.Model):
verbose_name = "Category"
verbose_name_plural = "Categories"
# Create your models here.
class Post(models.Model):
# id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
legacy_id = models.IntegerField(null=True)
@@ -72,8 +94,10 @@ class Post(models.Model):
# TimeStamps
date_modified = models.DateTimeField(auto_now=True)
date_created = models.DateTimeField(auto_now_add=True)
# Managers
objects = PostManager()
news_objects=NewsPostManager()
news_objects = ArticleManager()
def get_tags(self):
"""Returns assigned tags as a comma seperated list."""
@@ -95,23 +119,34 @@ class Post(models.Model):
def save(self, *args, **kwargs):
"save the post with some defaults"
if self.id is None and (self.slug is None or self.slug ==""):
if (self.id is None) and (not self.slug):
self.slug = slugify(self.public_date.date()) + "-" + slugify(self.title)
if not self.event_start is None:
self.is_event=True
super().save(*args, **kwargs)
self.tags.set(*re.findall(r'\#([\d\w-]+)', str(self.subtitle)),*re.findall(r'\#([\d\w-]+)', str(self.title)))
self.tags.set(*re.findall(r'\#([\d\w-]+)', str(self.subtitle)),
*re.findall(r'\#([\d\w-]+)', str(self.title)))
def __str__(self):
return "Post (%s, %s): %s " %(self.slug, self.public_date.strftime("%d.%m.%Y"), self.title)
class PostSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Post
fields = ['slug','title','subtitle', 'body','url','public_date', 'legacy_id','image', 'event_start','event_end','is_fetsitzung']
fields = ['slug', 'title', 'subtitle', 'body', 'url', 'public_date',
'legacy_id', 'image', 'event_start', 'event_end',
'is_fetsitzung']
class News(Post):
class Meta:
proxy = True
verbose_name = "News"
verbose_name_plural = "News"
objects = NewsManager()
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
class Event(Post):
class Meta:
@@ -122,3 +157,39 @@ class Event(Post):
self.is_event = True
super().save(*args, **kwargs)
class FetMeeting(Event):
class Meta:
proxy = True
verbose_name = "Fet Sitzung"
verbose_name_plural = "Fet Sitzungen"
objects = FetMeetingManager()
def save(self, *args, **kwargs):
self.title = "Fachschaftssitzung"
self.slug = slugify(self.event_start.date()) + "-" + slugify(self.title)
self.body ="TODO: Agenda + Protokoll Link"
#TODO
#self.image
self.has_protocol = True
self.has_agenda = True
#TODO
# self.protocol_key
# self.agenda_key
self.is_fetsitzung = True
if not self.event_place:
self.event_place = "FET"
# make duration 2 hours if not specified otherwise
if not self.event_end:
self.event_end = self.event_start + timedelta(hours=2)
super().save(*args, **kwargs)