diff --git a/src/registrar/admin.py b/src/registrar/admin.py index 215239d66..c0f52c696 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -2655,6 +2655,27 @@ class WaffleFlagAdmin(FlagAdmin): model = models.WaffleFlag fields = "__all__" +class DomainGroupResource(resources.ModelResource): + """defines how each field in the referenced model should be mapped to the corresponding fields in the + import/export file""" + + class Meta: + model = models.DomainGroup + +class DomainGroupAdmin(ListHeaderAdmin, ImportExportModelAdmin): + resource_classes = [DomainGroupResource] + list_display = ["name", "portfolio"] + +class SuborganizationResource(resources.ModelResource): + """defines how each field in the referenced model should be mapped to the corresponding fields in the + import/export file""" + + class Meta: + model = models.Suborganization + +class SuborganizationAdmin(ListHeaderAdmin, ImportExportModelAdmin): + resource_classes = [SuborganizationResource] + list_display = ["name", "portfolio"] admin.site.unregister(LogEntry) # Unregister the default registration @@ -2679,6 +2700,8 @@ admin.site.register(models.DomainRequest, DomainRequestAdmin) 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) diff --git a/src/registrar/migrations/0105_suborganization_domaingroup.py b/src/registrar/migrations/0105_suborganization_domaingroup.py new file mode 100644 index 000000000..3d99a4001 --- /dev/null +++ b/src/registrar/migrations/0105_suborganization_domaingroup.py @@ -0,0 +1,41 @@ +# Generated by Django 4.2.10 on 2024-06-20 21:18 + +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(blank=True, help_text="Domain group", null=True, 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(blank=True, help_text="Domain group", null=True, 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")}, + }, + ), + ] diff --git a/src/registrar/models/__init__.py b/src/registrar/models/__init__.py index b2cffaf32..2af89ce00 100644 --- a/src/registrar/models/__init__.py +++ b/src/registrar/models/__init__.py @@ -17,6 +17,8 @@ from .transition_domain import TransitionDomain 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__ = [ @@ -38,6 +40,8 @@ __all__ = [ "VerifiedByStaff", "WaffleFlag", "Portfolio", + "DomainGroup", + "Suborganization" ] auditlog.register(Contact) @@ -58,3 +62,5 @@ auditlog.register(TransitionDomain) auditlog.register(VerifiedByStaff) auditlog.register(WaffleFlag) auditlog.register(Portfolio) +auditlog.register(DomainGroup) +auditlog.register(Suborganization) diff --git a/src/registrar/models/domain_group.py b/src/registrar/models/domain_group.py new file mode 100644 index 000000000..aa6d64e1f --- /dev/null +++ b/src/registrar/models/domain_group.py @@ -0,0 +1,33 @@ +from django.db import models +from .utility.time_stamped_model import TimeStampedModel +from registrar.models.portfolio import Portfolio +from registrar.models.domain_information import DomainInformation + + +class DomainGroup(TimeStampedModel): + + class Meta: + unique_together = [("name", "portfolio")] + + """ + TODO: Write DomainGroup description + """ + name = models.CharField( + null=True, + blank=True, + 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}" \ No newline at end of file diff --git a/src/registrar/models/portfolio.py b/src/registrar/models/portfolio.py index a05422960..0ea036bb7 100644 --- a/src/registrar/models/portfolio.py +++ b/src/registrar/models/portfolio.py @@ -97,3 +97,6 @@ class Portfolio(TimeStampedModel): verbose_name="security contact e-mail", max_length=320, ) + + def __str__(self) -> str: + return f"{self.organization_name}" diff --git a/src/registrar/models/suborganization.py b/src/registrar/models/suborganization.py new file mode 100644 index 000000000..6ebae62e2 --- /dev/null +++ b/src/registrar/models/suborganization.py @@ -0,0 +1,23 @@ +from django.db import models +from .utility.time_stamped_model import TimeStampedModel +from registrar.models.portfolio import Portfolio + + +class Suborganization(TimeStampedModel): + """ + TODO: Write DomainGroup description + """ + name = models.CharField( + null=True, + blank=True, + unique=True, + help_text="Domain group", + ) + + portfolio = models.ForeignKey( + "registrar.Portfolio", + on_delete=models.PROTECT, + ) + + def __str__(self) -> str: + return f"{self.name}"