Mercurial > repos > eric-rasche > apollo
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 |