comparison 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
comparison
equal deleted inserted replaced
2:c8e16c8eff98 3:d4ae83dedb14
1 import requests 1 import requests
2 import json 2 import json
3 import os
3 import collections 4 import collections
4 from BCBio import GFF
5 import StringIO 5 import StringIO
6 import logging 6 import logging
7 from BCBio import GFF
8 from Bio import SeqIO
7 logging.getLogger("requests").setLevel(logging.CRITICAL) 9 logging.getLogger("requests").setLevel(logging.CRITICAL)
8 log = logging.getLogger() 10 log = logging.getLogger()
9 11
12
13 def WAAuth(parser):
14 parser.add_argument('apollo', help='Complete Apollo URL')
15 parser.add_argument('username', help='WA Username')
16 parser.add_argument('password', help='WA Password')
17 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')
18
19
20 def OrgOrGuess(parser):
21 parser.add_argument('--org_json', type=file, help='Apollo JSON output, source for common name')
22 parser.add_argument('--org_raw', help='Common Name')
23 parser.add_argument('--org_id', help='Organism ID')
24
25
26 def CnOrGuess(parser):
27 OrgOrGuess(parser)
28 parser.add_argument('--seq_fasta', type=file, help='Fasta file, IDs used as sequence sources')
29 parser.add_argument('--seq_raw', nargs='*', help='Sequence Names')
30
31
32 def GuessOrg(args, wa):
33 if args.org_json:
34 orgs = [x.get('commonName', None)
35 for x in json.load(args.org_json)]
36 orgs = [x for x in orgs if x is not None]
37 return orgs
38 elif args.org_raw:
39 org = args.org_raw.strip()
40 if len(org) > 0:
41 return [org]
42 else:
43 raise Exception("Organism Common Name not provided")
44 elif args.org_id:
45 return [wa.organisms.findOrganismById(args.org_id).get('commonName', None)]
46 else:
47 raise Exception("Organism Common Name not provided")
48
49
50 def GuessCn(args, wa):
51 org = GuessOrg(args, wa)
52 seqs = []
53 if args.seq_fasta:
54 # If we have a fasta, pull all rec ids from that.
55 for rec in SeqIO.parse(args.seq_fasta, 'fasta'):
56 seqs.append(rec.id)
57 elif args.seq_raw:
58 # Otherwise raw list.
59 seqs = [x.strip() for x in args.seq_raw if len(x.strip()) > 0]
60
61 return org, seqs
62
63
64 def AssertUser(user_list):
65 if len(user_list) == 0:
66 raise Exception("Unknown user. Please register first")
67 else:
68 return user_list[0]
69
70
71 def AssertAdmin(user):
72 if user.role == 'ADMIN':
73 return True
74 else:
75 raise Exception("User is not an administrator. Permission denied")
10 76
11 77
12 class WebApolloInstance(object): 78 class WebApolloInstance(object):
13 79
14 def __init__(self, url, username, password): 80 def __init__(self, url, username, password):
51 groups.append(GroupObj(**groupData)) 117 groups.append(GroupObj(**groupData))
52 self.groups = groups 118 self.groups = groups
53 119
54 self.__props = kwargs.keys() 120 self.__props = kwargs.keys()
55 121
56
57 def isAdmin(self): 122 def isAdmin(self):
58 if hasattr(self, 'role'): 123 if hasattr(self, 'role'):
59 return self.role == self.ROLE_ADMIN 124 return self.role == self.ROLE_ADMIN
60 return False 125 return False
61 126
98 'username': self._wa.username, 163 'username': self._wa.username,
99 'password': self._wa.password, 164 'password': self._wa.password,
100 }) 165 })
101 166
102 r = requests.post(url, data=json.dumps(data), headers=headers, 167 r = requests.post(url, data=json.dumps(data), headers=headers,
103 verify=self.__verify, params=post_params, **self._requestArgs) 168 verify=self.__verify, params=post_params, allow_redirects=False, **self._requestArgs)
104 169
105 if r.status_code == 200: 170 if r.status_code == 200 or r.status_code == 302:
106 if isJson: 171 if isJson:
107 d = r.json() 172 d = r.json()
108 if 'username' in d: 173 if 'username' in d:
109 del d['username'] 174 del d['username']
110 if 'password' in d: 175 if 'password' in d:
144 209
145 class AnnotationsClient(Client): 210 class AnnotationsClient(Client):
146 CLIENT_BASE = '/annotationEditor/' 211 CLIENT_BASE = '/annotationEditor/'
147 212
148 def _update_data(self, data): 213 def _update_data(self, data):
149 if not hasattr(self, '_extra_data'): raise Exception("Please call setSequence first") 214 if not hasattr(self, '_extra_data'):
215 raise Exception("Please call setSequence first")
216
150 data.update(self._extra_data) 217 data.update(self._extra_data)
151 return data 218 return data
152 219
153 def setSequence(self, sequence, organism): 220 def setSequence(self, sequence, organism):
154 self._extra_data = { 221 self._extra_data = {
397 'name': group.name, 464 'name': group.name,
398 } 465 }
399 return self.request('getOrganismPermissionsForGroup', data) 466 return self.request('getOrganismPermissionsForGroup', data)
400 467
401 def loadGroups(self, group=None): 468 def loadGroups(self, group=None):
402 data ={} 469 data = {}
403 if group is not None: 470 if group is not None:
404 data['groupId'] = group.groupId 471 data['groupId'] = group.groupId
405 472
406 return self.request('loadGroups', data) 473 return self.request('loadGroups', data)
407 474
515 if len(orgs) == 0: 582 if len(orgs) == 0:
516 raise Exception("Unknown common name") 583 raise Exception("Unknown common name")
517 else: 584 else:
518 return orgs[0] 585 return orgs[0]
519 586
587 def findOrganismById(self, id_number):
588 orgs = self.findAllOrganisms()
589 orgs = [x for x in orgs if str(x['id']) == str(id_number)]
590 if len(orgs) == 0:
591 raise Exception("Unknown ID")
592 else:
593 return orgs[0]
594
520 def deleteOrganism(self, organismId): 595 def deleteOrganism(self, organismId):
521 return self.request('deleteOrganism', {'id': organismId}) 596 return self.request('deleteOrganism', {'id': organismId})
522 597
523 def deleteOrganismFeatures(self, organismId): 598 def deleteOrganismFeatures(self, organismId):
524 return self.request('deleteOrganismFeatures', {'id': organismId}) 599 return self.request('deleteOrganismFeatures', {'id': organismId})
545 620
546 621
547 class UsersClient(Client): 622 class UsersClient(Client):
548 CLIENT_BASE = '/user/' 623 CLIENT_BASE = '/user/'
549 624
625 # Real one
626 # def getOrganismPermissionsForUser(self, user):
627 # data = {
628 # 'userId': user.userId,
629 # }
630 # return self.request('getOrganismPermissionsForUser', data)
631
632 # Utter frigging hack
550 def getOrganismPermissionsForUser(self, user): 633 def getOrganismPermissionsForUser(self, user):
551 data = { 634 return self.loadUser(user).organismPermissions
552 'userId': user.userId,
553 }
554 return self.request('getOrganismPermissionsForUser', data)
555 635
556 def updateOrganismPermission(self, user, organism, administrate=False, 636 def updateOrganismPermission(self, user, organism, administrate=False,
557 write=False, export=False, read=False): 637 write=False, export=False, read=False):
558 data = { 638 data = {
559 'userId': user.userId, 639 'userId': user.userId,
649 def __dir__(self): 729 def __dir__(self):
650 return dir(self._sr) 730 return dir(self._sr)
651 731
652 def __getattr__(self, key): 732 def __getattr__(self, key):
653 if key in ('_sr', '_wa'): 733 if key in ('_sr', '_wa'):
654 print self.__dict__
655 return self.__dict__[key] 734 return self.__dict__[key]
656 else: 735 else:
657 if key == 'features': 736 if key == 'features':
658 return (WebApolloSeqFeature(x, self._wa) 737 return (WebApolloSeqFeature(x, self._wa)
659 for x in self._sr.__dict__[key]) 738 for x in self._sr.__dict__[key])
664 if key in ('_sd', '_wa'): 743 if key in ('_sd', '_wa'):
665 self.__dict__[key] = value 744 self.__dict__[key] = value
666 else: 745 else:
667 self._sr.__dict__[key] = value 746 self._sr.__dict__[key] = value
668 # Methods acting on the SeqRecord object 747 # Methods acting on the SeqRecord object
669 print key, value
670 748
671 749
672 class WebApolloSeqFeature(object): 750 class WebApolloSeqFeature(object):
673 def __init__(self, sf, wa): 751 def __init__(self, sf, wa):
674 self._sf = sf 752 self._sf = sf
701 ) 779 )
702 780
703 self._sf.__dict__[key] = value 781 self._sf.__dict__[key] = value
704 else: 782 else:
705 self._sf.__dict__[key] = value 783 self._sf.__dict__[key] = value
706 print key, value 784
707 785
708 def _tnType(feature): 786 def _tnType(feature):
709 if feature.type in ('gene', 'mRNA', 'exon', 'CDS'): 787 if feature.type in ('gene', 'mRNA', 'exon', 'CDS'):
710 return feature.type 788 return feature.type
711 else: 789 else:
712 return 'exon' 790 return 'exon'
791
713 792
714 def _yieldFeatData(features): 793 def _yieldFeatData(features):
715 for f in features: 794 for f in features:
716 current = { 795 current = {
717 'location': { 796 'location': {
731 if hasattr(f, 'sub_features') and len(f.sub_features) > 0: 810 if hasattr(f, 'sub_features') and len(f.sub_features) > 0:
732 current['children'] = [x for x in _yieldFeatData(f.sub_features)] 811 current['children'] = [x for x in _yieldFeatData(f.sub_features)]
733 812
734 yield current 813 yield current
735 814
815
736 def featuresToFeatureSchema(features): 816 def featuresToFeatureSchema(features):
737 compiled = [] 817 compiled = []
738 for feature in features: 818 for feature in features:
739 if feature.type != 'gene': 819 if feature.type != 'gene':
740 log.warn("Not able to handle %s features just yet...", feature.type) 820 log.warn("Not able to handle %s features just yet...", feature.type)
741 continue 821 continue
742 822
743 for x in _yieldFeatData([feature]): 823 for x in _yieldFeatData([feature]):
744 compiled.append(x) 824 compiled.append(x)
745 return compiled 825 return compiled
826
827
828 def accessible_organisms(user, orgs):
829 permissionMap = {
830 x['organism']: x['permissions']
831 for x in user.organismPermissions
832 if 'WRITE' in x['permissions'] or
833 'READ' in x['permissions'] or
834 'ADMINISTRATE' in x['permissions'] or
835 user.role == 'ADMIN'
836 }
837 return [
838 (org['commonName'], org['id'], False)
839 for org in sorted(orgs, key=lambda x: x['commonName'])
840 if org['commonName'] in permissionMap
841 ]
842
843
844 def galaxy_list_orgs(trans, *args, **kwargs):
845 email = trans.get_user().email
846
847 wa = WebApolloInstance(
848 os.environ.get('GALAXY_WEBAPOLLO_URL', 'https://example.com'),
849 os.environ.get('GALAXY_WEBAPOLLO_USER', 'admin'),
850 os.environ.get('GALAXY_WEBAPOLLO_PASSWORD', 'admin')
851 )
852
853 gx_user = AssertUser(wa.users.loadUsers(email=email))
854 all_orgs = wa.organisms.findAllOrganisms()
855
856 orgs = accessible_organisms(gx_user, all_orgs)
857
858 return orgs