99from api .models .eplant_soybean import Isoforms as EPlantSoybeanIsoforms
1010from api .utils .bar_utils import BARUtils
1111from marshmallow import Schema , ValidationError , fields as marshmallow_fields
12- from api import cache , db
12+ from api import db
1313
1414
1515gene_information = Namespace ("Gene Information" , description = "Information about Genes" , path = "/gene_information" )
1616
1717# I think this is only needed for Swagger UI POST
18- gene_isoforms_request_fields = gene_information .model (
19- "GeneIsoforms " ,
18+ gene_information_request_fields = gene_information .model (
19+ "GeneInformation " ,
2020 {
2121 "species" : fields .String (required = True , example = "arabidopsis" ),
2222 "genes" : fields .List (
2929
3030
3131# Validation is done in a different way to keep things simple
32- class GeneIsoformsSchema (Schema ):
32+ class GeneInformationSchema (Schema ):
3333 species = marshmallow_fields .String (required = True )
3434 genes = marshmallow_fields .List (cls_or_instance = marshmallow_fields .String )
3535
3636
37- @gene_information .route ("/gene_alias " )
38- class GeneAliasList (Resource ):
39- def get ( self ):
40- """This end point returns the list of species available"""
41- species = [ "arabidopsis" ] # This are the only species available so far
42- return BARUtils . success_exit ( species )
43-
37+ @gene_information .route ("/gene_aliases " )
38+ class GeneAliases (Resource ):
39+ @ gene_information . expect ( gene_information_request_fields )
40+ def post ( self ):
41+ """This end point retrieves gene aliases for a large dataset"""
42+ json_data = request . get_json ( )
43+ data = {}
4444
45- @gene_information .route ("/gene_alias/<string:species>/<string:gene_id>" )
46- class GeneAlias (Resource ):
47- @gene_information .param ("species" , _in = "path" , default = "arabidopsis" )
48- @gene_information .param ("gene_id" , _in = "path" , default = "At3g24650" )
49- @cache .cached ()
50- def get (self , species = "" , gene_id = "" ):
51- """This end point provides gene alias given a gene ID."""
52- aliases = []
45+ # Validate json
46+ try :
47+ json_data = GeneInformationSchema ().load (json_data )
48+ except ValidationError as err :
49+ return BARUtils .error_exit (err .messages ), 400
5350
54- # Escape input
55- species = escape (species )
56- gene_id = escape (gene_id )
51+ genes = json_data ["genes" ]
52+ species = json_data ["species" ]
5753
54+ # Set species and check gene ID format
5855 if species == "arabidopsis" :
59- if BARUtils .is_arabidopsis_gene_valid (gene_id ):
60- rows = db .session .execute (db .select (AgiAlias ).where (AgiAlias .agi == gene_id )).scalars ().all ()
61- [aliases .append (row .alias ) for row in rows ]
62- else :
63- return BARUtils .error_exit ("Invalid gene id" ), 400
56+ database = AgiAlias
57+
58+ # Check if gene is valid
59+ for gene in genes :
60+ if not BARUtils .is_arabidopsis_gene_valid (gene ):
61+ return BARUtils .error_exit ("Invalid gene id" ), 400
62+
6463 else :
65- return BARUtils .error_exit ("No data for the given species" )
64+ return BARUtils .error_exit ("Invalid species" ), 400
65+
66+ # Query must be run individually for each species
67+ rows = db .session .execute (db .select (database ).where (database .agi .in_ (genes ))).scalars ().all ()
68+
69+ # If there are any isoforms found, return data
70+ data = []
71+ data_items = {}
72+
73+ if len (rows ) > 0 :
74+ for row in rows :
75+ if row .agi in data_items .keys ():
76+ data_items [row .agi ].append (row .agi )
77+ else :
78+ data_items [row .agi ] = []
79+ data_items [row .agi ].append (row .alias )
80+
81+ for gene in data_items .keys ():
82+ data .append ({"gene" : gene , "aliases" : data_items [gene ]})
83+
84+ return BARUtils .success_exit (data )
6685
67- # Return results if there are data
68- if len (aliases ) > 0 :
69- return BARUtils .success_exit (aliases )
7086 else :
71- return BARUtils .error_exit ("There are no data found for the given gene" )
87+ return BARUtils .error_exit ("No data for the given species/genes" ), 400
7288
7389
7490@gene_information .route ("/gene_publications/<string:species>/<string:gene_id>" )
@@ -166,7 +182,7 @@ def get(self, species="", gene_id=""):
166182
167183@gene_information .route ("/gene_isoforms/" )
168184class PostGeneIsoforms (Resource ):
169- @gene_information .expect (gene_isoforms_request_fields )
185+ @gene_information .expect (gene_information_request_fields )
170186 def post (self ):
171187 """This end point returns gene isoforms data for a multiple genes for a species.
172188 Only genes/isoforms with pdb structures are returned"""
@@ -176,7 +192,7 @@ def post(self):
176192
177193 # Validate json
178194 try :
179- json_data = GeneIsoformsSchema ().load (json_data )
195+ json_data = GeneInformationSchema ().load (json_data )
180196 except ValidationError as err :
181197 return BARUtils .error_exit (err .messages ), 400
182198
0 commit comments