diff --git a/car/migrations/0001_initial.py b/car/migrations/0001_initial.py new file mode 100644 index 00000000..c6b406cd --- /dev/null +++ b/car/migrations/0001_initial.py @@ -0,0 +1,41 @@ +# Generated by Django 4.1 on 2026-04-15 20:24 + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [] + + operations = [ + migrations.CreateModel( + name="Car", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("manufacturer", models.CharField(max_length=64)), + ("model", models.CharField(max_length=64)), + ( + "horse_powers", + models.PositiveSmallIntegerField( + validators=[ + django.core.validators.MaxValueValidator(1914), + django.core.validators.MinValueValidator(1), + ] + ), + ), + ("is_broken", models.BooleanField()), + ("problem_description", models.TextField(blank=True, null=True)), + ], + ), + ] diff --git a/car/serializers.py b/car/serializers.py index 3026b2b3..4447a5cf 100644 --- a/car/serializers.py +++ b/car/serializers.py @@ -1,5 +1,54 @@ +from django.core.validators import MinValueValidator, MaxValueValidator from rest_framework import serializers +from car.models import Car class CarSerializer(serializers.Serializer): - pass + id = serializers.IntegerField(read_only=True) + manufacturer = serializers.CharField(required=True, max_length=64) + model = serializers.CharField(required=True, max_length=64) + horse_powers = serializers.IntegerField( + required=True, + validators=[ + MinValueValidator( + 1, + message="Min horse_power must be equal or greater than 1." + ), + MaxValueValidator( + 1914, + message="Max horse_power must be equal or less than 1914." + ), + ], + ) + is_broken = serializers.BooleanField() + problem_description = serializers.CharField( + allow_null=True, + required=False + ) + + def create(self, validated_data): + return Car.objects.create(**validated_data) + + def update(self, instance, validated_data): + instance.manufacturer = validated_data.get( + "manufacturer", instance.manufacturer + ) + instance.model = validated_data.get("model", instance.model) + instance.horse_power = validated_data.get( + "horse_power", + instance.horse_power + ) + instance.is_broken = validated_data.get( + "is_broken", + instance.is_broken + ) + instance.problem_description = validated_data.get( + "problem_description", + instance.problem_description + ) + instance.save() + return instance + + class Meta: + model = Car + fields = "__all__" diff --git a/car/tests/tests.py b/car/tests/tests.py index 4cb08ec9..2cab124d 100644 --- a/car/tests/tests.py +++ b/car/tests/tests.py @@ -58,8 +58,14 @@ def test_horse_powers(self): def test_fields_max_length(self): items = [ - ("manufacturer", "Extremely long test manufacturer Extremely long test manufacturer"), - ("model", "Extremely long test model Extremely long test model Extremely long test model") + ( + "manufacturer", + "Extremely long test manufacturer Extremely long test manufacturer", + ), + ( + "model", + "Extremely long test model Extremely long test model Extremely long test model", + ), ] for item in items: @@ -91,14 +97,18 @@ def setUp(self) -> None: def test_serialize_car(self): car = Car(**self.payload) - result = '{"id":1,"manufacturer":"Audi","model":"A4","horse_powers":200,' \ - '"is_broken":true,"problem_description":"test description"}' + result = ( + '{"id":1,"manufacturer":"Audi","model":"A4","horse_powers":200,' + '"is_broken":true,"problem_description":"test description"}' + ) self.assertEqual(serialize_car_object(car=car), bytes(result, "utf-8")) def test_deserialize_car(self): - json = b'{"id":1,"manufacturer":"Audi","model":"A4",' \ - b'"horse_powers":200,"is_broken":true,"problem_description":"test description"}' + json = ( + b'{"id":1,"manufacturer":"Audi","model":"A4",' + b'"horse_powers":200,"is_broken":true,"problem_description":"test description"}' + ) car = deserialize_car_object(json) diff --git a/car_service/urls.py b/car_service/urls.py index cdd48db2..24b22ede 100644 --- a/car_service/urls.py +++ b/car_service/urls.py @@ -13,6 +13,7 @@ 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ + from django.contrib import admin from django.urls import path diff --git a/main.py b/main.py index c8ff592b..f8aa7573 100644 --- a/main.py +++ b/main.py @@ -1,9 +1,21 @@ +import io +from rest_framework.renderers import JSONRenderer +from rest_framework.parsers import JSONParser from car.models import Car +from car.serializers import CarSerializer def serialize_car_object(car: Car) -> bytes: - pass + serializer = CarSerializer(car) + return JSONRenderer().render(serializer.data) def deserialize_car_object(json: bytes) -> Car: - pass + stream = io.BytesIO(json) + data = JSONParser().parse(stream) + + serializer = CarSerializer(data=data) + + serializer.is_valid(raise_exception=True) + + return serializer.save()