diff --git a/versions/admin.py b/versions/admin.py index d9d48fcc..d59c05d7 100755 --- a/versions/admin.py +++ b/versions/admin.py @@ -30,7 +30,6 @@ class VersionAdmin(admin.ModelAdmin): search_fields = ["name", "description"] date_hierarchy = "release_date" inlines = [VersionFileInline] - filter_horizontal = ["financial_committee_members"] change_list_template = "admin/version_change_list.html" def get_urls(self): diff --git a/versions/migrations/0021_remove_version_financial_committee_members_and_more.py b/versions/migrations/0021_remove_version_financial_committee_members_and_more.py new file mode 100644 index 00000000..0a78d545 --- /dev/null +++ b/versions/migrations/0021_remove_version_financial_committee_members_and_more.py @@ -0,0 +1,34 @@ +# Generated by Django 4.2.16 on 2025-07-12 00:34 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("versions", "0020_decouple_report_configuration_migration"), + ] + + operations = [ + migrations.RemoveField( + model_name="version", + name="financial_committee_members", + ), + migrations.RemoveField( + model_name="version", + name="release_report_cover_image", + ), + migrations.RemoveField( + model_name="version", + name="sponsor_message", + ), + migrations.AlterField( + model_name="reportconfiguration", + name="version", + field=models.CharField( + help_text="The version name for this report configuration. e.g. boost-1.75.0", + max_length=256, + unique=True, + ), + ), + ] diff --git a/versions/models.py b/versions/models.py index 34928dc1..9636bbac 100755 --- a/versions/models.py +++ b/versions/models.py @@ -7,6 +7,7 @@ from django.utils.text import slugify from .converters import to_url from .managers import VersionManager, VersionFileManager +from .utils.model_validators import validate_version_name_format User = get_user_model() @@ -37,21 +38,7 @@ class Version(models.Model): "beta release or a development version", ) data = models.JSONField(default=dict) - release_report_cover_image = models.ImageField( - null=True, - blank=True, - upload_to="release_report_cover/", - ) - sponsor_message = models.TextField( - default="", - blank=True, - help_text='Message to show in release reports on the "Fiscal Sponsorship Committee" page.', # noqa: E501 - ) - financial_committee_members = models.ManyToManyField( - User, - blank=True, - help_text="Financial Committee members who are responsible for this release.", - ) + objects = VersionManager() def __str__(self): @@ -296,6 +283,7 @@ class ReportConfiguration(models.Model): blank=False, help_text="The version name for this report configuration. e.g. boost-1.75.0", unique=True, + validators=[validate_version_name_format], ) release_report_cover_image = models.ImageField( null=True, diff --git a/versions/utils/model_validators.py b/versions/utils/model_validators.py new file mode 100644 index 00000000..5bb5c400 --- /dev/null +++ b/versions/utils/model_validators.py @@ -0,0 +1,18 @@ +import re + +from django.core.exceptions import ValidationError + + +def validate_version_name_format(value: str) -> None: + """ + Validate that the version name follows the format 'boost-X.Y.Zw' where X, Y, and Z + are integers and w is freeform. + """ + if value in ["master", "develop"]: + return + if not re.match(r"^boost-[0-9]+\.[0-9]+\.[0-9]+[.\-a-zA-Z0-9]*$", value): + raise ValidationError( + f"Invalid version name format: '{value}'. " + "Expected format is that it begins with 'boost-X.Y.Zw' where X, Y, and Z " + "are integers and w is free form." + )