diff --git a/metecho/api/jobs.py b/metecho/api/jobs.py index c8a6d9e43..27845f65d 100644 --- a/metecho/api/jobs.py +++ b/metecho/api/jobs.py @@ -193,6 +193,7 @@ def create_repository( dependencies: Iterable[str], template_repo_owner: str = None, template_repo_name: str = None, + namespace: str = None, ): """ Given a local Metecho Project create and bootstrap the corresponding GitHub repository. @@ -258,7 +259,7 @@ def create_repository( "cci_version": cumulusci.__version__, "project_name": project.repo_name, "package_name": project.repo_name, - "package_namespace": None, + "package_namespace": namespace if namespace else None, "api_version": runtime.universal_config.project__package__api_version, "source_format": "sfdx", "dependencies": [ diff --git a/metecho/api/migrations/0119_siteprofile_project_namespace.py b/metecho/api/migrations/0119_siteprofile_project_namespace.py new file mode 100644 index 000000000..8120cc882 --- /dev/null +++ b/metecho/api/migrations/0119_siteprofile_project_namespace.py @@ -0,0 +1,19 @@ +# Generated by Django 4.0.6 on 2023-05-25 13:54 + +from django.db import migrations +import sfdo_template_helpers.fields.string + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0118_project_deleted_at'), + ] + + operations = [ + migrations.AddField( + model_name='siteprofile', + name='project_namespace', + field=sfdo_template_helpers.fields.string.StringField(blank=True, help_text='Namespace to be used for new Projects. Leave blank for no namespace.'), + ), + ] diff --git a/metecho/api/models.py b/metecho/api/models.py index 29ce7f37d..21a72492a 100644 --- a/metecho/api/models.py +++ b/metecho/api/models.py @@ -100,6 +100,12 @@ class SiteProfile(TranslatableModel): "Name of the GitHub repository to be used as a template for new Projects" ), ) + project_namespace = StringField( + blank=True, + help_text=_( + "Namespace to be used for new Projects. Leave blank for no namespace." + ), + ) translations = TranslatedFields( name=models.CharField(max_length=64), @@ -460,6 +466,7 @@ def queue_create_repository( dependencies: Iterable[str], template_repo_owner: str = None, template_repo_name: str = None, + namespace: str = None, ): from .jobs import create_repository_job @@ -469,6 +476,7 @@ def queue_create_repository( dependencies=dependencies, template_repo_owner=template_repo_owner, template_repo_name=template_repo_name, + namespace=namespace, ) def finalize_create_repository(self, *, error=None, user: User): diff --git a/metecho/api/tests/jobs.py b/metecho/api/tests/jobs.py index 8f09b5d84..e61a2df04 100644 --- a/metecho/api/tests/jobs.py +++ b/metecho/api/tests/jobs.py @@ -1396,6 +1396,7 @@ def test_ok(self, mocker, github_mocks, user_factory): dependencies=["http://foo.com"], template_repo_owner="owner", template_repo_name="repo", + namespace="namespace", ) project.refresh_from_db() diff --git a/metecho/api/tests/views.py b/metecho/api/tests/views.py index 6993762d6..52451865d 100644 --- a/metecho/api/tests/views.py +++ b/metecho/api/tests/views.py @@ -549,6 +549,7 @@ def test_create( site=Site.objects.get(), template_repo_owner="orgname", template_repo_name="reponame", + namespace="namespace", ) create_repository_job = mocker.patch( @@ -589,6 +590,7 @@ def test_create( dependencies=["http://foo.com", "http://bar.com"], template_repo_owner="orgname", template_repo_name="reponame", + namespace="namespace", ) diff --git a/metecho/api/views.py b/metecho/api/views.py index d2122a1b6..a4bfccc4b 100644 --- a/metecho/api/views.py +++ b/metecho/api/views.py @@ -347,6 +347,7 @@ def create(self, request): dependencies=dependencies, template_repo_owner=getattr(site_profile, "template_repo_owner", ""), template_repo_name=getattr(site_profile, "template_repo_name", ""), + namespace=getattr(site_profile, "project_namespace", ""), ) return Response(self.get_serializer(project).data) @@ -559,7 +560,6 @@ class ScratchOrgViewSet( filterset_class = ScratchOrgFilter def get_queryset(self): - # All actions except log() act on active scratch orgs only # getattr() check guards against DRF-Spectacular if (