Releases API

Fix #191
See #146
This commit is contained in:
Klaas van Schelven
2025-09-10 10:39:22 +02:00
parent 829cea1a80
commit b0b2573d17
5 changed files with 162 additions and 20 deletions

View File

@@ -1,19 +1,39 @@
from django.utils import timezone
from rest_framework import serializers
from .models import Release
from projects.models import Project
from rest_framework.exceptions import ValidationError
from .models import Release, create_release_if_needed
class ReleaseSerializer(serializers.ModelSerializer):
class ReleaseListSerializer(serializers.ModelSerializer):
class Meta:
model = Release
fields = ["id", "project", "version", "date_released"]
# TODO: distinguish read vs write fields
fields = [
"id",
"project",
"version",
"date_released",
"semver",
"is_semver",
"sort_epoch",
]
class ReleaseDetailSerializer(serializers.ModelSerializer):
class Meta:
model = Release
fields = ["id", "project", "version", "date_released", "semver", "is_semver", "sort_epoch"]
read_only_fields = ["semver", "is_semver", "sort_epoch"]
class ReleaseCreateSerializer(serializers.Serializer):
project = serializers.PrimaryKeyRelatedField(queryset=Project.objects.all())
version = serializers.CharField(allow_blank=True)
timestamp = serializers.DateTimeField(required=False)
def create(self, validated_data):
project = validated_data["project"]
version = validated_data["version"]
timestamp = validated_data.get("timestamp") or timezone.now()
release, release_created = create_release_if_needed(project=project, version=version, timestamp=timestamp)
if not release_created:
raise ValidationError({"version": ["Release with this version already exists for the project."]})
return release
def to_representation(self, instance):
return ReleaseDetailSerializer(instance).data