|
| 1 | +from apps.fhir.bluebutton.views.generic import FhirDataView |
| 2 | +from apps.fhir.bluebutton.permissions import (SearchCrosswalkPermission, |
| 3 | + ResourcePermission, |
| 4 | + ApplicationActivePermission) |
| 5 | +from apps.authorization.permissions import DataAccessGrantPermission |
| 6 | +from apps.capabilities.permissions import TokenHasProtectedCapability |
| 7 | + |
| 8 | +from rest_framework import permissions |
| 9 | + |
| 10 | + |
| 11 | +class HasDigitalInsuranceCardScope(permissions.BasePermission): |
| 12 | + def has_permission(self, request, view): |
| 13 | + required_scopes = getattr(view, 'required_scopes', None) |
| 14 | + if required_scopes is None: |
| 15 | + return True |
| 16 | + |
| 17 | + if hasattr(request, 'auth') and request.auth is not None: |
| 18 | + token_scopes = request.auth.scope |
| 19 | + return any(scope in token_scopes for scope in required_scopes) |
| 20 | + return False |
| 21 | + |
| 22 | + |
| 23 | +class DigitalInsuranceCardReadView(FhirDataView): |
| 24 | + '''Digital Insurance Card view for handling BFD Endpoint''' |
| 25 | + |
| 26 | + permission_classes = [ |
| 27 | + permissions.IsAuthenticated, |
| 28 | + ApplicationActivePermission, |
| 29 | + ResourcePermission, |
| 30 | + SearchCrosswalkPermission, |
| 31 | + DataAccessGrantPermission, |
| 32 | + TokenHasProtectedCapability, |
| 33 | + HasDigitalInsuranceCardScope, |
| 34 | + ] |
| 35 | + |
| 36 | + def __init__(self, version=1): |
| 37 | + super().__init__(version) |
| 38 | + self.resource_type = 'Bundle' |
| 39 | + |
| 40 | + def has_permission(self, request, view): |
| 41 | + required_scopes = getattr(view, 'required_scopes', None) |
| 42 | + if required_scopes is None: |
| 43 | + return False |
| 44 | + return request.user.is_authenticated and hasattr(request.user, 'crosswalk') |
| 45 | + |
| 46 | + def build_parameters(self, request): |
| 47 | + patient_id = request.query_params.get('patient', None) |
| 48 | + if not patient_id: |
| 49 | + patient_id = request.user.crosswalk.fhir_id |
| 50 | + return { |
| 51 | + "_format": "json" |
| 52 | + } |
| 53 | + |
| 54 | + def build_url(self, resource_router, resource_type, resource_id, **kwargs): |
| 55 | + if resource_router.fhir_url.endswith('v1/fhir/'): |
| 56 | + # only if called by tests |
| 57 | + return "{}{}/{}/".format(resource_router.fhir_url, resource_type, resource_id) |
| 58 | + else: |
| 59 | + if self.version == 3 and resource_router.fhir_url_v3: |
| 60 | + fhir_url = resource_router.fhir_url_v3 |
| 61 | + else: |
| 62 | + fhir_url = resource_router.fhir_url |
| 63 | + return f"{fhir_url}/v{self.version}/fhir/{resource_type}/{resource_id}/" |
0 commit comments