Introduces new forms, models, admin integrations
Post
____|___
| |
News Event // Events + News = Article, ArticleManager shows without FetMeeting!!
|
FetMeeting
This commit is contained in:
@@ -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)
|
||||
@@ -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
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user