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