refactor(devops): Switch GitGroup Model to CenturionModel

ref: #772 #515 #759 #767
This commit is contained in:
2025-05-25 09:43:28 +09:30
parent f5a2168958
commit 2e88dfc5c1
3 changed files with 160 additions and 136 deletions

View File

@ -0,0 +1,46 @@
# Generated by Django 5.1.9 on 2025-05-24 23:48
import access.models.tenancy_abstract
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0010_company_alter_entity_entity_type_alter_person_dob_and_more'),
('core', '0026_remove_centurionaudit_model_notes'),
('devops', '0012_alter_checkin_organization_and_more'),
]
operations = [
migrations.AlterField(
model_name='gitgroup',
name='id',
field=models.AutoField(help_text='ID of the item', primary_key=True, serialize=False, unique=True, verbose_name='ID'),
),
migrations.AlterField(
model_name='gitgroup',
name='model_notes',
field=models.TextField(blank=True, help_text='Tid bits of information', null=True, verbose_name='Notes'),
),
migrations.AlterField(
model_name='gitgroup',
name='organization',
field=models.ForeignKey(help_text='Tenant this belongs to', on_delete=django.db.models.deletion.CASCADE, related_name='+', to='access.tenant', validators=[access.models.tenancy_abstract.TenancyAbstractModel.validatate_organization_exists], verbose_name='Tenant'),
),
migrations.CreateModel(
name='GitGroupAuditHistory',
fields=[
('centurionaudit_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='core.centurionaudit')),
('model', models.ForeignKey(help_text='Model this history belongs to', on_delete=django.db.models.deletion.CASCADE, related_name='audit_history', to='devops.gitgroup', verbose_name='Model')),
],
options={
'verbose_name': 'GIT Group History',
'verbose_name_plural': 'GIT Group Histories',
'db_table': 'devops_gitgroup_audithistory',
'managed': True,
},
bases=('core.centurionaudit', models.Model),
),
]

View File

@ -1,138 +1,15 @@
from django.db import models
from access.fields import AutoCreatedField, AutoLastModifiedField
from access.models.tenancy import TenancyObject
from access.fields import AutoLastModifiedField
from core.models.centurion import CenturionModel
class GitGroup(
TenancyObject
CenturionModel
):
class Meta:
ordering = [
'organization',
'path',
'name',
]
# unique_together = [ # Cant use until import is a feature
# 'provider',
# 'provider_pk'
# ]
verbose_name = 'GIT Group'
verbose_name_plural = 'GIT Groups'
class GitProvider(models.IntegerChoices):
GITHUB = 1, 'GitHub'
GITLAB = 2, 'GitLab'
is_global = None
id = models.AutoField(
blank=False,
help_text = 'Primary key of the entry',
primary_key=True,
unique=True,
verbose_name = 'ID'
)
parent_group = models.ForeignKey(
'self',
blank = True,
default = None,
help_text = 'Parent Git Group this repository belongs to.',
on_delete = models.PROTECT,
null = True,
related_name = '+',
verbose_name = 'Parent Group',
)
provider = models.IntegerField(
blank = False,
choices = GitProvider,
help_text = 'GIT Provider for this Group',
verbose_name = 'Git Provider'
)
provider_pk = models.IntegerField(
blank = True,
help_text = 'Providers ID for this Group',
null = True,
unique = False,
verbose_name = 'Provider ID'
)
name = models.CharField(
blank = False,
help_text = 'Name of the Group',
max_length = 80,
null = False,
unique = False,
verbose_name = 'Name'
)
path = models.CharField(
blank = False,
help_text = 'Path of the group',
max_length = 80,
null = False,
unique = False,
verbose_name = 'Path'
)
description = models.TextField(
blank = True,
help_text = 'Description for this group',
max_length = 300,
null = True,
verbose_name = 'Description'
)
created = AutoCreatedField()
modified = AutoLastModifiedField()
def __str__(self) -> str:
if self.parent_group:
return str(self.parent_group) + '/' + self.path
return self.path
@property
def provider_badge(self):
from core.classes.badge import Badge
text: str = self.get_provider_display()
return Badge(
icon_name = f'{text.lower()}',
icon_style = f'badge-icon-action-{text.lower()}',
text = text,
)
def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
if self.parent_group:
self.organization = self.parent_group.organization
super().save(force_insert=force_insert, force_update=force_update, using=using, update_fields=update_fields)
app_namespace = 'devops'
documentation = ''
@ -178,7 +55,6 @@ class GitGroup(
},
]
table_fields: list = [
'name',
'provider_badge',
@ -187,15 +63,117 @@ class GitGroup(
'created',
]
def save_history(self, before: dict, after: dict) -> bool:
from devops.models.git_group_history import GitGroupHistory
class Meta:
history = super().save_history(
before = before,
after = after,
history_model = GitGroupHistory
ordering = [
'organization',
'path',
'name',
]
# unique_together = [ # Cant use until import is a feature
# 'provider',
# 'provider_pk'
# ]
verbose_name = 'GIT Group'
verbose_name_plural = 'GIT Groups'
class GitProvider(models.IntegerChoices):
GITHUB = 1, 'GitHub'
GITLAB = 2, 'GitLab'
is_global = None
parent_group = models.ForeignKey(
'self',
blank = True,
help_text = 'Parent Git Group this repository belongs to.',
on_delete = models.PROTECT,
null = True,
related_name = '+',
verbose_name = 'Parent Group',
)
@property
def provider_badge(self):
from core.classes.badge import Badge
text: str = self.get_provider_display()
return Badge(
icon_name = f'{text.lower()}',
icon_style = f'badge-icon-action-{text.lower()}',
text = text,
)
return history
provider = models.IntegerField(
blank = False,
choices = GitProvider,
help_text = 'GIT Provider for this Group',
verbose_name = 'Git Provider'
)
provider_pk = models.IntegerField(
blank = True,
help_text = 'Providers ID for this Group',
null = True,
unique = False,
verbose_name = 'Provider ID'
)
name = models.CharField(
blank = False,
help_text = 'Name of the Group',
max_length = 80,
null = False,
unique = False,
verbose_name = 'Name'
)
path = models.CharField(
blank = False,
help_text = 'Path of the group',
max_length = 80,
null = False,
unique = False,
verbose_name = 'Path'
)
description = models.TextField(
blank = True,
help_text = 'Description for this group',
max_length = 300,
null = True,
verbose_name = 'Description'
)
modified = AutoLastModifiedField()
def __str__(self) -> str:
if self.parent_group:
return str(self.parent_group) + '/' + self.path
return self.path
def clean_fields(self, exclude = None):
if self.parent_group:
self.organization = self.parent_group.organization
super().clean_fields( exclude = exclude )

View File

@ -24,7 +24,7 @@ router.register(r'git_repository(?:/(?P<git_provider>gitlab|github))?', git_repo
router.register('git_repository/github/(?P<model_id>[0-9]+)/notes', github_repository_notes.ViewSet, feature_flag = '2025-00001', basename='_api_v2_github_repository_note')
router.register('git_repository/gitlab/(?P<model_id>[0-9]+)/notes', gitlab_repository_notes.ViewSet, feature_flag = '2025-00001', basename='_api_v2_gitlab_repository_note')
router.register('git_group', git_group.ViewSet, feature_flag = '2025-00001', basename='_api_v2_git_group')
router.register('git_group', git_group.ViewSet, feature_flag = '2025-00001', basename='_api_gitgroup')
router.register('git_group/(?P<model_id>[0-9]+)/notes', git_group_notes.ViewSet, feature_flag = '2025-00001', basename='_api_v2_git_group_note')
urlpatterns = router.urls