Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion applications/composer/backend/composer/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
PopulationSet,
ConnectivityStatement,
Provenance,
ExpertConsultant,
ExportBatch,
Note,
Profile,
Expand Down Expand Up @@ -64,6 +65,11 @@ class ProvenanceInline(admin.StackedInline):
extra = 1


class ExpertConsultantInline(admin.StackedInline):
model = ExpertConsultant
extra = 1


class SynonymInline(admin.StackedInline):
model = Synonym
extra = 1
Expand Down Expand Up @@ -309,7 +315,7 @@ class ConnectivityStatementAdmin(

fieldsets = ()

inlines = (ProvenanceInline, NoteConnectivityStatementInline,
inlines = (ProvenanceInline, ExpertConsultantInline, NoteConnectivityStatementInline,
ViaInline, DestinationInline, StatementAlertInline, ConnectivityStatementTripleInline)

def _filter_admin_transitions(self, transitions_generator):
Expand Down
19 changes: 19 additions & 0 deletions applications/composer/backend/composer/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
Sex,
ConnectivityStatement,
Provenance,
ExpertConsultant,
Note,
Profile,
Sentence,
Expand Down Expand Up @@ -380,6 +381,22 @@ class ProvenanceCreateSerializer(serializers.Serializer):
uri = serializers.CharField(required=True)


class ExpertConsultantSerializer(serializers.ModelSerializer):
"""Expert Consultant"""

uri = serializers.CharField()
connectivity_statement_id = serializers.IntegerField(required=True)

class Meta:
model = ExpertConsultant
fields = ("id", "uri", "connectivity_statement_id")


class ExpertConsultantCreateSerializer(serializers.Serializer):
"""Serializer for creating expert consultant via request body"""
uri = serializers.CharField(required=True)


class SentenceConnectivityStatement(serializers.ModelSerializer):
"""Connectivity Statement"""

Expand Down Expand Up @@ -734,6 +751,7 @@ class ConnectivityStatementSerializer(BaseConnectivityStatementSerializer):
population_id = serializers.IntegerField(required=False, allow_null=True)
species = SpecieSerializer(many=True, read_only=False, required=False)
provenances = ProvenanceSerializer(source="provenance_set", many=True, read_only=False, required=False)
expert_consultants = ExpertConsultantSerializer(source="expertconsultant_set", many=True, read_only=False, required=False)
origins = AnatomicalEntitySerializer(many=True, required=False)
vias = ViaSerializerDetails(source="via_set", many=True, read_only=False, required=False)
destinations = DestinationSerializerDetails(many=True, required=False)
Expand Down Expand Up @@ -831,6 +849,7 @@ class Meta(BaseConnectivityStatementSerializer.Meta):
"knowledge_statement",
"tags",
"provenances",
"expert_consultants",
"owner",
"owner_id",
"state",
Expand Down
64 changes: 57 additions & 7 deletions applications/composer/backend/composer/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@
ViaSerializer,
ProvenanceSerializer,
ProvenanceCreateSerializer,
ExpertConsultantSerializer,
ExpertConsultantCreateSerializer,
SexSerializer,
PopulationSetSerializer,
ConnectivityStatementUpdateSerializer,
Expand All @@ -73,7 +75,6 @@
)
from ..models import (
AlertType,
AnatomicalEntityMeta,
AnatomicalEntity,
Phenotype,
ProjectionPhenotype,
Expand All @@ -87,6 +88,7 @@
Tag,
Via,
Provenance,
ExpertConsultant,
Sex,
PopulationSet,
Destination,
Expand Down Expand Up @@ -122,7 +124,7 @@ class TagMixin(viewsets.GenericViewSet):
],
request=None,
)
@action(detail=True, methods=["post"], url_path="add_tag/(?P<tag_id>\w+)")
@action(detail=True, methods=["post"], url_path=r"add_tag/(?P<tag_id>\w+)")
def add_tag(self, request, pk=None, tag_id=None):
instance = self.get_object()
tag_instance = Tag.objects.get(id=tag_id)
Expand All @@ -140,7 +142,7 @@ def add_tag(self, request, pk=None, tag_id=None):
],
request=None,
)
@action(detail=True, methods=["post"], url_path="del_tag/(?P<tag_id>\w+)")
@action(detail=True, methods=["post"], url_path=r"del_tag/(?P<tag_id>\w+)")
def del_tag(self, request, pk=None, tag_id=None):
instance = self.get_object()
tag_instance = Tag.objects.get(id=tag_id)
Expand Down Expand Up @@ -182,7 +184,7 @@ def add_provenance(self, request, pk=None):
@action(
detail=True,
methods=["delete"],
url_path="del_provenance/(?P<provenance_id>\d+)",
url_path=r"del_provenance/(?P<provenance_id>\d+)",
)
def del_provenance(self, request, pk=None, provenance_id=None):
count, deleted = Provenance.objects.filter(
Expand All @@ -194,6 +196,52 @@ def del_provenance(self, request, pk=None, provenance_id=None):
return Response(self.get_serializer(instance).data)


class ExpertConsultantMixin(
viewsets.GenericViewSet,
):
@extend_schema(
request=ExpertConsultantCreateSerializer,
responses={200: "ConnectivityStatement updated successfully"},
)
@action(detail=True, methods=["post"], url_path="add_expert_consultant")
def add_expert_consultant(self, request, pk=None):
serializer = ExpertConsultantCreateSerializer(data=request.data)
serializer.is_valid(raise_exception=True)

uri = serializer.validated_data['uri']
expert_consultant, created = ExpertConsultant.objects.get_or_create(
connectivity_statement_id=pk,
uri=uri,
)
instance = self.get_object()
return Response(self.get_serializer(instance).data)

@extend_schema(
parameters=[
OpenApiParameter(
"expert_consultant_id",
OpenApiTypes.INT,
location=OpenApiParameter.PATH,
required=True,
)
],
request=None,
)
@action(
detail=True,
methods=["delete"],
url_path=r"del_expert_consultant/(?P<expert_consultant_id>\d+)",
)
def del_expert_consultant(self, request, pk=None, expert_consultant_id=None):
count, deleted = ExpertConsultant.objects.filter(
id=expert_consultant_id, connectivity_statement_id=pk
).delete()
if count == 0:
raise Http404
instance = self.get_object()
return Response(self.get_serializer(instance).data)


class SpecieMixin(
viewsets.GenericViewSet,
):
Expand All @@ -208,7 +256,7 @@ class SpecieMixin(
],
request=None,
)
@action(detail=True, methods=["post"], url_path="add_specie/(?P<specie_id>\w+)")
@action(detail=True, methods=["post"], url_path=r"add_specie/(?P<specie_id>\w+)")
def add_specie(self, request, pk=None, specie_id=None):
instance = self.get_object()
specie_instance = Specie.objects.get(id=specie_id)
Expand All @@ -226,7 +274,7 @@ def add_specie(self, request, pk=None, specie_id=None):
],
request=None,
)
@action(detail=True, methods=["post"], url_path="del_specie/(?P<specie_id>\w+)")
@action(detail=True, methods=["post"], url_path=r"del_specie/(?P<specie_id>\w+)")
def del_specie(self, request, pk=None, specie_id=None):
instance = self.get_object()
specie_instance = Specie.objects.get(id=specie_id)
Expand All @@ -235,7 +283,7 @@ def del_specie(self, request, pk=None, specie_id=None):


class TransitionMixin(viewsets.GenericViewSet):
@action(detail=True, methods=["post"], url_path="do_transition/(?P<transition>\w+)")
@action(detail=True, methods=["post"], url_path=r"do_transition/(?P<transition>\w+)")
def transition(self, request, pk=None, transition=None):
instance = self.service(self.get_object()).do_transition(
transition, user=request.user, request=request
Expand Down Expand Up @@ -503,6 +551,7 @@ class AlertTypeViewSet(viewsets.ReadOnlyModelViewSet):

class ConnectivityStatementViewSet(
ProvenanceMixin,
ExpertConsultantMixin,
SpecieMixin,
TagMixin,
TransitionMixin,
Expand Down Expand Up @@ -852,6 +901,7 @@ def jsonschemas(request):
DestinationSerializer,
TagSerializer,
ProvenanceSerializer,
ExpertConsultantSerializer,
SpecieSerializer,
NoteSerializer,
StatementAlertSerializer,
Expand Down
Loading