88from api .models .eplant_soybean import Isoforms as EPlantSoybeanIsoforms
99from api .utils .bar_utils import BARUtils
1010from marshmallow import Schema , ValidationError , fields as marshmallow_fields
11- from api import cache , db
11+ from api import db
1212
1313
1414gene_information = Namespace ("Gene Information" , description = "Information about Genes" , path = "/gene_information" )
1515
1616# I think this is only needed for Swagger UI POST
17- gene_isoforms_request_fields = gene_information .model (
18- "GeneIsoforms " ,
17+ gene_information_request_fields = gene_information .model (
18+ "GeneInformation " ,
1919 {
2020 "species" : fields .String (required = True , example = "arabidopsis" ),
2121 "genes" : fields .List (
2828
2929
3030# Validation is done in a different way to keep things simple
31- class GeneIsoformsSchema (Schema ):
31+ class GeneInformationSchema (Schema ):
3232 species = marshmallow_fields .String (required = True )
3333 genes = marshmallow_fields .List (cls_or_instance = marshmallow_fields .String )
3434
3535
36- @gene_information .route ("/gene_alias " )
37- class GeneAliasList (Resource ):
38- def get ( self ):
39- """This end point returns the list of species available"""
40- species = [ "arabidopsis" ] # This are the only species available so far
41- return BARUtils . success_exit ( species )
42-
36+ @gene_information .route ("/gene_aliases " )
37+ class GeneAliases (Resource ):
38+ @ gene_information . expect ( gene_information_request_fields )
39+ def post ( self ):
40+ """This end point retrieves gene aliases for a large dataset"""
41+ json_data = request . get_json ( )
42+ data = {}
4343
44- @gene_information .route ("/gene_alias/<string:species>/<string:gene_id>" )
45- class GeneAlias (Resource ):
46- @gene_information .param ("species" , _in = "path" , default = "arabidopsis" )
47- @gene_information .param ("gene_id" , _in = "path" , default = "At3g24650" )
48- @cache .cached ()
49- def get (self , species = "" , gene_id = "" ):
50- """This end point provides gene alias given a gene ID."""
51- aliases = []
44+ # Validate json
45+ try :
46+ json_data = GeneInformationSchema ().load (json_data )
47+ except ValidationError as err :
48+ return BARUtils .error_exit (err .messages ), 400
5249
53- # Escape input
54- species = escape (species )
55- gene_id = escape (gene_id )
50+ genes = json_data ["genes" ]
51+ species = json_data ["species" ]
5652
53+ # Set species and check gene ID format
5754 if species == "arabidopsis" :
58- if BARUtils .is_arabidopsis_gene_valid (gene_id ):
59- rows = db .session .execute (db .select (AgiAlias ).where (AgiAlias .agi == gene_id )).scalars ().all ()
60- [aliases .append (row .alias ) for row in rows ]
61- else :
62- return BARUtils .error_exit ("Invalid gene id" ), 400
55+ database = AgiAlias
56+
57+ # Check if gene is valid
58+ for gene in genes :
59+ if not BARUtils .is_arabidopsis_gene_valid (gene ):
60+ return BARUtils .error_exit ("Invalid gene id" ), 400
61+
6362 else :
64- return BARUtils .error_exit ("No data for the given species" )
63+ return BARUtils .error_exit ("Invalid species" ), 400
64+
65+ # Query must be run individually for each species
66+ rows = db .session .execute (db .select (database ).where (database .agi .in_ (genes ))).scalars ().all ()
67+
68+ # If there are any isoforms found, return data
69+ data = []
70+ data_items = {}
71+
72+ if len (rows ) > 0 :
73+ for row in rows :
74+ if row .agi in data_items .keys ():
75+ data_items [row .agi ].append (row .agi )
76+ else :
77+ data_items [row .agi ] = []
78+ data_items [row .agi ].append (row .alias )
79+
80+ for gene in data_items .keys ():
81+ data .append ({"gene" : gene , "aliases" : data_items [gene ]})
82+
83+ return BARUtils .success_exit (data )
6584
66- # Return results if there are data
67- if len (aliases ) > 0 :
68- return BARUtils .success_exit (aliases )
6985 else :
70- return BARUtils .error_exit ("There are no data found for the given gene" )
86+ return BARUtils .error_exit ("No data for the given species/genes" ), 400
7187
7288
7389@gene_information .route ("/gene_isoforms/<string:species>/<string:gene_id>" )
@@ -126,7 +142,7 @@ def get(self, species="", gene_id=""):
126142
127143@gene_information .route ("/gene_isoforms/" )
128144class PostGeneIsoforms (Resource ):
129- @gene_information .expect (gene_isoforms_request_fields )
145+ @gene_information .expect (gene_information_request_fields )
130146 def post (self ):
131147 """This end point returns gene isoforms data for a multiple genes for a species.
132148 Only genes/isoforms with pdb structures are returned"""
@@ -136,7 +152,7 @@ def post(self):
136152
137153 # Validate json
138154 try :
139- json_data = GeneIsoformsSchema ().load (json_data )
155+ json_data = GeneInformationSchema ().load (json_data )
140156 except ValidationError as err :
141157 return BARUtils .error_exit (err .messages ), 400
142158
0 commit comments