From 04080a5f2bacefe09a32cb95dc2b828e9ad78f14 Mon Sep 17 00:00:00 2001 From: kappa118 Date: Fri, 28 Feb 2025 09:47:40 -0500 Subject: [PATCH] attempting to get profiles to work properly --- apps/m3u/api_urls.py | 12 ++++++++++-- apps/m3u/api_views.py | 15 +++++++++------ apps/m3u/models.py | 17 +++++++++++++---- apps/m3u/serializers.py | 14 +++++++++++--- 4 files changed, 43 insertions(+), 15 deletions(-) diff --git a/apps/m3u/api_urls.py b/apps/m3u/api_urls.py index 04528f94..5c216680 100644 --- a/apps/m3u/api_urls.py +++ b/apps/m3u/api_urls.py @@ -13,8 +13,16 @@ router.register(r'profiles', M3UAccountViewSet, basename='m3u-account-profiles') urlpatterns = [ path('refresh/', RefreshM3UAPIView.as_view(), name='m3u_refresh'), path('refresh//', RefreshSingleM3UAPIView.as_view(), name='m3u_refresh_single'), - path('accounts//profiles/', M3UAccountProfileViewSet.as_view({'get': 'list', 'post': 'create'})), - path('accounts//profiles//', M3UAccountProfileViewSet.as_view({'put': 'update', 'delete': 'destroy'})), + path('m3u/accounts//profiles/', M3UAccountProfileViewSet.as_view({ + 'get': 'list', + 'post': 'create' + }), name='m3uaccountprofile-list'), + path('m3u/accounts//profiles//', M3UAccountProfileViewSet.as_view({ + 'get': 'retrieve', + 'put': 'update', + 'patch': 'partial_update', + 'delete': 'destroy' + }), name='m3uaccountprofile-detail'), ] urlpatterns += router.urls diff --git a/apps/m3u/api_views.py b/apps/m3u/api_views.py index 35d558db..53ec9f9f 100644 --- a/apps/m3u/api_views.py +++ b/apps/m3u/api_views.py @@ -70,15 +70,18 @@ class UserAgentViewSet(viewsets.ModelViewSet): permission_classes = [IsAuthenticated] class M3UAccountProfileViewSet(viewsets.ModelViewSet): - queryset = M3UAccountProfile.objects.all() serializer_class = M3UAccountProfileSerializer permission_classes = [IsAuthenticated] def get_queryset(self): - account_id = self.kwargs['account_id'] - return M3UAccountProfile.objects.filter(account_id=account_id) + m3u_account_id = self.kwargs['account_id'] + return M3UAccountProfile.objects.filter(m3u_account_id=m3u_account_id) def perform_create(self, serializer): - account_id = self.kwargs['account_id'] - account = M3UAccount.objects.get(id=account_id) - serializer.save(account=account) + m3u_account_id = self.kwargs['account_id'] + try: + m3u_account = M3UAccount.objects.get(id=m3u_account_id) + except M3UAccount.DoesNotExist: + raise NotFound(f'M3UAccount with id {m3u_account_id} not found.') + + serializer.save(m3u_account=m3u_account) diff --git a/apps/m3u/models.py b/apps/m3u/models.py index 28c1b39b..c878729e 100644 --- a/apps/m3u/models.py +++ b/apps/m3u/models.py @@ -149,14 +149,20 @@ class ServerGroup(models.Model): def __str__(self): return self.name +from django.db import models + class M3UAccountProfile(models.Model): + """Represents a profile associated with an M3U Account.""" + m3u_account = models.ForeignKey( + 'M3UAccount', + on_delete=models.CASCADE, + related_name='profiles', + help_text="The M3U account this profile belongs to." + ) name = models.CharField( max_length=255, help_text="Name for the M3U account profile" ) - m3u_account_id = models.ForeignKey(M3UAccount, - on_delete=models.CASCADE - ) max_streams = models.PositiveIntegerField( default=0, help_text="Maximum number of concurrent streams (0 for unlimited)" @@ -170,5 +176,8 @@ class M3UAccountProfile(models.Model): class Meta: constraints = [ - models.UniqueConstraint(fields=['m3u_account_id', 'name'], name='unique_account_name') + models.UniqueConstraint(fields=['m3u_account', 'name'], name='unique_account_profile_name') ] + + def __str__(self): + return f"{self.name} ({self.m3u_account.name})" diff --git a/apps/m3u/serializers.py b/apps/m3u/serializers.py index e15d8499..83afe225 100644 --- a/apps/m3u/serializers.py +++ b/apps/m3u/serializers.py @@ -9,12 +9,20 @@ class M3UFilterSerializer(serializers.ModelSerializer): model = M3UFilter fields = ['id', 'filter_type', 'regex_pattern', 'exclude'] -class M3UAccountProfileSerializer(serializers.ModelSerializer): - """Serializer for M3U Account Profiles""" +from rest_framework import serializers +from .models import M3UAccountProfile +class M3UAccountProfileSerializer(serializers.ModelSerializer): class Meta: model = M3UAccountProfile - fields = ['id', 'name', 'm3u_account_id', 'search_pattern', 'replace_pattern'] + fields = ['id', 'name', 'max_streams', 'search_pattern', 'replace_pattern'] + read_only_fields = ['id'] + + def create(self, validated_data): + # Get the account from the context and assign it directly + m3u_account = self.context['m3u_account'] + return M3UAccountProfile.objects.create(m3u_account=m3u_account, **validated_data) + class M3UAccountSerializer(serializers.ModelSerializer): """Serializer for M3U Account"""