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
@@ -11,8 +9,9 @@ admin.site.register(Category,MyCategoryAdmin)
class MyPostAdmin(admin.ModelAdmin):
form = MyPostForm
model = Post
list_filter=['is_event']
list_display=['title','subtitle','slug','public_date']
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)
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,25 +11,48 @@ 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
title = models.CharField(max_length=200) # Titel des Posts
subtitle = models.CharField(max_length=500, null=True, blank=True) # subtitle
slug = models.SlugField(unique=True,null=True,blank=True) # Slug = Text Basierter url bestandteil zb Fetsitzung 22.1.2020 --> fetsitzung_22_1_2020 für Url
image = models.ImageField(null=True,blank=True) # Ein Haupt Bild für den Post
@@ -39,12 +62,11 @@ 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)
legacy_id = models.IntegerField(null=True)
legacy_rubrik_id = models.IntegerField(null=True)
title =models.CharField(max_length=200) # Titel des Posts
title = models.CharField(max_length=200) # Titel des Posts
subtitle = models.CharField(max_length=500, null=True, blank=True) # subtitle
slug = models.SlugField(unique=True,null=True,blank=True) # Slug = Text Basierter url bestandteil zb Fetsitzung 22.1.2020 --> fetsitzung_22_1_2020 für Url
body = models.TextField(null=True, blank=True) # Body Text Artikel Text soll später mit WYSIWG Editor bearbeitet werden
@@ -55,13 +77,13 @@ class Post(models.Model):
imported_from = models.CharField(max_length=200, null=True, blank=True) # Titel des Posts
is_fetsitzung=models.BooleanField(default=False)
is_event=models.BooleanField(default=False)
is_fetsitzung = models.BooleanField(default=False)
is_event = models.BooleanField(default=False)
# Zusatz Info wenn ein Event gepostet wird
event_start=models.DateTimeField('Event Start', null=True,blank=True)
event_end=models.DateTimeField('Event Ende', null=True,blank=True)
event_place=models.CharField(max_length=200, null=True,blank=True)
event_start = models.DateTimeField('Event Start', null=True,blank=True)
event_end = models.DateTimeField('Event Ende', null=True,blank=True)
event_place = models.CharField(max_length=200, null=True,blank=True)
# Dokumente v.a. fuer Sitzungen
has_protocol = models.BooleanField(default=False)
@@ -70,10 +92,12 @@ class Post(models.Model):
agenda_key = models.CharField(max_length=200, null=True,blank=True)
# TimeStamps
date_modified=models.DateTimeField(auto_now=True)
date_created=models.DateTimeField(auto_now_add=True)
objects=PostManager()
news_objects=NewsPostManager()
date_modified = models.DateTimeField(auto_now=True)
date_created = models.DateTimeField(auto_now_add=True)
# Managers
objects = PostManager()
news_objects = ArticleManager()
def get_tags(self):
"""Returns assigned tags as a comma seperated list."""
@@ -95,30 +119,77 @@ 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 ==""):
self.slug=slugify(self.public_date.date())+"-"+slugify(self.title)
if not self.event_start is None:
self.is_event=True
if (self.id is None) and (not self.slug):
self.slug = slugify(self.public_date.date()) + "-" + slugify(self.title)
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:
proxy=True
objects=EventManager()
proxy = True
objects = EventManager()
def save(self, *args, **kwargs):
self.is_event=True
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)