Skip to content

Commit

Permalink
Merge pull request #2345 from cisagov/es/2299-domaingroup-suborg-models
Browse files Browse the repository at this point in the history
Org Model: Add DomainGroup and Suborganization models
  • Loading branch information
erinysong authored Jun 24, 2024
2 parents 227d378 + 69b81ba commit 6736ba7
Show file tree
Hide file tree
Showing 6 changed files with 139 additions and 0 deletions.
10 changes: 10 additions & 0 deletions src/registrar/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -2720,6 +2720,14 @@ class Meta:
fields = "__all__"


class DomainGroupAdmin(ListHeaderAdmin, ImportExportModelAdmin):
list_display = ["name", "portfolio"]


class SuborganizationAdmin(ListHeaderAdmin, ImportExportModelAdmin):
list_display = ["name", "portfolio"]


admin.site.unregister(LogEntry) # Unregister the default registration

admin.site.register(LogEntry, CustomLogEntryAdmin)
Expand All @@ -2743,6 +2751,8 @@ class Meta:
admin.site.register(models.TransitionDomain, TransitionDomainAdmin)
admin.site.register(models.VerifiedByStaff, VerifiedByStaffAdmin)
admin.site.register(models.Portfolio, PortfolioAdmin)
admin.site.register(models.DomainGroup, DomainGroupAdmin)
admin.site.register(models.Suborganization, SuborganizationAdmin)

# Register our custom waffle implementations
admin.site.register(models.WaffleFlag, WaffleFlagAdmin)
Expand Down
41 changes: 41 additions & 0 deletions src/registrar/migrations/0105_suborganization_domaingroup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Generated by Django 4.2.10 on 2024-06-21 18:15

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
("registrar", "0104_create_groups_v13"),
]

operations = [
migrations.CreateModel(
name="Suborganization",
fields=[
("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
("name", models.CharField(help_text="Suborganization", max_length=1000, unique=True)),
("portfolio", models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to="registrar.portfolio")),
],
options={
"abstract": False,
},
),
migrations.CreateModel(
name="DomainGroup",
fields=[
("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
("name", models.CharField(help_text="Domain group", unique=True)),
("domains", models.ManyToManyField(blank=True, to="registrar.domaininformation")),
("portfolio", models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to="registrar.portfolio")),
],
options={
"unique_together": {("name", "portfolio")},
},
),
]
37 changes: 37 additions & 0 deletions src/registrar/migrations/0106_create_groups_v14.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# This migration creates the create_full_access_group and create_cisa_analyst_group groups
# It is dependent on 0079 (which populates federal agencies)
# If permissions on the groups need changing, edit CISA_ANALYST_GROUP_PERMISSIONS
# in the user_group model then:
# [NOT RECOMMENDED]
# step 1: docker-compose exec app ./manage.py migrate --fake registrar 0035_contenttypes_permissions
# step 2: docker-compose exec app ./manage.py migrate registrar 0036_create_groups
# step 3: fake run the latest migration in the migrations list
# [RECOMMENDED]
# Alternatively:
# step 1: duplicate the migration that loads data
# step 2: docker-compose exec app ./manage.py migrate

from django.db import migrations
from registrar.models import UserGroup
from typing import Any


# For linting: RunPython expects a function reference,
# so let's give it one
def create_groups(apps, schema_editor) -> Any:
UserGroup.create_cisa_analyst_group(apps, schema_editor)
UserGroup.create_full_access_group(apps, schema_editor)


class Migration(migrations.Migration):
dependencies = [
("registrar", "0105_suborganization_domaingroup"),
]

operations = [
migrations.RunPython(
create_groups,
reverse_code=migrations.RunPython.noop,
atomic=True,
),
]
6 changes: 6 additions & 0 deletions src/registrar/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
from .verified_by_staff import VerifiedByStaff
from .waffle_flag import WaffleFlag
from .portfolio import Portfolio
from .domain_group import DomainGroup
from .suborganization import Suborganization


__all__ = [
Expand All @@ -38,6 +40,8 @@
"VerifiedByStaff",
"WaffleFlag",
"Portfolio",
"DomainGroup",
"Suborganization",
]

auditlog.register(Contact)
Expand All @@ -58,3 +62,5 @@
auditlog.register(VerifiedByStaff)
auditlog.register(WaffleFlag)
auditlog.register(Portfolio)
auditlog.register(DomainGroup)
auditlog.register(Suborganization)
23 changes: 23 additions & 0 deletions src/registrar/models/domain_group.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from django.db import models
from .utility.time_stamped_model import TimeStampedModel


class DomainGroup(TimeStampedModel):
"""
Organized group of domains.
"""

class Meta:
unique_together = [("name", "portfolio")]

name = models.CharField(
unique=True,
help_text="Domain group",
)

portfolio = models.ForeignKey("registrar.Portfolio", on_delete=models.PROTECT)

domains = models.ManyToManyField("registrar.DomainInformation", blank=True)

def __str__(self) -> str:
return f"{self.name}"
22 changes: 22 additions & 0 deletions src/registrar/models/suborganization.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
from django.db import models
from .utility.time_stamped_model import TimeStampedModel


class Suborganization(TimeStampedModel):
"""
Suborganization under an organization (portfolio)
"""

name = models.CharField(
unique=True,
max_length=1000,
help_text="Suborganization",
)

portfolio = models.ForeignKey(
"registrar.Portfolio",
on_delete=models.PROTECT,
)

def __str__(self) -> str:
return f"{self.name}"

0 comments on commit 6736ba7

Please sign in to comment.