From 0786eb89b87037a1ba040b710247c707aa7bbfed Mon Sep 17 00:00:00 2001 From: dglemos Date: Fri, 13 Mar 2026 13:51:23 +0000 Subject: [PATCH] Delete GenCCSubmission model and associated code --- .../migrations/0018_delete_genccsubmission.py | 16 ++ .../gene2phenotype_app/models.py | 34 ---- .../serializers/__init__.py | 2 - .../serializers/gencc_submission.py | 161 ------------------ .../gene2phenotype_app/urls.py | 19 --- .../gene2phenotype_app/views/__init__.py | 7 - .../views/gencc_submission.py | 85 --------- 7 files changed, 16 insertions(+), 308 deletions(-) create mode 100644 gene2phenotype_project/gene2phenotype_app/migrations/0018_delete_genccsubmission.py delete mode 100644 gene2phenotype_project/gene2phenotype_app/serializers/gencc_submission.py delete mode 100644 gene2phenotype_project/gene2phenotype_app/views/gencc_submission.py diff --git a/gene2phenotype_project/gene2phenotype_app/migrations/0018_delete_genccsubmission.py b/gene2phenotype_project/gene2phenotype_app/migrations/0018_delete_genccsubmission.py new file mode 100644 index 00000000..624f46d9 --- /dev/null +++ b/gene2phenotype_project/gene2phenotype_app/migrations/0018_delete_genccsubmission.py @@ -0,0 +1,16 @@ +# Generated by Django 5.2.11 on 2026-03-13 13:48 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("gene2phenotype_app", "0017_create_new_user_group"), + ] + + operations = [ + migrations.DeleteModel( + name="GenCCSubmission", + ), + ] diff --git a/gene2phenotype_project/gene2phenotype_app/models.py b/gene2phenotype_project/gene2phenotype_app/models.py index 74405093..05ddd6b0 100644 --- a/gene2phenotype_project/gene2phenotype_app/models.py +++ b/gene2phenotype_project/gene2phenotype_app/models.py @@ -816,40 +816,6 @@ class Meta: ] -### Table to keep track of GenCC submissions ### -class GenCCSubmission(models.Model): - """ - Store the info when the record was submitted to GenCC. - - id: primary key - - submission_id: genCC ID associated with the G2P record - - old_g2p_id: internal G2P ID in the old system (only relevant for submissions with the old data) - - g2p_stable_id: new G2P stable ID - - date_of_submission: date when record was submitted to GenCC - - type_of_submission: 'create' if we submitted a new G2P record to GenCC or 'update' if we updated an existing G2P record in GenCC - """ - - SUBMISSION_CHOICES = [ - ("create", "Create"), - ("update", "Update"), - ] - id = models.AutoField(primary_key=True) - submission_id = models.CharField(max_length=64) - old_g2p_id = models.IntegerField(null=True, default=False) - g2p_stable_id = models.ForeignKey( - "G2PStableID", on_delete=models.PROTECT, db_column="g2p_stable_id" - ) - date_of_submission = models.DateField(null=False) - type_of_submission = models.CharField( - max_length=50, choices=SUBMISSION_CHOICES, default="create" - ) - - class Meta: - db_table = "gencc_submission" - - -################### - - ### Legacy data ### class Organ(models.Model): id = models.AutoField(primary_key=True) diff --git a/gene2phenotype_project/gene2phenotype_app/serializers/__init__.py b/gene2phenotype_project/gene2phenotype_app/serializers/__init__.py index 83d39432..8f0c0bd4 100644 --- a/gene2phenotype_project/gene2phenotype_app/serializers/__init__.py +++ b/gene2phenotype_project/gene2phenotype_app/serializers/__init__.py @@ -62,8 +62,6 @@ from .meta import MetaSerializer -from .gencc_submission import CreateGenCCSubmissionSerializer, GenCCSubmissionSerializer - from .mined_publication import ( LGDMinedPublicationSerializer, LGDMinedPublicationListSerializer, diff --git a/gene2phenotype_project/gene2phenotype_app/serializers/gencc_submission.py b/gene2phenotype_project/gene2phenotype_app/serializers/gencc_submission.py deleted file mode 100644 index 16aa3402..00000000 --- a/gene2phenotype_project/gene2phenotype_app/serializers/gencc_submission.py +++ /dev/null @@ -1,161 +0,0 @@ -from typing import Any -from rest_framework import serializers -from django.db.models import OuterRef, Exists, Max, F, Subquery -from django.db.models.query import QuerySet -from django.core.exceptions import ObjectDoesNotExist - -from ..models import ( - GenCCSubmission, - G2PStableID, - LocusGenotypeDisease, - LGDPanel, -) - - -class GenCCSubmissionListSerializer(serializers.ListSerializer): - def validate(self, data: list) -> list: - """ - Method to validate multiple GenCCSubmission objects - - Args: - data (list): The list data - - Raises: - serializers.ValidationError: If G2P stable id does not exist - - Returns: - list: Returns the validated list - """ - for item in data: - stable_id_value = item.get("g2p_stable_id") - try: - g2p_stable = G2PStableID.objects.get(stable_id=stable_id_value) - except ObjectDoesNotExist: - raise serializers.ValidationError( - f"G2PStableID with stable_id '{stable_id_value}' does not exist." - ) - item["g2p_stable_id"] = g2p_stable - - return data - - def create(self, validated_data: list) -> list[GenCCSubmission]: - """ - Method to create multiple GenCCSubmission objects - - Args: - validated_data (list): list of validated data - - Returns: - GenCCSubmission: list of created GenCCSubmission objects - """ - instances = [GenCCSubmission(**item) for item in validated_data] - return GenCCSubmission.objects.bulk_create(instances) - - -class CreateGenCCSubmissionSerializer(serializers.ModelSerializer): - g2p_stable_id = serializers.CharField() - - def create(self, validated_data: dict[str, Any]) -> GenCCSubmission: - """Create the GenCCSubmission - - Args: - validated_data (dict[str, Any]): Validated data - - Returns: - GenCCSubmission: A created GenCCSubmission object - """ - return GenCCSubmission.objects.create(**validated_data) - - class Meta: - model = GenCCSubmission - fields = [ - "submission_id", - "date_of_submission", - "type_of_submission", - "g2p_stable_id", - ] - list_serializer_class = GenCCSubmissionListSerializer - - -class GenCCSubmissionSerializer(serializers.ModelSerializer): - @staticmethod - def fetch_list_of_unsubmitted_stable_id() -> QuerySet[G2PStableID]: - """ - Fetch list of unsubmitted G2P ids by comparing the IDs from the gencc_submission table. - Only returns live stable IDs whose records are in public panels. - - Returns: - QuerySet[G2PStableID]: A queryset - """ - public_records = LGDPanel.objects.filter(panel__is_visible=True).values_list( - "lgd_id__stable_id", flat=True - ) - - return G2PStableID.objects.annotate( - has_submission=Exists( - GenCCSubmission.objects.filter(g2p_stable_id=OuterRef("id")) - ) - ).filter(has_submission=False, is_live=True, id__in=public_records) - - @staticmethod - def fetch_list_of_deleted_stable_id() -> dict[str, str]: - """ - Fetch list of records that have been submitted to GenCC but are now deleted. - - Returns: - dict[str, str]: Dictionary with stable_id as key and submission_id as value - """ - final_list = {} - - deleted_records_queryset = GenCCSubmission.objects.filter( - g2p_stable_id__is_live=False - ).values( - "g2p_stable_id__stable_id", - "submission_id", - ) - - for record in deleted_records_queryset: - final_list[record["g2p_stable_id__stable_id"]] = record["submission_id"] - - return final_list - - @staticmethod - def fetch_stable_ids_with_later_review_date() -> dict[str, str]: - """Fetches the records that has been updated since the last GenCC submission""" - final_list = {} - - latest_submission_date = ( - GenCCSubmission.objects.filter(g2p_stable_id=OuterRef("g2p_stable_id")) - .order_by() - .values("g2p_stable_id") - .annotate(latest=Max("date_of_submission")) - .values("latest")[:1] - ) - - queryset = ( - GenCCSubmission.objects.annotate( - latest_date=Subquery(latest_submission_date) - ) - .filter( - g2p_stable_id__is_live=True, - date_of_submission=F("latest_date"), - ) - .annotate( - has_new_review=Exists( - LocusGenotypeDisease.objects.filter( - stable_id=OuterRef("g2p_stable_id_id"), - date_review__gt=OuterRef("date_of_submission"), - ) - ) - ) - .filter(has_new_review=True) - .values( - "g2p_stable_id__stable_id", - "submission_id", - ) - ) - - for record in queryset: - final_list[record["g2p_stable_id__stable_id"]] = record["submission_id"] - - return final_list diff --git a/gene2phenotype_project/gene2phenotype_app/urls.py b/gene2phenotype_project/gene2phenotype_app/urls.py index 388d662c..e852ea99 100644 --- a/gene2phenotype_project/gene2phenotype_app/urls.py +++ b/gene2phenotype_project/gene2phenotype_app/urls.py @@ -254,25 +254,6 @@ def perform_create(self, serializer): path("create/panel/", views.PanelCreateView.as_view(), name="panel_create"), ### Meta information ### path("reference_data/", views.MetaView.as_view(), name="get_reference_data"), - ### GenCC submission  ### - path( - "gencc_create/", views.GenCCSubmissionCreateView.as_view(), name="create_gencc" - ), - path( - "unsubmitted_stable_ids/", - views.GenCCSubmissionView.as_view(), - name="unsubmitted_stable_ids", - ), - path( - "later_review_date/", - views.StableIDsWithLaterReviewDateView.as_view(), - name="later_review_date", - ), - path( - "gencc_deleted_records/", - views.GenCCDeletedRecords.as_view(), - name="gencc_deleted_records", - ), ### Activity logs ### path("activity_logs/", views.ActivityLogs.as_view(), name="activity_logs"), ] diff --git a/gene2phenotype_project/gene2phenotype_app/views/__init__.py b/gene2phenotype_project/gene2phenotype_app/views/__init__.py index 12d43cb9..5a600387 100644 --- a/gene2phenotype_project/gene2phenotype_app/views/__init__.py +++ b/gene2phenotype_project/gene2phenotype_app/views/__init__.py @@ -77,13 +77,6 @@ MergeRecords, ) -from .gencc_submission import ( - GenCCSubmissionCreateView, - GenCCSubmissionView, - StableIDsWithLaterReviewDateView, - GenCCDeletedRecords, -) - from .phenotype import ( AddPhenotype, PhenotypeDetail, diff --git a/gene2phenotype_project/gene2phenotype_app/views/gencc_submission.py b/gene2phenotype_project/gene2phenotype_app/views/gencc_submission.py deleted file mode 100644 index e31162b2..00000000 --- a/gene2phenotype_project/gene2phenotype_app/views/gencc_submission.py +++ /dev/null @@ -1,85 +0,0 @@ -from rest_framework.views import APIView -from rest_framework.response import Response -from rest_framework import generics, permissions -from rest_framework import status -from drf_spectacular.utils import extend_schema -from rest_framework.request import Request - -from gene2phenotype_app.serializers import ( - GenCCSubmissionSerializer, - G2PStableIDSerializer, - CreateGenCCSubmissionSerializer, -) - - -@extend_schema(exclude=True) -class GenCCSubmissionCreateView(generics.CreateAPIView): - serializer_class = CreateGenCCSubmissionSerializer - permission_classes = [permissions.IsAuthenticated] - - def post(self, request: Request) -> Response: - """ - Create one or more GenCC submissions. - - Args: - request (Request): The incoming request containing a list of GenCC submission objects. - - Returns: - Response: Empty body with HTTP 201 status if creation succeeds. - """ - serializer = CreateGenCCSubmissionSerializer(data=request.data, many=True) - serializer.is_valid(raise_exception=True) - serializer.save() - return Response(status=status.HTTP_201_CREATED) - - -@extend_schema(exclude=True) -class GenCCSubmissionView(APIView): - def get(self, request: Request) -> Response: - """ - Retrieve G2P IDs that have not yet been submitted to GenCC. - - Returns: - Response: A JSON list of id strings. - """ - unused_ids = GenCCSubmissionSerializer.fetch_list_of_unsubmitted_stable_id() - serializer = G2PStableIDSerializer(unused_ids, many=True) - stable_ids = [entry["stable_id"] for entry in serializer.data] - return Response(stable_ids, status=status.HTTP_200_OK) - - -@extend_schema(exclude=True) -class GenCCDeletedRecords(APIView): - def get(self, request: Request) -> Response: - """ - Gets the records that have been submitted to GenCC but are now deleted in G2P. - - Returns: - Response: Response object containing - - ids: dict with stable_id as key and submission_id as value - - count: number of IDs - """ - deleted_ids = GenCCSubmissionSerializer.fetch_list_of_deleted_stable_id() - return Response( - {"ids": deleted_ids, "count": len(deleted_ids)}, - status=status.HTTP_200_OK, - ) - - -@extend_schema(exclude=True) -class StableIDsWithLaterReviewDateView(APIView): - def get(self, request: Request) -> Response: - """ - Fetches records that have been updated in G2P since the last GenCC submission. - It returns the GenCC ID used for the G2P submission and the G2P ID. - - Returns: - Response: Response object containing - - ids: dict with stable_id as key and submission_id as value - - count: number of IDs - """ - stable_ids = GenCCSubmissionSerializer.fetch_stable_ids_with_later_review_date() - return Response( - {"ids": stable_ids, "count": len(list(stable_ids))}, - status=status.HTTP_200_OK, - )