From 88866cc905bae365d1b5bb216f56ca36c8bcdc77 Mon Sep 17 00:00:00 2001 From: MooseyOnTheLoosey Date: Thu, 8 May 2025 09:12:10 -0500 Subject: [PATCH 1/3] Updated channel numbers from integer to float --- apps/channels/api_views.py | 24 ++++++++++++------- .../0018_alter_channel_channel_number.py | 18 ++++++++++++++ apps/channels/models.py | 3 ++- apps/channels/serializers.py | 6 ++++- 4 files changed, 41 insertions(+), 10 deletions(-) create mode 100644 apps/channels/migrations/0018_alter_channel_channel_number.py diff --git a/apps/channels/api_views.py b/apps/channels/api_views.py index ab206afb..ed070baa 100644 --- a/apps/channels/api_views.py +++ b/apps/channels/api_views.py @@ -23,6 +23,8 @@ import mimetypes from rest_framework.pagination import PageNumberPagination +import logging +logger = logging.getLogger(__name__) class OrInFilter(django_filters.Filter): """ @@ -239,7 +241,7 @@ class ChannelViewSet(viewsets.ModelViewSet): type=openapi.TYPE_INTEGER, description="ID of the stream to link" ), "channel_number": openapi.Schema( - type=openapi.TYPE_INTEGER, + type=openapi.TYPE_NUMBER, description="(Optional) Desired channel number. Must not be in use." ), "name": openapi.Schema( @@ -255,6 +257,7 @@ class ChannelViewSet(viewsets.ModelViewSet): if not stream_id: return Response({"error": "Missing stream_id"}, status=status.HTTP_400_BAD_REQUEST) stream = get_object_or_404(Stream, pk=stream_id) + logger.debug(f"Stream found: {stream.id}, Custom Properties: {stream.custom_properties}") channel_group = stream.channel_group name = request.data.get('name') @@ -266,17 +269,21 @@ class ChannelViewSet(viewsets.ModelViewSet): channel_number = None if 'tvg-chno' in stream_custom_props: - channel_number = int(stream_custom_props['tvg-chno']) + channel_number = float(stream_custom_props['tvg-chno']) + logger.debug(f"Channel number from tvg-chno: {channel_number}") elif 'channel-number' in stream_custom_props: - channel_number = int(stream_custom_props['channel-number']) + channel_number = float(stream_custom_props['channel-number']) + logger.debug(f"Channel number from channel-number: {channel_number}") if channel_number is None: provided_number = request.data.get('channel_number') + logger.debug(f"Provided channel number: {provided_number}") if provided_number is None: channel_number = Channel.get_next_available_channel_number() else: try: - channel_number = int(provided_number) + channel_number = float(provided_number) + logger.debug(f"Provided channel number2: {provided_number}") except ValueError: return Response({"error": "channel_number must be an integer."}, status=status.HTTP_400_BAD_REQUEST) # If the provided number is already used, return an error. @@ -295,6 +302,7 @@ class ChannelViewSet(viewsets.ModelViewSet): 'channel_group_id': channel_group.id, 'streams': [stream_id], } + logger.debug(f"Final channel data: {channel_data}") if stream.logo_url: logo, _ = Logo.objects.get_or_create(url=stream.logo_url, defaults={ @@ -330,7 +338,7 @@ class ChannelViewSet(viewsets.ModelViewSet): type=openapi.TYPE_INTEGER, description="ID of the stream to link" ), "channel_number": openapi.Schema( - type=openapi.TYPE_INTEGER, + type=openapi.TYPE_NUMBER, description="(Optional) Desired channel number. Must not be in use." ), "name": openapi.Schema( @@ -387,9 +395,9 @@ class ChannelViewSet(viewsets.ModelViewSet): channel_number = None if 'tvg-chno' in stream_custom_props: - channel_number = int(stream_custom_props['tvg-chno']) + channel_number = float(stream_custom_props['tvg-chno']) elif 'channel-number' in stream_custom_props: - channel_number = int(stream_custom_props['channel-number']) + channel_number = float(stream_custom_props['channel-number']) # Determine channel number: if provided, use it (if free); else auto assign. if channel_number is None: @@ -398,7 +406,7 @@ class ChannelViewSet(viewsets.ModelViewSet): channel_number = get_auto_number() else: try: - channel_number = int(provided_number) + channel_number = float(provided_number) except ValueError: errors.append({"item": item, "error": "channel_number must be an integer."}) continue diff --git a/apps/channels/migrations/0018_alter_channel_channel_number.py b/apps/channels/migrations/0018_alter_channel_channel_number.py new file mode 100644 index 00000000..7e5163d4 --- /dev/null +++ b/apps/channels/migrations/0018_alter_channel_channel_number.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.6 on 2025-05-08 14:05 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dispatcharr_channels', '0017_alter_channelgroup_name'), + ] + + operations = [ + migrations.AlterField( + model_name='channel', + name='channel_number', + field=models.FloatField(db_index=True), + ), + ] diff --git a/apps/channels/models.py b/apps/channels/models.py index 4485936e..fb208bcd 100644 --- a/apps/channels/models.py +++ b/apps/channels/models.py @@ -210,7 +210,8 @@ class ChannelManager(models.Manager): class Channel(models.Model): - channel_number = models.IntegerField(db_index=True) + channel_number = models.FloatField(db_index=True) + logger.debug(f"Saving channel with channel_number: {channel_number}") name = models.CharField(max_length=255) logo = models.ForeignKey( 'Logo', diff --git a/apps/channels/serializers.py b/apps/channels/serializers.py index 69f25286..2134eef5 100644 --- a/apps/channels/serializers.py +++ b/apps/channels/serializers.py @@ -7,6 +7,9 @@ from django.urls import reverse from rest_framework import serializers from django.utils import timezone +import logging +logger = logging.getLogger(__name__) + class LogoSerializer(serializers.ModelSerializer): cache_url = serializers.SerializerMethodField() @@ -114,7 +117,8 @@ class BulkChannelProfileMembershipSerializer(serializers.Serializer): # class ChannelSerializer(serializers.ModelSerializer): # Show nested group data, or ID - channel_number = serializers.IntegerField(allow_null=True, required=False) + channel_number = serializers.FloatField(allow_null=True, required=False) + logger.debug(f"Serializer validating channel number: {channel_number}") channel_group_id = serializers.PrimaryKeyRelatedField( queryset=ChannelGroup.objects.all(), source="channel_group", From f6ea1b41b32cbfd9833ff95e849d1dd2ea48f1a1 Mon Sep 17 00:00:00 2001 From: MooseyOnTheLoosey Date: Thu, 8 May 2025 09:15:08 -0500 Subject: [PATCH 2/3] Removing debug --- apps/channels/api_views.py | 8 -------- apps/channels/serializers.py | 4 ---- 2 files changed, 12 deletions(-) diff --git a/apps/channels/api_views.py b/apps/channels/api_views.py index ed070baa..a6200ae5 100644 --- a/apps/channels/api_views.py +++ b/apps/channels/api_views.py @@ -23,9 +23,6 @@ import mimetypes from rest_framework.pagination import PageNumberPagination -import logging -logger = logging.getLogger(__name__) - class OrInFilter(django_filters.Filter): """ Custom filter that handles the OR condition instead of AND. @@ -270,20 +267,16 @@ class ChannelViewSet(viewsets.ModelViewSet): channel_number = None if 'tvg-chno' in stream_custom_props: channel_number = float(stream_custom_props['tvg-chno']) - logger.debug(f"Channel number from tvg-chno: {channel_number}") elif 'channel-number' in stream_custom_props: channel_number = float(stream_custom_props['channel-number']) - logger.debug(f"Channel number from channel-number: {channel_number}") if channel_number is None: provided_number = request.data.get('channel_number') - logger.debug(f"Provided channel number: {provided_number}") if provided_number is None: channel_number = Channel.get_next_available_channel_number() else: try: channel_number = float(provided_number) - logger.debug(f"Provided channel number2: {provided_number}") except ValueError: return Response({"error": "channel_number must be an integer."}, status=status.HTTP_400_BAD_REQUEST) # If the provided number is already used, return an error. @@ -302,7 +295,6 @@ class ChannelViewSet(viewsets.ModelViewSet): 'channel_group_id': channel_group.id, 'streams': [stream_id], } - logger.debug(f"Final channel data: {channel_data}") if stream.logo_url: logo, _ = Logo.objects.get_or_create(url=stream.logo_url, defaults={ diff --git a/apps/channels/serializers.py b/apps/channels/serializers.py index 2134eef5..c3772f34 100644 --- a/apps/channels/serializers.py +++ b/apps/channels/serializers.py @@ -7,9 +7,6 @@ from django.urls import reverse from rest_framework import serializers from django.utils import timezone -import logging -logger = logging.getLogger(__name__) - class LogoSerializer(serializers.ModelSerializer): cache_url = serializers.SerializerMethodField() @@ -118,7 +115,6 @@ class BulkChannelProfileMembershipSerializer(serializers.Serializer): class ChannelSerializer(serializers.ModelSerializer): # Show nested group data, or ID channel_number = serializers.FloatField(allow_null=True, required=False) - logger.debug(f"Serializer validating channel number: {channel_number}") channel_group_id = serializers.PrimaryKeyRelatedField( queryset=ChannelGroup.objects.all(), source="channel_group", From 5bae7997c03927871be9b2b0de4c042bdd562fb7 Mon Sep 17 00:00:00 2001 From: MooseyOnTheLoosey Date: Thu, 8 May 2025 09:50:19 -0500 Subject: [PATCH 3/3] Removing more debug --- apps/channels/api_views.py | 2 +- apps/channels/models.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/channels/api_views.py b/apps/channels/api_views.py index a6200ae5..13535c8c 100644 --- a/apps/channels/api_views.py +++ b/apps/channels/api_views.py @@ -23,6 +23,7 @@ import mimetypes from rest_framework.pagination import PageNumberPagination + class OrInFilter(django_filters.Filter): """ Custom filter that handles the OR condition instead of AND. @@ -254,7 +255,6 @@ class ChannelViewSet(viewsets.ModelViewSet): if not stream_id: return Response({"error": "Missing stream_id"}, status=status.HTTP_400_BAD_REQUEST) stream = get_object_or_404(Stream, pk=stream_id) - logger.debug(f"Stream found: {stream.id}, Custom Properties: {stream.custom_properties}") channel_group = stream.channel_group name = request.data.get('name') diff --git a/apps/channels/models.py b/apps/channels/models.py index fb208bcd..fc6af558 100644 --- a/apps/channels/models.py +++ b/apps/channels/models.py @@ -211,7 +211,6 @@ class ChannelManager(models.Manager): class Channel(models.Model): channel_number = models.FloatField(db_index=True) - logger.debug(f"Saving channel with channel_number: {channel_number}") name = models.CharField(max_length=255) logo = models.ForeignKey( 'Logo',