diff --git a/api/__init__.py b/domains/__init__.py similarity index 100% rename from api/__init__.py rename to domains/__init__.py diff --git a/api/management/__init__.py b/domains/etl/__init__.py similarity index 100% rename from api/management/__init__.py rename to domains/etl/__init__.py diff --git a/etl/admin.py b/domains/etl/admin.py similarity index 94% rename from etl/admin.py rename to domains/etl/admin.py index 70505844..25d90070 100644 --- a/etl/admin.py +++ b/domains/etl/admin.py @@ -1,6 +1,6 @@ from django.urls import path from django.contrib import admin -from etl.models import OrchestrationSystem, DataConnection, Task, TaskMapping, TaskMappingPath, TaskRun +from domains.etl.models import OrchestrationSystem, DataConnection, Task, TaskMapping, TaskMappingPath, TaskRun from hydroserver.admin import VocabularyAdmin diff --git a/domains/etl/apps.py b/domains/etl/apps.py new file mode 100644 index 00000000..352f29a0 --- /dev/null +++ b/domains/etl/apps.py @@ -0,0 +1,8 @@ +from django.apps import AppConfig + + +class EtlConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "domains.etl" + label = "etl" + verbose_name = "Extract Transform Load" diff --git a/etl/fixtures/default_orchestration_systems.yaml b/domains/etl/fixtures/default_orchestration_systems.yaml similarity index 100% rename from etl/fixtures/default_orchestration_systems.yaml rename to domains/etl/fixtures/default_orchestration_systems.yaml diff --git a/etl/services/loader.py b/domains/etl/loader.py similarity index 94% rename from etl/services/loader.py rename to domains/etl/loader.py index b6110d2e..78289608 100644 --- a/etl/services/loader.py +++ b/domains/etl/loader.py @@ -7,10 +7,10 @@ from datetime import datetime from django.db.models import Min, Value from django.db.models.functions import Coalesce -from etl.models import Task -from sta.services import ObservationService -from sta.models import Datastream -from sta.schemas.observation import ObservationBulkPostBody +from domains.etl.models import Task +from domains.sta.services import ObservationService +from domains.sta.models import Datastream +from interfaces.api.schemas.observation import ObservationBulkPostBody observation_service = ObservationService() diff --git a/etl/migrations/0001_initial.py b/domains/etl/migrations/0001_initial.py similarity index 93% rename from etl/migrations/0001_initial.py rename to domains/etl/migrations/0001_initial.py index 34ad1354..56c4d877 100644 --- a/etl/migrations/0001_initial.py +++ b/domains/etl/migrations/0001_initial.py @@ -1,6 +1,6 @@ # Generated by Django 5.2b1 on 2025-04-15 21:58 -import iam.models.utils +import domains.iam.models.utils import uuid6 from django.db import migrations, models @@ -43,7 +43,7 @@ class Migration(migrations.Migration): options={ "abstract": False, }, - bases=(models.Model, iam.models.utils.PermissionChecker), + bases=(models.Model, domains.iam.models.utils.PermissionChecker), ), migrations.CreateModel( name="DataSource", @@ -76,7 +76,7 @@ class Migration(migrations.Migration): options={ "abstract": False, }, - bases=(models.Model, iam.models.utils.PermissionChecker), + bases=(models.Model, domains.iam.models.utils.PermissionChecker), ), migrations.CreateModel( name="OrchestrationSystem", @@ -93,6 +93,6 @@ class Migration(migrations.Migration): ("name", models.CharField(max_length=255)), ("orchestration_system_type", models.CharField(max_length=255)), ], - bases=(models.Model, iam.models.utils.PermissionChecker), + bases=(models.Model, domains.iam.models.utils.PermissionChecker), ), ] diff --git a/etl/migrations/0002_initial.py b/domains/etl/migrations/0002_initial.py similarity index 100% rename from etl/migrations/0002_initial.py rename to domains/etl/migrations/0002_initial.py diff --git a/etl/migrations/0003_remove_datasource_orchestration_system_and_more.py b/domains/etl/migrations/0003_remove_datasource_orchestration_system_and_more.py similarity index 98% rename from etl/migrations/0003_remove_datasource_orchestration_system_and_more.py rename to domains/etl/migrations/0003_remove_datasource_orchestration_system_and_more.py index aadbd38f..80f57f29 100644 --- a/etl/migrations/0003_remove_datasource_orchestration_system_and_more.py +++ b/domains/etl/migrations/0003_remove_datasource_orchestration_system_and_more.py @@ -1,7 +1,7 @@ # Generated by Django 5.2.5 on 2025-11-25 16:26 import django.db.models.deletion -import iam.models.utils +import domains.iam.models.utils import uuid6 from django.db import migrations, models from django.utils import timezone @@ -282,7 +282,7 @@ class Migration(migrations.Migration): ), ), ], - bases=(models.Model, iam.models.utils.PermissionChecker), + bases=(models.Model, domains.iam.models.utils.PermissionChecker), ), migrations.CreateModel( name="Task", @@ -337,7 +337,7 @@ class Migration(migrations.Migration): ), ), ], - bases=(models.Model, iam.models.utils.PermissionChecker), + bases=(models.Model, domains.iam.models.utils.PermissionChecker), ), migrations.CreateModel( name="TaskMapping", diff --git a/api/management/commands/__init__.py b/domains/etl/migrations/__init__.py similarity index 100% rename from api/management/commands/__init__.py rename to domains/etl/migrations/__init__.py diff --git a/etl/models/__init__.py b/domains/etl/models/__init__.py similarity index 100% rename from etl/models/__init__.py rename to domains/etl/models/__init__.py diff --git a/etl/models/data_connection.py b/domains/etl/models/data_connection.py similarity index 97% rename from etl/models/data_connection.py rename to domains/etl/models/data_connection.py index 382d7589..50d754e8 100644 --- a/etl/models/data_connection.py +++ b/domains/etl/models/data_connection.py @@ -2,11 +2,11 @@ from typing import Union, Literal, Optional, TYPE_CHECKING from django.db import models from django.db.models import Q -from iam.models.utils import PermissionChecker +from domains.iam.models.utils import PermissionChecker if TYPE_CHECKING: from django.contrib.auth import get_user_model - from iam.models import Workspace, APIKey + from domains.iam.models import Workspace, APIKey User = get_user_model() diff --git a/etl/models/orchestration_system.py b/domains/etl/models/orchestration_system.py similarity index 95% rename from etl/models/orchestration_system.py rename to domains/etl/models/orchestration_system.py index 71ad7681..aec791ee 100644 --- a/etl/models/orchestration_system.py +++ b/domains/etl/models/orchestration_system.py @@ -3,12 +3,12 @@ from typing import Literal, Optional, Union from django.db import models from django.db.models import Q -from iam.models import Workspace -from iam.models.utils import PermissionChecker +from domains.iam.models import Workspace +from domains.iam.models.utils import PermissionChecker if typing.TYPE_CHECKING: from django.contrib.auth import get_user_model - from iam.models import Workspace, APIKey + from domains.iam.models import Workspace, APIKey User = get_user_model() diff --git a/etl/models/run.py b/domains/etl/models/run.py similarity index 100% rename from etl/models/run.py rename to domains/etl/models/run.py diff --git a/etl/models/task.py b/domains/etl/models/task.py similarity index 97% rename from etl/models/task.py rename to domains/etl/models/task.py index 9dac4d33..c9e387b2 100644 --- a/etl/models/task.py +++ b/domains/etl/models/task.py @@ -4,14 +4,14 @@ from django.db.models import Q from django.db.models.signals import pre_delete from django.dispatch import receiver -from iam.models.utils import PermissionChecker +from domains.iam.models.utils import PermissionChecker from django_celery_beat.models import PeriodicTask from .data_connection import DataConnection from .orchestration_system import OrchestrationSystem if TYPE_CHECKING: from django.contrib.auth import get_user_model - from iam.models import Workspace, APIKey + from domains.iam.models import Workspace, APIKey User = get_user_model() diff --git a/etl/services/__init__.py b/domains/etl/services/__init__.py similarity index 100% rename from etl/services/__init__.py rename to domains/etl/services/__init__.py diff --git a/etl/services/data_connection.py b/domains/etl/services/data_connection.py similarity index 96% rename from etl/services/data_connection.py rename to domains/etl/services/data_connection.py index fc12ee22..a87ba97b 100644 --- a/etl/services/data_connection.py +++ b/domains/etl/services/data_connection.py @@ -4,19 +4,19 @@ from django.http import HttpResponse from django.contrib.auth import get_user_model from django.db.models import QuerySet -from iam.models import APIKey -from etl.models import DataConnection -from etl.schemas import ( +from domains.iam.models import APIKey +from domains.etl.models import DataConnection +from interfaces.api.schemas import ( DataConnectionSummaryResponse, DataConnectionDetailResponse, DataConnectionPostBody, DataConnectionPatchBody, ) -from etl.schemas.data_connection import ( +from interfaces.api.schemas.data_connection import ( DataConnectionFields, DataConnectionOrderByFields, ) -from api.service import ServiceUtils +from interfaces.api.service import ServiceUtils User = get_user_model() diff --git a/etl/services/hydroshare_archival.py b/domains/etl/services/hydroshare_archival.py similarity index 100% rename from etl/services/hydroshare_archival.py rename to domains/etl/services/hydroshare_archival.py diff --git a/etl/services/orchestration_system.py b/domains/etl/services/orchestration_system.py similarity index 96% rename from etl/services/orchestration_system.py rename to domains/etl/services/orchestration_system.py index e401191f..b9dad325 100644 --- a/etl/services/orchestration_system.py +++ b/domains/etl/services/orchestration_system.py @@ -4,19 +4,19 @@ from django.http import HttpResponse from django.contrib.auth import get_user_model from django.db.models import QuerySet -from iam.models import APIKey -from etl.models import OrchestrationSystem -from etl.schemas import ( +from domains.iam.models import APIKey +from domains.etl.models import OrchestrationSystem +from interfaces.api.schemas import ( OrchestrationSystemSummaryResponse, OrchestrationSystemDetailResponse, OrchestrationSystemPostBody, OrchestrationSystemPatchBody, ) -from etl.schemas.orchestration_system import ( +from interfaces.api.schemas.orchestration_system import ( OrchestrationSystemFields, OrchestrationSystemOrderByFields, ) -from api.service import ServiceUtils +from interfaces.api.service import ServiceUtils User = get_user_model() diff --git a/etl/services/run.py b/domains/etl/services/run.py similarity index 94% rename from etl/services/run.py rename to domains/etl/services/run.py index d27213ca..2336adfc 100644 --- a/etl/services/run.py +++ b/domains/etl/services/run.py @@ -3,10 +3,10 @@ from ninja.errors import HttpError from django.http import HttpResponse from django.contrib.auth import get_user_model -from iam.models import APIKey -from etl.models import TaskRun -from etl.schemas import TaskRunFields, TaskRunPostBody, TaskRunPatchBody, TaskRunOrderByFields -from api.service import ServiceUtils +from domains.iam.models import APIKey +from domains.etl.models import TaskRun +from interfaces.api.schemas import TaskRunFields, TaskRunPostBody, TaskRunPatchBody, TaskRunOrderByFields +from interfaces.api.service import ServiceUtils from .task import TaskService User = get_user_model() diff --git a/etl/services/task.py b/domains/etl/services/task.py similarity index 98% rename from etl/services/task.py rename to domains/etl/services/task.py index a80acab2..d2083863 100644 --- a/etl/services/task.py +++ b/domains/etl/services/task.py @@ -9,11 +9,11 @@ from django.utils import timezone from django.conf import settings from django_celery_beat.models import PeriodicTask, CrontabSchedule, IntervalSchedule -from iam.models import APIKey -from etl.models import Task, TaskMapping, TaskMappingPath, TaskRun -from etl.schemas import TaskFields, TaskPostBody, TaskPatchBody, TaskOrderByFields -from etl.tasks import run_etl_task -from api.service import ServiceUtils +from domains.iam.models import APIKey +from domains.etl.models import Task, TaskMapping, TaskMappingPath, TaskRun +from interfaces.api.schemas import TaskFields, TaskPostBody, TaskPatchBody, TaskOrderByFields +from domains.etl.tasks import run_etl_task +from interfaces.api.service import ServiceUtils from .data_connection import DataConnectionService from .orchestration_system import OrchestrationSystemService diff --git a/etl/tasks.py b/domains/etl/tasks.py similarity index 98% rename from etl/tasks.py rename to domains/etl/tasks.py index 847146c7..2de705ac 100644 --- a/etl/tasks.py +++ b/domains/etl/tasks.py @@ -8,8 +8,8 @@ from django.utils import timezone from django.db.utils import IntegrityError from django.core.management import call_command -from etl.models import Task, TaskRun -from etl.services.loader import HydroServerInternalLoader +from domains.etl.models import Task, TaskRun +from .loader import HydroServerInternalLoader from hydroserverpy.etl.factories import extractor_factory, transformer_factory from hydroserverpy.etl.etl_configuration import ExtractorConfig, TransformerConfig, SourceTargetMapping, MappingPath diff --git a/api/migrations/__init__.py b/domains/iam/__init__.py similarity index 100% rename from api/migrations/__init__.py rename to domains/iam/__init__.py diff --git a/iam/admin.py b/domains/iam/admin.py similarity index 99% rename from iam/admin.py rename to domains/iam/admin.py index cf0c1520..158f6c0e 100644 --- a/iam/admin.py +++ b/domains/iam/admin.py @@ -1,7 +1,7 @@ from django.contrib import admin, messages from django.utils.html import format_html from django.urls import path -from iam.models import ( +from domains.iam.models import ( User, UserType, Organization, diff --git a/iam/apps.py b/domains/iam/apps.py similarity index 56% rename from iam/apps.py rename to domains/iam/apps.py index 38ef7acd..8c316789 100644 --- a/iam/apps.py +++ b/domains/iam/apps.py @@ -3,4 +3,6 @@ class IamConfig(AppConfig): default_auto_field = "django.db.models.BigAutoField" - name = "iam" + name = "domains.iam" + label = "iam" + verbose_name = "Identity and Access Management" diff --git a/etl/__init__.py b/domains/iam/auth/__init__.py similarity index 100% rename from etl/__init__.py rename to domains/iam/auth/__init__.py diff --git a/iam/auth/adapters.py b/domains/iam/auth/adapters.py similarity index 91% rename from iam/auth/adapters.py rename to domains/iam/auth/adapters.py index 2ddf0c30..e474e91c 100644 --- a/iam/auth/adapters.py +++ b/domains/iam/auth/adapters.py @@ -1,8 +1,8 @@ from django.http import HttpRequest from django.conf import settings from allauth.account.adapter import DefaultAccountAdapter -from iam.schemas import AccountPatchBody -from iam.services import AccountService +from interfaces.auth.schemas import AccountPatchBody +from domains.iam.services import AccountService class AccountAdapter(DefaultAccountAdapter): diff --git a/iam/auth/forms.py b/domains/iam/auth/forms.py similarity index 92% rename from iam/auth/forms.py rename to domains/iam/auth/forms.py index 67fa4800..ec942d20 100644 --- a/iam/auth/forms.py +++ b/domains/iam/auth/forms.py @@ -1,7 +1,7 @@ from django import forms from django.conf import settings -from iam.schemas import AccountPatchBody -from iam.services import AccountService +from interfaces.auth.schemas import AccountPatchBody +from domains.iam.services import AccountService class UserSignupForm(forms.Form): diff --git a/etl/management/__init__.py b/domains/iam/auth/providers/__init__.py similarity index 100% rename from etl/management/__init__.py rename to domains/iam/auth/providers/__init__.py diff --git a/etl/management/commands/__init__.py b/domains/iam/auth/providers/hydroshare/__init__.py similarity index 100% rename from etl/management/commands/__init__.py rename to domains/iam/auth/providers/hydroshare/__init__.py diff --git a/iam/auth/providers/hydroshare/provider.py b/domains/iam/auth/providers/hydroshare/provider.py similarity index 91% rename from iam/auth/providers/hydroshare/provider.py rename to domains/iam/auth/providers/hydroshare/provider.py index 6f70c4b5..03d95b3d 100644 --- a/iam/auth/providers/hydroshare/provider.py +++ b/domains/iam/auth/providers/hydroshare/provider.py @@ -1,6 +1,6 @@ from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider -from iam.auth.providers.hydroshare.views import HydroShareOAuth2Adapter +from domains.iam.auth.providers.hydroshare.views import HydroShareOAuth2Adapter class HydroShareAccount(ProviderAccount): diff --git a/iam/auth/providers/hydroshare/urls.py b/domains/iam/auth/providers/hydroshare/urls.py similarity index 100% rename from iam/auth/providers/hydroshare/urls.py rename to domains/iam/auth/providers/hydroshare/urls.py diff --git a/iam/auth/providers/hydroshare/views.py b/domains/iam/auth/providers/hydroshare/views.py similarity index 100% rename from iam/auth/providers/hydroshare/views.py rename to domains/iam/auth/providers/hydroshare/views.py diff --git a/etl/migrations/__init__.py b/domains/iam/auth/providers/orcidsandbox/__init__.py similarity index 100% rename from etl/migrations/__init__.py rename to domains/iam/auth/providers/orcidsandbox/__init__.py diff --git a/iam/auth/providers/orcidsandbox/provider.py b/domains/iam/auth/providers/orcidsandbox/provider.py similarity index 79% rename from iam/auth/providers/orcidsandbox/provider.py rename to domains/iam/auth/providers/orcidsandbox/provider.py index a9f86fb5..ac3764a8 100644 --- a/iam/auth/providers/orcidsandbox/provider.py +++ b/domains/iam/auth/providers/orcidsandbox/provider.py @@ -4,7 +4,7 @@ OrcidProvider, extract_from_dict, ) -from iam.auth.providers.orcidsandbox.views import SandboxOrcidOAuth2Adapter +from domains.iam.auth.providers.orcidsandbox.views import SandboxOrcidOAuth2Adapter class SandboxOrcidProvider(OrcidProvider): diff --git a/iam/auth/providers/orcidsandbox/urls.py b/domains/iam/auth/providers/orcidsandbox/urls.py similarity index 100% rename from iam/auth/providers/orcidsandbox/urls.py rename to domains/iam/auth/providers/orcidsandbox/urls.py diff --git a/iam/auth/providers/orcidsandbox/views.py b/domains/iam/auth/providers/orcidsandbox/views.py similarity index 100% rename from iam/auth/providers/orcidsandbox/views.py rename to domains/iam/auth/providers/orcidsandbox/views.py diff --git a/iam/fixtures/default_organization_types.yaml b/domains/iam/fixtures/default_organization_types.yaml similarity index 100% rename from iam/fixtures/default_organization_types.yaml rename to domains/iam/fixtures/default_organization_types.yaml diff --git a/iam/fixtures/default_roles.yaml b/domains/iam/fixtures/default_roles.yaml similarity index 97% rename from iam/fixtures/default_roles.yaml rename to domains/iam/fixtures/default_roles.yaml index cba5fb96..f49e90cd 100644 --- a/iam/fixtures/default_roles.yaml +++ b/domains/iam/fixtures/default_roles.yaml @@ -19,7 +19,7 @@ pk: 1f7ec829-eea8-415e-b6ee-72d31ae43d1a fields: name: Data Loader - description: Grants permission to push observations to workspace datastreams and update data sources. + description: Grants permission to push observations to workspace datastreams and update data connections. workspace_id: is_user_role: False is_apikey_role: True diff --git a/iam/fixtures/default_user_types.yaml b/domains/iam/fixtures/default_user_types.yaml similarity index 100% rename from iam/fixtures/default_user_types.yaml rename to domains/iam/fixtures/default_user_types.yaml diff --git a/iam/migrations/0001_initial.py b/domains/iam/migrations/0001_initial.py similarity index 98% rename from iam/migrations/0001_initial.py rename to domains/iam/migrations/0001_initial.py index 684cc585..ab645add 100644 --- a/iam/migrations/0001_initial.py +++ b/domains/iam/migrations/0001_initial.py @@ -3,7 +3,7 @@ import django.contrib.auth.validators import django.db.models.deletion import django.utils.timezone -import iam.models.utils +import domains.iam.models.utils import uuid6 from django.conf import settings from django.db import migrations, models @@ -68,7 +68,7 @@ class Migration(migrations.Migration): ("name", models.CharField(max_length=255)), ("description", models.TextField(blank=True, null=True)), ], - bases=(models.Model, iam.models.utils.PermissionChecker), + bases=(models.Model, domains.iam.models.utils.PermissionChecker), ), migrations.CreateModel( name="UserType", @@ -392,6 +392,6 @@ class Migration(migrations.Migration): options={ "unique_together": {("user", "workspace")}, }, - bases=(models.Model, iam.models.utils.PermissionChecker), + bases=(models.Model, domains.iam.models.utils.PermissionChecker), ), ] diff --git a/iam/migrations/0002_workspace_unique_workspace_name_per_owner.py b/domains/iam/migrations/0002_workspace_unique_workspace_name_per_owner.py similarity index 100% rename from iam/migrations/0002_workspace_unique_workspace_name_per_owner.py rename to domains/iam/migrations/0002_workspace_unique_workspace_name_per_owner.py diff --git a/iam/migrations/0003_role_is_apikey_role_role_is_user_role_and_more.py b/domains/iam/migrations/0003_role_is_apikey_role_role_is_user_role_and_more.py similarity index 96% rename from iam/migrations/0003_role_is_apikey_role_role_is_user_role_and_more.py rename to domains/iam/migrations/0003_role_is_apikey_role_role_is_user_role_and_more.py index daeca33e..083b6df4 100644 --- a/iam/migrations/0003_role_is_apikey_role_role_is_user_role_and_more.py +++ b/domains/iam/migrations/0003_role_is_apikey_role_role_is_user_role_and_more.py @@ -2,7 +2,7 @@ import django.db.models.deletion import django.utils.timezone -import iam.models.utils +import domains.iam.models.utils import uuid6 from django.db import migrations, models @@ -88,6 +88,6 @@ class Migration(migrations.Migration): "verbose_name": "API Key", "verbose_name_plural": "API Keys", }, - bases=(models.Model, iam.models.utils.PermissionChecker), + bases=(models.Model, domains.iam.models.utils.PermissionChecker), ), ] diff --git a/iam/migrations/0004_alter_permission_resource_type.py b/domains/iam/migrations/0004_alter_permission_resource_type.py similarity index 100% rename from iam/migrations/0004_alter_permission_resource_type.py rename to domains/iam/migrations/0004_alter_permission_resource_type.py diff --git a/iam/__init__.py b/domains/iam/migrations/__init__.py similarity index 100% rename from iam/__init__.py rename to domains/iam/migrations/__init__.py diff --git a/iam/models/__init__.py b/domains/iam/models/__init__.py similarity index 100% rename from iam/models/__init__.py rename to domains/iam/models/__init__.py diff --git a/iam/models/api_key.py b/domains/iam/models/api_key.py similarity index 100% rename from iam/models/api_key.py rename to domains/iam/models/api_key.py diff --git a/iam/models/collaborator.py b/domains/iam/models/collaborator.py similarity index 98% rename from iam/models/collaborator.py rename to domains/iam/models/collaborator.py index e941254f..e1a6b5a5 100644 --- a/iam/models/collaborator.py +++ b/domains/iam/models/collaborator.py @@ -7,7 +7,7 @@ if typing.TYPE_CHECKING: from django.contrib.auth import get_user_model - from iam.models import Workspace + from domains.iam.models import Workspace User = get_user_model() diff --git a/iam/models/organization.py b/domains/iam/models/organization.py similarity index 100% rename from iam/models/organization.py rename to domains/iam/models/organization.py diff --git a/iam/models/permission.py b/domains/iam/models/permission.py similarity index 100% rename from iam/models/permission.py rename to domains/iam/models/permission.py diff --git a/iam/models/role.py b/domains/iam/models/role.py similarity index 97% rename from iam/models/role.py rename to domains/iam/models/role.py index 8474d121..7beeb751 100644 --- a/iam/models/role.py +++ b/domains/iam/models/role.py @@ -84,7 +84,7 @@ def delete(self, *args, **kwargs): @staticmethod def delete_contents(filter_arg: models.Model, filter_suffix: Optional[str]): - from iam.models import Permission, Collaborator, APIKey + from domains.iam.models import Permission, Collaborator, APIKey role_relation_filter = f"role__{filter_suffix}" if filter_suffix else "role" diff --git a/iam/models/user.py b/domains/iam/models/user.py similarity index 98% rename from iam/models/user.py rename to domains/iam/models/user.py index 51d4ac06..a0153f6c 100644 --- a/iam/models/user.py +++ b/domains/iam/models/user.py @@ -98,7 +98,7 @@ def delete(self, *args, **kwargs): @staticmethod def delete_contents(filter_arg: models.Model, filter_suffix: Optional[str]): - from iam.models import Workspace, Collaborator + from domains.iam.models import Workspace, Collaborator user_relation_filter = f"user__{filter_suffix}" if filter_suffix else "user" owner_relation_filter = f"owner__{filter_suffix}" if filter_suffix else "owner" diff --git a/iam/models/utils.py b/domains/iam/models/utils.py similarity index 98% rename from iam/models/utils.py rename to domains/iam/models/utils.py index a7ff8f3b..8af93591 100644 --- a/iam/models/utils.py +++ b/domains/iam/models/utils.py @@ -3,7 +3,7 @@ from .permission import Permission if typing.TYPE_CHECKING: - from iam.models import Workspace, APIKey + from domains.iam.models import Workspace, APIKey from django.contrib.auth import get_user_model User = get_user_model() diff --git a/iam/models/workspace.py b/domains/iam/models/workspace.py similarity index 98% rename from iam/models/workspace.py rename to domains/iam/models/workspace.py index 6264ddd2..5636455b 100644 --- a/iam/models/workspace.py +++ b/domains/iam/models/workspace.py @@ -123,8 +123,8 @@ def delete(self, *args, **kwargs): @staticmethod def delete_contents(filter_arg: models.Model, filter_suffix: Optional[str]): - from iam.models import Role, Collaborator, APIKey - from sta.models import ( + from domains.iam.models import Role, Collaborator, APIKey + from domains.sta.models import ( Thing, ObservedProperty, ProcessingLevel, diff --git a/iam/services/__init__.py b/domains/iam/services/__init__.py similarity index 100% rename from iam/services/__init__.py rename to domains/iam/services/__init__.py diff --git a/iam/services/account.py b/domains/iam/services/account.py similarity index 95% rename from iam/services/account.py rename to domains/iam/services/account.py index 680b9bfb..595af8e2 100644 --- a/iam/services/account.py +++ b/domains/iam/services/account.py @@ -2,9 +2,9 @@ from ninja.errors import HttpError from django.http import HttpResponse from django.contrib.auth import get_user_model -from api.service import ServiceUtils -from iam.models import Organization, UserType, OrganizationType -from iam.schemas import AccountPostBody, AccountPatchBody +from interfaces.api.service import ServiceUtils +from domains.iam.models import Organization, UserType, OrganizationType +from interfaces.auth.schemas import AccountPostBody, AccountPatchBody User = get_user_model() diff --git a/iam/services/api_key.py b/domains/iam/services/api_key.py similarity index 97% rename from iam/services/api_key.py rename to domains/iam/services/api_key.py index 17b9c53d..11978e12 100644 --- a/iam/services/api_key.py +++ b/domains/iam/services/api_key.py @@ -4,8 +4,8 @@ from django.http import HttpResponse from django.contrib.auth import get_user_model from django.db.models import QuerySet -from iam.models import APIKey -from iam.schemas import ( +from domains.iam.models import APIKey +from interfaces.api.schemas import ( APIKeyPostBody, APIKeyPatchBody, APIKeySummaryResponse, @@ -13,8 +13,8 @@ APIKeySummaryPostResponse, APIKeyDetailPostResponse, ) -from iam.schemas.api_key import APIKeyOrderByFields -from api.service import ServiceUtils +from interfaces.api.schemas.api_key import APIKeyOrderByFields +from interfaces.api.service import ServiceUtils from .role import RoleService User = get_user_model() diff --git a/iam/services/collaborator.py b/domains/iam/services/collaborator.py similarity index 96% rename from iam/services/collaborator.py rename to domains/iam/services/collaborator.py index d3bcfe1f..29821bb3 100644 --- a/iam/services/collaborator.py +++ b/domains/iam/services/collaborator.py @@ -3,9 +3,9 @@ from ninja.errors import HttpError from django.http import HttpResponse from django.contrib.auth import get_user_model -from iam.models import Collaborator, APIKey -from iam.schemas import CollaboratorPostBody, CollaboratorDeleteBody -from api.service import ServiceUtils +from domains.iam.models import Collaborator, APIKey +from interfaces.api.schemas import CollaboratorPostBody, CollaboratorDeleteBody +from interfaces.api.service import ServiceUtils from .role import RoleService User = get_user_model() diff --git a/iam/services/role.py b/domains/iam/services/role.py similarity index 93% rename from iam/services/role.py rename to domains/iam/services/role.py index 98757603..fc16d55d 100644 --- a/iam/services/role.py +++ b/domains/iam/services/role.py @@ -4,9 +4,9 @@ from django.http import HttpResponse from django.contrib.auth import get_user_model from django.db.models import QuerySet -from iam.models import APIKey, Role -from iam.schemas.role import RoleOrderByFields, RoleSummaryResponse, RoleDetailResponse -from api.service import ServiceUtils +from domains.iam.models import APIKey, Role +from interfaces.api.schemas.role import RoleOrderByFields, RoleSummaryResponse, RoleDetailResponse +from interfaces.api.service import ServiceUtils User = get_user_model() diff --git a/iam/services/workspace.py b/domains/iam/services/workspace.py similarity index 97% rename from iam/services/workspace.py rename to domains/iam/services/workspace.py index b179572d..71001bce 100644 --- a/iam/services/workspace.py +++ b/domains/iam/services/workspace.py @@ -5,16 +5,16 @@ from django.http import HttpResponse from django.contrib.auth import get_user_model from django.db.utils import IntegrityError -from iam.models import Workspace, WorkspaceTransferConfirmation, APIKey -from iam.schemas import ( +from domains.iam.models import Workspace, WorkspaceTransferConfirmation, APIKey +from interfaces.api.schemas import ( WorkspaceSummaryResponse, WorkspaceDetailResponse, WorkspacePostBody, WorkspacePatchBody, WorkspaceTransferBody, ) -from iam.schemas.workspace import WorkspaceOrderByFields -from api.service import ServiceUtils +from interfaces.api.schemas.workspace import WorkspaceOrderByFields +from interfaces.api.service import ServiceUtils User = get_user_model() diff --git a/iam/auth/__init__.py b/domains/sta/__init__.py similarity index 100% rename from iam/auth/__init__.py rename to domains/sta/__init__.py diff --git a/sta/admin.py b/domains/sta/admin.py similarity index 99% rename from sta/admin.py rename to domains/sta/admin.py index 843f96a9..1861c78a 100644 --- a/sta/admin.py +++ b/domains/sta/admin.py @@ -2,7 +2,7 @@ from django.db import transaction from django.urls import path from django.core.management.base import CommandError -from sta.models import ( +from domains.sta.models import ( Thing, Sensor, ObservedProperty, @@ -27,7 +27,7 @@ SampledMedium, FileAttachmentType, ) -from sta.management.utils import generate_test_timeseries +from interfaces.actions.management.utils import generate_test_timeseries from hydroserver.admin import VocabularyAdmin diff --git a/sta/apps.py b/domains/sta/apps.py similarity index 59% rename from sta/apps.py rename to domains/sta/apps.py index 01b95c2c..8d928aae 100644 --- a/sta/apps.py +++ b/domains/sta/apps.py @@ -3,4 +3,6 @@ class StaConfig(AppConfig): default_auto_field = "django.db.models.BigAutoField" - name = "sta" + name = "domains.sta" + label = "sta" + verbose_name = "Measurement Data" diff --git a/sta/fixtures/default_datastream_aggregations.yaml b/domains/sta/fixtures/default_datastream_aggregations.yaml similarity index 100% rename from sta/fixtures/default_datastream_aggregations.yaml rename to domains/sta/fixtures/default_datastream_aggregations.yaml diff --git a/sta/fixtures/default_datastream_statuses.yaml b/domains/sta/fixtures/default_datastream_statuses.yaml similarity index 100% rename from sta/fixtures/default_datastream_statuses.yaml rename to domains/sta/fixtures/default_datastream_statuses.yaml diff --git a/sta/fixtures/default_file_attachment_types.yaml b/domains/sta/fixtures/default_file_attachment_types.yaml similarity index 100% rename from sta/fixtures/default_file_attachment_types.yaml rename to domains/sta/fixtures/default_file_attachment_types.yaml diff --git a/sta/fixtures/default_method_types.yaml b/domains/sta/fixtures/default_method_types.yaml similarity index 100% rename from sta/fixtures/default_method_types.yaml rename to domains/sta/fixtures/default_method_types.yaml diff --git a/sta/fixtures/default_observed_properties.yaml b/domains/sta/fixtures/default_observed_properties.yaml similarity index 100% rename from sta/fixtures/default_observed_properties.yaml rename to domains/sta/fixtures/default_observed_properties.yaml diff --git a/sta/fixtures/default_processing_levels.yaml b/domains/sta/fixtures/default_processing_levels.yaml similarity index 100% rename from sta/fixtures/default_processing_levels.yaml rename to domains/sta/fixtures/default_processing_levels.yaml diff --git a/sta/fixtures/default_sampled_mediums.yaml b/domains/sta/fixtures/default_sampled_mediums.yaml similarity index 100% rename from sta/fixtures/default_sampled_mediums.yaml rename to domains/sta/fixtures/default_sampled_mediums.yaml diff --git a/sta/fixtures/default_sampling_feature_types.yaml b/domains/sta/fixtures/default_sampling_feature_types.yaml similarity index 100% rename from sta/fixtures/default_sampling_feature_types.yaml rename to domains/sta/fixtures/default_sampling_feature_types.yaml diff --git a/sta/fixtures/default_sensor_encoding_types.yaml b/domains/sta/fixtures/default_sensor_encoding_types.yaml similarity index 100% rename from sta/fixtures/default_sensor_encoding_types.yaml rename to domains/sta/fixtures/default_sensor_encoding_types.yaml diff --git a/sta/fixtures/default_site_types.yaml b/domains/sta/fixtures/default_site_types.yaml similarity index 100% rename from sta/fixtures/default_site_types.yaml rename to domains/sta/fixtures/default_site_types.yaml diff --git a/sta/fixtures/default_unit_types.yaml b/domains/sta/fixtures/default_unit_types.yaml similarity index 100% rename from sta/fixtures/default_unit_types.yaml rename to domains/sta/fixtures/default_unit_types.yaml diff --git a/sta/fixtures/default_units.yaml b/domains/sta/fixtures/default_units.yaml similarity index 100% rename from sta/fixtures/default_units.yaml rename to domains/sta/fixtures/default_units.yaml diff --git a/sta/fixtures/default_variable_types.yaml b/domains/sta/fixtures/default_variable_types.yaml similarity index 100% rename from sta/fixtures/default_variable_types.yaml rename to domains/sta/fixtures/default_variable_types.yaml diff --git a/sta/migrations/0001_initial.py b/domains/sta/migrations/0001_initial.py similarity index 95% rename from sta/migrations/0001_initial.py rename to domains/sta/migrations/0001_initial.py index 6c529309..5e740f0a 100644 --- a/sta/migrations/0001_initial.py +++ b/domains/sta/migrations/0001_initial.py @@ -1,8 +1,8 @@ # Generated by Django 5.2b1 on 2025-04-15 21:58 import django.db.models.deletion -import iam.models.utils -import sta.models.thing +import domains.iam.models.utils +import domains.sta.models.thing import uuid6 from django.db import migrations, models @@ -186,7 +186,7 @@ class Migration(migrations.Migration): options={ "verbose_name_plural": "Observed properties", }, - bases=(models.Model, iam.models.utils.PermissionChecker), + bases=(models.Model, domains.iam.models.utils.PermissionChecker), ), migrations.CreateModel( name="ProcessingLevel", @@ -214,7 +214,7 @@ class Migration(migrations.Migration): ), ), ], - bases=(models.Model, iam.models.utils.PermissionChecker), + bases=(models.Model, domains.iam.models.utils.PermissionChecker), ), migrations.CreateModel( name="ResultQualifier", @@ -241,7 +241,7 @@ class Migration(migrations.Migration): ), ), ], - bases=(models.Model, iam.models.utils.PermissionChecker), + bases=(models.Model, domains.iam.models.utils.PermissionChecker), ), migrations.CreateModel( name="Sensor", @@ -287,7 +287,7 @@ class Migration(migrations.Migration): ), ), ], - bases=(models.Model, iam.models.utils.PermissionChecker), + bases=(models.Model, domains.iam.models.utils.PermissionChecker), ), migrations.CreateModel( name="Thing", @@ -317,7 +317,7 @@ class Migration(migrations.Migration): ), ), ], - bases=(models.Model, iam.models.utils.PermissionChecker), + bases=(models.Model, domains.iam.models.utils.PermissionChecker), ), migrations.CreateModel( name="Tag", @@ -342,7 +342,7 @@ class Migration(migrations.Migration): ), ), ], - bases=(models.Model, iam.models.utils.PermissionChecker), + bases=(models.Model, domains.iam.models.utils.PermissionChecker), ), migrations.CreateModel( name="Location", @@ -383,7 +383,7 @@ class Migration(migrations.Migration): ), ), ], - bases=(models.Model, iam.models.utils.PermissionChecker), + bases=(models.Model, domains.iam.models.utils.PermissionChecker), ), migrations.CreateModel( name="Unit", @@ -412,7 +412,7 @@ class Migration(migrations.Migration): ), ), ], - bases=(models.Model, iam.models.utils.PermissionChecker), + bases=(models.Model, domains.iam.models.utils.PermissionChecker), ), migrations.CreateModel( name="Datastream", @@ -509,7 +509,7 @@ class Migration(migrations.Migration): ), ), ], - bases=(models.Model, iam.models.utils.PermissionChecker), + bases=(models.Model, domains.iam.models.utils.PermissionChecker), ), migrations.CreateModel( name="Observation", @@ -546,7 +546,7 @@ class Migration(migrations.Migration): models.Index(fields=["id"], name="sta_observa_id_5779e2_idx") ], }, - bases=(models.Model, iam.models.utils.PermissionChecker), + bases=(models.Model, domains.iam.models.utils.PermissionChecker), ), migrations.CreateModel( name="Photo", @@ -564,7 +564,7 @@ class Migration(migrations.Migration): ( "photo", models.FileField( - upload_to=sta.models.thing.thing_file_attachment_storage_path + upload_to=domains.sta.models.thing.thing_file_attachment_storage_path ), ), ( @@ -579,6 +579,6 @@ class Migration(migrations.Migration): options={ "unique_together": {("thing", "name")}, }, - bases=(models.Model, iam.models.utils.PermissionChecker), + bases=(models.Model, domains.iam.models.utils.PermissionChecker), ), ] diff --git a/sta/migrations/0002_remove_observation_sta_observa_id_5779e2_idx_and_more.py b/domains/sta/migrations/0002_remove_observation_sta_observa_id_5779e2_idx_and_more.py similarity index 100% rename from sta/migrations/0002_remove_observation_sta_observa_id_5779e2_idx_and_more.py rename to domains/sta/migrations/0002_remove_observation_sta_observa_id_5779e2_idx_and_more.py diff --git a/sta/migrations/0003_observation_result_qualifiers_and_more.py b/domains/sta/migrations/0003_observation_result_qualifiers_and_more.py similarity index 100% rename from sta/migrations/0003_observation_result_qualifiers_and_more.py rename to domains/sta/migrations/0003_observation_result_qualifiers_and_more.py diff --git a/sta/migrations/0004_datastreamfileattachmenttype_thingfileattachmenttype_and_more.py b/domains/sta/migrations/0004_datastreamfileattachmenttype_thingfileattachmenttype_and_more.py similarity index 92% rename from sta/migrations/0004_datastreamfileattachmenttype_thingfileattachmenttype_and_more.py rename to domains/sta/migrations/0004_datastreamfileattachmenttype_thingfileattachmenttype_and_more.py index ccdefcb3..afb0b8a1 100644 --- a/sta/migrations/0004_datastreamfileattachmenttype_thingfileattachmenttype_and_more.py +++ b/domains/sta/migrations/0004_datastreamfileattachmenttype_thingfileattachmenttype_and_more.py @@ -1,9 +1,9 @@ # Generated by Django 5.2.5 on 2025-10-27 17:28 import django.db.models.deletion -import iam.models.utils -import sta.models.datastream -import sta.models.thing +import domains.iam.models.utils +import domains.sta.models.datastream +import domains.sta.models.thing from django.db import migrations, models @@ -92,7 +92,7 @@ class Migration(migrations.Migration): ( "file_attachment", models.FileField( - upload_to=sta.models.datastream.datastream_file_attachment_storage_path + upload_to=domains.sta.models.datastream.datastream_file_attachment_storage_path ), ), ("file_attachment_type", models.CharField(max_length=200)), @@ -108,7 +108,7 @@ class Migration(migrations.Migration): options={ "unique_together": {("datastream", "name")}, }, - bases=(models.Model, iam.models.utils.PermissionChecker), + bases=(models.Model, domains.iam.models.utils.PermissionChecker), ), migrations.CreateModel( name="DatastreamTag", @@ -133,6 +133,6 @@ class Migration(migrations.Migration): ), ), ], - bases=(models.Model, iam.models.utils.PermissionChecker), + bases=(models.Model, domains.iam.models.utils.PermissionChecker), ), ] diff --git a/sta/migrations/0005_remove_datastream_data_archives_and_more.py b/domains/sta/migrations/0005_remove_datastream_data_archives_and_more.py similarity index 100% rename from sta/migrations/0005_remove_datastream_data_archives_and_more.py rename to domains/sta/migrations/0005_remove_datastream_data_archives_and_more.py diff --git a/iam/auth/providers/__init__.py b/domains/sta/migrations/__init__.py similarity index 100% rename from iam/auth/providers/__init__.py rename to domains/sta/migrations/__init__.py diff --git a/sta/models/__init__.py b/domains/sta/models/__init__.py similarity index 100% rename from sta/models/__init__.py rename to domains/sta/models/__init__.py diff --git a/sta/models/datastream.py b/domains/sta/models/datastream.py similarity index 98% rename from sta/models/datastream.py rename to domains/sta/models/datastream.py index 597b7a22..914e1c51 100644 --- a/sta/models/datastream.py +++ b/domains/sta/models/datastream.py @@ -4,8 +4,8 @@ from django.db import models from django.db.models import Q from django.conf import settings -from iam.models import Workspace -from iam.models.utils import PermissionChecker +from domains.iam.models import Workspace +from domains.iam.models.utils import PermissionChecker from .thing import Thing from .sensor import Sensor from .unit import Unit @@ -14,7 +14,7 @@ if typing.TYPE_CHECKING: from django.contrib.auth import get_user_model - from iam.models import Workspace, APIKey + from domains.iam.models import Workspace, APIKey User = get_user_model() @@ -149,7 +149,7 @@ def delete(self, *args, **kwargs): @staticmethod def delete_contents(filter_arg: models.Model, filter_suffix: Optional[str]): - from sta.models import ( + from domains.sta.models import ( Observation, DatastreamTag, DatastreamFileAttachment, diff --git a/sta/models/location.py b/domains/sta/models/location.py similarity index 96% rename from sta/models/location.py rename to domains/sta/models/location.py index 5773393c..aa58f552 100644 --- a/sta/models/location.py +++ b/domains/sta/models/location.py @@ -3,12 +3,12 @@ from typing import Optional, Union from django.db import models from django.db.models import Q -from iam.models.utils import PermissionChecker +from domains.iam.models.utils import PermissionChecker from .thing import Thing if typing.TYPE_CHECKING: from django.contrib.auth import get_user_model - from iam.models import APIKey + from domains.iam.models import APIKey User = get_user_model() diff --git a/sta/models/observation.py b/domains/sta/models/observation.py similarity index 98% rename from sta/models/observation.py rename to domains/sta/models/observation.py index c1817dd9..bf9631b3 100644 --- a/sta/models/observation.py +++ b/domains/sta/models/observation.py @@ -5,14 +5,14 @@ from typing import Literal, Optional, Union from django.db import models, connection from django.db.models import Q, OuterRef, Exists -from iam.models import Workspace, APIKey, Permission, Collaborator -from iam.models.utils import PermissionChecker +from domains.iam.models import Workspace, APIKey, Permission, Collaborator +from domains.iam.models.utils import PermissionChecker from .datastream import Datastream from .result_qualifier import ResultQualifier if typing.TYPE_CHECKING: from django.contrib.auth import get_user_model - from iam.models import Workspace + from domains.iam.models import Workspace User = get_user_model() diff --git a/sta/models/observed_property.py b/domains/sta/models/observed_property.py similarity index 96% rename from sta/models/observed_property.py rename to domains/sta/models/observed_property.py index 320d9484..24b3dbe3 100644 --- a/sta/models/observed_property.py +++ b/domains/sta/models/observed_property.py @@ -3,12 +3,12 @@ from typing import Literal, Optional, Union from django.db import models from django.db.models import Q -from iam.models import Workspace -from iam.models.utils import PermissionChecker +from domains.iam.models import Workspace +from domains.iam.models.utils import PermissionChecker if typing.TYPE_CHECKING: from django.contrib.auth import get_user_model - from iam.models import Workspace, APIKey + from domains.iam.models import Workspace, APIKey User = get_user_model() diff --git a/sta/models/processing_level.py b/domains/sta/models/processing_level.py similarity index 95% rename from sta/models/processing_level.py rename to domains/sta/models/processing_level.py index 28fabae0..5cee2c36 100644 --- a/sta/models/processing_level.py +++ b/domains/sta/models/processing_level.py @@ -3,12 +3,12 @@ from typing import Literal, Optional, Union from django.db import models from django.db.models import Q -from iam.models import Workspace -from iam.models.utils import PermissionChecker +from domains.iam.models import Workspace +from domains.iam.models.utils import PermissionChecker if typing.TYPE_CHECKING: from django.contrib.auth import get_user_model - from iam.models import Workspace, APIKey + from domains.iam.models import Workspace, APIKey User = get_user_model() diff --git a/sta/models/result_qualifier.py b/domains/sta/models/result_qualifier.py similarity index 95% rename from sta/models/result_qualifier.py rename to domains/sta/models/result_qualifier.py index 24faa976..a4ccf077 100644 --- a/sta/models/result_qualifier.py +++ b/domains/sta/models/result_qualifier.py @@ -3,12 +3,12 @@ from typing import Literal, Optional, Union from django.db import models from django.db.models import Q -from iam.models import Workspace -from iam.models.utils import PermissionChecker +from domains.iam.models import Workspace +from domains.iam.models.utils import PermissionChecker if typing.TYPE_CHECKING: from django.contrib.auth import get_user_model - from iam.models import Workspace, APIKey + from domains.iam.models import Workspace, APIKey User = get_user_model() diff --git a/sta/models/sensor.py b/domains/sta/models/sensor.py similarity index 96% rename from sta/models/sensor.py rename to domains/sta/models/sensor.py index edc479ad..69d35d7e 100644 --- a/sta/models/sensor.py +++ b/domains/sta/models/sensor.py @@ -3,12 +3,12 @@ from typing import Literal, Optional, Union from django.db import models from django.db.models import Q -from iam.models import Workspace -from iam.models.utils import PermissionChecker +from domains.iam.models import Workspace +from domains.iam.models.utils import PermissionChecker if typing.TYPE_CHECKING: from django.contrib.auth import get_user_model - from iam.models import Workspace, APIKey + from domains.iam.models import Workspace, APIKey User = get_user_model() diff --git a/sta/models/thing.py b/domains/sta/models/thing.py similarity index 97% rename from sta/models/thing.py rename to domains/sta/models/thing.py index a140b997..423742d9 100644 --- a/sta/models/thing.py +++ b/domains/sta/models/thing.py @@ -4,12 +4,12 @@ from django.db import models from django.db.models import Q from django.conf import settings -from iam.models import Workspace -from iam.models.utils import PermissionChecker +from domains.iam.models import Workspace +from domains.iam.models.utils import PermissionChecker if typing.TYPE_CHECKING: from django.contrib.auth import get_user_model - from iam.models import Workspace, APIKey + from domains.iam.models import Workspace, APIKey User = get_user_model() @@ -115,7 +115,7 @@ def delete(self, *args, **kwargs): @staticmethod def delete_contents(filter_arg: models.Model, filter_suffix: Optional[str]): - from sta.models import Datastream, Location, ThingTag, ThingFileAttachment + from domains.sta.models import Datastream, Location, ThingTag, ThingFileAttachment thing_relation_filter = f"thing__{filter_suffix}" if filter_suffix else "thing" diff --git a/sta/models/unit.py b/domains/sta/models/unit.py similarity index 95% rename from sta/models/unit.py rename to domains/sta/models/unit.py index 1813b5aa..b5dc7d32 100644 --- a/sta/models/unit.py +++ b/domains/sta/models/unit.py @@ -3,12 +3,12 @@ from typing import Literal, Optional, Union from django.db import models from django.db.models import Q -from iam.models import Workspace -from iam.models.utils import PermissionChecker +from domains.iam.models import Workspace +from domains.iam.models.utils import PermissionChecker if typing.TYPE_CHECKING: from django.contrib.auth import get_user_model - from iam.models import Workspace, APIKey + from domains.iam.models import Workspace, APIKey User = get_user_model() diff --git a/sta/services/__init__.py b/domains/sta/services/__init__.py similarity index 100% rename from sta/services/__init__.py rename to domains/sta/services/__init__.py diff --git a/sta/services/datastream.py b/domains/sta/services/datastream.py similarity index 99% rename from sta/services/datastream.py rename to domains/sta/services/datastream.py index 648bf204..a2f09056 100644 --- a/sta/services/datastream.py +++ b/domains/sta/services/datastream.py @@ -7,9 +7,9 @@ from django.contrib.postgres.aggregates import ArrayAgg from django.utils import timezone from django.http import StreamingHttpResponse -from api.service import ServiceUtils -from iam.models import APIKey -from sta.models import ( +from interfaces.api.service import ServiceUtils +from domains.iam.models import APIKey +from domains.sta.models import ( Datastream, Observation, DatastreamTag, @@ -19,19 +19,19 @@ SampledMedium, FileAttachmentType, ) -from sta.schemas import ( +from interfaces.api.schemas import ( DatastreamPostBody, DatastreamPatchBody, TagPostBody, TagDeleteBody, FileAttachmentDeleteBody, ) -from sta.schemas.datastream import ( +from interfaces.api.schemas.datastream import ( DatastreamOrderByFields, DatastreamSummaryResponse, DatastreamDetailResponse, ) -from sta.services import ( +from domains.sta.services import ( ThingService, ObservedPropertyService, ProcessingLevelService, diff --git a/sta/services/observation.py b/domains/sta/services/observation.py similarity index 98% rename from sta/services/observation.py rename to domains/sta/services/observation.py index 542453ec..e4479d9a 100644 --- a/sta/services/observation.py +++ b/domains/sta/services/observation.py @@ -12,9 +12,9 @@ from django.db.models.functions import Coalesce from django.db.utils import IntegrityError from django.contrib.postgres.aggregates import ArrayAgg -from iam.models import APIKey -from sta.models import Observation, ResultQualifier -from sta.schemas.observation import ( +from domains.iam.models import APIKey +from domains.sta.models import Observation, ResultQualifier +from interfaces.api.schemas.observation import ( ObservationFields, ObservationOrderByFields, ObservationSummaryResponse, @@ -23,8 +23,8 @@ ObservationBulkPostBody, ObservationBulkDeleteBody, ) -from sta.services.datastream import DatastreamService -from api.service import ServiceUtils +from domains.sta.services.datastream import DatastreamService +from interfaces.api.service import ServiceUtils User = get_user_model() datastream_service = DatastreamService() diff --git a/sta/services/observed_property.py b/domains/sta/services/observed_property.py similarity index 96% rename from sta/services/observed_property.py rename to domains/sta/services/observed_property.py index 5219bec7..721b0abd 100644 --- a/sta/services/observed_property.py +++ b/domains/sta/services/observed_property.py @@ -4,19 +4,19 @@ from django.http import HttpResponse from django.contrib.auth import get_user_model from django.db.models import QuerySet -from iam.models import APIKey -from sta.models import ObservedProperty, VariableType -from sta.schemas import ( +from domains.iam.models import APIKey +from domains.sta.models import ObservedProperty, VariableType +from interfaces.api.schemas import ( ObservedPropertySummaryResponse, ObservedPropertyDetailResponse, ObservedPropertyPostBody, ObservedPropertyPatchBody, ) -from sta.schemas.observed_property import ( +from interfaces.api.schemas.observed_property import ( ObservedPropertyFields, ObservedPropertyOrderByFields, ) -from api.service import ServiceUtils +from interfaces.api.service import ServiceUtils User = get_user_model() diff --git a/sta/services/processing_level.py b/domains/sta/services/processing_level.py similarity index 96% rename from sta/services/processing_level.py rename to domains/sta/services/processing_level.py index 75f4b0d4..0dd401f3 100644 --- a/sta/services/processing_level.py +++ b/domains/sta/services/processing_level.py @@ -4,19 +4,19 @@ from django.http import HttpResponse from django.contrib.auth import get_user_model from django.db.models import QuerySet -from iam.models import APIKey -from sta.models import ProcessingLevel -from sta.schemas import ( +from domains.iam.models import APIKey +from domains.sta.models import ProcessingLevel +from interfaces.api.schemas import ( ProcessingLevelSummaryResponse, ProcessingLevelDetailResponse, ProcessingLevelPostBody, ProcessingLevelPatchBody, ) -from sta.schemas.processing_level import ( +from interfaces.api.schemas.processing_level import ( ProcessingLevelFields, ProcessingLevelOrderByFields, ) -from api.service import ServiceUtils +from interfaces.api.service import ServiceUtils User = get_user_model() diff --git a/sta/services/result_qualifier.py b/domains/sta/services/result_qualifier.py similarity index 96% rename from sta/services/result_qualifier.py rename to domains/sta/services/result_qualifier.py index ef3b2a9d..0142699e 100644 --- a/sta/services/result_qualifier.py +++ b/domains/sta/services/result_qualifier.py @@ -6,19 +6,19 @@ from django.db.models import QuerySet from django.db.utils import IntegrityError from psycopg.errors import UniqueViolation -from iam.models import APIKey -from sta.models import ResultQualifier -from sta.schemas import ( +from domains.iam.models import APIKey +from domains.sta.models import ResultQualifier +from interfaces.api.schemas import ( ResultQualifierSummaryResponse, ResultQualifierDetailResponse, ResultQualifierPostBody, ResultQualifierPatchBody, ) -from sta.schemas.result_qualifier import ( +from interfaces.api.schemas.result_qualifier import ( ResultQualifierFields, ResultQualifierOrderByFields, ) -from api.service import ServiceUtils +from interfaces.api.service import ServiceUtils User = get_user_model() diff --git a/sta/services/sensor.py b/domains/sta/services/sensor.py similarity index 95% rename from sta/services/sensor.py rename to domains/sta/services/sensor.py index f2a0cec2..5f6f65ad 100644 --- a/sta/services/sensor.py +++ b/domains/sta/services/sensor.py @@ -4,16 +4,16 @@ from django.http import HttpResponse from django.contrib.auth import get_user_model from django.db.models import QuerySet -from iam.models import APIKey -from sta.models import Sensor, SensorEncodingType, MethodType -from sta.schemas import ( +from domains.iam.models import APIKey +from domains.sta.models import Sensor, SensorEncodingType, MethodType +from interfaces.api.schemas import ( SensorSummaryResponse, SensorDetailResponse, SensorPostBody, SensorPatchBody, ) -from sta.schemas.sensor import SensorFields, SensorOrderByFields -from api.service import ServiceUtils +from interfaces.api.schemas.sensor import SensorFields, SensorOrderByFields +from interfaces.api.service import ServiceUtils User = get_user_model() diff --git a/sta/services/thing.py b/domains/sta/services/thing.py similarity index 98% rename from sta/services/thing.py rename to domains/sta/services/thing.py index fd753b06..103ab0ed 100644 --- a/sta/services/thing.py +++ b/domains/sta/services/thing.py @@ -5,8 +5,8 @@ from django.contrib.auth import get_user_model from django.contrib.postgres.aggregates import ArrayAgg from django.db.models import QuerySet, F, Q -from iam.models import APIKey -from sta.models import ( +from domains.iam.models import APIKey +from domains.sta.models import ( Thing, Location, ThingTag, @@ -15,7 +15,7 @@ SiteType, FileAttachmentType, ) -from sta.schemas import ( +from interfaces.api.schemas import ( ThingSummaryResponse, ThingDetailResponse, ThingPostBody, @@ -24,8 +24,8 @@ TagDeleteBody, FileAttachmentDeleteBody, ) -from sta.schemas.thing import ThingFields, LocationFields, ThingOrderByFields -from api.service import ServiceUtils +from interfaces.api.schemas.thing import ThingFields, LocationFields, ThingOrderByFields +from interfaces.api.service import ServiceUtils User = get_user_model() diff --git a/sta/services/unit.py b/domains/sta/services/unit.py similarity index 95% rename from sta/services/unit.py rename to domains/sta/services/unit.py index 5679f9cd..cc68f2e9 100644 --- a/sta/services/unit.py +++ b/domains/sta/services/unit.py @@ -4,16 +4,16 @@ from django.http import HttpResponse from django.contrib.auth import get_user_model from django.db.models import QuerySet -from iam.models import APIKey -from sta.models import Unit, UnitType -from sta.schemas import ( +from domains.iam.models import APIKey +from domains.sta.models import Unit, UnitType +from interfaces.api.schemas import ( UnitSummaryResponse, UnitDetailResponse, UnitPostBody, UnitPatchBody, ) -from sta.schemas.unit import UnitFields, UnitOrderByFields -from api.service import ServiceUtils +from interfaces.api.schemas.unit import UnitFields, UnitOrderByFields +from interfaces.api.service import ServiceUtils User = get_user_model() diff --git a/iam/auth/providers/hydroshare/__init__.py b/domains/web/__init__.py similarity index 100% rename from iam/auth/providers/hydroshare/__init__.py rename to domains/web/__init__.py diff --git a/web/admin.py b/domains/web/admin.py similarity index 94% rename from web/admin.py rename to domains/web/admin.py index 1bb11b7d..205f6574 100644 --- a/web/admin.py +++ b/domains/web/admin.py @@ -1,5 +1,5 @@ from django.contrib import admin -from web.models import ( +from domains.web.models import ( InstanceConfiguration, MapConfiguration, AnalyticsConfiguration, diff --git a/web/apps.py b/domains/web/apps.py similarity index 58% rename from web/apps.py rename to domains/web/apps.py index c11daace..a09f367e 100644 --- a/web/apps.py +++ b/domains/web/apps.py @@ -3,4 +3,6 @@ class WebConfig(AppConfig): default_auto_field = "django.db.models.BigAutoField" - name = "web" + name = "domains.web" + label = "web" + verbose_name = "Website Configuration" diff --git a/web/migrations/0001_initial.py b/domains/web/migrations/0001_initial.py similarity index 100% rename from web/migrations/0001_initial.py rename to domains/web/migrations/0001_initial.py diff --git a/iam/auth/providers/orcidsandbox/__init__.py b/domains/web/migrations/__init__.py similarity index 100% rename from iam/auth/providers/orcidsandbox/__init__.py rename to domains/web/migrations/__init__.py diff --git a/web/models.py b/domains/web/models.py similarity index 100% rename from web/models.py rename to domains/web/models.py diff --git a/etl/schemas/__init__.py b/etl/schemas/__init__.py deleted file mode 100644 index 567fc0a2..00000000 --- a/etl/schemas/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -from .data_connection import (DataConnectionSummaryResponse, DataConnectionDetailResponse, DataConnectionPostBody, - DataConnectionPatchBody, DataConnectionFields, DataConnectionOrderByFields, - DataConnectionQueryParameters) -from .orchestration_system import (OrchestrationSystemSummaryResponse, OrchestrationSystemDetailResponse, - OrchestrationSystemPostBody, OrchestrationSystemPatchBody, - OrchestrationSystemFields, OrchestrationSystemOrderByFields, - OrchestrationSystemQueryParameters) -from .task import (TaskSummaryResponse, TaskDetailResponse, TaskPostBody, TaskPatchBody, TaskRunResponse, TaskFields, - TaskQueryParameters, TaskOrderByFields, TaskScheduleFields, TaskSchedulePostBody, - TaskMappingPostBody, TaskMappingPathPostBody) -from .run import (TaskRunFields, TaskRunResponse, TaskRunPostBody, TaskRunPatchBody, TaskRunQueryParameters, - TaskRunOrderByFields) diff --git a/etl/views/__init__.py b/etl/views/__init__.py deleted file mode 100644 index 12240e71..00000000 --- a/etl/views/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .data_connection import data_connection_router -from .orchestration_system import orchestration_system_router -from .task import task_router -from .run import task_run_router diff --git a/hydroserver/settings.py b/hydroserver/settings.py index 7e0a3c36..f0ec085d 100644 --- a/hydroserver/settings.py +++ b/hydroserver/settings.py @@ -107,19 +107,20 @@ "allauth.socialaccount.providers.google", "allauth.socialaccount.providers.orcid", "allauth.socialaccount.providers.openid_connect", - "iam.auth.providers.hydroshare", - "iam.auth.providers.orcidsandbox", + "domains.iam.auth.providers.hydroshare", + "domains.iam.auth.providers.orcidsandbox", "corsheaders", "easyaudit", "sensorthings", "storages", "django_celery_results", "django_celery_beat", - "api.apps.ApiConfig", - "iam.apps.IamConfig", - "sta.apps.StaConfig", - "etl.apps.EtlConfig", - "web.apps.WebConfig", + "interfaces.api.apps.ApiConfig", + "interfaces.actions.apps.ActionsConfig", + "domains.iam.apps.IamConfig", + "domains.sta.apps.StaConfig", + "domains.etl.apps.EtlConfig", + "domains.web.apps.WebConfig", "django.contrib.admin", ] @@ -210,10 +211,10 @@ ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED = True ACCOUNT_EMAIL_REQUIRED = True ACCOUNT_EMAIL_VERIFICATION = "mandatory" -ACCOUNT_SIGNUP_FORM_CLASS = "iam.auth.forms.UserSignupForm" +ACCOUNT_SIGNUP_FORM_CLASS = "domains.iam.auth.forms.UserSignupForm" ACCOUNT_DEFAULT_HTTP_PROTOCOL = "https" if DEPLOYMENT_BACKEND != "dev" else "http" -ACCOUNT_ADAPTER = "iam.auth.adapters.AccountAdapter" +ACCOUNT_ADAPTER = "domains.iam.auth.adapters.AccountAdapter" HEADLESS_ONLY = True HEADLESS_FRONTEND_URLS = { diff --git a/hydroserver/urls.py b/hydroserver/urls.py index e665a43a..0f3fa616 100644 --- a/hydroserver/urls.py +++ b/hydroserver/urls.py @@ -2,14 +2,14 @@ from django.conf.urls.static import static from django.contrib import admin from django.urls import path, re_path, include -from web.views import index +from interfaces.web.views import index urlpatterns = [ path("admin/", admin.site.urls), path("accounts/", include("allauth.urls")), - path("api/auth/", include("iam.urls")), - path("api/", include("api.urls")), + path("api/auth/", include("interfaces.auth.urls")), + path("api/", include("interfaces.api.urls")), ] urlpatterns += [ diff --git a/iam/schemas/__init__.py b/iam/schemas/__init__.py deleted file mode 100644 index 9c0613c4..00000000 --- a/iam/schemas/__init__.py +++ /dev/null @@ -1,48 +0,0 @@ -from .account import ( - AccountDetailResponse, - AccountPostBody, - AccountPatchBody, - AccountContactDetailResponse, - TypeDetailResponse, - OrganizationPostBody, - OrganizationPatchBody, -) -from .session import SessionPostBody -from .email import VerificationEmailPutBody, VerifyEmailPostBody -from .password import RequestResetPasswordPostBody, ResetPasswordPostBody -from .provider import ProviderRedirectPostForm, ProviderSignupPostBody -from .workspace import ( - WorkspaceSummaryResponse, - WorkspaceDetailResponse, - WorkspaceQueryParameters, - WorkspacePostBody, - WorkspacePatchBody, - WorkspaceTransferBody, -) -from .collaborator import ( - CollaboratorDetailResponse, - CollaboratorQueryParameters, - CollaboratorPostBody, - CollaboratorDeleteBody, -) -from .api_key import ( - APIKeySummaryResponse, - APIKeyDetailResponse, - APIKeyQueryParameters, - APIKeyPostBody, - APIKeyPatchBody, - APIKeySummaryPostResponse, - APIKeyDetailPostResponse, -) -from .role import RoleDetailResponse, RoleSummaryResponse, RoleQueryParameters - - -ProviderSignupPostBody.model_rebuild() - -WorkspaceDetailResponse.model_rebuild() -RoleDetailResponse.model_rebuild() - -APIKeyDetailResponse.model_rebuild() -APIKeyDetailPostResponse.model_rebuild() - -CollaboratorDetailResponse.model_rebuild() diff --git a/iam/management/__init__.py b/interfaces/__init__.py similarity index 100% rename from iam/management/__init__.py rename to interfaces/__init__.py diff --git a/iam/management/commands/__init__.py b/interfaces/actions/__init__.py similarity index 100% rename from iam/management/commands/__init__.py rename to interfaces/actions/__init__.py diff --git a/etl/apps.py b/interfaces/actions/apps.py similarity index 59% rename from etl/apps.py rename to interfaces/actions/apps.py index 09a2680e..4eda9511 100644 --- a/etl/apps.py +++ b/interfaces/actions/apps.py @@ -1,6 +1,6 @@ from django.apps import AppConfig -class EtlConfig(AppConfig): +class ActionsConfig(AppConfig): default_auto_field = "django.db.models.BigAutoField" - name = "etl" + name = "interfaces.actions" diff --git a/iam/migrations/__init__.py b/interfaces/actions/management/__init__.py similarity index 100% rename from iam/migrations/__init__.py rename to interfaces/actions/management/__init__.py diff --git a/sta/__init__.py b/interfaces/actions/management/commands/__init__.py similarity index 100% rename from sta/__init__.py rename to interfaces/actions/management/commands/__init__.py diff --git a/etl/management/commands/cleanup_etl_task_runs.py b/interfaces/actions/management/commands/cleanup_etl_task_runs.py similarity index 96% rename from etl/management/commands/cleanup_etl_task_runs.py rename to interfaces/actions/management/commands/cleanup_etl_task_runs.py index e172a252..be7697a6 100644 --- a/etl/management/commands/cleanup_etl_task_runs.py +++ b/interfaces/actions/management/commands/cleanup_etl_task_runs.py @@ -1,7 +1,7 @@ from datetime import timedelta from django.core.management.base import BaseCommand from django.utils import timezone -from etl.models import Task, TaskRun +from domains.etl.models import Task, TaskRun class Command(BaseCommand): diff --git a/api/management/commands/load_default_data.py b/interfaces/actions/management/commands/load_default_data.py similarity index 56% rename from api/management/commands/load_default_data.py rename to interfaces/actions/management/commands/load_default_data.py index f4f40956..ac5bcb7f 100644 --- a/api/management/commands/load_default_data.py +++ b/interfaces/actions/management/commands/load_default_data.py @@ -2,7 +2,7 @@ from django.core.management import call_command from django.db import transaction from django.conf import settings -from web.models import InstanceConfiguration +from domains.web.models import InstanceConfiguration class Command(BaseCommand): @@ -24,21 +24,21 @@ def handle(self, *args, **kwargs): if settings.LOAD_DEFAULT_DATA: self.stdout.write("Loading default fixtures...") fixtures = [ - "iam/fixtures/default_user_types.yaml", - "iam/fixtures/default_organization_types.yaml", - "iam/fixtures/default_roles.yaml", - "sta/fixtures/default_datastream_aggregations.yaml", - "sta/fixtures/default_datastream_statuses.yaml", - "sta/fixtures/default_method_types.yaml", - "sta/fixtures/default_processing_levels.yaml", - "sta/fixtures/default_sampled_mediums.yaml", - "sta/fixtures/default_units.yaml", - "sta/fixtures/default_variable_types.yaml", + "domains/iam/fixtures/default_user_types.yaml", + "domains/iam/fixtures/default_organization_types.yaml", + "domains/iam/fixtures/default_roles.yaml", + "domains/sta/fixtures/default_datastream_aggregations.yaml", + "domains/sta/fixtures/default_datastream_statuses.yaml", + "domains/sta/fixtures/default_method_types.yaml", + "domains/sta/fixtures/default_processing_levels.yaml", + "domains/sta/fixtures/default_sampled_mediums.yaml", + "domains/sta/fixtures/default_units.yaml", + "domains/sta/fixtures/default_variable_types.yaml", ] for fixture in fixtures: self.stdout.write(f"Loading {fixture}...") call_command("loaddata", fixture, verbosity=1) self.stdout.write( - self.style.SUCCESS("Default data loaded successfully.") + self.style.SUCCESS("Default domains loaded successfully.") ) diff --git a/etl/management/commands/load_etl_test_data.py b/interfaces/actions/management/commands/load_etl_test_data.py similarity index 100% rename from etl/management/commands/load_etl_test_data.py rename to interfaces/actions/management/commands/load_etl_test_data.py diff --git a/iam/management/commands/load_iam_test_data.py b/interfaces/actions/management/commands/load_iam_test_data.py similarity index 100% rename from iam/management/commands/load_iam_test_data.py rename to interfaces/actions/management/commands/load_iam_test_data.py diff --git a/sta/management/commands/load_sta_test_data.py b/interfaces/actions/management/commands/load_sta_test_data.py similarity index 100% rename from sta/management/commands/load_sta_test_data.py rename to interfaces/actions/management/commands/load_sta_test_data.py diff --git a/sta/management/commands/load_sta_test_observations.py b/interfaces/actions/management/commands/load_sta_test_observations.py similarity index 95% rename from sta/management/commands/load_sta_test_observations.py rename to interfaces/actions/management/commands/load_sta_test_observations.py index 0767fb42..26a72d4f 100644 --- a/sta/management/commands/load_sta_test_observations.py +++ b/interfaces/actions/management/commands/load_sta_test_observations.py @@ -2,8 +2,8 @@ from datetime import datetime, timedelta, timezone from django.core.management.base import BaseCommand from django.core.management import call_command -from sta.models import Datastream -from sta.management.utils import generate_test_timeseries +from domains.sta.models import Datastream +from interfaces.actions.management.utils import generate_test_timeseries class Command(BaseCommand): diff --git a/sta/management/commands/run_demo.py b/interfaces/actions/management/commands/run_demo.py similarity index 100% rename from sta/management/commands/run_demo.py rename to interfaces/actions/management/commands/run_demo.py diff --git a/iam/management/commands/setup_admin_user.py b/interfaces/actions/management/commands/setup_admin_user.py similarity index 100% rename from iam/management/commands/setup_admin_user.py rename to interfaces/actions/management/commands/setup_admin_user.py diff --git a/sta/management/utils.py b/interfaces/actions/management/utils.py similarity index 93% rename from sta/management/utils.py rename to interfaces/actions/management/utils.py index 59acae98..89da4f80 100644 --- a/sta/management/utils.py +++ b/interfaces/actions/management/utils.py @@ -1,11 +1,11 @@ import random from uuid import UUID from django.core.management.base import CommandError -from sta.models import Observation, Datastream +from domains.sta.models import Observation, Datastream def generate_test_timeseries(datastream_id: UUID): - """Populates a datastream with test timeseries data.""" + """Populates a datastream with test timeseries domains.""" try: datastream = Datastream.objects.get(pk=datastream_id) diff --git a/sta/management/__init__.py b/interfaces/api/__init__.py similarity index 100% rename from sta/management/__init__.py rename to interfaces/api/__init__.py diff --git a/api/apps.py b/interfaces/api/apps.py similarity index 81% rename from api/apps.py rename to interfaces/api/apps.py index 878e7d54..8d1d3ef1 100644 --- a/api/apps.py +++ b/interfaces/api/apps.py @@ -3,4 +3,4 @@ class ApiConfig(AppConfig): default_auto_field = "django.db.models.BigAutoField" - name = "api" + name = "interfaces.api" diff --git a/api/renderer.py b/interfaces/api/renderer.py similarity index 100% rename from api/renderer.py rename to interfaces/api/renderer.py diff --git a/interfaces/api/schemas/__init__.py b/interfaces/api/schemas/__init__.py new file mode 100644 index 00000000..e1fcd988 --- /dev/null +++ b/interfaces/api/schemas/__init__.py @@ -0,0 +1,130 @@ +from .base import (BaseGetResponse, BasePostBody, BasePatchBody, BaseQueryParameters, CollectionQueryParameters, + VocabularyQueryParameters) +from .workspace import ( + WorkspaceSummaryResponse, + WorkspaceDetailResponse, + WorkspaceQueryParameters, + WorkspacePostBody, + WorkspacePatchBody, + WorkspaceTransferBody, + AccountContactDetailResponse +) +from .collaborator import ( + CollaboratorDetailResponse, + CollaboratorQueryParameters, + CollaboratorPostBody, + CollaboratorDeleteBody, +) +from .api_key import ( + APIKeySummaryResponse, + APIKeyDetailResponse, + APIKeyQueryParameters, + APIKeyPostBody, + APIKeyPatchBody, + APIKeySummaryPostResponse, + APIKeyDetailPostResponse, +) +from .role import RoleDetailResponse, RoleSummaryResponse, RoleQueryParameters + +from .thing import ( + ThingSummaryResponse, + ThingDetailResponse, + ThingPostBody, + ThingPatchBody, + ThingQueryParameters, + LocationPostBody, + LocationPatchBody, + TagGetResponse, + FileAttachmentGetResponse, +) +from .observed_property import ( + ObservedPropertySummaryResponse, + ObservedPropertyDetailResponse, + ObservedPropertyQueryParameters, + ObservedPropertyPostBody, + ObservedPropertyPatchBody, +) +from .processing_level import ( + ProcessingLevelSummaryResponse, + ProcessingLevelDetailResponse, + ProcessingLevelQueryParameters, + ProcessingLevelPostBody, + ProcessingLevelPatchBody, +) +from .result_qualifier import ( + ResultQualifierSummaryResponse, + ResultQualifierDetailResponse, + ResultQualifierQueryParameters, + ResultQualifierPostBody, + ResultQualifierPatchBody, +) +from .sensor import ( + SensorSummaryResponse, + SensorDetailResponse, + SensorQueryParameters, + SensorPostBody, + SensorPatchBody, +) +from .unit import ( + UnitSummaryResponse, + UnitDetailResponse, + UnitQueryParameters, + UnitPostBody, + UnitPatchBody, +) +from .datastream import ( + DatastreamSummaryResponse, + DatastreamDetailResponse, + DatastreamQueryParameters, + DatastreamPostBody, + DatastreamPatchBody, +) +from .observation import ( + ObservationSummaryResponse, + ObservationDetailResponse, + ObservationQueryParameters, + ObservationRowResponse, + ObservationColumnarResponse, + ObservationPostBody, + ObservationBulkPostQueryParameters, + ObservationBulkPostBody, + ObservationBulkDeleteBody, +) +from .attachment import ( + TagGetResponse, + TagPostBody, + TagDeleteBody, + FileAttachmentDeleteBody, + FileAttachmentGetResponse, +) + +from .data_connection import (DataConnectionSummaryResponse, DataConnectionDetailResponse, DataConnectionPostBody, + DataConnectionPatchBody, DataConnectionFields, DataConnectionOrderByFields, + DataConnectionQueryParameters) +from .orchestration_system import (OrchestrationSystemSummaryResponse, OrchestrationSystemDetailResponse, + OrchestrationSystemPostBody, OrchestrationSystemPatchBody, + OrchestrationSystemFields, OrchestrationSystemOrderByFields, + OrchestrationSystemQueryParameters) +from .task import (TaskSummaryResponse, TaskDetailResponse, TaskPostBody, TaskPatchBody, TaskRunResponse, TaskFields, + TaskQueryParameters, TaskOrderByFields, TaskScheduleFields, TaskSchedulePostBody, + TaskMappingPostBody, TaskMappingPathPostBody) +from .run import (TaskRunFields, TaskRunResponse, TaskRunPostBody, TaskRunPatchBody, TaskRunQueryParameters, + TaskRunOrderByFields) + + +WorkspaceDetailResponse.model_rebuild() +RoleDetailResponse.model_rebuild() + +APIKeyDetailResponse.model_rebuild() +APIKeyDetailPostResponse.model_rebuild() + +CollaboratorDetailResponse.model_rebuild() + +ThingDetailResponse.model_rebuild() +ObservedPropertyDetailResponse.model_rebuild() +ProcessingLevelDetailResponse.model_rebuild() +ResultQualifierDetailResponse.model_rebuild() +SensorDetailResponse.model_rebuild() +UnitDetailResponse.model_rebuild() +DatastreamDetailResponse.model_rebuild() +ObservationDetailResponse.model_rebuild() diff --git a/iam/schemas/api_key.py b/interfaces/api/schemas/api_key.py similarity index 90% rename from iam/schemas/api_key.py rename to interfaces/api/schemas/api_key.py index 2a389b56..a218a988 100644 --- a/iam/schemas/api_key.py +++ b/interfaces/api/schemas/api_key.py @@ -1,8 +1,8 @@ import uuid from typing import Optional, Literal, TYPE_CHECKING from ninja import Schema, Field, Query -from api.types import ISODatetime -from api.schemas import ( +from interfaces.api.types import ISODatetime +from interfaces.api.schemas import ( BaseGetResponse, BasePostBody, BasePatchBody, @@ -10,7 +10,7 @@ ) if TYPE_CHECKING: - from iam.schemas import WorkspaceSummaryResponse, RoleSummaryResponse + from interfaces.api.schemas import WorkspaceSummaryResponse, RoleSummaryResponse class APIKeyFields(Schema): diff --git a/sta/schemas/attachment.py b/interfaces/api/schemas/attachment.py similarity index 86% rename from sta/schemas/attachment.py rename to interfaces/api/schemas/attachment.py index 7940fdb6..43625323 100644 --- a/sta/schemas/attachment.py +++ b/interfaces/api/schemas/attachment.py @@ -1,5 +1,5 @@ from typing import Optional -from api.schemas import BaseGetResponse, BasePostBody +from interfaces.api.schemas import BaseGetResponse, BasePostBody class TagGetResponse(BaseGetResponse): diff --git a/api/schemas.py b/interfaces/api/schemas/base.py similarity index 100% rename from api/schemas.py rename to interfaces/api/schemas/base.py diff --git a/iam/schemas/collaborator.py b/interfaces/api/schemas/collaborator.py similarity index 75% rename from iam/schemas/collaborator.py rename to interfaces/api/schemas/collaborator.py index 9cfc66a6..f3d1cf45 100644 --- a/iam/schemas/collaborator.py +++ b/interfaces/api/schemas/collaborator.py @@ -2,10 +2,10 @@ from typing import TYPE_CHECKING from ninja import Query from pydantic import EmailStr -from api.schemas import BaseGetResponse, BasePostBody, CollectionQueryParameters +from interfaces.api.schemas import BaseGetResponse, BasePostBody, CollectionQueryParameters if TYPE_CHECKING: - from iam.schemas import AccountContactDetailResponse, RoleSummaryResponse + from interfaces.api.schemas import RoleSummaryResponse, AccountContactDetailResponse class CollaboratorQueryParameters(CollectionQueryParameters): diff --git a/etl/schemas/data_connection.py b/interfaces/api/schemas/data_connection.py similarity index 94% rename from etl/schemas/data_connection.py rename to interfaces/api/schemas/data_connection.py index b478aaad..c38c47be 100644 --- a/etl/schemas/data_connection.py +++ b/interfaces/api/schemas/data_connection.py @@ -1,8 +1,8 @@ import uuid from typing import Any, Literal, Optional from ninja import Schema, Field, Query -from api.schemas import BaseGetResponse, BasePostBody, BasePatchBody, CollectionQueryParameters -from iam.schemas import WorkspaceSummaryResponse +from interfaces.api.schemas import BaseGetResponse, BasePostBody, BasePatchBody, CollectionQueryParameters +from interfaces.api.schemas import WorkspaceSummaryResponse _order_by_fields = ( diff --git a/sta/schemas/datastream.py b/interfaces/api/schemas/datastream.py similarity index 97% rename from sta/schemas/datastream.py rename to interfaces/api/schemas/datastream.py index 5b2b17ca..229a0512 100644 --- a/sta/schemas/datastream.py +++ b/interfaces/api/schemas/datastream.py @@ -2,8 +2,8 @@ from pydantic import AliasPath, AliasChoices from ninja import Schema, Field, Query from typing import Optional, Literal, TYPE_CHECKING -from api.types import ISODatetime -from api.schemas import ( +from interfaces.api.types import ISODatetime +from interfaces.api.schemas import ( BaseGetResponse, BasePostBody, BasePatchBody, @@ -12,8 +12,8 @@ from .attachment import TagGetResponse, FileAttachmentGetResponse if TYPE_CHECKING: - from iam.schemas import WorkspaceSummaryResponse - from sta.schemas import ( + from interfaces.api.schemas import WorkspaceSummaryResponse + from interfaces.api.schemas import ( ThingSummaryResponse, ObservedPropertySummaryResponse, UnitSummaryResponse, diff --git a/sta/schemas/observation.py b/interfaces/api/schemas/observation.py similarity index 93% rename from sta/schemas/observation.py rename to interfaces/api/schemas/observation.py index 6318a64e..38b58be7 100644 --- a/sta/schemas/observation.py +++ b/interfaces/api/schemas/observation.py @@ -2,17 +2,17 @@ from pydantic import AliasPath, AliasChoices, model_validator from ninja import Schema, Query, Field from typing import Optional, Literal, TYPE_CHECKING -from api.types import ISODatetime -from api.types.iso_datetime import validate_iso_datetime -from api.schemas import ( +from interfaces.api.types import ISODatetime +from interfaces.api.types.iso_datetime import validate_iso_datetime +from interfaces.api.schemas import ( BaseGetResponse, BasePostBody, CollectionQueryParameters, ) if TYPE_CHECKING: - from iam.schemas import WorkspaceSummaryResponse - from sta.schemas import DatastreamSummaryResponse + from interfaces.api.schemas import WorkspaceSummaryResponse + from interfaces.api.schemas import DatastreamSummaryResponse class ObservationFields(Schema): diff --git a/sta/schemas/observed_property.py b/interfaces/api/schemas/observed_property.py similarity index 95% rename from sta/schemas/observed_property.py rename to interfaces/api/schemas/observed_property.py index 64362394..1a288248 100644 --- a/sta/schemas/observed_property.py +++ b/interfaces/api/schemas/observed_property.py @@ -1,7 +1,7 @@ import uuid from typing import Optional, Literal, TYPE_CHECKING from ninja import Schema, Field, Query -from api.schemas import ( +from interfaces.api.schemas import ( BaseGetResponse, BasePostBody, BasePatchBody, @@ -9,7 +9,7 @@ ) if TYPE_CHECKING: - from iam.schemas import WorkspaceSummaryResponse + from interfaces.api.schemas import WorkspaceSummaryResponse class ObservedPropertyFields(Schema): diff --git a/etl/schemas/orchestration_system.py b/interfaces/api/schemas/orchestration_system.py similarity index 94% rename from etl/schemas/orchestration_system.py rename to interfaces/api/schemas/orchestration_system.py index 7b1a3d95..b9129699 100644 --- a/etl/schemas/orchestration_system.py +++ b/interfaces/api/schemas/orchestration_system.py @@ -1,13 +1,13 @@ import uuid from ninja import Schema, Field, Query from typing import Optional, Literal -from api.schemas import ( +from interfaces.api.schemas import ( BaseGetResponse, BasePostBody, BasePatchBody, CollectionQueryParameters, ) -from iam.schemas import WorkspaceSummaryResponse +from interfaces.api.schemas import WorkspaceSummaryResponse class OrchestrationSystemFields(Schema): diff --git a/sta/schemas/processing_level.py b/interfaces/api/schemas/processing_level.py similarity index 94% rename from sta/schemas/processing_level.py rename to interfaces/api/schemas/processing_level.py index 07b75d24..e26846b0 100644 --- a/sta/schemas/processing_level.py +++ b/interfaces/api/schemas/processing_level.py @@ -1,7 +1,7 @@ import uuid from typing import Optional, Literal, TYPE_CHECKING from ninja import Schema, Field, Query -from api.schemas import ( +from interfaces.api.schemas import ( BaseGetResponse, BasePostBody, BasePatchBody, @@ -9,7 +9,7 @@ ) if TYPE_CHECKING: - from iam.schemas import WorkspaceSummaryResponse + from interfaces.api.schemas import WorkspaceSummaryResponse class ProcessingLevelFields(Schema): diff --git a/sta/schemas/result_qualifier.py b/interfaces/api/schemas/result_qualifier.py similarity index 94% rename from sta/schemas/result_qualifier.py rename to interfaces/api/schemas/result_qualifier.py index 6bf6e0ef..68f3bf2f 100644 --- a/sta/schemas/result_qualifier.py +++ b/interfaces/api/schemas/result_qualifier.py @@ -1,7 +1,7 @@ import uuid from typing import Optional, Literal, TYPE_CHECKING from ninja import Schema, Field, Query -from api.schemas import ( +from interfaces.api.schemas import ( BaseGetResponse, BasePostBody, BasePatchBody, @@ -9,7 +9,7 @@ ) if TYPE_CHECKING: - from iam.schemas import WorkspaceSummaryResponse + from interfaces.api.schemas import WorkspaceSummaryResponse class ResultQualifierFields(Schema): diff --git a/iam/schemas/role.py b/interfaces/api/schemas/role.py similarity index 88% rename from iam/schemas/role.py rename to interfaces/api/schemas/role.py index 2d9d69ed..00386cbc 100644 --- a/iam/schemas/role.py +++ b/interfaces/api/schemas/role.py @@ -1,11 +1,11 @@ import uuid from ninja import Schema, Field, Query from typing import Optional, Literal, TYPE_CHECKING -from api.schemas import BaseGetResponse, CollectionQueryParameters -from iam.models.permission import PERMISSION_CHOICES, RESOURCE_TYPE_CHOICES +from interfaces.api.schemas import BaseGetResponse, CollectionQueryParameters +from domains.iam.models.permission import PERMISSION_CHOICES, RESOURCE_TYPE_CHOICES if TYPE_CHECKING: - from iam.schemas import WorkspaceDetailResponse + from interfaces.api.schemas import WorkspaceDetailResponse RESOURCE_TYPES = Literal[*[choice[0] for choice in RESOURCE_TYPE_CHOICES]] PERMISSIONS = Literal[*[choice[0] for choice in PERMISSION_CHOICES]] diff --git a/etl/schemas/run.py b/interfaces/api/schemas/run.py similarity index 91% rename from etl/schemas/run.py rename to interfaces/api/schemas/run.py index 5e3adb7e..59a6ab61 100644 --- a/etl/schemas/run.py +++ b/interfaces/api/schemas/run.py @@ -2,8 +2,8 @@ from typing import Literal from datetime import datetime from ninja import Schema, Query -from api.types import ISODatetime -from api.schemas import BaseGetResponse, BasePostBody, BasePatchBody, CollectionQueryParameters +from interfaces.api.types import ISODatetime +from interfaces.api.schemas import BaseGetResponse, BasePostBody, BasePatchBody, CollectionQueryParameters _order_by_fields = ( diff --git a/sta/schemas/sensor.py b/interfaces/api/schemas/sensor.py similarity index 93% rename from sta/schemas/sensor.py rename to interfaces/api/schemas/sensor.py index 2d8525b5..7af8b7cd 100644 --- a/sta/schemas/sensor.py +++ b/interfaces/api/schemas/sensor.py @@ -1,8 +1,8 @@ import uuid from typing import Optional, Literal, TYPE_CHECKING from ninja import Schema, Field, Query -from sta.schemas.sensorthings.sensor import sensorEncodingTypes -from api.schemas import ( +from interfaces.sensorthings.schemas.sensor import sensorEncodingTypes +from interfaces.api.schemas import ( BaseGetResponse, BasePostBody, BasePatchBody, @@ -10,7 +10,7 @@ ) if TYPE_CHECKING: - from iam.schemas import WorkspaceSummaryResponse + from interfaces.api.schemas import WorkspaceSummaryResponse class SensorFields(Schema): diff --git a/etl/schemas/task.py b/interfaces/api/schemas/task.py similarity index 97% rename from etl/schemas/task.py rename to interfaces/api/schemas/task.py index 4f8f1adc..d3946300 100644 --- a/etl/schemas/task.py +++ b/interfaces/api/schemas/task.py @@ -2,9 +2,9 @@ from typing import Any, Literal from datetime import datetime from ninja import Schema, Field, Query -from api.types import ISODatetime -from api.schemas import BaseGetResponse, BasePostBody, BasePatchBody, CollectionQueryParameters -from iam.schemas import WorkspaceSummaryResponse +from interfaces.api.types import ISODatetime +from interfaces.api.schemas import BaseGetResponse, BasePostBody, BasePatchBody, CollectionQueryParameters +from interfaces.api.schemas import WorkspaceSummaryResponse from .data_connection import DataConnectionSummaryResponse from .orchestration_system import OrchestrationSystemSummaryResponse from .run import TaskRunResponse diff --git a/sta/schemas/thing.py b/interfaces/api/schemas/thing.py similarity index 98% rename from sta/schemas/thing.py rename to interfaces/api/schemas/thing.py index 464b2cb4..2b1c4760 100644 --- a/sta/schemas/thing.py +++ b/interfaces/api/schemas/thing.py @@ -3,7 +3,7 @@ from ninja import Schema, Field, Query from pydantic import field_validator, AliasChoices from country_list import countries_for_language -from api.schemas import ( +from interfaces.api.schemas import ( BaseGetResponse, BasePostBody, BasePatchBody, @@ -12,7 +12,7 @@ from .attachment import TagGetResponse, FileAttachmentGetResponse if TYPE_CHECKING: - from iam.schemas import WorkspaceSummaryResponse + from interfaces.api.schemas import WorkspaceSummaryResponse valid_country_codes = [code for code, _ in countries_for_language("en")] diff --git a/sta/schemas/unit.py b/interfaces/api/schemas/unit.py similarity index 94% rename from sta/schemas/unit.py rename to interfaces/api/schemas/unit.py index 837489f4..6cbe8f88 100644 --- a/sta/schemas/unit.py +++ b/interfaces/api/schemas/unit.py @@ -1,7 +1,7 @@ import uuid from ninja import Schema, Field, Query from typing import Optional, Literal, TYPE_CHECKING -from api.schemas import ( +from interfaces.api.schemas import ( BaseGetResponse, BasePostBody, BasePatchBody, @@ -9,7 +9,7 @@ ) if TYPE_CHECKING: - from iam.schemas import WorkspaceSummaryResponse + from interfaces.api.schemas import WorkspaceSummaryResponse class UnitFields(Schema): diff --git a/iam/schemas/workspace.py b/interfaces/api/schemas/workspace.py similarity index 70% rename from iam/schemas/workspace.py rename to interfaces/api/schemas/workspace.py index b56fea1b..04c3c15c 100644 --- a/iam/schemas/workspace.py +++ b/interfaces/api/schemas/workspace.py @@ -3,7 +3,7 @@ from ninja import Schema, Field, Query from pydantic import EmailStr from django.contrib.auth import get_user_model -from api.schemas import ( +from interfaces.api.schemas import ( BaseGetResponse, BasePostBody, BasePatchBody, @@ -11,7 +11,7 @@ ) if TYPE_CHECKING: - from iam.schemas import AccountContactDetailResponse, RoleDetailResponse + from interfaces.api.schemas import RoleDetailResponse User = get_user_model() @@ -46,15 +46,28 @@ class WorkspaceQueryParameters(CollectionQueryParameters): ) +class UserContactFields(Schema): + phone: Optional[str] = Field(None, max_length=15) + address: Optional[str] = Field(None, max_length=255) + link: Optional[str] = Field(None, max_length=2000) + user_type: str = Field(..., max_length=255, alias="type") + + +class AccountContactDetailResponse(BaseGetResponse, UserContactFields): + name: str = Field(..., max_length=255) + email: EmailStr + organization_name: Optional[str] = None + + class WorkspaceSummaryResponse(BaseGetResponse, WorkspaceFields): id: uuid.UUID class WorkspaceDetailResponse(BaseGetResponse, WorkspaceFields): id: uuid.UUID - owner: "AccountContactDetailResponse" + owner: AccountContactDetailResponse collaborator_role: Optional["RoleDetailResponse"] = None - pending_transfer_to: Optional["AccountContactDetailResponse"] = None + pending_transfer_to: Optional[AccountContactDetailResponse] = None class WorkspacePostBody(BasePostBody, WorkspaceFields): diff --git a/api/service.py b/interfaces/api/service.py similarity index 99% rename from api/service.py rename to interfaces/api/service.py index b61dac19..31f95eb4 100644 --- a/api/service.py +++ b/interfaces/api/service.py @@ -5,7 +5,7 @@ from django.http import HttpResponse from django.contrib.auth import get_user_model from django.db.models import QuerySet, Model, Q -from iam.models import Workspace, APIKey +from domains.iam.models import Workspace, APIKey User = get_user_model() diff --git a/api/types/__init__.py b/interfaces/api/types/__init__.py similarity index 100% rename from api/types/__init__.py rename to interfaces/api/types/__init__.py diff --git a/api/types/iso_datetime.py b/interfaces/api/types/iso_datetime.py similarity index 100% rename from api/types/iso_datetime.py rename to interfaces/api/types/iso_datetime.py diff --git a/api/urls.py b/interfaces/api/urls.py similarity index 86% rename from api/urls.py rename to interfaces/api/urls.py index 98d1e5c7..151c9b92 100644 --- a/api/urls.py +++ b/interfaces/api/urls.py @@ -5,11 +5,11 @@ from sensorthings import SensorThingsAPI from sensorthings.extensions.dataarray import data_array_extension from hydroserver import __version__ -from api.renderer import ORJSONRenderer -from sta.api import hydroserver_extension -from sta.services.sensorthings import HydroServerSensorThingsEngine -from iam.views import workspace_router, role_router -from sta.views import ( +from interfaces.api.renderer import ORJSONRenderer +from interfaces.sensorthings.api import hydroserver_extension +from interfaces.sensorthings.engine import HydroServerSensorThingsEngine +from interfaces.api.views import workspace_router, role_router +from interfaces.api.views import ( thing_router, observed_property_router, processing_level_router, @@ -18,7 +18,7 @@ unit_router, datastream_router, ) -from etl.views import ( +from interfaces.api.views import ( data_connection_router, orchestration_system_router, task_router, diff --git a/sta/views/__init__.py b/interfaces/api/views/__init__.py similarity index 51% rename from sta/views/__init__.py rename to interfaces/api/views/__init__.py index 451a90ad..aa28835c 100644 --- a/sta/views/__init__.py +++ b/interfaces/api/views/__init__.py @@ -1,3 +1,7 @@ +from .workspace import workspace_router +from .role import role_router +from .collaborator import collaborator_router +from .api_key import api_key_router from .thing import thing_router from .observed_property import observed_property_router from .processing_level import processing_level_router @@ -6,3 +10,7 @@ from .unit import unit_router from .datastream import datastream_router from .observation import observation_router +from .data_connection import data_connection_router +from .orchestration_system import orchestration_system_router +from .task import task_router +from .run import task_run_router diff --git a/iam/views/api_key.py b/interfaces/api/views/api_key.py similarity index 95% rename from iam/views/api_key.py rename to interfaces/api/views/api_key.py index dbad52f5..ed634a58 100644 --- a/iam/views/api_key.py +++ b/interfaces/api/views/api_key.py @@ -3,9 +3,9 @@ from ninja import Router, Path, Query from django.http import HttpResponse from django.db import transaction -from hydroserver.http import HydroServerHttpRequest -from hydroserver.security import bearer_auth, session_auth, apikey_auth -from iam.schemas import ( +from interfaces.http.request import HydroServerHttpRequest +from interfaces.http.auth import bearer_auth, session_auth, apikey_auth +from interfaces.api.schemas import ( APIKeySummaryResponse, APIKeyDetailResponse, APIKeyQueryParameters, @@ -14,7 +14,7 @@ APIKeySummaryPostResponse, APIKeyDetailPostResponse, ) -from iam.services import APIKeyService +from domains.iam.services import APIKeyService api_key_router = Router(tags=["API Keys"]) api_key_service = APIKeyService() diff --git a/iam/views/collaborator.py b/interfaces/api/views/collaborator.py similarity index 92% rename from iam/views/collaborator.py rename to interfaces/api/views/collaborator.py index 8dd1fcbc..02cde948 100644 --- a/iam/views/collaborator.py +++ b/interfaces/api/views/collaborator.py @@ -2,15 +2,15 @@ from ninja import Router, Path, Query from django.http import HttpResponse from django.db import transaction -from hydroserver.security import bearer_auth, session_auth, apikey_auth, anonymous_auth -from hydroserver.http import HydroServerHttpRequest -from iam.schemas import ( +from interfaces.http.auth import bearer_auth, session_auth, apikey_auth, anonymous_auth +from interfaces.http.request import HydroServerHttpRequest +from interfaces.api.schemas import ( CollaboratorDetailResponse, CollaboratorQueryParameters, CollaboratorPostBody, CollaboratorDeleteBody, ) -from iam.services import CollaboratorService +from domains.iam.services import CollaboratorService collaborator_router = Router(tags=["Collaborators"]) collaborator_service = CollaboratorService() diff --git a/etl/views/data_connection.py b/interfaces/api/views/data_connection.py similarity index 89% rename from etl/views/data_connection.py rename to interfaces/api/views/data_connection.py index 68c501df..df0dc03e 100644 --- a/etl/views/data_connection.py +++ b/interfaces/api/views/data_connection.py @@ -2,11 +2,11 @@ from ninja import Router, Path, Query from django.http import HttpResponse from django.db import transaction -from hydroserver.http import HydroServerHttpRequest -from hydroserver.security import bearer_auth, session_auth, apikey_auth -from etl.services import DataConnectionService -from etl.schemas import (DataConnectionSummaryResponse, DataConnectionDetailResponse, DataConnectionPostBody, - DataConnectionPatchBody, DataConnectionQueryParameters) +from interfaces.http.request import HydroServerHttpRequest +from interfaces.http.auth import bearer_auth, session_auth, apikey_auth +from domains.etl.services import DataConnectionService +from interfaces.api.schemas import (DataConnectionSummaryResponse, DataConnectionDetailResponse, DataConnectionPostBody, + DataConnectionPatchBody, DataConnectionQueryParameters) data_connection_router = Router(tags=["ETL Data Connections"]) diff --git a/sta/views/datastream.py b/interfaces/api/views/datastream.py similarity index 96% rename from sta/views/datastream.py rename to interfaces/api/views/datastream.py index 93eb351d..ebe2cf7c 100644 --- a/sta/views/datastream.py +++ b/interfaces/api/views/datastream.py @@ -4,10 +4,10 @@ from ninja.files import UploadedFile from django.http import HttpResponse from django.db import transaction -from hydroserver.security import bearer_auth, session_auth, apikey_auth, anonymous_auth -from hydroserver.http import HydroServerHttpRequest -from api.schemas import VocabularyQueryParameters -from sta.schemas import ( +from interfaces.http.auth import bearer_auth, session_auth, apikey_auth, anonymous_auth +from interfaces.http.request import HydroServerHttpRequest +from interfaces.api.schemas import VocabularyQueryParameters +from interfaces.api.schemas import ( DatastreamSummaryResponse, DatastreamDetailResponse, DatastreamQueryParameters, @@ -19,8 +19,8 @@ FileAttachmentGetResponse, FileAttachmentDeleteBody, ) -from sta.services import DatastreamService -from sta.views.observation import observation_router +from domains.sta.services import DatastreamService +from interfaces.api.views.observation import observation_router datastream_router = Router(tags=["Datastreams"]) datastream_service = DatastreamService() diff --git a/sta/views/observation.py b/interfaces/api/views/observation.py similarity index 95% rename from sta/views/observation.py rename to interfaces/api/views/observation.py index 9fd33cd0..d8e17c88 100644 --- a/sta/views/observation.py +++ b/interfaces/api/views/observation.py @@ -3,9 +3,9 @@ from ninja import Router, Path, Query from django.http import HttpResponse from django.db import transaction -from hydroserver.security import bearer_auth, session_auth, apikey_auth, anonymous_auth -from hydroserver.http import HydroServerHttpRequest -from sta.schemas import ( +from interfaces.http.auth import bearer_auth, session_auth, apikey_auth, anonymous_auth +from interfaces.http.request import HydroServerHttpRequest +from interfaces.api.schemas import ( ObservationSummaryResponse, ObservationDetailResponse, ObservationRowResponse, @@ -16,7 +16,7 @@ ObservationBulkPostQueryParameters, ObservationBulkDeleteBody, ) -from sta.services import ObservationService +from domains.sta.services import ObservationService observation_router = Router(tags=["Observations"]) observation_service = ObservationService() diff --git a/sta/views/observed_property.py b/interfaces/api/views/observed_property.py similarity index 94% rename from sta/views/observed_property.py rename to interfaces/api/views/observed_property.py index edb52bd5..6f15d0e4 100644 --- a/sta/views/observed_property.py +++ b/interfaces/api/views/observed_property.py @@ -3,17 +3,17 @@ from ninja import Router, Path, Query from django.http import HttpResponse from django.db import transaction -from hydroserver.security import bearer_auth, session_auth, apikey_auth, anonymous_auth -from hydroserver.http import HydroServerHttpRequest -from api.schemas import VocabularyQueryParameters -from sta.schemas import ( +from interfaces.http.auth import bearer_auth, session_auth, apikey_auth, anonymous_auth +from interfaces.http.request import HydroServerHttpRequest +from interfaces.api.schemas import VocabularyQueryParameters +from interfaces.api.schemas import ( ObservedPropertySummaryResponse, ObservedPropertyDetailResponse, ObservedPropertyQueryParameters, ObservedPropertyPostBody, ObservedPropertyPatchBody, ) -from sta.services import ObservedPropertyService +from domains.sta.services import ObservedPropertyService observed_property_router = Router(tags=["Observed Properties"]) observed_property_service = ObservedPropertyService() diff --git a/etl/views/orchestration_system.py b/interfaces/api/views/orchestration_system.py similarity index 89% rename from etl/views/orchestration_system.py rename to interfaces/api/views/orchestration_system.py index 840a608b..aec584d6 100644 --- a/etl/views/orchestration_system.py +++ b/interfaces/api/views/orchestration_system.py @@ -3,11 +3,12 @@ from ninja import Router, Path, Query from django.http import HttpResponse from django.db import transaction -from hydroserver.http import HydroServerHttpRequest -from hydroserver.security import bearer_auth, session_auth, apikey_auth, anonymous_auth -from etl.services import OrchestrationSystemService -from etl.schemas import (OrchestrationSystemSummaryResponse, OrchestrationSystemDetailResponse, - OrchestrationSystemPostBody, OrchestrationSystemPatchBody, OrchestrationSystemQueryParameters) +from interfaces.http.request import HydroServerHttpRequest +from interfaces.http.auth import bearer_auth, session_auth, apikey_auth, anonymous_auth +from domains.etl.services import OrchestrationSystemService +from interfaces.api.schemas import (OrchestrationSystemSummaryResponse, OrchestrationSystemDetailResponse, + OrchestrationSystemPostBody, OrchestrationSystemPatchBody, + OrchestrationSystemQueryParameters) orchestration_system_router = Router(tags=["ETL Orchestration Systems"]) diff --git a/sta/views/processing_level.py b/interfaces/api/views/processing_level.py similarity index 94% rename from sta/views/processing_level.py rename to interfaces/api/views/processing_level.py index 2d384c0a..8360f423 100644 --- a/sta/views/processing_level.py +++ b/interfaces/api/views/processing_level.py @@ -3,16 +3,16 @@ from ninja import Router, Path, Query from django.http import HttpResponse from django.db import transaction -from hydroserver.security import bearer_auth, session_auth, apikey_auth, anonymous_auth -from hydroserver.http import HydroServerHttpRequest -from sta.schemas import ( +from interfaces.http.auth import bearer_auth, session_auth, apikey_auth, anonymous_auth +from interfaces.http.request import HydroServerHttpRequest +from interfaces.api.schemas import ( ProcessingLevelSummaryResponse, ProcessingLevelDetailResponse, ProcessingLevelQueryParameters, ProcessingLevelPostBody, ProcessingLevelPatchBody, ) -from sta.services import ProcessingLevelService +from domains.sta.services import ProcessingLevelService processing_level_router = Router(tags=["Processing Levels"]) processing_level_service = ProcessingLevelService() diff --git a/sta/views/result_qualifier.py b/interfaces/api/views/result_qualifier.py similarity index 94% rename from sta/views/result_qualifier.py rename to interfaces/api/views/result_qualifier.py index 50df92ad..60205305 100644 --- a/sta/views/result_qualifier.py +++ b/interfaces/api/views/result_qualifier.py @@ -3,16 +3,16 @@ from ninja import Router, Path, Query from django.http import HttpResponse from django.db import transaction -from hydroserver.security import bearer_auth, session_auth, apikey_auth, anonymous_auth -from hydroserver.http import HydroServerHttpRequest -from sta.schemas import ( +from interfaces.http.auth import bearer_auth, session_auth, apikey_auth, anonymous_auth +from interfaces.http.request import HydroServerHttpRequest +from interfaces.api.schemas import ( ResultQualifierSummaryResponse, ResultQualifierDetailResponse, ResultQualifierQueryParameters, ResultQualifierPostBody, ResultQualifierPatchBody, ) -from sta.services import ResultQualifierService +from domains.sta.services import ResultQualifierService result_qualifier_router = Router(tags=["Result Qualifiers"]) result_qualifier_service = ResultQualifierService() diff --git a/iam/views/role.py b/interfaces/api/views/role.py similarity index 88% rename from iam/views/role.py rename to interfaces/api/views/role.py index 8dfd5e5a..09cba459 100644 --- a/iam/views/role.py +++ b/interfaces/api/views/role.py @@ -2,14 +2,14 @@ from typing import Optional from ninja import Router, Path, Query from django.http import HttpResponse -from hydroserver.security import bearer_auth, session_auth, apikey_auth, anonymous_auth -from hydroserver.http import HydroServerHttpRequest -from iam.schemas import ( +from interfaces.http.auth import bearer_auth, session_auth, apikey_auth, anonymous_auth +from interfaces.http.request import HydroServerHttpRequest +from interfaces.api.schemas import ( RoleSummaryResponse, RoleDetailResponse, RoleQueryParameters, ) -from iam.services import RoleService +from domains.iam.services import RoleService role_router = Router(tags=["Roles"]) role_service = RoleService() diff --git a/etl/views/run.py b/interfaces/api/views/run.py similarity index 91% rename from etl/views/run.py rename to interfaces/api/views/run.py index fbe8b216..b1e2642c 100644 --- a/etl/views/run.py +++ b/interfaces/api/views/run.py @@ -2,10 +2,10 @@ from ninja import Router, Path, Query from django.http import HttpResponse from django.db import transaction -from hydroserver.http import HydroServerHttpRequest -from hydroserver.security import bearer_auth, session_auth, apikey_auth -from etl.services import TaskRunService -from etl.schemas import TaskRunResponse, TaskRunPostBody, TaskRunPatchBody, TaskRunQueryParameters +from interfaces.http.request import HydroServerHttpRequest +from interfaces.http.auth import bearer_auth, session_auth, apikey_auth +from domains.etl.services import TaskRunService +from interfaces.api.schemas import TaskRunResponse, TaskRunPostBody, TaskRunPatchBody, TaskRunQueryParameters task_run_router = Router(tags=["ETL Task Runs"]) diff --git a/sta/views/sensor.py b/interfaces/api/views/sensor.py similarity index 94% rename from sta/views/sensor.py rename to interfaces/api/views/sensor.py index 08be64db..891ff9d1 100644 --- a/sta/views/sensor.py +++ b/interfaces/api/views/sensor.py @@ -3,17 +3,17 @@ from ninja import Router, Path, Query from django.http import HttpResponse from django.db import transaction -from hydroserver.security import bearer_auth, session_auth, apikey_auth, anonymous_auth -from hydroserver.http import HydroServerHttpRequest -from api.schemas import VocabularyQueryParameters -from sta.schemas import ( +from interfaces.http.auth import bearer_auth, session_auth, apikey_auth, anonymous_auth +from interfaces.http.request import HydroServerHttpRequest +from interfaces.api.schemas import VocabularyQueryParameters +from interfaces.api.schemas import ( SensorSummaryResponse, SensorDetailResponse, SensorQueryParameters, SensorPostBody, SensorPatchBody, ) -from sta.services import SensorService +from domains.sta.services import SensorService sensor_router = Router(tags=["Sensors"]) sensor_service = SensorService() diff --git a/etl/views/task.py b/interfaces/api/views/task.py similarity index 90% rename from etl/views/task.py rename to interfaces/api/views/task.py index 6b32e162..238db74e 100644 --- a/etl/views/task.py +++ b/interfaces/api/views/task.py @@ -2,11 +2,11 @@ from ninja import Router, Path, Query from django.http import HttpResponse from django.db import transaction -from hydroserver.http import HydroServerHttpRequest -from hydroserver.security import bearer_auth, session_auth, apikey_auth -from etl.services import TaskService -from etl.schemas import (TaskSummaryResponse, TaskDetailResponse, TaskPostBody, TaskPatchBody, TaskQueryParameters, - TaskRunResponse) +from interfaces.http.request import HydroServerHttpRequest +from interfaces.http.auth import bearer_auth, session_auth, apikey_auth +from domains.etl.services import TaskService +from interfaces.api.schemas import (TaskSummaryResponse, TaskDetailResponse, TaskPostBody, TaskPatchBody, TaskQueryParameters, + TaskRunResponse) task_router = Router(tags=["ETL Tasks"]) diff --git a/sta/views/thing.py b/interfaces/api/views/thing.py similarity index 97% rename from sta/views/thing.py rename to interfaces/api/views/thing.py index 7cd32786..0e75ed7e 100644 --- a/sta/views/thing.py +++ b/interfaces/api/views/thing.py @@ -4,10 +4,10 @@ from ninja.files import UploadedFile from django.db import transaction from django.http import HttpResponse -from hydroserver.security import bearer_auth, session_auth, apikey_auth, anonymous_auth -from hydroserver.http import HydroServerHttpRequest -from api.schemas import VocabularyQueryParameters -from sta.schemas import ( +from interfaces.http.auth import bearer_auth, session_auth, apikey_auth, anonymous_auth +from interfaces.http.request import HydroServerHttpRequest +from interfaces.api.schemas import VocabularyQueryParameters +from interfaces.api.schemas import ( ThingSummaryResponse, ThingDetailResponse, ThingPostBody, @@ -19,7 +19,7 @@ FileAttachmentGetResponse, FileAttachmentDeleteBody, ) -from sta.services import ThingService +from domains.sta.services import ThingService thing_router = Router(tags=["Things"]) thing_service = ThingService() diff --git a/sta/views/unit.py b/interfaces/api/views/unit.py similarity index 93% rename from sta/views/unit.py rename to interfaces/api/views/unit.py index 064cff16..702ce72c 100644 --- a/sta/views/unit.py +++ b/interfaces/api/views/unit.py @@ -3,17 +3,17 @@ from ninja import Router, Path, Query from django.db import transaction from django.http import HttpResponse -from hydroserver.security import bearer_auth, session_auth, apikey_auth, anonymous_auth -from hydroserver.http import HydroServerHttpRequest -from api.schemas import VocabularyQueryParameters -from sta.schemas import ( +from interfaces.http.auth import bearer_auth, session_auth, apikey_auth, anonymous_auth +from interfaces.http.request import HydroServerHttpRequest +from interfaces.api.schemas import VocabularyQueryParameters +from interfaces.api.schemas import ( UnitSummaryResponse, UnitDetailResponse, UnitPostBody, UnitPatchBody, UnitQueryParameters, ) -from sta.services import UnitService +from domains.sta.services import UnitService unit_router = Router(tags=["Units"]) unit_service = UnitService() diff --git a/iam/views/workspace.py b/interfaces/api/views/workspace.py similarity index 94% rename from iam/views/workspace.py rename to interfaces/api/views/workspace.py index edbda72e..e0b1eb7c 100644 --- a/iam/views/workspace.py +++ b/interfaces/api/views/workspace.py @@ -3,9 +3,9 @@ from ninja import Router, Path, Query from django.db import transaction from django.http import HttpResponse -from hydroserver.http import HydroServerHttpRequest -from hydroserver.security import bearer_auth, session_auth, apikey_auth, anonymous_auth -from iam.schemas import ( +from interfaces.http.request import HydroServerHttpRequest +from interfaces.http.auth import bearer_auth, session_auth, apikey_auth, anonymous_auth +from interfaces.api.schemas import ( WorkspaceSummaryResponse, WorkspaceDetailResponse, WorkspacePostBody, @@ -13,9 +13,9 @@ WorkspaceTransferBody, WorkspaceQueryParameters, ) -from iam.services import WorkspaceService -from iam.views.api_key import api_key_router -from iam.views.collaborator import collaborator_router +from domains.iam.services import WorkspaceService +from interfaces.api.views.api_key import api_key_router +from interfaces.api.views.collaborator import collaborator_router workspace_router = Router(tags=["Workspaces"]) workspace_service = WorkspaceService() diff --git a/sta/management/commands/__init__.py b/interfaces/auth/__init__.py similarity index 100% rename from sta/management/commands/__init__.py rename to interfaces/auth/__init__.py diff --git a/interfaces/auth/schemas/__init__.py b/interfaces/auth/schemas/__init__.py new file mode 100644 index 00000000..fa3f3f0f --- /dev/null +++ b/interfaces/auth/schemas/__init__.py @@ -0,0 +1,9 @@ +from .account import (AccountPostBody, AccountPatchBody, AccountDetailResponse, OrganizationPostBody, + OrganizationPatchBody) +from .session import SessionPostBody +from .email import VerificationEmailPutBody, VerifyEmailPostBody +from .password import RequestResetPasswordPostBody, ResetPasswordPostBody +from .provider import ProviderRedirectPostForm, ProviderSignupPostBody + + +ProviderSignupPostBody.model_rebuild() diff --git a/iam/schemas/account.py b/interfaces/auth/schemas/account.py similarity index 83% rename from iam/schemas/account.py rename to interfaces/auth/schemas/account.py index 2f004727..900c8bae 100644 --- a/iam/schemas/account.py +++ b/interfaces/auth/schemas/account.py @@ -2,7 +2,7 @@ from pydantic import EmailStr from typing import Optional, Literal from django.contrib.auth import get_user_model -from api.schemas import BaseGetResponse, BasePostBody, BasePatchBody +from interfaces.api.schemas import BaseGetResponse, BasePostBody, BasePatchBody User = get_user_model() @@ -27,26 +27,17 @@ class OrganizationPatchBody(BasePatchBody, OrganizationFields): pass -class UserContactFields(Schema): +class UserFields(Schema): + first_name: str = Field(..., max_length=30) + middle_name: Optional[str] = Field(None, max_length=30) + last_name: str = Field(..., max_length=150) phone: Optional[str] = Field(None, max_length=15) address: Optional[str] = Field(None, max_length=255) link: Optional[str] = Field(None, max_length=2000) user_type: str = Field(..., max_length=255, alias="type") - - -class UserFields(UserContactFields): - first_name: str = Field(..., max_length=30) - middle_name: Optional[str] = Field(None, max_length=30) - last_name: str = Field(..., max_length=150) organization: Optional[OrganizationDetailResponse] = None -class AccountContactDetailResponse(BaseGetResponse, UserContactFields): - name: str = Field(..., max_length=255) - email: EmailStr - organization_name: Optional[str] = None - - class AccountDetailResponse(BaseGetResponse, UserFields): email: EmailStr account_type: Literal["admin", "standard", "limited"] diff --git a/iam/schemas/email.py b/interfaces/auth/schemas/email.py similarity index 100% rename from iam/schemas/email.py rename to interfaces/auth/schemas/email.py diff --git a/iam/schemas/password.py b/interfaces/auth/schemas/password.py similarity index 100% rename from iam/schemas/password.py rename to interfaces/auth/schemas/password.py diff --git a/iam/schemas/provider.py b/interfaces/auth/schemas/provider.py similarity index 69% rename from iam/schemas/provider.py rename to interfaces/auth/schemas/provider.py index 745bc1bb..2107ac14 100644 --- a/iam/schemas/provider.py +++ b/interfaces/auth/schemas/provider.py @@ -1,11 +1,11 @@ from ninja import Schema from typing import Literal, Optional, TYPE_CHECKING from pydantic import EmailStr -from api.schemas import BasePostBody -from iam.schemas.account import UserFields +from interfaces.api.schemas import BasePostBody +from interfaces.auth.schemas.account import UserFields if TYPE_CHECKING: - from iam.schemas import OrganizationPostBody + from interfaces.api.schemas import OrganizationPostBody class ProviderRedirectPostForm(Schema): diff --git a/iam/schemas/session.py b/interfaces/auth/schemas/session.py similarity index 100% rename from iam/schemas/session.py rename to interfaces/auth/schemas/session.py diff --git a/iam/static/providers/google.png b/interfaces/auth/static/providers/google.png similarity index 100% rename from iam/static/providers/google.png rename to interfaces/auth/static/providers/google.png diff --git a/iam/static/providers/hydroshare.png b/interfaces/auth/static/providers/hydroshare.png similarity index 100% rename from iam/static/providers/hydroshare.png rename to interfaces/auth/static/providers/hydroshare.png diff --git a/iam/static/providers/orcid.png b/interfaces/auth/static/providers/orcid.png similarity index 100% rename from iam/static/providers/orcid.png rename to interfaces/auth/static/providers/orcid.png diff --git a/iam/static/providers/orcidsandbox.png b/interfaces/auth/static/providers/orcidsandbox.png similarity index 100% rename from iam/static/providers/orcidsandbox.png rename to interfaces/auth/static/providers/orcidsandbox.png diff --git a/iam/static/providers/utahid.png b/interfaces/auth/static/providers/utahid.png similarity index 100% rename from iam/static/providers/utahid.png rename to interfaces/auth/static/providers/utahid.png diff --git a/iam/urls.py b/interfaces/auth/urls.py similarity index 91% rename from iam/urls.py rename to interfaces/auth/urls.py index d95a8294..0e17e02e 100644 --- a/iam/urls.py +++ b/interfaces/auth/urls.py @@ -3,8 +3,8 @@ from django.urls import path from django.views.decorators.csrf import ensure_csrf_cookie from hydroserver import __version__ -from api.renderer import ORJSONRenderer -from iam.views import ( +from interfaces.api.renderer import ORJSONRenderer +from interfaces.auth.views import ( account_router, session_router, email_router, diff --git a/iam/views/__init__.py b/interfaces/auth/views/__init__.py similarity index 54% rename from iam/views/__init__.py rename to interfaces/auth/views/__init__.py index 400791a3..0bb54144 100644 --- a/iam/views/__init__.py +++ b/interfaces/auth/views/__init__.py @@ -1,9 +1,5 @@ from .account import account_router -from .session import session_router from .email import email_router from .password import password_router from .provider import provider_router -from .workspace import workspace_router -from .role import role_router -from .collaborator import collaborator_router -from .api_key import api_key_router +from .session import session_router diff --git a/iam/views/account.py b/interfaces/auth/views/account.py similarity index 89% rename from iam/views/account.py rename to interfaces/auth/views/account.py index 309fd233..896bf950 100644 --- a/iam/views/account.py +++ b/interfaces/auth/views/account.py @@ -3,11 +3,11 @@ from django.http import HttpResponse from allauth.headless.account.views import SignupView from allauth.headless.constants import Client -from hydroserver.security import bearer_auth, session_auth -from hydroserver.http import HydroServerHttpRequest -from api.schemas import VocabularyQueryParameters -from iam.schemas import AccountDetailResponse, AccountPostBody, AccountPatchBody -from iam.services import AccountService +from interfaces.http.auth import bearer_auth, session_auth +from interfaces.http.request import HydroServerHttpRequest +from interfaces.api.schemas import VocabularyQueryParameters +from interfaces.auth.schemas import AccountDetailResponse, AccountPostBody, AccountPatchBody +from domains.iam.services import AccountService account_router = Router(tags=["Account"]) account_service = AccountService() diff --git a/iam/views/email.py b/interfaces/auth/views/email.py similarity index 98% rename from iam/views/email.py rename to interfaces/auth/views/email.py index 806662a5..be512ce5 100644 --- a/iam/views/email.py +++ b/interfaces/auth/views/email.py @@ -7,7 +7,7 @@ from allauth.headless.account.views import VerifyEmailView from allauth.account.utils import send_email_confirmation, has_verified_email from allauth.headless.constants import Client -from iam.schemas import ( +from interfaces.auth.schemas import ( VerificationEmailPutBody, VerifyEmailPostBody, AccountDetailResponse, diff --git a/iam/views/password.py b/interfaces/auth/views/password.py similarity index 93% rename from iam/views/password.py rename to interfaces/auth/views/password.py index 52a65f34..1915104d 100644 --- a/iam/views/password.py +++ b/interfaces/auth/views/password.py @@ -2,7 +2,7 @@ from typing import Literal from allauth.headless.account.views import RequestPasswordResetView, ResetPasswordView from allauth.headless.constants import Client -from iam.schemas import RequestResetPasswordPostBody, ResetPasswordPostBody +from interfaces.auth.schemas import RequestResetPasswordPostBody, ResetPasswordPostBody password_router = Router(tags=["Password"]) diff --git a/iam/views/provider.py b/interfaces/auth/views/provider.py similarity index 98% rename from iam/views/provider.py rename to interfaces/auth/views/provider.py index 52e562a9..7be7451b 100644 --- a/iam/views/provider.py +++ b/interfaces/auth/views/provider.py @@ -7,7 +7,7 @@ ManageProvidersView, ) from allauth.headless.constants import Client -from iam.schemas import ( +from interfaces.auth.schemas import ( ProviderRedirectPostForm, ProviderSignupPostBody, AccountDetailResponse, diff --git a/iam/views/session.py b/interfaces/auth/views/session.py similarity index 97% rename from iam/views/session.py rename to interfaces/auth/views/session.py index 8d64d2e6..44bdc671 100644 --- a/iam/views/session.py +++ b/interfaces/auth/views/session.py @@ -4,7 +4,7 @@ from django.contrib.auth import get_user_model from allauth.headless.account.views import LoginView, SessionView from allauth.headless.constants import Client -from iam.schemas import AccountDetailResponse, SessionPostBody +from interfaces.auth.schemas import AccountDetailResponse, SessionPostBody User = get_user_model() diff --git a/sta/migrations/__init__.py b/interfaces/http/__init__.py similarity index 100% rename from sta/migrations/__init__.py rename to interfaces/http/__init__.py diff --git a/hydroserver/security/__init__.py b/interfaces/http/auth/__init__.py similarity index 100% rename from hydroserver/security/__init__.py rename to interfaces/http/auth/__init__.py diff --git a/hydroserver/security/anonymous.py b/interfaces/http/auth/anonymous.py similarity index 100% rename from hydroserver/security/anonymous.py rename to interfaces/http/auth/anonymous.py diff --git a/hydroserver/security/apikey.py b/interfaces/http/auth/apikey.py similarity index 95% rename from hydroserver/security/apikey.py rename to interfaces/http/auth/apikey.py index f2a6ce2c..35f8c845 100644 --- a/hydroserver/security/apikey.py +++ b/interfaces/http/auth/apikey.py @@ -2,7 +2,7 @@ from django.db.models import Q from django.contrib.auth.hashers import check_password from ninja.security import APIKeyHeader -from iam.models import APIKey +from domains.iam.models import APIKey class APIKeyAuth(APIKeyHeader): diff --git a/hydroserver/security/basic.py b/interfaces/http/auth/basic.py similarity index 100% rename from hydroserver/security/basic.py rename to interfaces/http/auth/basic.py diff --git a/hydroserver/security/bearer.py b/interfaces/http/auth/bearer.py similarity index 100% rename from hydroserver/security/bearer.py rename to interfaces/http/auth/bearer.py diff --git a/hydroserver/security/session.py b/interfaces/http/auth/session.py similarity index 100% rename from hydroserver/security/session.py rename to interfaces/http/auth/session.py diff --git a/hydroserver/http.py b/interfaces/http/request.py similarity index 85% rename from hydroserver/http.py rename to interfaces/http/request.py index 3be0791c..827b7001 100644 --- a/hydroserver/http.py +++ b/interfaces/http/request.py @@ -3,7 +3,7 @@ from django.conf import settings if TYPE_CHECKING: - from iam.models import APIKey + from domains.iam.models import APIKey class HydroServerHttpRequest(HttpRequest): diff --git a/web/__init__.py b/interfaces/sensorthings/__init__.py similarity index 100% rename from web/__init__.py rename to interfaces/sensorthings/__init__.py diff --git a/sta/api.py b/interfaces/sensorthings/api.py similarity index 88% rename from sta/api.py rename to interfaces/sensorthings/api.py index 0c534f04..139c8141 100644 --- a/sta/api.py +++ b/interfaces/sensorthings/api.py @@ -1,8 +1,11 @@ from django.db import transaction from sensorthings import SensorThingsExtension from sensorthings.factories import SensorThingsEndpointHookFactory -from sta.schemas import sensorthings as schemas -from hydroserver.security import session_auth, bearer_auth, apikey_auth, anonymous_auth +from interfaces.http.auth import session_auth, bearer_auth, apikey_auth, anonymous_auth +from .schemas import (DatastreamListResponse, DatastreamGetResponse, ThingListResponse, ThingGetResponse, + LocationListResponse, LocationGetResponse, ObservationListResponse, ObservationGetResponse, + ObservationPostBody, ObservationDataArrayPostBody, ObservedPropertyListResponse, + ObservedPropertyGetResponse, SensorListResponse, SensorGetResponse) hydroserver_extension = SensorThingsExtension( @@ -15,7 +18,7 @@ apikey_auth, anonymous_auth, ], - view_response_schema=schemas.DatastreamListResponse, + view_response_schema=DatastreamListResponse, ), SensorThingsEndpointHookFactory( endpoint_name="get_datastream", @@ -25,7 +28,7 @@ apikey_auth, anonymous_auth, ], - view_response_schema=schemas.DatastreamGetResponse, + view_response_schema=DatastreamGetResponse, ), SensorThingsEndpointHookFactory( endpoint_name="create_datastream", @@ -116,7 +119,7 @@ apikey_auth, anonymous_auth, ], - view_response_schema=schemas.LocationListResponse, + view_response_schema=LocationListResponse, ), SensorThingsEndpointHookFactory( endpoint_name="get_location", @@ -126,7 +129,7 @@ apikey_auth, anonymous_auth, ], - view_response_schema=schemas.LocationGetResponse, + view_response_schema=LocationGetResponse, ), SensorThingsEndpointHookFactory( endpoint_name="create_location", @@ -151,7 +154,7 @@ apikey_auth, anonymous_auth, ], - view_response_schema=schemas.ObservationListResponse, + view_response_schema=ObservationListResponse, ), SensorThingsEndpointHookFactory( endpoint_name="get_observation", @@ -161,7 +164,7 @@ apikey_auth, anonymous_auth, ], - view_response_schema=schemas.ObservationGetResponse, + view_response_schema=ObservationGetResponse, ), SensorThingsEndpointHookFactory( endpoint_name="create_observation", @@ -172,7 +175,7 @@ apikey_auth, anonymous_auth, ], - view_body_schema=schemas.ObservationPostBody, + view_body_schema=ObservationPostBody, ), SensorThingsEndpointHookFactory( endpoint_name="create_observations", @@ -183,7 +186,7 @@ apikey_auth, anonymous_auth, ], - view_body_schema=schemas.ObservationDataArrayPostBody, + view_body_schema=ObservationDataArrayPostBody, ), SensorThingsEndpointHookFactory( endpoint_name="update_observation", @@ -203,7 +206,7 @@ apikey_auth, anonymous_auth, ], - view_response_schema=schemas.ObservedPropertyListResponse, + view_response_schema=ObservedPropertyListResponse, ), SensorThingsEndpointHookFactory( endpoint_name="get_observed_property", @@ -213,7 +216,7 @@ apikey_auth, anonymous_auth, ], - view_response_schema=schemas.ObservedPropertyGetResponse, + view_response_schema=ObservedPropertyGetResponse, ), SensorThingsEndpointHookFactory( endpoint_name="create_observed_property", @@ -238,7 +241,7 @@ apikey_auth, anonymous_auth, ], - view_response_schema=schemas.SensorListResponse, + view_response_schema=SensorListResponse, ), SensorThingsEndpointHookFactory( endpoint_name="get_sensor", @@ -248,7 +251,7 @@ apikey_auth, anonymous_auth, ], - view_response_schema=schemas.SensorGetResponse, + view_response_schema=SensorGetResponse, ), SensorThingsEndpointHookFactory( endpoint_name="create_sensor", @@ -273,7 +276,7 @@ apikey_auth, anonymous_auth, ], - view_response_schema=schemas.ThingListResponse, + view_response_schema=ThingListResponse, ), SensorThingsEndpointHookFactory( endpoint_name="get_thing", @@ -283,7 +286,7 @@ apikey_auth, anonymous_auth, ], - view_response_schema=schemas.ThingGetResponse, + view_response_schema=ThingGetResponse, ), SensorThingsEndpointHookFactory( endpoint_name="create_thing", diff --git a/sta/services/sensorthings/__init__.py b/interfaces/sensorthings/engine/__init__.py similarity index 100% rename from sta/services/sensorthings/__init__.py rename to interfaces/sensorthings/engine/__init__.py diff --git a/sta/services/sensorthings/datastream.py b/interfaces/sensorthings/engine/datastream.py similarity index 98% rename from sta/services/sensorthings/datastream.py rename to interfaces/sensorthings/engine/datastream.py index 987bccf9..40cf960e 100644 --- a/sta/services/sensorthings/datastream.py +++ b/interfaces/sensorthings/engine/datastream.py @@ -2,7 +2,7 @@ from typing import Optional from ninja.errors import HttpError from django.db.utils import DataError, DatabaseError -from sta.models import Datastream +from domains.sta.models import Datastream from sensorthings.components.datastreams.engine import DatastreamBaseEngine from sensorthings.components.datastreams.schemas import ( Datastream as DatastreamSchema, @@ -10,7 +10,7 @@ DatastreamPatchBody, ) from .utils import SensorThingsUtils -from ..datastream import DatastreamService +from domains.sta.services.datastream import DatastreamService datastream_service = DatastreamService() diff --git a/sta/services/sensorthings/feature_of_interest.py b/interfaces/sensorthings/engine/feature_of_interest.py similarity index 100% rename from sta/services/sensorthings/feature_of_interest.py rename to interfaces/sensorthings/engine/feature_of_interest.py diff --git a/sta/services/sensorthings/historical_location.py b/interfaces/sensorthings/engine/historical_location.py similarity index 100% rename from sta/services/sensorthings/historical_location.py rename to interfaces/sensorthings/engine/historical_location.py diff --git a/sta/services/sensorthings/location.py b/interfaces/sensorthings/engine/location.py similarity index 98% rename from sta/services/sensorthings/location.py rename to interfaces/sensorthings/engine/location.py index 112aaf14..589fa845 100644 --- a/sta/services/sensorthings/location.py +++ b/interfaces/sensorthings/engine/location.py @@ -1,7 +1,7 @@ from typing import Optional from ninja.errors import HttpError from django.db.utils import DataError, DatabaseError -from sta.models import Location +from domains.sta.models import Location from sensorthings.components.locations.engine import LocationBaseEngine from sensorthings.components.locations.schemas import ( Location as LocationSchema, diff --git a/sta/services/sensorthings/observation.py b/interfaces/sensorthings/engine/observation.py similarity index 97% rename from sta/services/sensorthings/observation.py rename to interfaces/sensorthings/engine/observation.py index ffe5d7af..cde09332 100644 --- a/sta/services/sensorthings/observation.py +++ b/interfaces/sensorthings/engine/observation.py @@ -7,16 +7,16 @@ from django.contrib.postgres.aggregates import ArrayAgg from psycopg.errors import UniqueViolation from ninja.errors import HttpError -from sta.models import Observation, Datastream +from domains.sta.models import Observation, Datastream from sensorthings.components.observations.engine import ObservationBaseEngine from sensorthings.components.observations.schemas import ( Observation as ObservationSchema, ObservationPatchBody, ) -from sta.schemas.sensorthings import ObservationPostBody +from ..schemas import ObservationPostBody from .utils import SensorThingsUtils -from ..observation import ObservationService -from ..datastream import DatastreamService +from domains.sta.services.observation import ObservationService +from domains.sta.services.datastream import DatastreamService observation_service = ObservationService() datastream_service = DatastreamService() @@ -213,7 +213,7 @@ def create_observations(self, observations) -> list[UUID]: # ] for result_qualifier in result_qualifiers])): # ResultQualifier.objects.get_by_id( # result_qualifier_id=result_qualifier_id, - # principal=getattr(self, "request").principal, + # principal=getattr(self, "http").principal, # method="GET", # fetch=False, # raise_404=True diff --git a/sta/services/sensorthings/observed_property.py b/interfaces/sensorthings/engine/observed_property.py similarity index 98% rename from sta/services/sensorthings/observed_property.py rename to interfaces/sensorthings/engine/observed_property.py index a1615db3..5d43edde 100644 --- a/sta/services/sensorthings/observed_property.py +++ b/interfaces/sensorthings/engine/observed_property.py @@ -2,7 +2,7 @@ from typing import Optional from ninja.errors import HttpError from django.db.utils import DataError, DatabaseError -from sta.models import ObservedProperty +from domains.sta.models import ObservedProperty from sensorthings.components.observedproperties.engine import ObservedPropertyBaseEngine from sensorthings.components.observedproperties.schemas import ( ObservedProperty as ObservedPropertySchema, diff --git a/sta/services/sensorthings/sensor.py b/interfaces/sensorthings/engine/sensor.py similarity index 98% rename from sta/services/sensorthings/sensor.py rename to interfaces/sensorthings/engine/sensor.py index a2485025..ea47365d 100644 --- a/sta/services/sensorthings/sensor.py +++ b/interfaces/sensorthings/engine/sensor.py @@ -3,7 +3,7 @@ from django.db.utils import DataError, DatabaseError from sensorthings.components.sensors.engine import SensorBaseEngine from sensorthings.components.sensors.schemas import Sensor as SensorSchema -from sta.models import Sensor +from domains.sta.models import Sensor from .utils import SensorThingsUtils diff --git a/sta/services/sensorthings/thing.py b/interfaces/sensorthings/engine/thing.py similarity index 99% rename from sta/services/sensorthings/thing.py rename to interfaces/sensorthings/engine/thing.py index 9ed83727..d50426c0 100644 --- a/sta/services/sensorthings/thing.py +++ b/interfaces/sensorthings/engine/thing.py @@ -2,7 +2,7 @@ from typing import Optional from ninja.errors import HttpError from django.db.utils import DataError, DatabaseError -from sta.models import Thing +from domains.sta.models import Thing from sensorthings.components.things.engine import ThingBaseEngine from sensorthings.components.things.schemas import Thing as ThingSchema from .utils import SensorThingsUtils diff --git a/sta/services/sensorthings/utils.py b/interfaces/sensorthings/engine/utils.py similarity index 99% rename from sta/services/sensorthings/utils.py rename to interfaces/sensorthings/engine/utils.py index 94af3965..fc475f2d 100644 --- a/sta/services/sensorthings/utils.py +++ b/interfaces/sensorthings/engine/utils.py @@ -5,7 +5,7 @@ from ninja.errors import HttpError from odata_query.django.django_q import AstToDjangoQVisitor from sensorthings.components import field_schemas -from sta import models as sta_models +from domains.sta import models as sta_models class SensorThingsUtils: diff --git a/sta/schemas/sensorthings/__init__.py b/interfaces/sensorthings/schemas/__init__.py similarity index 100% rename from sta/schemas/sensorthings/__init__.py rename to interfaces/sensorthings/schemas/__init__.py diff --git a/sta/schemas/sensorthings/datastream.py b/interfaces/sensorthings/schemas/datastream.py similarity index 100% rename from sta/schemas/sensorthings/datastream.py rename to interfaces/sensorthings/schemas/datastream.py diff --git a/sta/schemas/sensorthings/feature_of_interest.py b/interfaces/sensorthings/schemas/feature_of_interest.py similarity index 100% rename from sta/schemas/sensorthings/feature_of_interest.py rename to interfaces/sensorthings/schemas/feature_of_interest.py diff --git a/sta/schemas/sensorthings/historical_location.py b/interfaces/sensorthings/schemas/historical_location.py similarity index 100% rename from sta/schemas/sensorthings/historical_location.py rename to interfaces/sensorthings/schemas/historical_location.py diff --git a/sta/schemas/sensorthings/location.py b/interfaces/sensorthings/schemas/location.py similarity index 100% rename from sta/schemas/sensorthings/location.py rename to interfaces/sensorthings/schemas/location.py diff --git a/sta/schemas/sensorthings/observation.py b/interfaces/sensorthings/schemas/observation.py similarity index 100% rename from sta/schemas/sensorthings/observation.py rename to interfaces/sensorthings/schemas/observation.py diff --git a/sta/schemas/sensorthings/observed_property.py b/interfaces/sensorthings/schemas/observed_property.py similarity index 100% rename from sta/schemas/sensorthings/observed_property.py rename to interfaces/sensorthings/schemas/observed_property.py diff --git a/sta/schemas/sensorthings/sensor.py b/interfaces/sensorthings/schemas/sensor.py similarity index 100% rename from sta/schemas/sensorthings/sensor.py rename to interfaces/sensorthings/schemas/sensor.py diff --git a/sta/schemas/sensorthings/thing.py b/interfaces/sensorthings/schemas/thing.py similarity index 100% rename from sta/schemas/sensorthings/thing.py rename to interfaces/sensorthings/schemas/thing.py diff --git a/sta/schemas/sensorthings/workspace.py b/interfaces/sensorthings/schemas/workspace.py similarity index 100% rename from sta/schemas/sensorthings/workspace.py rename to interfaces/sensorthings/schemas/workspace.py diff --git a/web/migrations/__init__.py b/interfaces/web/__init__.py similarity index 100% rename from web/migrations/__init__.py rename to interfaces/web/__init__.py diff --git a/web/views.py b/interfaces/web/views.py similarity index 98% rename from web/views.py rename to interfaces/web/views.py index 3dac3584..d50ef7e5 100644 --- a/web/views.py +++ b/interfaces/web/views.py @@ -3,7 +3,7 @@ from django.shortcuts import render from django.views.decorators.cache import cache_page from django.conf import settings -from web.models import InstanceConfiguration, MapLayer, ContactInformation +from domains.web.models import InstanceConfiguration, MapLayer, ContactInformation @cache_page(60 * 10) diff --git a/sta/schemas/__init__.py b/sta/schemas/__init__.py deleted file mode 100644 index dcd3018e..00000000 --- a/sta/schemas/__init__.py +++ /dev/null @@ -1,84 +0,0 @@ -from .thing import ( - ThingSummaryResponse, - ThingDetailResponse, - ThingPostBody, - ThingPatchBody, - ThingQueryParameters, - LocationPostBody, - LocationPatchBody, - TagGetResponse, - FileAttachmentGetResponse, -) -from .observed_property import ( - ObservedPropertySummaryResponse, - ObservedPropertyDetailResponse, - ObservedPropertyQueryParameters, - ObservedPropertyPostBody, - ObservedPropertyPatchBody, -) -from .processing_level import ( - ProcessingLevelSummaryResponse, - ProcessingLevelDetailResponse, - ProcessingLevelQueryParameters, - ProcessingLevelPostBody, - ProcessingLevelPatchBody, -) -from .result_qualifier import ( - ResultQualifierSummaryResponse, - ResultQualifierDetailResponse, - ResultQualifierQueryParameters, - ResultQualifierPostBody, - ResultQualifierPatchBody, -) -from .sensor import ( - SensorSummaryResponse, - SensorDetailResponse, - SensorQueryParameters, - SensorPostBody, - SensorPatchBody, -) -from .unit import ( - UnitSummaryResponse, - UnitDetailResponse, - UnitQueryParameters, - UnitPostBody, - UnitPatchBody, -) -from .datastream import ( - DatastreamSummaryResponse, - DatastreamDetailResponse, - DatastreamQueryParameters, - DatastreamPostBody, - DatastreamPatchBody, -) -from .observation import ( - ObservationSummaryResponse, - ObservationDetailResponse, - ObservationQueryParameters, - ObservationRowResponse, - ObservationColumnarResponse, - ObservationPostBody, - ObservationBulkPostQueryParameters, - ObservationBulkPostBody, - ObservationBulkDeleteBody, -) -from .attachment import ( - TagGetResponse, - TagPostBody, - TagDeleteBody, - FileAttachmentDeleteBody, - FileAttachmentGetResponse, -) - - -from iam.schemas import WorkspaceSummaryResponse - - -ThingDetailResponse.model_rebuild() -ObservedPropertyDetailResponse.model_rebuild() -ProcessingLevelDetailResponse.model_rebuild() -ResultQualifierDetailResponse.model_rebuild() -SensorDetailResponse.model_rebuild() -UnitDetailResponse.model_rebuild() -DatastreamDetailResponse.model_rebuild() -ObservationDetailResponse.model_rebuild() diff --git a/tests/conftest.py b/tests/conftest.py index bc9bb7a2..5c87752b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,7 +2,7 @@ from django.db import transaction from django.core.management import call_command from django.contrib.auth import get_user_model -from iam.models import APIKey +from domains.iam.models import APIKey User = get_user_model() @@ -12,7 +12,7 @@ def django_db_setup(django_db_setup, django_db_blocker): with django_db_blocker.unblock(): call_command("migrate") - call_command("loaddata", "iam/fixtures/default_roles.yaml") + call_command("loaddata", "domains/iam/fixtures/default_roles.yaml") call_command("load_iam_test_data") call_command("load_sta_test_data") call_command("load_etl_test_data") diff --git a/tests/etl/services/test_data_archive.py b/tests/etl/services/test_data_archive.py deleted file mode 100644 index ef6f3d05..00000000 --- a/tests/etl/services/test_data_archive.py +++ /dev/null @@ -1,682 +0,0 @@ -# import pytest -# from uuid import UUID -# from collections import Counter -# from django.http import HttpResponse -# from iam.models import Workspace -# from etl.services import DataArchiveService -# from etl.schemas import ( -# DataArchivePostBody, -# DataArchivePatchBody, -# DataArchiveSummaryResponse, -# OrchestrationSystemSummaryResponse, -# ) -# from tests.utils import test_service_method -# -# data_archive_service = DataArchiveService() -# -# -# @pytest.mark.parametrize( -# "principal, params, data_archive_names, max_queries", -# [ -# # Test user access -# ( -# "owner", -# {}, -# ["Test Data Archive", "Crontab Data Archive", "Interval Data Archive"], -# 5, -# ), -# ( -# "editor", -# {}, -# ["Test Data Archive", "Crontab Data Archive", "Interval Data Archive"], -# 5, -# ), -# ( -# "viewer", -# {}, -# ["Test Data Archive", "Crontab Data Archive", "Interval Data Archive"], -# 5, -# ), -# ( -# "admin", -# {}, -# ["Test Data Archive", "Crontab Data Archive", "Interval Data Archive"], -# 5, -# ), -# ( -# "apikey", -# {}, -# ["Test Data Archive", "Crontab Data Archive", "Interval Data Archive"], -# 5, -# ), -# ("unaffiliated", {}, [], 5), -# ("anonymous", {}, [], 5), -# # Test pagination and order_by -# ( -# "owner", -# {"page": 2, "page_size": 1, "order_by": "-name"}, -# ["Interval Data Archive"], -# 5, -# ), -# # Test filtering -# ( -# "owner", -# {"orchestration_system_id": "320ad0e1-1426-47f6-8a3a-886a7111a7c2"}, -# ["Test Data Archive", "Crontab Data Archive", "Interval Data Archive"], -# 5, -# ), -# ], -# ) -# def test_list_data_archive( -# django_assert_max_num_queries, -# get_principal, -# principal, -# params, -# data_archive_names, -# max_queries, -# ): -# with django_assert_max_num_queries(max_queries): -# http_response = HttpResponse() -# result = data_archive_service.list( -# principal=get_principal(principal), -# response=http_response, -# page=params.pop("page", 1), -# page_size=params.pop("page_size", 100), -# order_by=[params.pop("order_by")] if "order_by" in params else [], -# filtering=params, -# ) -# assert Counter(str(data_archive.name) for data_archive in result) == Counter( -# data_archive_names -# ) -# assert ( -# DataArchiveSummaryResponse.from_orm(data_archive) for data_archive in result -# ) -# -# -# @pytest.mark.parametrize( -# "principal, data_archive, action, response, error_code", -# [ -# ( -# "admin", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "view", -# {"name": "Test Data Archive"}, -# None, -# ), -# ( -# "admin", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "edit", -# {"name": "Test Data Archive"}, -# None, -# ), -# ( -# "admin", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "delete", -# {"name": "Test Data Archive"}, -# None, -# ), -# ( -# "admin", -# UUID("00000000-0000-0000-0000-000000000000"), -# "view", -# "Data archive does not exist", -# 404, -# ), -# ( -# "admin", -# UUID("00000000-0000-0000-0000-000000000000"), -# "edit", -# "Data archive does not exist", -# 404, -# ), -# ( -# "admin", -# UUID("00000000-0000-0000-0000-000000000000"), -# "delete", -# "Data archive does not exist", -# 404, -# ), -# ( -# "owner", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "view", -# {"name": "Test Data Archive"}, -# None, -# ), -# ( -# "owner", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "edit", -# {"name": "Test Data Archive"}, -# None, -# ), -# ( -# "owner", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "delete", -# {"name": "Test Data Archive"}, -# None, -# ), -# ( -# "editor", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "view", -# {"name": "Test Data Archive"}, -# None, -# ), -# ( -# "editor", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "edit", -# {"name": "Test Data Archive"}, -# None, -# ), -# ( -# "editor", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "delete", -# {"name": "Test Data Archive"}, -# None, -# ), -# ( -# "viewer", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "view", -# {"name": "Test Data Archive"}, -# None, -# ), -# ( -# "viewer", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "edit", -# "You do not have permission", -# 403, -# ), -# ( -# "viewer", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "delete", -# "You do not have permission", -# 403, -# ), -# ( -# "apikey", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "view", -# {"name": "Test Data Archive"}, -# None, -# ), -# ( -# "apikey", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "edit", -# {"name": "Test Data Archive"}, -# None, -# ), -# ( -# "apikey", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "delete", -# "You do not have permission", -# 403, -# ), -# ( -# "anonymous", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "view", -# "Data archive does not exist", -# 404, -# ), -# ( -# "anonymous", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "edit", -# "Data archive does not exist", -# 404, -# ), -# ( -# "anonymous", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "delete", -# "Data archive does not exist", -# 404, -# ), -# ( -# None, -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "view", -# "Data archive does not exist", -# 404, -# ), -# ( -# None, -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "edit", -# "Data archive does not exist", -# 404, -# ), -# ( -# None, -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "delete", -# "Data archive does not exist", -# 404, -# ), -# ], -# ) -# def test_get_data_archive_for_action( -# get_principal, principal, data_archive, action, response, error_code -# ): -# with test_service_method( -# schema=DataArchiveSummaryResponse, response=response, error_code=error_code -# ) as context: -# context["result"] = data_archive_service.get_data_archive_for_action( -# principal=get_principal(principal), uid=data_archive, action=action -# ) -# -# -# @pytest.mark.parametrize( -# "principal, orchestration_system, workspace, response, error_code", -# [ -# ( -# "owner", -# UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# UUID("6e0deaf2-a92b-421b-9ece-86783265596f"), -# {"name": "Global Orchestration System"}, -# None, -# ), -# ( -# "owner", -# UUID("7cb900d2-eb11-4a59-a05b-dd02d95af312"), -# UUID("b27c51a0-7374-462d-8a53-d97d47176c10"), -# {"name": "Workspace Orchestration System"}, -# None, -# ), -# ( -# "owner", -# UUID("7cb900d2-eb11-4a59-a05b-dd02d95af312"), -# UUID("6e0deaf2-a92b-421b-9ece-86783265596f"), -# "The given orchestration system cannot", -# 400, -# ), -# ], -# ) -# def test_validate_orchestration_system( -# get_principal, principal, orchestration_system, workspace, response, error_code -# ): -# with test_service_method( -# schema=OrchestrationSystemSummaryResponse, -# response=response, -# error_code=error_code, -# ) as context: -# workspace = Workspace.objects.get(pk=workspace) -# context["result"] = data_archive_service.validate_orchestration_system( -# principal=get_principal(principal), -# orchestration_system_id=orchestration_system, -# workspace=workspace, -# ) -# -# -# @pytest.mark.parametrize( -# "crontab, interval, interval_units, response, error_code", -# [ -# ( -# "* * * * *", -# None, -# None, -# None, -# None, -# ), -# ( -# None, -# 5, -# "minutes", -# None, -# None, -# ), -# ( -# "* * * * *", -# 5, -# "minutes", -# "Only one of", -# 400, -# ), -# ( -# "* * * * *", -# 5, -# None, -# "Only one of", -# 400, -# ), -# ( -# "* * * * *", -# None, -# "minutes", -# "Only one of", -# 400, -# ), -# ( -# "invalid", -# None, -# None, -# "Invalid crontab schedule", -# 400, -# ), -# ( -# None, -# 5, -# None, -# "Both interval and interval units", -# 400, -# ), -# ( -# None, -# None, -# "minutes", -# "Both interval and interval units", -# 400, -# ), -# ], -# ) -# def test_validate_scheduling(crontab, interval, interval_units, response, error_code): -# with test_service_method(response=response, error_code=error_code) as context: -# context["result"] = data_archive_service.validate_scheduling( -# interval=interval, -# interval_units=interval_units, -# crontab=crontab, -# ) -# -# -# @pytest.mark.parametrize( -# "principal, data, response, error_code", -# [ -# ( -# "admin", -# { -# "name": "New", -# "workspace_id": UUID("6e0deaf2-a92b-421b-9ece-86783265596f"), -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# None, -# None, -# ), -# ( -# "owner", -# { -# "name": "New", -# "workspace_id": UUID("6e0deaf2-a92b-421b-9ece-86783265596f"), -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# None, -# None, -# ), -# ( -# "editor", -# { -# "name": "New", -# "workspace_id": UUID("6e0deaf2-a92b-421b-9ece-86783265596f"), -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# None, -# None, -# ), -# ( -# "viewer", -# { -# "name": "New", -# "workspace_id": UUID("6e0deaf2-a92b-421b-9ece-86783265596f"), -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# "You do not have permission", -# 403, -# ), -# ( -# "apikey", -# { -# "name": "New", -# "workspace_id": UUID("6e0deaf2-a92b-421b-9ece-86783265596f"), -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# "You do not have permission", -# 403, -# ), -# ( -# "anonymous", -# { -# "name": "New", -# "workspace_id": UUID("6e0deaf2-a92b-421b-9ece-86783265596f"), -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# "You do not have permission", -# 403, -# ), -# ( -# None, -# { -# "name": "New", -# "workspace_id": UUID("6e0deaf2-a92b-421b-9ece-86783265596f"), -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# "You do not have permission", -# 403, -# ), -# ], -# ) -# def test_create_data_archive(get_principal, principal, data, response, error_code): -# data_archive_body = DataArchivePostBody( -# name=data["name"], -# workspace_id=data["workspace_id"], -# orchestration_system_id=data["orchestration_system_id"], -# ) -# with test_service_method( -# schema=DataArchiveSummaryResponse, -# response=response or data, -# error_code=error_code, -# fields=("name",), -# ) as context: -# context["result"] = data_archive_service.create( -# principal=get_principal(principal), data=data_archive_body -# ) -# -# -# @pytest.mark.parametrize( -# "principal, data_archive, data, response, error_code", -# [ -# ( -# "admin", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# { -# "name": "New", -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# None, -# None, -# ), -# ( -# "owner", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# { -# "name": "New", -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# None, -# None, -# ), -# ( -# "editor", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# { -# "name": "New", -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# None, -# None, -# ), -# ( -# "apikey", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# { -# "name": "New", -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# None, -# None, -# ), -# ( -# "viewer", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# { -# "name": "New", -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# "You do not have permission", -# 403, -# ), -# ( -# "anonymous", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# { -# "name": "New", -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# "Data archive does not exist", -# 404, -# ), -# ( -# None, -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# { -# "name": "New", -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# "Data archive does not exist", -# 404, -# ), -# ], -# ) -# def test_update_data_archive( -# get_principal, principal, data_archive, data, response, error_code -# ): -# data_archive_body = DataArchivePatchBody( -# name=data["name"], orchestration_system_id=data["orchestration_system_id"] -# ) -# with test_service_method( -# schema=DataArchiveSummaryResponse, -# response=response or data, -# error_code=error_code, -# fields=("name",), -# ) as context: -# context["result"] = data_archive_service.update( -# principal=get_principal(principal), uid=data_archive, data=data_archive_body -# ) -# -# -# @pytest.mark.parametrize( -# "principal, data_archive, response, error_code", -# [ -# ("admin", UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), None, None), -# ("owner", UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), None, None), -# ("editor", UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), None, None), -# ( -# "apikey", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "You do not have permission", -# 403, -# ), -# ( -# "viewer", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "You do not have permission", -# 403, -# ), -# ( -# "anonymous", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "Data archive does not exist", -# 404, -# ), -# ( -# None, -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# "Data archive does not exist", -# 404, -# ), -# ], -# ) -# def test_delete_data_archive( -# get_principal, principal, data_archive, response, error_code -# ): -# with test_service_method(response=response, error_code=error_code) as context: -# context["result"] = data_archive_service.delete( -# principal=get_principal(principal), -# uid=data_archive, -# ) -# -# -# @pytest.mark.parametrize( -# "principal, data_archive, datastream, response, error_code", -# [ -# ( -# "admin", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# UUID("e0506cac-3e50-4d0a-814d-7ae0146705b2"), -# None, -# None, -# ), -# ( -# "admin", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# UUID("27c70b41-e845-40ea-8cc7-d1b40f89816b"), -# "Datastream has already been linked", -# 400, -# ), -# ( -# "admin", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# UUID("9f96957b-ee20-4c7b-bf2b-673a0cda3a04"), -# "The datastream must share a workspace", -# 400, -# ), -# ], -# ) -# def test_link_datastream( -# get_principal, principal, data_archive, datastream, response, error_code -# ): -# with test_service_method(response=response, error_code=error_code) as context: -# context["result"] = data_archive_service.link_datastream( -# principal=get_principal(principal), -# uid=data_archive, -# datastream_id=datastream, -# ) -# -# -# @pytest.mark.parametrize( -# "principal, data_archive, datastream, response, error_code", -# [ -# ( -# "admin", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# UUID("27c70b41-e845-40ea-8cc7-d1b40f89816b"), -# None, -# None, -# ), -# ( -# "admin", -# UUID("6ff5de63-753b-458e-9735-e1ea68f9816c"), -# UUID("e0506cac-3e50-4d0a-814d-7ae0146705b2"), -# "The given data archive is not configured", -# 400, -# ), -# ], -# ) -# def test_unlink_datastream( -# get_principal, principal, data_archive, datastream, response, error_code -# ): -# with test_service_method(response=response, error_code=error_code) as context: -# context["result"] = data_archive_service.unlink_datastream( -# principal=get_principal(principal), -# uid=data_archive, -# datastream_id=datastream, -# ) diff --git a/tests/etl/services/test_data_connection.py b/tests/etl/services/test_data_connection.py index 9a297dc5..25581e26 100644 --- a/tests/etl/services/test_data_connection.py +++ b/tests/etl/services/test_data_connection.py @@ -3,8 +3,8 @@ from collections import Counter from ninja.errors import HttpError from django.http import HttpResponse -from etl.services import DataConnectionService -from etl.schemas import ( +from domains.etl.services import DataConnectionService +from interfaces.api.schemas import ( DataConnectionPostBody, DataConnectionPatchBody, DataConnectionSummaryResponse, diff --git a/tests/etl/services/test_data_source.py b/tests/etl/services/test_data_source.py deleted file mode 100644 index f8ad476f..00000000 --- a/tests/etl/services/test_data_source.py +++ /dev/null @@ -1,692 +0,0 @@ -# import pytest -# from uuid import UUID -# from collections import Counter -# from django.http import HttpResponse -# from iam.models import Workspace -# from etl.services import DataSourceService -# from etl.schemas import ( -# DataSourcePostBody, -# DataSourcePatchBody, -# DataSourceSummaryResponse, -# OrchestrationSystemSummaryResponse, -# ) -# from tests.utils import test_service_method -# -# data_source_service = DataSourceService() -# -# -# @pytest.mark.parametrize( -# "principal, params, data_source_names, max_queries", -# [ -# # Test user access -# ( -# "owner", -# {}, -# ["Test Data Source", "Crontab Data Source", "Interval Data Source"], -# 5, -# ), -# ( -# "editor", -# {}, -# ["Test Data Source", "Crontab Data Source", "Interval Data Source"], -# 5, -# ), -# ( -# "viewer", -# {}, -# ["Test Data Source", "Crontab Data Source", "Interval Data Source"], -# 5, -# ), -# ( -# "admin", -# {}, -# ["Test Data Source", "Crontab Data Source", "Interval Data Source"], -# 5, -# ), -# ( -# "apikey", -# {}, -# ["Test Data Source", "Crontab Data Source", "Interval Data Source"], -# 5, -# ), -# ("unaffiliated", {}, [], 5), -# ("anonymous", {}, [], 5), -# # Test pagination and order_by -# ( -# "owner", -# {"page": 2, "page_size": 1, "order_by": "-name"}, -# ["Interval Data Source"], -# 5, -# ), -# # Test filtering -# ( -# "owner", -# {"orchestration_system_id": "320ad0e1-1426-47f6-8a3a-886a7111a7c2"}, -# ["Test Data Source", "Crontab Data Source", "Interval Data Source"], -# 5, -# ), -# ], -# ) -# def test_list_data_source( -# django_assert_max_num_queries, -# get_principal, -# principal, -# params, -# data_source_names, -# max_queries, -# ): -# with django_assert_max_num_queries(max_queries): -# http_response = HttpResponse() -# result = data_source_service.list( -# principal=get_principal(principal), -# response=http_response, -# page=params.pop("page", 1), -# page_size=params.pop("page_size", 100), -# order_by=[params.pop("order_by")] if "order_by" in params else [], -# filtering=params, -# ) -# assert Counter(str(data_source.name) for data_source in result) == Counter( -# data_source_names -# ) -# assert ( -# DataSourceSummaryResponse.from_orm(data_source) for data_source in result -# ) -# -# -# @pytest.mark.parametrize( -# "principal, data_source, action, response, error_code", -# [ -# ( -# "admin", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "view", -# {"name": "Test Data Source"}, -# None, -# ), -# ( -# "admin", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "edit", -# {"name": "Test Data Source"}, -# None, -# ), -# ( -# "admin", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "delete", -# {"name": "Test Data Source"}, -# None, -# ), -# ( -# "admin", -# UUID("00000000-0000-0000-0000-000000000000"), -# "view", -# "Data source does not exist", -# 404, -# ), -# ( -# "admin", -# UUID("00000000-0000-0000-0000-000000000000"), -# "edit", -# "Data source does not exist", -# 404, -# ), -# ( -# "admin", -# UUID("00000000-0000-0000-0000-000000000000"), -# "delete", -# "Data source does not exist", -# 404, -# ), -# ( -# "owner", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "view", -# {"name": "Test Data Source"}, -# None, -# ), -# ( -# "owner", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "edit", -# {"name": "Test Data Source"}, -# None, -# ), -# ( -# "owner", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "delete", -# {"name": "Test Data Source"}, -# None, -# ), -# ( -# "editor", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "view", -# {"name": "Test Data Source"}, -# None, -# ), -# ( -# "editor", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "edit", -# {"name": "Test Data Source"}, -# None, -# ), -# ( -# "editor", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "delete", -# {"name": "Test Data Source"}, -# None, -# ), -# ( -# "viewer", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "view", -# {"name": "Test Data Source"}, -# None, -# ), -# ( -# "viewer", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "edit", -# "You do not have permission", -# 403, -# ), -# ( -# "viewer", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "delete", -# "You do not have permission", -# 403, -# ), -# ( -# "apikey", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "view", -# {"name": "Test Data Source"}, -# None, -# ), -# ( -# "apikey", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "edit", -# {"name": "Test Data Source"}, -# None, -# ), -# ( -# "apikey", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "delete", -# "You do not have permission", -# 403, -# ), -# ( -# "anonymous", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "view", -# "Data source does not exist", -# 404, -# ), -# ( -# "anonymous", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "edit", -# "Data source does not exist", -# 404, -# ), -# ( -# "anonymous", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "delete", -# "Data source does not exist", -# 404, -# ), -# ( -# None, -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "view", -# "Data source does not exist", -# 404, -# ), -# ( -# None, -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "edit", -# "Data source does not exist", -# 404, -# ), -# ( -# None, -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "delete", -# "Data source does not exist", -# 404, -# ), -# ], -# ) -# def test_get_data_source_for_action( -# get_principal, principal, data_source, action, response, error_code -# ): -# with test_service_method( -# schema=DataSourceSummaryResponse, response=response, error_code=error_code -# ) as context: -# context["result"] = data_source_service.get_data_source_for_action( -# principal=get_principal(principal), uid=data_source, action=action -# ) -# -# -# @pytest.mark.parametrize( -# "principal, orchestration_system, workspace, response, error_code", -# [ -# ( -# "owner", -# UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# UUID("6e0deaf2-a92b-421b-9ece-86783265596f"), -# {"name": "Global Orchestration System"}, -# None, -# ), -# ( -# "owner", -# UUID("7cb900d2-eb11-4a59-a05b-dd02d95af312"), -# UUID("b27c51a0-7374-462d-8a53-d97d47176c10"), -# {"name": "Workspace Orchestration System"}, -# None, -# ), -# ( -# "owner", -# UUID("7cb900d2-eb11-4a59-a05b-dd02d95af312"), -# UUID("6e0deaf2-a92b-421b-9ece-86783265596f"), -# "The given orchestration system cannot", -# 400, -# ), -# ], -# ) -# def test_validate_orchestration_system( -# get_principal, principal, orchestration_system, workspace, response, error_code -# ): -# with test_service_method( -# schema=OrchestrationSystemSummaryResponse, -# response=response, -# error_code=error_code, -# ) as context: -# workspace = Workspace.objects.get(pk=workspace) -# context["result"] = data_source_service.validate_orchestration_system( -# principal=get_principal(principal), -# orchestration_system_id=orchestration_system, -# workspace=workspace, -# ) -# -# -# @pytest.mark.parametrize( -# "crontab, interval, interval_units, data_source, response, error_code", -# [ -# ( -# "* * * * *", -# None, -# None, -# None, -# None, -# None, -# ), -# ( -# None, -# 5, -# "minutes", -# None, -# None, -# None, -# ), -# ( -# "* * * * *", -# 5, -# "minutes", -# None, -# "Only one of", -# 400, -# ), -# ( -# "* * * * *", -# 5, -# None, -# None, -# "Only one of", -# 400, -# ), -# ( -# "* * * * *", -# None, -# "minutes", -# None, -# "Only one of", -# 400, -# ), -# ( -# "invalid", -# None, -# None, -# None, -# "Invalid crontab schedule", -# 400, -# ), -# ( -# None, -# 5, -# None, -# None, -# "Both interval and interval units", -# 400, -# ), -# ( -# None, -# None, -# "minutes", -# None, -# "Both interval and interval units", -# 400, -# ), -# ], -# ) -# def test_validate_scheduling( -# crontab, interval, interval_units, data_source, response, error_code -# ): -# with test_service_method(response=response, error_code=error_code) as context: -# context["result"] = data_source_service.validate_scheduling( -# interval=interval, -# interval_units=interval_units, -# crontab=crontab, -# ) -# -# -# @pytest.mark.parametrize( -# "principal, data, response, error_code", -# [ -# ( -# "admin", -# { -# "name": "New", -# "workspace_id": UUID("6e0deaf2-a92b-421b-9ece-86783265596f"), -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# None, -# None, -# ), -# ( -# "owner", -# { -# "name": "New", -# "workspace_id": UUID("6e0deaf2-a92b-421b-9ece-86783265596f"), -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# None, -# None, -# ), -# ( -# "editor", -# { -# "name": "New", -# "workspace_id": UUID("6e0deaf2-a92b-421b-9ece-86783265596f"), -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# None, -# None, -# ), -# ( -# "viewer", -# { -# "name": "New", -# "workspace_id": UUID("6e0deaf2-a92b-421b-9ece-86783265596f"), -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# "You do not have permission", -# 403, -# ), -# ( -# "apikey", -# { -# "name": "New", -# "workspace_id": UUID("6e0deaf2-a92b-421b-9ece-86783265596f"), -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# "You do not have permission", -# 403, -# ), -# ( -# "anonymous", -# { -# "name": "New", -# "workspace_id": UUID("6e0deaf2-a92b-421b-9ece-86783265596f"), -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# "You do not have permission", -# 403, -# ), -# ( -# None, -# { -# "name": "New", -# "workspace_id": UUID("6e0deaf2-a92b-421b-9ece-86783265596f"), -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# "You do not have permission", -# 403, -# ), -# ], -# ) -# def test_create_data_source(get_principal, principal, data, response, error_code): -# data_source_body = DataSourcePostBody( -# name=data["name"], -# workspace_id=data["workspace_id"], -# orchestration_system_id=data["orchestration_system_id"], -# ) -# with test_service_method( -# schema=DataSourceSummaryResponse, -# response=response or data, -# error_code=error_code, -# fields=("name",), -# ) as context: -# context["result"] = data_source_service.create( -# principal=get_principal(principal), data=data_source_body -# ) -# -# -# @pytest.mark.parametrize( -# "principal, data_source, data, response, error_code", -# [ -# ( -# "admin", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# { -# "name": "New", -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# None, -# None, -# ), -# ( -# "owner", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# { -# "name": "New", -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# None, -# None, -# ), -# ( -# "editor", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# { -# "name": "New", -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# None, -# None, -# ), -# ( -# "viewer", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# { -# "name": "New", -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# "You do not have permission", -# 403, -# ), -# ( -# "apikey", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# { -# "name": "New", -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# None, -# None, -# ), -# ( -# "anonymous", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# { -# "name": "New", -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# "Data source does not exist", -# 404, -# ), -# ( -# None, -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# { -# "name": "New", -# "orchestration_system_id": UUID("320ad0e1-1426-47f6-8a3a-886a7111a7c2"), -# }, -# "Data source does not exist", -# 404, -# ), -# ], -# ) -# def test_update_data_source( -# get_principal, principal, data_source, data, response, error_code -# ): -# data_source_body = DataSourcePatchBody( -# name=data["name"], orchestration_system_id=data["orchestration_system_id"] -# ) -# with test_service_method( -# schema=DataSourceSummaryResponse, -# response=response or data, -# error_code=error_code, -# fields=("name",), -# ) as context: -# context["result"] = data_source_service.update( -# principal=get_principal(principal), uid=data_source, data=data_source_body -# ) -# -# -# @pytest.mark.parametrize( -# "principal, data_source, response, error_code", -# [ -# ("admin", UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), None, None), -# ("owner", UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), None, None), -# ("editor", UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), None, None), -# ( -# "viewer", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "You do not have permission", -# 403, -# ), -# ( -# "apikey", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "You do not have permission", -# 403, -# ), -# ( -# "anonymous", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "Data source does not exist", -# 404, -# ), -# ( -# None, -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# "Data source does not exist", -# 404, -# ), -# ], -# ) -# def test_delete_data_source( -# get_principal, principal, data_source, response, error_code -# ): -# with test_service_method(response=response, error_code=error_code) as context: -# context["result"] = data_source_service.delete( -# principal=get_principal(principal), -# uid=data_source, -# ) -# -# -# @pytest.mark.parametrize( -# "principal, data_source, datastream, response, error_code", -# [ -# ( -# "admin", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# UUID("e0506cac-3e50-4d0a-814d-7ae0146705b2"), -# None, -# None, -# ), -# ( -# "admin", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# UUID("27c70b41-e845-40ea-8cc7-d1b40f89816b"), -# "Datastream has already been linked", -# 400, -# ), -# ( -# "admin", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# UUID("9f96957b-ee20-4c7b-bf2b-673a0cda3a04"), -# "The datastream must share a workspace", -# 400, -# ), -# ], -# ) -# def test_link_datastream( -# get_principal, principal, data_source, datastream, response, error_code -# ): -# with test_service_method(response=response, error_code=error_code) as context: -# context["result"] = data_source_service.link_datastream( -# principal=get_principal(principal), -# uid=data_source, -# datastream_id=datastream, -# ) -# -# -# @pytest.mark.parametrize( -# "principal, data_source, datastream, response, error_code", -# [ -# ( -# "admin", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# UUID("27c70b41-e845-40ea-8cc7-d1b40f89816b"), -# None, -# None, -# ), -# ( -# "admin", -# UUID("8bc6ba8b-dc67-4ca2-bed1-5abb4b067024"), -# UUID("e0506cac-3e50-4d0a-814d-7ae0146705b2"), -# "The given data source is not configured", -# 400, -# ), -# ], -# ) -# def test_unlink_datastream( -# get_principal, principal, data_source, datastream, response, error_code -# ): -# with test_service_method(response=response, error_code=error_code) as context: -# context["result"] = data_source_service.unlink_datastream( -# principal=get_principal(principal), -# uid=data_source, -# datastream_id=datastream, -# ) diff --git a/tests/etl/services/test_orchestration_system.py b/tests/etl/services/test_orchestration_system.py index b1f1b875..271859ff 100644 --- a/tests/etl/services/test_orchestration_system.py +++ b/tests/etl/services/test_orchestration_system.py @@ -3,8 +3,8 @@ from collections import Counter from ninja.errors import HttpError from django.http import HttpResponse -from etl.services import OrchestrationSystemService -from etl.schemas import ( +from domains.etl.services import OrchestrationSystemService +from interfaces.api.schemas import ( OrchestrationSystemPostBody, OrchestrationSystemPatchBody, OrchestrationSystemSummaryResponse, diff --git a/tests/etl/services/test_task.py b/tests/etl/services/test_task.py index f1becc06..d6859dd6 100644 --- a/tests/etl/services/test_task.py +++ b/tests/etl/services/test_task.py @@ -3,8 +3,8 @@ from collections import Counter from ninja.errors import HttpError from django.http import HttpResponse -from etl.services import TaskService -from etl.schemas import ( +from domains.etl.services import TaskService +from interfaces.api.schemas import ( TaskPostBody, TaskPatchBody, TaskSummaryResponse, diff --git a/tests/iam/services/test_account.py b/tests/iam/services/test_account.py index da5ff44a..117780af 100644 --- a/tests/iam/services/test_account.py +++ b/tests/iam/services/test_account.py @@ -1,12 +1,12 @@ import pytest -from iam.schemas import ( +from interfaces.auth.schemas import ( AccountPostBody, AccountPatchBody, OrganizationPostBody, OrganizationPatchBody, AccountDetailResponse, ) -from iam.services.account import AccountService +from domains.iam.services.account import AccountService account_service = AccountService() diff --git a/tests/iam/services/test_collaborator.py b/tests/iam/services/test_collaborator.py index 28522fe5..445cb8d1 100644 --- a/tests/iam/services/test_collaborator.py +++ b/tests/iam/services/test_collaborator.py @@ -3,8 +3,8 @@ from collections import Counter from ninja.errors import HttpError from django.http import HttpResponse -from iam.services.collaborator import CollaboratorService -from iam.schemas import ( +from domains.iam.services.collaborator import CollaboratorService +from interfaces.api.schemas import ( CollaboratorPostBody, CollaboratorDeleteBody, CollaboratorDetailResponse, diff --git a/tests/iam/services/test_role.py b/tests/iam/services/test_role.py index 30e2911d..5075ba78 100644 --- a/tests/iam/services/test_role.py +++ b/tests/iam/services/test_role.py @@ -3,8 +3,8 @@ from collections import Counter from ninja.errors import HttpError from django.http import HttpResponse -from iam.services.role import RoleService -from iam.schemas import RoleSummaryResponse +from domains.iam.services.role import RoleService +from interfaces.api.schemas import RoleSummaryResponse role_service = RoleService() diff --git a/tests/iam/services/test_workspace.py b/tests/iam/services/test_workspace.py index 2daf257f..6309f29a 100644 --- a/tests/iam/services/test_workspace.py +++ b/tests/iam/services/test_workspace.py @@ -3,8 +3,8 @@ from collections import Counter from ninja.errors import HttpError from django.http import HttpResponse -from iam.services.workspace import WorkspaceService -from iam.schemas import ( +from domains.iam.services.workspace import WorkspaceService +from interfaces.api.schemas import ( WorkspacePostBody, WorkspacePatchBody, WorkspaceTransferBody, diff --git a/tests/sta/services/test_datastream.py b/tests/sta/services/test_datastream.py index dd854825..237497c7 100644 --- a/tests/sta/services/test_datastream.py +++ b/tests/sta/services/test_datastream.py @@ -3,8 +3,8 @@ from collections import Counter from ninja.errors import HttpError from django.http import HttpResponse -from sta.services import DatastreamService -from sta.schemas import ( +from domains.sta.services import DatastreamService +from interfaces.api.schemas import ( DatastreamPostBody, DatastreamPatchBody, DatastreamSummaryResponse, diff --git a/tests/sta/services/test_observation.py b/tests/sta/services/test_observation.py index aa46669e..4abce313 100644 --- a/tests/sta/services/test_observation.py +++ b/tests/sta/services/test_observation.py @@ -2,9 +2,9 @@ import uuid from collections import Counter from django.http import HttpResponse -from sta.models import Observation -from sta.services import ObservationService -from sta.schemas import ( +from domains.sta.models import Observation +from domains.sta.services import ObservationService +from interfaces.api.schemas import ( ObservationBulkPostBody, ObservationBulkDeleteBody, ObservationSummaryResponse, diff --git a/tests/sta/services/test_observed_property.py b/tests/sta/services/test_observed_property.py index 037e7365..973bc2b8 100644 --- a/tests/sta/services/test_observed_property.py +++ b/tests/sta/services/test_observed_property.py @@ -3,8 +3,8 @@ from collections import Counter from ninja.errors import HttpError from django.http import HttpResponse -from sta.services import ObservedPropertyService -from sta.schemas import ( +from domains.sta.services import ObservedPropertyService +from interfaces.api.schemas import ( ObservedPropertyPostBody, ObservedPropertyPatchBody, ObservedPropertySummaryResponse, diff --git a/tests/sta/services/test_processing_level.py b/tests/sta/services/test_processing_level.py index 0d9fd95c..dee1fd92 100644 --- a/tests/sta/services/test_processing_level.py +++ b/tests/sta/services/test_processing_level.py @@ -3,8 +3,8 @@ from collections import Counter from ninja.errors import HttpError from django.http import HttpResponse -from sta.services import ProcessingLevelService -from sta.schemas import ( +from domains.sta.services import ProcessingLevelService +from interfaces.api.schemas import ( ProcessingLevelPostBody, ProcessingLevelPatchBody, ProcessingLevelSummaryResponse, diff --git a/tests/sta/services/test_result_qualifier.py b/tests/sta/services/test_result_qualifier.py index 5f329183..43efd76d 100644 --- a/tests/sta/services/test_result_qualifier.py +++ b/tests/sta/services/test_result_qualifier.py @@ -3,8 +3,8 @@ from collections import Counter from ninja.errors import HttpError from django.http import HttpResponse -from sta.services import ResultQualifierService -from sta.schemas import ( +from domains.sta.services import ResultQualifierService +from interfaces.api.schemas import ( ResultQualifierPostBody, ResultQualifierPatchBody, ResultQualifierSummaryResponse, diff --git a/tests/sta/services/test_sensor.py b/tests/sta/services/test_sensor.py index 8e6eb03e..7a2e1462 100644 --- a/tests/sta/services/test_sensor.py +++ b/tests/sta/services/test_sensor.py @@ -3,8 +3,8 @@ from collections import Counter from ninja.errors import HttpError from django.http import HttpResponse -from sta.services import SensorService -from sta.schemas import SensorPostBody, SensorPatchBody, SensorSummaryResponse +from domains.sta.services import SensorService +from interfaces.api.schemas import SensorPostBody, SensorPatchBody, SensorSummaryResponse sensor_service = SensorService() diff --git a/tests/sta/services/test_thing.py b/tests/sta/services/test_thing.py index b88c6d61..9b1c878a 100644 --- a/tests/sta/services/test_thing.py +++ b/tests/sta/services/test_thing.py @@ -3,8 +3,8 @@ from collections import Counter from ninja.errors import HttpError from django.http import HttpResponse -from sta.services import ThingService -from sta.schemas import ( +from domains.sta.services import ThingService +from interfaces.api.schemas import ( ThingPostBody, ThingPatchBody, LocationPostBody, diff --git a/tests/sta/services/test_unit.py b/tests/sta/services/test_unit.py index 84354b1c..14c1a580 100644 --- a/tests/sta/services/test_unit.py +++ b/tests/sta/services/test_unit.py @@ -3,8 +3,8 @@ from collections import Counter from ninja.errors import HttpError from django.http import HttpResponse -from sta.services import UnitService -from sta.schemas import UnitPostBody, UnitPatchBody, UnitSummaryResponse +from domains.sta.services import UnitService +from interfaces.api.schemas import UnitPostBody, UnitPatchBody, UnitSummaryResponse unit_service = UnitService()