Browse Source

Reorganize serializers so they can reference eachother for related
fields

David Burke 5 years ago
parent
commit
6b9475c104

+ 1 - 1
issues/serializers.py

@@ -1,5 +1,5 @@
 from rest_framework import serializers
 from rest_framework import serializers
-from projects.serializers import ProjectReferenceSerializer
+from projects.serializers.base_serializers import ProjectReferenceSerializer
 from .models import Issue, Event
 from .models import Issue, Event
 
 
 
 

+ 0 - 0
organizations_ext/serializers/__init__.py


+ 2 - 1
organizations_ext/serializers.py → organizations_ext/serializers/base_serializers.py

@@ -2,7 +2,7 @@ from rest_framework import serializers
 from organizations.models import Organization
 from organizations.models import Organization
 
 
 
 
-class OrganizationSerializer(serializers.ModelSerializer):
+class OrganizationReferenceSerializer(serializers.ModelSerializer):
     dateCreated = serializers.DateTimeField(source="created", read_only=True)
     dateCreated = serializers.DateTimeField(source="created", read_only=True)
     status = serializers.SerializerMethodField()
     status = serializers.SerializerMethodField()
     avatar = serializers.SerializerMethodField()
     avatar = serializers.SerializerMethodField()
@@ -34,3 +34,4 @@ class OrganizationSerializer(serializers.ModelSerializer):
 
 
     def get_require2FA(self, obj):
     def get_require2FA(self, obj):
         return False
         return False
+

+ 13 - 0
organizations_ext/serializers/serializers.py

@@ -0,0 +1,13 @@
+from .base_serializers import OrganizationReferenceSerializer
+from projects.serializers.base_serializers import ProjectReferenceSerializer
+
+
+class OrganizationSerializer(OrganizationReferenceSerializer):
+    pass
+
+
+class OrganizationDetailSerializer(OrganizationSerializer):
+    projects = ProjectReferenceSerializer(many=True)
+
+    class Meta(OrganizationSerializer.Meta):
+        fields = OrganizationSerializer.Meta.fields + ("projects",)

+ 18 - 0
organizations_ext/tests.py

@@ -0,0 +1,18 @@
+from django.shortcuts import reverse
+from rest_framework.test import APITestCase
+from model_bakery import baker
+from glitchtip import test_utils  # pylint: disable=unused-import
+
+
+class OrganizationsAPITestCase(APITestCase):
+    def setUp(self):
+        self.user = baker.make("users.user")
+        self.organization = baker.make("organizations.Organization")
+        self.client.force_login(self.user)
+
+    def test_organizations_retrieve(self):
+        project = baker.make("projects.Project", organization=self.organization)
+        url = reverse("organization-detail", args=[self.organization.slug])
+        res = self.client.get(url)
+        self.assertContains(res, self.organization.name)
+        self.assertContains(res, project.name)

+ 9 - 1
organizations_ext/views.py

@@ -1,9 +1,17 @@
 from rest_framework import viewsets
 from rest_framework import viewsets
 from organizations.models import Organization
 from organizations.models import Organization
-from .serializers import OrganizationSerializer
+from .serializers.serializers import (
+    OrganizationSerializer,
+    OrganizationDetailSerializer,
+)
 
 
 
 
 class OrganizationViewSet(viewsets.ModelViewSet):
 class OrganizationViewSet(viewsets.ModelViewSet):
     queryset = Organization.objects.all()
     queryset = Organization.objects.all()
     serializer_class = OrganizationSerializer
     serializer_class = OrganizationSerializer
     lookup_field = "slug"
     lookup_field = "slug"
+
+    def get_serializer_class(self):
+        if self.action in ["retrieve"]:
+            return OrganizationDetailSerializer
+        return super().get_serializer_class()

+ 1 - 1
projects/models.py

@@ -17,7 +17,7 @@ class Project(models.Model):
     slug = AutoSlugField(populate_from=["name", "organization_id"],)
     slug = AutoSlugField(populate_from=["name", "organization_id"],)
     name = models.CharField(max_length=200)
     name = models.CharField(max_length=200)
     organization = models.ForeignKey(
     organization = models.ForeignKey(
-        "organizations.Organization", on_delete=models.CASCADE
+        "organizations.Organization", on_delete=models.CASCADE, related_name="projects"
     )
     )
     created = models.DateTimeField(auto_now_add=True, db_index=True)
     created = models.DateTimeField(auto_now_add=True, db_index=True)
     platform = models.CharField(max_length=64, blank=True, null=True)
     platform = models.CharField(max_length=64, blank=True, null=True)

+ 0 - 0
projects/serializers/__init__.py


+ 9 - 0
projects/serializers/base_serializers.py

@@ -0,0 +1,9 @@
+from rest_framework import serializers
+from ..models import Project
+
+
+class ProjectReferenceSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = Project
+        fields = ("platform", "slug", "id", "name")
+

+ 6 - 9
projects/serializers.py → projects/serializers/serializers.py

@@ -1,6 +1,9 @@
 from rest_framework import serializers
 from rest_framework import serializers
-from organizations_ext.serializers import OrganizationSerializer
-from .models import Project, ProjectKey
+from organizations_ext.serializers.base_serializers import (
+    OrganizationReferenceSerializer,
+)
+from .base_serializers import ProjectReferenceSerializer
+from ..models import ProjectKey
 
 
 
 
 class ProjectKeySerializer(serializers.ModelSerializer):
 class ProjectKeySerializer(serializers.ModelSerializer):
@@ -18,12 +21,6 @@ class ProjectKeySerializer(serializers.ModelSerializer):
         return {"public": obj.get_dsn()}
         return {"public": obj.get_dsn()}
 
 
 
 
-class ProjectReferenceSerializer(serializers.ModelSerializer):
-    class Meta:
-        model = Project
-        fields = ("platform", "slug", "id", "name")
-
-
 class ProjectSerializer(ProjectReferenceSerializer):
 class ProjectSerializer(ProjectReferenceSerializer):
     avatar = serializers.SerializerMethodField()
     avatar = serializers.SerializerMethodField()
     color = serializers.SerializerMethodField()
     color = serializers.SerializerMethodField()
@@ -35,7 +32,7 @@ class ProjectSerializer(ProjectReferenceSerializer):
     isInternal = serializers.SerializerMethodField()
     isInternal = serializers.SerializerMethodField()
     isMember = serializers.SerializerMethodField()
     isMember = serializers.SerializerMethodField()
     isPublic = serializers.SerializerMethodField()
     isPublic = serializers.SerializerMethodField()
-    organization = OrganizationSerializer(read_only=True)
+    organization = OrganizationReferenceSerializer(read_only=True)
 
 
     class Meta(ProjectReferenceSerializer.Meta):
     class Meta(ProjectReferenceSerializer.Meta):
         fields = (
         fields = (

Some files were not shown because too many files changed in this diff