From df80b0ab56e531ef7e0d2fb52649c363cb7ef788 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjam=C3=ADn=20Mravec?= Date: Sat, 11 Nov 2023 16:36:41 +0100 Subject: [PATCH 1/2] Added logo model --- cms/admin.py | 11 +++++++++- cms/models.py | 24 +++++++++++++++++++++ cms/serializers.py | 6 ++++++ cms/urls.py | 1 + cms/views.py | 53 ++++++++++++++++++++++++++++++++++++++++++++-- 5 files changed, 92 insertions(+), 3 deletions(-) diff --git a/cms/admin.py b/cms/admin.py index 2ae1c98e..6bc8ccfe 100644 --- a/cms/admin.py +++ b/cms/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin -from cms.models import InfoBanner, MenuItem, MessageTemplate, Post, PostLink +from cms.models import InfoBanner, MenuItem, MessageTemplate, Post, PostLink, Logo @admin.register(MenuItem) @@ -16,6 +16,15 @@ class MenuItemAdmin(admin.ModelAdmin): ) +@admin.register(Logo) +class LogoAdmin(admin.ModelAdmin): + list_display = ( + 'image', + 'name', + 'disabled' + ) + + @admin.register(Post) class PostAdmin(admin.ModelAdmin): list_display = ( diff --git a/cms/models.py b/cms/models.py index 952dd1ab..cb13880a 100644 --- a/cms/models.py +++ b/cms/models.py @@ -3,6 +3,7 @@ from django.core.exceptions import ValidationError from django.db import models from django.utils.timezone import now +from base.models import RestrictedFileField from competition.models import Event, Series @@ -111,6 +112,29 @@ class Meta: # zobrazované aj možno niekde inde +class Logo(models.Model): + """ + Logo + """ + class Meta: + verbose_name = 'logo' + verbose_name_plural = 'logá' + + ordering = ['name', ] + + name = models.CharField(verbose_name='názov loga', max_length=150) + disabled = models.BooleanField() + image = RestrictedFileField( + content_types=['image/svg+xml', 'image/png'], + upload_to='logo_images/', + verbose_name='Logo', null=True, blank=True) + + def __str__(self): + return f'{self.series.semester.competition.name}-{self.series.semester.year}' \ + f'-{self.series.semester.season[0]}S-S{self.series.order} - {self.order}. úloha' + + + class InfoBanner(ModelWithVisibility): class Meta: verbose_name = 'Informácia v pohyblivom baneri' diff --git a/cms/serializers.py b/cms/serializers.py index ae6c28c0..232fa566 100644 --- a/cms/serializers.py +++ b/cms/serializers.py @@ -27,6 +27,12 @@ class Meta: model = models.Post fields = '__all__' +@ts_interface(context='cms') +class LogoSerializer(serializers.ModelSerializer): + class Meta: + model = models.Logo + fields = '__all__' + @ts_interface(context='cms') class InfoBannerSerializer(serializers.ModelSerializer): diff --git a/cms/urls.py b/cms/urls.py index ef6b9f41..68b22e20 100644 --- a/cms/urls.py +++ b/cms/urls.py @@ -11,6 +11,7 @@ router.register(r'menu-item', views.MenuItemViewSet) router.register(r'info-banner', views.InfoBannerViewSet) router.register(r'message-template', views.MessageTemplateViewSet) +router.register(r'logo', views.LogoViewSet) urlpatterns = [ diff --git a/cms/views.py b/cms/views.py index 604640c5..ccccb09f 100644 --- a/cms/views.py +++ b/cms/views.py @@ -2,12 +2,20 @@ from rest_framework.decorators import action from rest_framework.response import Response -from cms.models import InfoBanner, MenuItem, MessageTemplate, Post +from cms.models import InfoBanner, MenuItem, MessageTemplate, Post, Logo from cms.permissions import PostPermission from cms.serializers import (InfoBannerSerializer, MenuItemShortSerializer, - MessageTemplateSerializer, PostSerializer) + MessageTemplateSerializer, PostSerializer, LogoSerializer) +from django.http import HttpResponse +from rest_framework import exceptions, status, viewsets +from rest_framework.decorators import action +from rest_framework.permissions import IsAdminUser, IsAuthenticated +from rest_framework.response import Response + +from base.utils import mime_type + class MenuItemViewSet(viewsets.ReadOnlyModelViewSet): """Položky menu""" queryset = MenuItem.objects.order_by('-priority') @@ -43,6 +51,47 @@ def visible(self, request): posts = self.filter_queryset(self.get_queryset()).visible() serializer = PostSerializer(posts, many=True) return Response(serializer.data) + + +class LogoViewSet(viewsets.ModelViewSet): + """Publikácie(výsledky, brožúrky, časopisy, ...)""" + queryset = Logo.objects.all() + serializer_class = LogoSerializer + permission_classes = (PostPermission,) + + def perform_create(self, serializer): + ''' + Vola sa pri vytvarani objektu, + checkuju sa tu permissions, ci user vie vytvorit publication v danom evente + ''' + event = serializer.validated_data['event'] + if event.can_user_modify(self.request.user): + serializer.save() + else: + raise exceptions.PermissionDenied( + 'Nedostatočné práva na vytvorenie tohoto objektu') + + @action(methods=['get'], detail=True, url_path='download') + def download_logo(self, request, pk=None): + """Stiahne logo""" + logo = self.get_object() + response = HttpResponse( + logo.file, content_type=mime_type(logo.file)) + response['Content-Disposition'] = f'attachment; filename="{logo.name}"' + return response + + @action(methods=['post'], detail=False, url_path='upload', permission_classes=[IsAdminUser]) + def upload_publication(self, request): + """Nahrá súbor publikácie""" + if 'file' not in request.data: + raise exceptions.ParseError(detail='Request neobsahoval súbor') + + file = request.data['file'] + if mime_type(file) not in ['application/jpg', 'application/png']: + raise exceptions.ParseError(detail='Nesprávny formát') + + return Response(status=status.HTTP_201_CREATED) + class InfoBannerViewSet(viewsets.ModelViewSet): From 043f0bce55b217bfcde1aeaa52e8b1a5eeb5cbac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjam=C3=ADn=20Mravec?= Date: Sat, 11 Nov 2023 16:46:32 +0100 Subject: [PATCH 2/2] Added logo model --- cms/models.py | 5 ----- cms/views.py | 14 ++++---------- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/cms/models.py b/cms/models.py index cb13880a..1c7296f4 100644 --- a/cms/models.py +++ b/cms/models.py @@ -129,11 +129,6 @@ class Meta: upload_to='logo_images/', verbose_name='Logo', null=True, blank=True) - def __str__(self): - return f'{self.series.semester.competition.name}-{self.series.semester.year}' \ - f'-{self.series.semester.season[0]}S-S{self.series.order} - {self.order}. úloha' - - class InfoBanner(ModelWithVisibility): class Meta: diff --git a/cms/views.py b/cms/views.py index ccccb09f..446bf58d 100644 --- a/cms/views.py +++ b/cms/views.py @@ -1,19 +1,13 @@ -from rest_framework import viewsets +from rest_framework import viewsets, exceptions, status from rest_framework.decorators import action from rest_framework.response import Response from cms.models import InfoBanner, MenuItem, MessageTemplate, Post, Logo -from cms.permissions import PostPermission +from cms.permissions import PostPermission, IsAdminUser from cms.serializers import (InfoBannerSerializer, MenuItemShortSerializer, MessageTemplateSerializer, PostSerializer, LogoSerializer) - from django.http import HttpResponse -from rest_framework import exceptions, status, viewsets -from rest_framework.decorators import action -from rest_framework.permissions import IsAdminUser, IsAuthenticated -from rest_framework.response import Response - from base.utils import mime_type class MenuItemViewSet(viewsets.ReadOnlyModelViewSet): @@ -51,7 +45,7 @@ def visible(self, request): posts = self.filter_queryset(self.get_queryset()).visible() serializer = PostSerializer(posts, many=True) return Response(serializer.data) - + class LogoViewSet(viewsets.ModelViewSet): """Publikácie(výsledky, brožúrky, časopisy, ...)""" @@ -72,7 +66,7 @@ def perform_create(self, serializer): 'Nedostatočné práva na vytvorenie tohoto objektu') @action(methods=['get'], detail=True, url_path='download') - def download_logo(self, request, pk=None): + def download_logo(self, request): """Stiahne logo""" logo = self.get_object() response = HttpResponse(