3 Commits

  1. 2
      apps/podcast/models.py
  2. 38
      apps/podcast/serializers_dovodi.py
  3. 2
      apps/video/models.py
  4. 38
      apps/video/serializers_dovodi.py
  5. 2
      config/urls.py
  6. 27
      dynamic_preferences/views.py

2
apps/podcast/models.py

@ -1,6 +1,7 @@
from django.db import models
from django.utils.translation import gettext_lazy as _
from django.conf import settings
import datetime
from utils import generate_slug_for_model
from utils.mixins import LowercaseSlugMixin
@ -119,7 +120,6 @@ class Podcast(LowercaseSlugMixin, models.Model):
file_changed = True
if not self.audio_time:
import datetime
self.audio_time = datetime.time(0, 0, 0)
super().save(*args, **kwargs)

38
apps/podcast/serializers_dovodi.py

@ -1,6 +1,6 @@
from rest_framework import serializers
from .models import Podcast, PodcastCategory, PodcastCollection
from .models import Podcast, PodcastCategory, PodcastCollection, PodcastPlaylist, PlaylistItem
from .serializers_admin import AbsoluteFileField, AbsoluteImageField
@ -50,6 +50,8 @@ class DovodiPodcastItemSerializer(serializers.ModelSerializer):
audio_file = AbsoluteFileField(required=False, allow_null=True)
remove_thumbnail = serializers.BooleanField(write_only=True, required=False, default=False)
remove_audio_file = serializers.BooleanField(write_only=True, required=False, default=False)
playlist = serializers.IntegerField(required=False, allow_null=True, write_only=True)
playlist_id = serializers.SerializerMethodField(read_only=True)
class Meta:
model = Podcast
@ -64,17 +66,31 @@ class DovodiPodcastItemSerializer(serializers.ModelSerializer):
"status",
"view_count",
"download_count",
"playlist",
"playlist_id",
"created_at",
"updated_at",
"remove_thumbnail",
"remove_audio_file",
]
read_only_fields = ["id", "view_count", "download_count", "created_at", "updated_at"]
read_only_fields = ["id", "view_count", "download_count", "playlist_id", "created_at", "updated_at"]
def get_playlist_id(self, obj):
appearance = obj.playlist_appearances.first()
return appearance.playlist_id if appearance else None
def create(self, validated_data):
playlist_id = validated_data.pop("playlist", None)
validated_data.pop("remove_thumbnail", False)
validated_data.pop("remove_audio_file", False)
return super().create(validated_data)
instance = super().create(validated_data)
if playlist_id:
try:
playlist = PodcastPlaylist.objects.get(id=playlist_id)
PlaylistItem.objects.create(playlist=playlist, podcast=instance, priority=playlist.playlist_items.count() + 1)
except PodcastPlaylist.DoesNotExist:
pass
return instance
def update(self, instance, validated_data):
remove_thumbnail = validated_data.pop("remove_thumbnail", False)
@ -88,4 +104,18 @@ class DovodiPodcastItemSerializer(serializers.ModelSerializer):
instance.audio_file.delete(save=False)
instance.audio_file = None
return super().update(instance, validated_data)
playlist_in_payload = "playlist" in self.initial_data
playlist_id = validated_data.pop("playlist", None)
instance = super().update(instance, validated_data)
if playlist_in_payload:
instance.playlist_appearances.all().delete()
if playlist_id:
try:
playlist = PodcastPlaylist.objects.get(id=playlist_id)
PlaylistItem.objects.create(playlist=playlist, podcast=instance, priority=playlist.playlist_items.count() + 1)
except PodcastPlaylist.DoesNotExist:
pass
return instance

2
apps/video/models.py

@ -1,6 +1,7 @@
from django.db import models
from django.utils.translation import gettext_lazy as _
from django.conf import settings
import datetime
from filer.fields.image import FilerImageField
from utils import generate_slug_for_model
from utils.mixins import LowercaseSlugMixin
@ -139,7 +140,6 @@ class Video(LowercaseSlugMixin, models.Model):
file_changed = True
if not self.video_time:
import datetime
self.video_time = datetime.time(0, 0, 0)
super().save(*args, **kwargs)

38
apps/video/serializers_dovodi.py

@ -1,6 +1,6 @@
from rest_framework import serializers
from .models import Video, VideoCategory, VideoCollection
from .models import Video, VideoCategory, VideoCollection, VideoPlaylist, PlaylistItem
from .serializers_admin import AbsoluteFileField, AbsoluteImageField
@ -50,6 +50,8 @@ class DovodiVideoItemSerializer(serializers.ModelSerializer):
video_file = AbsoluteFileField(required=False, allow_null=True)
remove_thumbnail = serializers.BooleanField(write_only=True, required=False, default=False)
remove_video_file = serializers.BooleanField(write_only=True, required=False, default=False)
playlist = serializers.IntegerField(required=False, allow_null=True, write_only=True)
playlist_id = serializers.SerializerMethodField(read_only=True)
class Meta:
model = Video
@ -65,12 +67,18 @@ class DovodiVideoItemSerializer(serializers.ModelSerializer):
"video_time",
"status",
"view_count",
"playlist",
"playlist_id",
"created_at",
"updated_at",
"remove_thumbnail",
"remove_video_file",
]
read_only_fields = ["id", "view_count", "created_at", "updated_at"]
read_only_fields = ["id", "view_count", "playlist_id", "created_at", "updated_at"]
def get_playlist_id(self, obj):
appearance = obj.playlist_appearances.first()
return appearance.playlist_id if appearance else None
def validate(self, attrs):
video_type = attrs.get("video_type", getattr(self.instance, "video_type", None))
@ -96,9 +104,17 @@ class DovodiVideoItemSerializer(serializers.ModelSerializer):
return attrs
def create(self, validated_data):
playlist_id = validated_data.pop("playlist", None)
validated_data.pop("remove_thumbnail", False)
validated_data.pop("remove_video_file", False)
return super().create(validated_data)
instance = super().create(validated_data)
if playlist_id:
try:
playlist = VideoPlaylist.objects.get(id=playlist_id)
PlaylistItem.objects.create(playlist=playlist, video=instance, priority=playlist.playlist_items.count() + 1)
except VideoPlaylist.DoesNotExist:
pass
return instance
def update(self, instance, validated_data):
remove_thumbnail = validated_data.pop("remove_thumbnail", False)
@ -112,4 +128,18 @@ class DovodiVideoItemSerializer(serializers.ModelSerializer):
instance.video_file.delete(save=False)
instance.video_file = None
return super().update(instance, validated_data)
playlist_in_payload = "playlist" in self.initial_data
playlist_id = validated_data.pop("playlist", None)
instance = super().update(instance, validated_data)
if playlist_in_payload:
instance.playlist_appearances.all().delete()
if playlist_id:
try:
playlist = VideoPlaylist.objects.get(id=playlist_id)
PlaylistItem.objects.create(playlist=playlist, video=instance, priority=playlist.playlist_items.count() + 1)
except VideoPlaylist.DoesNotExist:
pass
return instance

2
config/urls.py

@ -198,4 +198,4 @@ if settings.DEBUG:
re_path(r'^%s(?P<path>.*)$' % re.escape(settings.MEDIA_URL.lstrip('/')), ranged_static_serve, {'document_root': settings.MEDIA_ROOT}),
]
# Force reload trigger
# Force reload trigger 3

27
dynamic_preferences/views.py

@ -13,6 +13,7 @@ from .serializers import (
)
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
from apps.account.permissions import IsSuperAdmin
class AboutUsAPIView(GenericAPIView):
@ -49,6 +50,12 @@ class FAQCourseAPIView(GenericAPIView):
class FAQGeneralAPIView(GenericAPIView):
serializer_class = FAQItemSerializer
authentication_classes = [TokenAuthentication]
def get_permissions(self):
if self.request.method in ['PUT', 'POST', 'PATCH']:
return [IsAuthenticated(), IsSuperAdmin()]
return []
def get(self, request, *args, **kwargs):
preferences = global_preferences_registry.manager()
@ -56,6 +63,13 @@ class FAQGeneralAPIView(GenericAPIView):
serializer = self.get_serializer(faq_general, many=True)
return Response(serializer.data)
def put(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data, many=True)
serializer.is_valid(raise_exception=True)
preferences = global_preferences_registry.manager()
preferences['FAQ_General__FAQ_General'] = serializer.validated_data
return Response(serializer.data)
class SupportAPIView(GenericAPIView):
serializer_class = SupportSerializer
authentication_classes = [TokenAuthentication]
@ -106,6 +120,12 @@ class CardAPIView(GenericAPIView):
class AboutUsDobodiAPIView(GenericAPIView):
serializer_class = AboutUsDobodiSerializer
authentication_classes = [TokenAuthentication]
def get_permissions(self):
if self.request.method in ['PUT', 'POST', 'PATCH']:
return [IsAuthenticated(), IsSuperAdmin()]
return []
def get(self, request, *args, **kwargs):
preferences = global_preferences_registry.manager()
@ -114,6 +134,13 @@ class AboutUsDobodiAPIView(GenericAPIView):
about_us_dobodi = {}
serializer = self.get_serializer(about_us_dobodi)
return Response(serializer.data)
def put(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
preferences = global_preferences_registry.manager()
preferences['about_us_dobodi__about_us_dobodi'] = serializer.validated_data
return Response(serializer.data)
"""Todo : remove these views and use only context processors"""

Loading…
Cancel
Save