diff --git a/core/code_systems/serializers.py b/core/code_systems/serializers.py index 54a76ea4..63f9cc58 100644 --- a/core/code_systems/serializers.py +++ b/core/code_systems/serializers.py @@ -280,7 +280,7 @@ def to_representation(self, instance): def create(self, validated_data): concepts = validated_data.pop('concepts', []) - uri = self.context['request'].path + validated_data['mnemonic'] + uri = '/'.join([self.context['request'].path.rstrip('/'), validated_data['mnemonic']]) ident = IdentifierSerializer.include_ocl_identifier(uri, RESOURCE_TYPE, validated_data) source = SourceCreateOrUpdateSerializer().prepare_object(validated_data) diff --git a/core/code_systems/tests.py b/core/code_systems/tests.py index f8f2f91a..17f6a174 100644 --- a/core/code_systems/tests.py +++ b/core/code_systems/tests.py @@ -345,7 +345,7 @@ def test_put_code_system_without_concepts(self): @patch('core.sources.models.index_source_mappings', Mock(__name__='index_source_mappings')) def test_post_code_system_with_concepts(self): response = self.client.post( - f'/users/{self.user.mnemonic}/CodeSystem/', + f'/users/{self.user.mnemonic}/CodeSystem', HTTP_AUTHORIZATION='Token ' + self.user_token, data={ 'url': 'http://localhost/url', diff --git a/core/code_systems/urls.py b/core/code_systems/urls.py index d9a10f2d..b290d6b2 100644 --- a/core/code_systems/urls.py +++ b/core/code_systems/urls.py @@ -5,6 +5,9 @@ urlpatterns = [ path('', views.CodeSystemListView.as_view(), name='code-system-list'), path('$lookup/', views.CodeSystemListLookupView.as_view(), name='code-system-list-lookup'), + path('$lookup', views.CodeSystemListLookupView.as_view(), name='code-system-list-lookup_no_slash'), path('$validate-code/', views.CodeSystemValidateCodeView.as_view(), name='code-system-validate-code'), - path("/", views.CodeSystemRetrieveUpdateView.as_view(), name='code-system-detail') + path('$validate-code', views.CodeSystemValidateCodeView.as_view(), name='code-system-validate-code_no_slash'), + path("/", views.CodeSystemRetrieveUpdateView.as_view(), name='code-system-detail'), + path("", views.CodeSystemRetrieveUpdateView.as_view(), name='code-system-detail_no_slash'), ] diff --git a/core/code_systems/views.py b/core/code_systems/views.py index 5c24d550..a03bd3ab 100644 --- a/core/code_systems/views.py +++ b/core/code_systems/views.py @@ -77,6 +77,9 @@ class CodeSystemListLookupView(ConceptRetrieveUpdateDestroyView): def is_container_version_specified(self): return True + def verify_scope(self): + pass + def get_queryset(self): queryset = super().get_queryset() code = self.request.query_params.get('code') diff --git a/core/concept_maps/serializers.py b/core/concept_maps/serializers.py index 3a9b591a..c7105bb2 100644 --- a/core/concept_maps/serializers.py +++ b/core/concept_maps/serializers.py @@ -156,7 +156,7 @@ def to_representation(self, instance): def create(self, validated_data): mappings = validated_data.pop('mappings', []) - uri = self.context['request'].path + validated_data['mnemonic'] + uri = '/'.join([self.context['request'].path.rstrip('/'), validated_data['mnemonic']]) ident = IdentifierSerializer.include_ocl_identifier(uri, RESOURCE_TYPE, validated_data) source = SourceCreateOrUpdateSerializer().prepare_object(validated_data) diff --git a/core/concept_maps/urls.py b/core/concept_maps/urls.py index 0ebfdab5..e3085973 100644 --- a/core/concept_maps/urls.py +++ b/core/concept_maps/urls.py @@ -4,6 +4,8 @@ urlpatterns = [ path('', views.ConceptMapListView.as_view(), name='concept-map-list'), - path('$translate', views.ConceptMapTranslateView.as_view(), name='concept-map-list-translate'), - path("/", views.ConceptMapRetrieveUpdateView.as_view(), name='concept-map-detail') + path('$translate/', views.ConceptMapTranslateView.as_view(), name='concept-map-list-translate'), + path('$translate', views.ConceptMapTranslateView.as_view(), name='concept-map-list-translate_no_slash'), + path("/", views.ConceptMapRetrieveUpdateView.as_view(), name='concept-map-detail'), + path("", views.ConceptMapRetrieveUpdateView.as_view(), name='concept-map-detail_no_slash') ] diff --git a/core/orgs/urls.py b/core/orgs/urls.py index d93ea39d..b023f3bb 100644 --- a/core/orgs/urls.py +++ b/core/orgs/urls.py @@ -22,8 +22,11 @@ path('/repos/', include('core.repos.urls'), name='org-repos-urls'), path('/sources/', include('core.sources.urls')), path('/CodeSystem/', include('core.code_systems.urls'), name='code_systems_urls'), + path('/CodeSystem', include('core.code_systems.urls'), name='code_systems_urls_no_slash'), path('/ValueSet/', include('core.value_sets.urls'), name='value_sets_urls'), + path('/ValueSet', include('core.value_sets.urls'), name='value_sets_urls_no_slash'), path('/ConceptMap/', include('core.concept_maps.urls'), name='concept_maps_urls'), + path('/ConceptMap', include('core.concept_maps.urls'), name='concept_maps_urls_no_slash'), path('/collections/', include('core.collections.urls')), path('/pins/', include('core.pins.urls')), path('/events/', include('core.events.urls')), diff --git a/core/urls.py b/core/urls.py index a8474e61..2086c15f 100644 --- a/core/urls.py +++ b/core/urls.py @@ -72,8 +72,11 @@ # TODO: require FHIR subdomain path('fhir/', include('core.fhir.urls'), name='fhir_urls'), path('fhir/CodeSystem/', include('core.code_systems.urls'), name='code_systems_urls'), + path('fhir/CodeSystem', include('core.code_systems.urls'), name='code_systems_urls_no_slash'), path('fhir/ValueSet/', include('core.value_sets.urls'), name='value_sets_urls'), + path('fhir/ValueSet', include('core.value_sets.urls'), name='value_sets_urls_no_slash'), path('fhir/ConceptMap/', include('core.concept_maps.urls'), name='concept_maps_urls'), + path('fhir/ConceptMap', include('core.concept_maps.urls'), name='concept_maps_urls_no_slash'), path('collections/', include('core.collections.urls'), name='collections_urls'), path('concepts/', concept_views.ConceptListView.as_view(), name='all_concepts_urls'), diff --git a/core/users/urls.py b/core/users/urls.py index 7ebd5fa9..34dc1bce 100644 --- a/core/users/urls.py +++ b/core/users/urls.py @@ -48,6 +48,9 @@ # TODO: require FHIR subdomain path('/CodeSystem/', include('core.code_systems.urls'), name='code_systems_urls'), + path('/CodeSystem', include('core.code_systems.urls'), name='code_systems_urls_no_slash'), path('/ValueSet/', include('core.value_sets.urls'), name='value_sets_urls'), + path('/ValueSet', include('core.value_sets.urls'), name='value_sets_urls_no_slash'), path('/ConceptMap/', include('core.concept_maps.urls'), name='concept_maps_urls'), + path('/ConceptMap', include('core.concept_maps.urls'), name='concept_maps_urls_no_slash'), ] diff --git a/core/value_sets/serializers.py b/core/value_sets/serializers.py index b9ce05d0..383aaf4c 100644 --- a/core/value_sets/serializers.py +++ b/core/value_sets/serializers.py @@ -165,7 +165,7 @@ class Meta: 'immutable', 'text', 'compose') def create(self, validated_data): - uri = self.context['request'].path + validated_data['mnemonic'] + uri = '/'.join([self.context['request'].path.rstrip('/'), validated_data['mnemonic']]) ident = IdentifierSerializer.include_ocl_identifier(uri, RESOURCE_TYPE, validated_data) collection = CollectionCreateOrUpdateSerializer().prepare_object(validated_data) collection_version = collection.version if collection.version != HEAD else '0.1' diff --git a/core/value_sets/urls.py b/core/value_sets/urls.py index 424a457a..f642c0ed 100644 --- a/core/value_sets/urls.py +++ b/core/value_sets/urls.py @@ -5,7 +5,12 @@ urlpatterns = [ path('', views.ValueSetListView.as_view(), name='value-set-list'), path("/$validate-code/", views.ValueSetValidateCodeView.as_view(), name='value-set-validate-code'), + path("/$validate-code", views.ValueSetValidateCodeView.as_view(), + name='value-set-validate-code_no_slash'), path("$validate-code/", views.ValueSetValidateCodeView.as_view(), name='value-set-validate-code-global'), - path("/$expand/", views.ValueSetExpandView.as_view(), name='value-set-validate-code'), + path("$validate-code", views.ValueSetValidateCodeView.as_view(), name='value-set-validate-code-global_no_slash'), + path("/$expand/", views.ValueSetExpandView.as_view(), name='value-set-expand'), + path("/$expand", views.ValueSetExpandView.as_view(), name='value-set-expand_no_slash'), path("/", views.ValueSetRetrieveUpdateView.as_view(), name='value-set-detail'), + path("", views.ValueSetRetrieveUpdateView.as_view(), name='value-set-detail_no_slash'), ]