diff --git a/program/serializers.py b/program/serializers.py index 690b42a0e252cf06fa543367eae3fe71caff260e..bf44de1c521d6b280208824988558ffc0c3e9532 100644 --- a/program/serializers.py +++ b/program/serializers.py @@ -83,16 +83,18 @@ class ErrorSerializer(serializers.Serializer): class ProfileSerializer(serializers.ModelSerializer): + user_id = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(), source="user") + class Meta: model = UserProfile fields = ( - "user", "cba_username", "cba_user_token", "created_at", "created_by", "updated_at", "updated_by", + "user_id", ) read_only_fields = ( "created_at", @@ -281,10 +283,8 @@ class ImageSerializer(serializers.ModelSerializer): class HostSerializer(serializers.ModelSerializer): - image = serializers.PrimaryKeyRelatedField( - allow_null=True, - queryset=Image.objects.all(), - required=False, + image_id = serializers.PrimaryKeyRelatedField( + allow_null=True, queryset=Image.objects.all(), required=False, source="image" ) links = HostLinkSerializer(many=True, required=False) @@ -300,7 +300,7 @@ class HostSerializer(serializers.ModelSerializer): "biography", "email", "id", - "image", + "image_id", "is_active", "links", "name", @@ -313,6 +313,8 @@ class HostSerializer(serializers.ModelSerializer): links_data = validated_data.pop("links", []) + validated_data["image"] = validated_data.pop("image_id", None) + host = Host.objects.create( created_by=self.context.get("request").user.username, **validated_data ) @@ -331,7 +333,7 @@ class HostSerializer(serializers.ModelSerializer): instance.biography = validated_data.get("biography", instance.biography) instance.email = validated_data.get("email", instance.email) - instance.image = validated_data.get("image", instance.image) + instance.image = validated_data.get("image_id", instance.image) instance.is_active = validated_data.get("is_active", instance.is_active) instance.name = validated_data.get("name", instance.name) @@ -643,7 +645,7 @@ class CollisionSerializer(serializers.Serializer): playlist_id = serializers.IntegerField(allow_null=True) show_id = serializers.IntegerField() show_name = serializers.CharField() - repetition_of = serializers.IntegerField(allow_null=True) + repetition_of_id = serializers.IntegerField(allow_null=True) schedule_id = serializers.IntegerField() memo = serializers.CharField() note_id = serializers.IntegerField(allow_null=True) @@ -741,7 +743,9 @@ class NoteLinkSerializer(serializers.ModelSerializer): class NoteSerializer(serializers.ModelSerializer): - contributors = serializers.PrimaryKeyRelatedField(queryset=Host.objects.all(), many=True) + contributor_ids = serializers.PrimaryKeyRelatedField( + many=True, queryset=Host.objects.all(), source="contributors" + ) image_id = serializers.PrimaryKeyRelatedField( queryset=Image.objects.all(), required=False, allow_null=True ) @@ -763,7 +767,7 @@ class NoteSerializer(serializers.ModelSerializer): fields = ( "cba_id", "content", - "contributors", + "contributor_ids", "id", "image_id", "links", diff --git a/program/services.py b/program/services.py index 005192dbc5e03ee064d710ef502c9b03c418ab94..eb56f7402075cd40b338ba676c9dc68f91c8438c 100644 --- a/program/services.py +++ b/program/services.py @@ -25,10 +25,10 @@ from dateutil.rrule import rrule from rest_framework.exceptions import ValidationError from django.core.exceptions import ObjectDoesNotExist -from django.forms.models import model_to_dict from django.utils import timezone from django.utils.translation import gettext_lazy as _ from program.models import Note, RRule, Schedule, ScheduleConflictError, Show, TimeSlot +from program.serializers import ScheduleSerializer, TimeSlotSerializer from program.utils import parse_date, parse_datetime, parse_time from steering.settings import ( AUTO_SET_LAST_DATE_TO_DAYS_IN_FUTURE, @@ -271,7 +271,9 @@ def resolve_conflicts(data: ScheduleCreateUpdateData, schedule_pk: int | None, s # If there were any errors, don't make any db changes yet # but add error messages and return already chosen solutions if len(errors) > 0: - conflicts = make_conflicts(model_to_dict(new_schedule), new_schedule.pk, show.pk) + conflicts = make_conflicts( + ScheduleSerializer().to_representation(new_schedule), new_schedule.pk, show.pk + ) partly_resolved = conflicts["projected"] saved_solutions = {} @@ -313,9 +315,9 @@ def resolve_conflicts(data: ScheduleCreateUpdateData, schedule_pk: int | None, s # If 'dryrun' is true, just return the projected changes instead of executing them if "dryrun" in schedule and schedule["dryrun"]: return { - "create": [model_to_dict(timeslot) for timeslot in to_create], - "update": [model_to_dict(timeslot) for timeslot in to_update], - "delete": [model_to_dict(timeslot) for timeslot in to_delete], + "create": [TimeSlotSerializer().to_representation(timeslot) for timeslot in to_create], + "update": [TimeSlotSerializer().to_representation(timeslot) for timeslot in to_update], + "delete": [TimeSlotSerializer().to_representation(timeslot) for timeslot in to_delete], } # Database changes if no errors found @@ -354,7 +356,7 @@ def resolve_conflicts(data: ScheduleCreateUpdateData, schedule_pk: int | None, s for timeslot in to_delete: timeslot.delete() - return model_to_dict(new_schedule) + return ScheduleSerializer().to_representation(new_schedule) def instantiate_upcoming_schedule( @@ -440,7 +442,7 @@ def make_conflicts(data: ScheduleData, schedule_pk: int | None, show_pk: int) -> conflicts = generate_conflicts(timeslots) # create a new dictionary by adding "schedule" to conflicts - return dict(conflicts, schedule=model_to_dict(new_schedule)) + return dict(conflicts, schedule=ScheduleSerializer().to_representation(new_schedule)) def generate_timeslots(schedule: Schedule) -> list[TimeSlot]: