Mercurial > repos > eric-rasche > apollo
diff webapollo.py @ 3:d4ae83dedb14 draft
planemo upload for repository https://github.com/TAMU-CPT/galaxy-webapollo commit 4ac38d0b6dba1183f3e78eb5c224c7051064b4a5
author | eric-rasche |
---|---|
date | Thu, 12 Jan 2017 11:52:28 -0500 |
parents | 6002cc0df04e |
children | 7610987e0c48 |
line wrap: on
line diff
--- a/webapollo.py Tue May 03 13:48:11 2016 -0400 +++ b/webapollo.py Thu Jan 12 11:52:28 2017 -0500 @@ -1,13 +1,79 @@ import requests import json +import os import collections -from BCBio import GFF import StringIO import logging +from BCBio import GFF +from Bio import SeqIO logging.getLogger("requests").setLevel(logging.CRITICAL) log = logging.getLogger() +def WAAuth(parser): + parser.add_argument('apollo', help='Complete Apollo URL') + parser.add_argument('username', help='WA Username') + parser.add_argument('password', help='WA Password') + parser.add_argument('--remote_user', default='', help='If set, ignore password, set the header with the name supplied to this argument to the value of email') + + +def OrgOrGuess(parser): + parser.add_argument('--org_json', type=file, help='Apollo JSON output, source for common name') + parser.add_argument('--org_raw', help='Common Name') + parser.add_argument('--org_id', help='Organism ID') + + +def CnOrGuess(parser): + OrgOrGuess(parser) + parser.add_argument('--seq_fasta', type=file, help='Fasta file, IDs used as sequence sources') + parser.add_argument('--seq_raw', nargs='*', help='Sequence Names') + + +def GuessOrg(args, wa): + if args.org_json: + orgs = [x.get('commonName', None) + for x in json.load(args.org_json)] + orgs = [x for x in orgs if x is not None] + return orgs + elif args.org_raw: + org = args.org_raw.strip() + if len(org) > 0: + return [org] + else: + raise Exception("Organism Common Name not provided") + elif args.org_id: + return [wa.organisms.findOrganismById(args.org_id).get('commonName', None)] + else: + raise Exception("Organism Common Name not provided") + + +def GuessCn(args, wa): + org = GuessOrg(args, wa) + seqs = [] + if args.seq_fasta: + # If we have a fasta, pull all rec ids from that. + for rec in SeqIO.parse(args.seq_fasta, 'fasta'): + seqs.append(rec.id) + elif args.seq_raw: + # Otherwise raw list. + seqs = [x.strip() for x in args.seq_raw if len(x.strip()) > 0] + + return org, seqs + + +def AssertUser(user_list): + if len(user_list) == 0: + raise Exception("Unknown user. Please register first") + else: + return user_list[0] + + +def AssertAdmin(user): + if user.role == 'ADMIN': + return True + else: + raise Exception("User is not an administrator. Permission denied") + class WebApolloInstance(object): @@ -53,7 +119,6 @@ self.__props = kwargs.keys() - def isAdmin(self): if hasattr(self, 'role'): return self.role == self.ROLE_ADMIN @@ -100,9 +165,9 @@ }) r = requests.post(url, data=json.dumps(data), headers=headers, - verify=self.__verify, params=post_params, **self._requestArgs) + verify=self.__verify, params=post_params, allow_redirects=False, **self._requestArgs) - if r.status_code == 200: + if r.status_code == 200 or r.status_code == 302: if isJson: d = r.json() if 'username' in d: @@ -146,7 +211,9 @@ CLIENT_BASE = '/annotationEditor/' def _update_data(self, data): - if not hasattr(self, '_extra_data'): raise Exception("Please call setSequence first") + if not hasattr(self, '_extra_data'): + raise Exception("Please call setSequence first") + data.update(self._extra_data) return data @@ -399,7 +466,7 @@ return self.request('getOrganismPermissionsForGroup', data) def loadGroups(self, group=None): - data ={} + data = {} if group is not None: data['groupId'] = group.groupId @@ -517,6 +584,14 @@ else: return orgs[0] + def findOrganismById(self, id_number): + orgs = self.findAllOrganisms() + orgs = [x for x in orgs if str(x['id']) == str(id_number)] + if len(orgs) == 0: + raise Exception("Unknown ID") + else: + return orgs[0] + def deleteOrganism(self, organismId): return self.request('deleteOrganism', {'id': organismId}) @@ -547,11 +622,16 @@ class UsersClient(Client): CLIENT_BASE = '/user/' + # Real one + # def getOrganismPermissionsForUser(self, user): + # data = { + # 'userId': user.userId, + # } + # return self.request('getOrganismPermissionsForUser', data) + + # Utter frigging hack def getOrganismPermissionsForUser(self, user): - data = { - 'userId': user.userId, - } - return self.request('getOrganismPermissionsForUser', data) + return self.loadUser(user).organismPermissions def updateOrganismPermission(self, user, organism, administrate=False, write=False, export=False, read=False): @@ -651,7 +731,6 @@ def __getattr__(self, key): if key in ('_sr', '_wa'): - print self.__dict__ return self.__dict__[key] else: if key == 'features': @@ -666,7 +745,6 @@ else: self._sr.__dict__[key] = value # Methods acting on the SeqRecord object - print key, value class WebApolloSeqFeature(object): @@ -703,7 +781,7 @@ self._sf.__dict__[key] = value else: self._sf.__dict__[key] = value - print key, value + def _tnType(feature): if feature.type in ('gene', 'mRNA', 'exon', 'CDS'): @@ -711,6 +789,7 @@ else: return 'exon' + def _yieldFeatData(features): for f in features: current = { @@ -733,6 +812,7 @@ yield current + def featuresToFeatureSchema(features): compiled = [] for feature in features: @@ -743,3 +823,36 @@ for x in _yieldFeatData([feature]): compiled.append(x) return compiled + + +def accessible_organisms(user, orgs): + permissionMap = { + x['organism']: x['permissions'] + for x in user.organismPermissions + if 'WRITE' in x['permissions'] or + 'READ' in x['permissions'] or + 'ADMINISTRATE' in x['permissions'] or + user.role == 'ADMIN' + } + return [ + (org['commonName'], org['id'], False) + for org in sorted(orgs, key=lambda x: x['commonName']) + if org['commonName'] in permissionMap + ] + + +def galaxy_list_orgs(trans, *args, **kwargs): + email = trans.get_user().email + + wa = WebApolloInstance( + os.environ.get('GALAXY_WEBAPOLLO_URL', 'https://example.com'), + os.environ.get('GALAXY_WEBAPOLLO_USER', 'admin'), + os.environ.get('GALAXY_WEBAPOLLO_PASSWORD', 'admin') + ) + + gx_user = AssertUser(wa.users.loadUsers(email=email)) + all_orgs = wa.organisms.findAllOrganisms() + + orgs = accessible_organisms(gx_user, all_orgs) + + return orgs