blob: 8007def9fde4d5dc1d05479de6b23196eb11baec [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
from django.contrib.auth.models import User, Group
from django.shortcuts import get_object_or_404
from rest_framework import serializers
from rest_framework.reverse import reverse
from ..models import (
Component,
Milestone,
Product,
Ticket,
TicketChange,
Version,
)
from functools import partial
def get_self_url(obj, context, obj_type):
keywords = {
"product_prefix": obj.product.prefix,
}
if obj_type == "ticket":
keywords["product_ticket_id"] = obj.product_ticket_id
elif obj_type == "ticketchange":
keywords["time"] = obj.time
else:
keywords["name"] = obj.name
return reverse(
f"product-{obj_type}s-detail",
kwargs=keywords,
request=context["request"],
)
class ProductChildSerializer(serializers.HyperlinkedModelSerializer):
product_url = serializers.SerializerMethodField()
def get_product_url(self, obj):
keywords = {
"prefix": obj.product.prefix,
}
return reverse(
"product-detail", kwargs=keywords, request=self.context["request"]
)
def create(self, validated_data):
if "prefix" not in self.context["view"].kwargs.keys():
prefix = self.context["view"].kwargs["product_prefix"]
product = get_object_or_404(Product.objects.all(), prefix=prefix)
validated_data["product"] = product
return super().create(validated_data)
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ("url", "username", "email", "is_staff")
class GroupSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Group
fields = ("url", "name")
class TicketChangeSerializer(ProductChildSerializer):
url = serializers.SerializerMethodField()
class Meta:
model = TicketChange
fields = ("url", "time", "author", "field", "oldvalue", "newvalue")
def get_url(self, obj):
return get_self_url(obj, self.context, "ticketchange")
class TicketSerializer(ProductChildSerializer):
url = serializers.SerializerMethodField()
class Meta:
model = Ticket
fields = (
"product_url",
"url",
"product_ticket_id",
"summary",
"description",
"time",
"changetime",
"reporter",
"owner",
"cc",
"status",
"severity",
"priority",
"keywords",
)
extra_kwargs = {
"product_ticket_id": {"required": False},
}
def get_url(self, obj):
return get_self_url(obj, self.context, "ticket")
class ComponentSerializer(ProductChildSerializer):
url = serializers.SerializerMethodField()
class Meta:
model = Component
fields = (
"product_url",
"url",
"name",
"description",
"owner",
)
def get_url(self, obj):
return get_self_url(obj, self.context, "component")
class MilestoneSerializer(ProductChildSerializer):
url = serializers.SerializerMethodField()
class Meta:
model = Milestone
fields = (
"product_url",
"url",
"name",
"description",
"due",
"completed",
)
def get_url(self, obj):
return get_self_url(obj, self.context, "milestone")
class VersionSerializer(ProductChildSerializer):
url = serializers.SerializerMethodField()
class Meta:
model = Version
fields = (
"product_url",
"url",
"name",
"description",
"time",
)
def get_url(self, obj):
return get_self_url(obj, self.context, "version")
ProductHyperlinkedModelSerializer = partial(
serializers.HyperlinkedIdentityField,
lookup_field="prefix",
lookup_url_kwarg="product_prefix",
)
class ProductSerializer(serializers.HyperlinkedModelSerializer):
url = serializers.HyperlinkedIdentityField(
view_name="product-detail",
lookup_field="prefix",
)
tickets_url = ProductHyperlinkedModelSerializer(
view_name="product-tickets-list",
)
components_url = ProductHyperlinkedModelSerializer(
view_name="product-components-list",
)
milestones_url = ProductHyperlinkedModelSerializer(
view_name="product-milestones-list",
)
versions_url = ProductHyperlinkedModelSerializer(
view_name="product-versions-list",
)
ticketchanges_url = ProductHyperlinkedModelSerializer(
view_name="product-ticketchanges-list",
)
class Meta:
model = Product
fields = (
"url",
"prefix",
"name",
"description",
"owner",
"tickets_url",
"components_url",
"milestones_url",
"versions_url",
"ticketchanges_url",
)