From 74ff9a719933dfa4b5356f0b1a9f06c86f5db5ac Mon Sep 17 00:00:00 2001 From: patrick Date: Mon, 1 Mar 2021 14:52:17 +0000 Subject: [PATCH] add file uploads to post --- fet2020/posts/admin.py | 20 ++++--- fet2020/posts/models.py | 86 +++++++++++-------------------- fet2020/posts/views.py | 6 ++- fet2020/templates/posts/show.html | 19 ++++++- 4 files changed, 64 insertions(+), 67 deletions(-) diff --git a/fet2020/posts/admin.py b/fet2020/posts/admin.py index 1a5b9f7f..d9431dc7 100644 --- a/fet2020/posts/admin.py +++ b/fet2020/posts/admin.py @@ -1,7 +1,7 @@ from django.contrib import admin, auth, messages from django.utils.translation import gettext_lazy as _ -from .models import Post, Event, News, FetMeeting +from .models import Post, Event, News, FetMeeting, FileUpload from .forms import PostForm, EventForm, NewsForm, FetMeetingForm from documents.api import createPadifNotExists @@ -58,6 +58,13 @@ def make_fetmeeting(self, request, queryset): make_fetmeeting.short_description = "In eine Fachschaftssitzung konvertieren" +class FileUploadInline(admin.TabularInline): + model = FileUpload + extra = 0 + verbose_name = "Dokument" + verbose_name_plural = "Do­ku­men­ten­samm­lung" + + class PostAdmin(admin.ModelAdmin): form = PostForm model = Post @@ -101,6 +108,12 @@ class PostAdmin(admin.ModelAdmin): ] +class NewsAdmin(PostAdmin): + form = NewsForm + model = News + inlines = (FileUploadInline,) + + class EventAdmin(PostAdmin): form = EventForm model = Event @@ -110,11 +123,6 @@ class EventAdmin(PostAdmin): actions = [make_fetmeeting] -class NewsAdmin(PostAdmin): - form = NewsForm - model = News - - class FetMeetingAdmin(EventAdmin): form = FetMeetingForm model = FetMeeting diff --git a/fet2020/posts/models.py b/fet2020/posts/models.py index 7c27fd63..596e8d74 100644 --- a/fet2020/posts/models.py +++ b/fet2020/posts/models.py @@ -28,17 +28,17 @@ def create_pad_for_post(slug, typ="agenda"): "Creates a Etherpad Pad and returns EtherpadKey" print("creatingpadforpost") try: - agenda_key = createPadifNotExists(slug + "-" + typ) + etherpad_key = createPadifNotExists(slug + "-" + typ) except URLError as error: request_logger.info( - """%s konnte von dem Slug '%s' nicht erstellt werden. - Error: %s""", + "%s konnte von dem Slug '%s' nicht erstellt werden. Error: %s", typ, slug, error, ) return None - return agenda_key + + return etherpad_key class Category(models.Model): @@ -59,30 +59,24 @@ class Category(models.Model): class Post(models.Model): - # id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + # legacy id is for the posts from the old website legacy_id = models.IntegerField(null=True, blank=True) - legacy_rubrik_id = models.IntegerField(null=True, blank=True) - # Titel des Posts + title = models.CharField(verbose_name="Titel", max_length=200) subtitle = models.CharField(max_length=500, null=True, blank=True) + tags = TaggableManager(blank=True) # Slug = Text Basierter url bestandteil zb Fetsitzung 22.1.2020 --> fetsitzung_22_1_2020 für Url slug = models.SlugField(unique=True, blank=True) - # Body Text Artikel Text soll später mit WYSIWG Editor bearbeitet werden - body = models.TextField(null=True, blank=True) - # Ein Haupt Bild für den Post - image = models.ImageField(null=True, blank=True) - # Wer hat das geschrieben - author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) - tags = TaggableManager(blank=True) - # Datum ab dem etwas öffentlich sein soll + body = models.TextField(null=True, blank=True) + image = models.ImageField(null=True, blank=True) + + author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) public_date = models.DateField( verbose_name="Veröffentlichung", null=True, blank=True, default=timezone.now ) - imported_from = models.CharField(max_length=200, null=True, blank=True) - __choices = [("N", _("News")), ("E", _("Event")), ("F", _("FetMeeting"))] post_type = models.CharField(max_length=1, choices=__choices, editable=True) @@ -92,14 +86,12 @@ class Post(models.Model): # post is hidden from newsfeed (e.g. about) is_hidden = models.BooleanField(verbose_name="UNSICHTBAR", default=False) - # Zusatz Info wenn ein Event gepostet wird - event_start = models.DateTimeField( - verbose_name="Event Start", null=True, blank=True - ) + # addional infos for events + event_start = models.DateTimeField(verbose_name="Event Start", null=True, blank=True) event_end = models.DateTimeField(verbose_name="Event Ende", null=True, blank=True) event_place = models.CharField(max_length=200, null=True, blank=True) - # Dokumente v.a. fuer Sitzungen + # protocol for fet meeting has_protocol = models.BooleanField(default=False) has_agenda = models.BooleanField(default=False) protocol_key = models.CharField(max_length=200, null=True, blank=True) @@ -109,6 +101,10 @@ class Post(models.Model): date_modified = models.DateTimeField(auto_now=True) date_created = models.DateTimeField(auto_now_add=True) + # useless (-_-) + legacy_rubrik_id = models.IntegerField(null=True, blank=True) + imported_from = models.CharField(max_length=200, null=True, blank=True) + # Managers objects = PostManager() articles = ArticleManager() @@ -228,9 +224,6 @@ class Post(models.Model): return image.url return "" - # def key(self): - # return self.slug or self.id - def find_an_image(self): "find an image via another post" # TODO: Explain why this image is selected on save of the image @@ -243,10 +236,6 @@ class Post(models.Model): if len(posts1) > 0: return posts1.get().image - # posts2=self.tags.similar_objects() - # for p in posts2: - # if p.image is not None: - # return p.image return None @property @@ -351,34 +340,6 @@ class FetMeeting(Event): return slug - # def __get_agenda_key(self): - # if not self.slug: - # return None## - # - # try: - # agenda_key = createPadifNotExists(self.slug + "-agenda") - # except Exception as error: - # raise ValidationError( - # _("Die Agenda konnte nicht erstellt werden. Error: %(error)s"), - # params={"error": str(error)}, - # ) from error - # - # return agenda_key - - # def __get_protocol_key(self): - # if not self.slug: - # return None# - # - # try: - # protocol_key = createPadifNotExists(self.slug + "-protocol") - # except URLError as error: - # raise ValidationError( - # _("Das Protokoll konnte nicht erstellt werden. Error: %(error)s"), - # params={"error": str(error)}, - # ) from error# - # - # return protocol_key - def clean(self): super().clean() if not self.slug: @@ -406,3 +367,14 @@ class FetMeeting(Event): self.event_end = self.event_start + timedelta(hours=2) super().save(*args, **kwargs) + + +class FileUpload(models.Model): + title = models.CharField(verbose_name="Titel", max_length=200) + file_field = models.FileField(verbose_name="Dokument", upload_to="uploads/posts/files/") + post = models.ForeignKey(Post, on_delete=models.CASCADE) + + objects = models.Manager() + + def __str__(self): + return self.title diff --git a/fet2020/posts/views.py b/fet2020/posts/views.py index dd88b05d..108c506c 100644 --- a/fet2020/posts/views.py +++ b/fet2020/posts/views.py @@ -11,8 +11,7 @@ from documents.api import get_pad_link from documents.etherpadlib import add_ep_cookie from members.models import Member, JobMember - -from .models import Post, FetMeeting +from .models import Post, FetMeeting, FileUpload logger = logging.getLogger(__name__) @@ -74,6 +73,8 @@ def show(request, id=None): elif id != "" and id is not None: p = Post.objects.get(slug=(id)) + files = deque(FileUpload.objects.filter(post=p)) + post_author = Member.all_members.filter(username=p.author).first() author_image = None author = None @@ -112,6 +113,7 @@ def show(request, id=None): context = { "post": p, + "files": files, "author": author, "author_image": author_image, "next": get_next_dict(p), diff --git a/fet2020/templates/posts/show.html b/fet2020/templates/posts/show.html index 52c56c87..1da5a1ca 100644 --- a/fet2020/templates/posts/show.html +++ b/fet2020/templates/posts/show.html @@ -79,9 +79,9 @@
Nächster Artikel
-
{% if request.user.is_authenticated %} +
{% if post.has_agenda %} Agenda
@@ -101,10 +101,10 @@ Bearbeiten {% endif %} -
{% endif %} {% if post.event_start %} +
Start: {{ post.event_start|date:"d. F Y" }} {{ post.event_start|time:"H:i" }}
{% endif %} {% if post.event_end %} @@ -114,6 +114,21 @@ {% if post.event_start %} {% include 'posts/partials/_date_box.html' %} {% endif %} + + {% if files %} +
+ Dokumente: + + + + {% endif %} + +
+