From 5429c17f9875757c3da78de7ce60c6bd465946e7 Mon Sep 17 00:00:00 2001 From: Jon Date: Fri, 30 May 2025 08:05:13 +0930 Subject: [PATCH] feat(devops): Enable Model notes for GitGroup ref: #779 #778 #515 --- .../0015_gitgroupcenturionmodelnote.py | 48 ++++++++++ app/devops/models/git_group.py | 1 - .../centurionmodelnote_gitgroup.py | 87 +++++++++++++++++++ 3 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 app/devops/migrations/0015_gitgroupcenturionmodelnote.py create mode 100644 app/devops/serializers/centurionmodelnote_gitgroup.py diff --git a/app/devops/migrations/0015_gitgroupcenturionmodelnote.py b/app/devops/migrations/0015_gitgroupcenturionmodelnote.py new file mode 100644 index 00000000..2ae44424 --- /dev/null +++ b/app/devops/migrations/0015_gitgroupcenturionmodelnote.py @@ -0,0 +1,48 @@ +# Generated by Django 5.1.9 on 2025-05-29 19:49 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("core", "0027_centurionmodelnote"), + ("devops", "0014_alter_gitgroup_parent_group"), + ] + + operations = [ + migrations.CreateModel( + name="GitGroupCenturionModelNote", + fields=[ + ( + "centurionmodelnote_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="core.centurionmodelnote", + ), + ), + ( + "model", + models.ForeignKey( + help_text="Model this note belongs to", + on_delete=django.db.models.deletion.CASCADE, + related_name="+", + to="devops.gitgroup", + verbose_name="Model", + ), + ), + ], + options={ + "verbose_name": "GIT Group Note", + "verbose_name_plural": "GIT Group Notes", + "db_table": "devops_gitgroup_centurionmodelnote", + "managed": True, + }, + bases=("core.centurionmodelnote", models.Model), + ), + ] diff --git a/app/devops/models/git_group.py b/app/devops/models/git_group.py index 3f4462b5..35c6f36a 100644 --- a/app/devops/models/git_group.py +++ b/app/devops/models/git_group.py @@ -12,7 +12,6 @@ class GitGroup( CenturionModel ): - _notes_enabled = False app_namespace = 'devops' diff --git a/app/devops/serializers/centurionmodelnote_gitgroup.py b/app/devops/serializers/centurionmodelnote_gitgroup.py new file mode 100644 index 00000000..f8527c68 --- /dev/null +++ b/app/devops/serializers/centurionmodelnote_gitgroup.py @@ -0,0 +1,87 @@ +from rest_framework import serializers + +from drf_spectacular.utils import extend_schema_serializer + +from access.serializers.organization import (TenantBaseSerializer) + +from centurion.models.meta import GitGroupCenturionModelNote # pylint: disable=E0401:import-error disable=E0611:no-name-in-module + +from core.serializers.centurionmodelnote import ( # pylint: disable=W0611:unused-import + BaseSerializer, + ModelSerializer as BaseModelModelSerializer, + ViewSerializer as BaseModelViewSerializer +) + + + +@extend_schema_serializer(component_name = 'GitGroupModelSerializer') +class ModelSerializer( + BaseModelModelSerializer, +): + + + _urls = serializers.SerializerMethodField('get_url') + + def get_url(self, item) -> dict: + + return { + '_self': item.get_url( request = self._context['view'].request ), + } + + + class Meta: + + model = GitGroupCenturionModelNote + + fields = [ + 'id', + 'organization', + 'display_name', + 'body', + 'created_by', + 'modified_by', + 'content_type', + 'model', + 'created', + 'modified', + '_urls', + ] + + read_only_fields = [ + 'id', + 'display_name', + 'organization', + 'created_by', + 'modified_by', + 'content_type', + 'model', + 'created', + 'modified', + '_urls', + ] + + + + def validate(self, attrs): + + is_valid = False + + note_model = self.Meta.model.model.field.related_model + + attrs['model'] = note_model.objects.get( + id = int( self.context['view'].kwargs['model_id'] ) + ) + + + is_valid = super().validate(attrs) + + return is_valid + + +@extend_schema_serializer(component_name = 'GitGroupViewSerializer') +class ViewSerializer( + ModelSerializer, + BaseModelViewSerializer, +): + + organization = TenantBaseSerializer( many = False, read_only = True )