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 django.contrib import admin
|
||||||
from .models import Post, Event, Category
|
from .models import Post, Event, Category, News, FetMeeting
|
||||||
|
from .forms import MyPostForm, MyEventForm, MyNewsForm, MyFetMeetingForm
|
||||||
# Register your models here.
|
|
||||||
from .forms import MyPostForm, MyEventForm
|
|
||||||
|
|
||||||
class MyCategoryAdmin(admin.ModelAdmin):
|
class MyCategoryAdmin(admin.ModelAdmin):
|
||||||
model = Category
|
model = Category
|
||||||
@@ -11,8 +9,9 @@ admin.site.register(Category,MyCategoryAdmin)
|
|||||||
class MyPostAdmin(admin.ModelAdmin):
|
class MyPostAdmin(admin.ModelAdmin):
|
||||||
form = MyPostForm
|
form = MyPostForm
|
||||||
model = Post
|
model = Post
|
||||||
list_filter=['is_event']
|
list_filter = ['is_event']
|
||||||
list_display=['title','subtitle','slug','public_date']
|
list_display = ['title','subtitle','slug','public_date']
|
||||||
|
|
||||||
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)
|
||||||
@@ -28,10 +27,21 @@ class MyPostAdmin(admin.ModelAdmin):
|
|||||||
"jquery-ui/jquery-ui.min.js",
|
"jquery-ui/jquery-ui.min.js",
|
||||||
]
|
]
|
||||||
|
|
||||||
admin.site.register(Post,MyPostAdmin)
|
|
||||||
|
|
||||||
class MyEventAdmin(MyPostAdmin):
|
class MyEventAdmin(MyPostAdmin):
|
||||||
form = MyEventForm
|
form = MyEventForm
|
||||||
model = Event
|
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 django import forms
|
||||||
from ckeditor_uploader.widgets import CKEditorUploadingWidget
|
from ckeditor_uploader.widgets import CKEditorUploadingWidget
|
||||||
|
|
||||||
from .models import Post, Event
|
from .models import Post, Event, News, FetMeeting
|
||||||
|
|
||||||
class MyPostForm(forms.ModelForm):
|
class MyPostForm(forms.ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
@@ -16,18 +16,41 @@ class MyPostForm(forms.ModelForm):
|
|||||||
'js/tag_completion.js', # to get a list for tag autocompletion via ajax
|
'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 MyEventForm(MyPostForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Event
|
model = Event
|
||||||
fields = ['title','subtitle','tags', 'image','body',
|
fields = ['title','subtitle','tags', 'image','body',
|
||||||
'event_start','event_end', 'event_place','slug','author']
|
'event_start','event_end', 'event_place','slug','author']
|
||||||
|
|
||||||
widgets = {'body': CKEditorUploadingWidget(config_name='default')}
|
widgets = {'body': CKEditorUploadingWidget(config_name='default')}
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs) # to get the self.fields set
|
super().__init__(*args, **kwargs) # to get the self.fields set
|
||||||
|
|
||||||
self.fields['event_start'].required = True
|
self.fields['event_start'].required = True
|
||||||
self.fields['event_end'].required = True
|
self.fields['event_end'].required = True
|
||||||
self.fields['event_place'].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 rest_framework import serializers
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
|
|
||||||
|
from datetime import timedelta
|
||||||
|
|
||||||
|
#TODO: is_fetsitzung -> is_fetmeeting
|
||||||
|
|
||||||
|
############
|
||||||
|
# MANAGERS #
|
||||||
|
############
|
||||||
|
|
||||||
class PostManager(models.Manager):
|
class PostManager(models.Manager):
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return super().get_queryset()
|
return super().get_queryset()
|
||||||
|
|
||||||
class NewsPostManager(models.Manager):
|
class ArticleManager(models.Manager):
|
||||||
"""
|
"""
|
||||||
Provide a query set only for "News"
|
Provide a query set only for "Article"
|
||||||
regular meetings should not be contained in the news stream
|
regular fet meetings should not be contained in the news stream
|
||||||
"""
|
"""
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return super().get_queryset().filter(~Q(is_fetsitzung=True))
|
return super().get_queryset().filter(~Q(is_fetsitzung=True))
|
||||||
|
|
||||||
class EventManager(models.Manager):
|
class NewsManager(models.Manager):
|
||||||
def get_queryset(self):
|
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):
|
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
|
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
|
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
|
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 = "Category"
|
||||||
verbose_name_plural = "Categories"
|
verbose_name_plural = "Categories"
|
||||||
|
|
||||||
# Create your models here.
|
|
||||||
class Post(models.Model):
|
class Post(models.Model):
|
||||||
# id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
# 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)
|
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
|
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
|
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
|
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
|
imported_from = models.CharField(max_length=200, null=True, blank=True) # Titel des Posts
|
||||||
|
|
||||||
is_fetsitzung=models.BooleanField(default=False)
|
is_fetsitzung = models.BooleanField(default=False)
|
||||||
is_event=models.BooleanField(default=False)
|
is_event = models.BooleanField(default=False)
|
||||||
|
|
||||||
# Zusatz Info wenn ein Event gepostet wird
|
# Zusatz Info wenn ein Event gepostet wird
|
||||||
event_start=models.DateTimeField('Event Start', 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_end = models.DateTimeField('Event Ende', null=True,blank=True)
|
||||||
event_place=models.CharField(max_length=200, null=True,blank=True)
|
event_place = models.CharField(max_length=200, null=True,blank=True)
|
||||||
|
|
||||||
# Dokumente v.a. fuer Sitzungen
|
# Dokumente v.a. fuer Sitzungen
|
||||||
has_protocol = models.BooleanField(default=False)
|
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)
|
agenda_key = models.CharField(max_length=200, null=True,blank=True)
|
||||||
|
|
||||||
# TimeStamps
|
# TimeStamps
|
||||||
date_modified=models.DateTimeField(auto_now=True)
|
date_modified = models.DateTimeField(auto_now=True)
|
||||||
date_created=models.DateTimeField(auto_now_add=True)
|
date_created = models.DateTimeField(auto_now_add=True)
|
||||||
objects=PostManager()
|
|
||||||
news_objects=NewsPostManager()
|
# Managers
|
||||||
|
objects = PostManager()
|
||||||
|
news_objects = ArticleManager()
|
||||||
|
|
||||||
def get_tags(self):
|
def get_tags(self):
|
||||||
"""Returns assigned tags as a comma seperated list."""
|
"""Returns assigned tags as a comma seperated list."""
|
||||||
@@ -95,30 +119,77 @@ class Post(models.Model):
|
|||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
"save the post with some defaults"
|
"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)
|
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)
|
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):
|
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)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class PostSerializer(serializers.HyperlinkedModelSerializer):
|
class PostSerializer(serializers.HyperlinkedModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Post
|
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',
|
||||||
class Event(Post):
|
'is_fetsitzung']
|
||||||
|
class News(Post):
|
||||||
class Meta:
|
class Meta:
|
||||||
proxy=True
|
proxy = True
|
||||||
objects=EventManager()
|
|
||||||
|
verbose_name = "News"
|
||||||
|
verbose_name_plural = "News"
|
||||||
|
|
||||||
|
objects = NewsManager()
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
self.is_event=True
|
super().save(*args, **kwargs)
|
||||||
|
|
||||||
|
class Event(Post):
|
||||||
|
class Meta:
|
||||||
|
proxy = True
|
||||||
|
objects = EventManager()
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
self.is_event = True
|
||||||
|
|
||||||
super().save(*args, **kwargs)
|
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