diff --git a/fet2020/posts/admin.py b/fet2020/posts/admin.py index 8df326fa..d3e0cd0b 100644 --- a/fet2020/posts/admin.py +++ b/fet2020/posts/admin.py @@ -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) \ No newline at end of file +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) \ No newline at end of file diff --git a/fet2020/posts/forms.py b/fet2020/posts/forms.py index 0421ebcf..3d19b13e 100644 --- a/fet2020/posts/forms.py +++ b/fet2020/posts/forms.py @@ -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,18 +16,41 @@ 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 fields = ['title','subtitle','tags', 'image','body', 'event_start','event_end', 'event_place','slug','author'] - + widgets = {'body': CKEditorUploadingWidget(config_name='default')} - + 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 = 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 \ No newline at end of file diff --git a/fet2020/posts/models.py b/fet2020/posts/models.py index 34d06c95..6f373eb1 100644 --- a/fet2020/posts/models.py +++ b/fet2020/posts/models.py @@ -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'] - -class Event(Post): + fields = ['slug', 'title', 'subtitle', 'body', 'url', 'public_date', + 'legacy_id', 'image', 'event_start', 'event_end', + 'is_fetsitzung'] +class News(Post): class Meta: - proxy=True - objects=EventManager() + proxy = True + + verbose_name = "News" + verbose_name_plural = "News" + + objects = NewsManager() 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) + +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) \ No newline at end of file