Mercurial > repos > gga > apollo_export
comparison create_or_update_organism.py @ 10:c3b5bc8b4080 draft
"planemo upload for repository https://github.com/galaxy-genome-annotation/galaxy-tools/tree/master/tools/apollo commit 08015be1ee8a784e0619f961aaa724857debfd6f"
author | gga |
---|---|
date | Mon, 02 Dec 2019 05:43:20 -0500 |
parents | ad02f02c75e3 |
children | 56b9a26694c0 |
comparison
equal
deleted
inserted
replaced
9:f45ad96c9e08 | 10:c3b5bc8b4080 |
---|---|
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 from __future__ import print_function | 2 from __future__ import print_function |
3 | 3 |
4 import argparse | 4 import argparse |
5 import glob | |
5 import json | 6 import json |
6 import logging | 7 import logging |
7 import os | 8 import os |
8 import shutil | 9 import shutil |
10 import stat | |
9 import subprocess | 11 import subprocess |
10 import sys | 12 import sys |
13 import tarfile | |
11 import tempfile | 14 import tempfile |
12 import time | 15 import time |
13 | 16 |
14 | 17 from apollo import accessible_organisms |
15 from webapollo import GuessOrg, OrgOrGuess, PermissionCheck, WAAuth, WebApolloInstance | 18 from apollo.util import GuessOrg, OrgOrGuess |
19 | |
20 from arrow.apollo import get_apollo_instance | |
21 | |
22 from webapollo import UserObj, handle_credentials | |
23 | |
16 logging.basicConfig(level=logging.INFO) | 24 logging.basicConfig(level=logging.INFO) |
17 log = logging.getLogger(__name__) | 25 log = logging.getLogger(__name__) |
18 | 26 |
19 | 27 |
20 def IsBlatEnabled(): | 28 def IsBlatEnabled(): |
25 return True | 33 return True |
26 else: | 34 else: |
27 return False | 35 return False |
28 | 36 |
29 | 37 |
38 def IsOrgCNSuffixEnabled(): | |
39 if 'GALAXY_APOLLO_ORG_SUFFIX' not in os.environ: | |
40 return False | |
41 value = os.environ['GALAXY_APOLLO_ORG_SUFFIX'].lower() | |
42 if value in ('id', 'email'): | |
43 return value | |
44 | |
45 return False | |
46 | |
47 | |
48 def IsRemote(): | |
49 return 'GALAXY_SHARED_DIR' not in os.environ or len(os.environ['GALAXY_SHARED_DIR'].lower().strip()) == 0 | |
50 | |
51 | |
30 if __name__ == '__main__': | 52 if __name__ == '__main__': |
31 parser = argparse.ArgumentParser(description='Create or update an organism in an Apollo instance') | 53 parser = argparse.ArgumentParser(description='Create or update an organism in an Apollo instance') |
32 WAAuth(parser) | 54 parser.add_argument('jbrowse_src', help='Source JBrowse Data Directory') |
33 parser.add_argument('jbrowse_src', help='Old JBrowse Data Directory') | 55 parser.add_argument('jbrowse', help='Destination JBrowse Data Directory') |
34 parser.add_argument('jbrowse', help='JBrowse Data Directory') | |
35 parser.add_argument('email', help='User Email') | 56 parser.add_argument('email', help='User Email') |
36 OrgOrGuess(parser) | 57 OrgOrGuess(parser) |
37 parser.add_argument('--genus', help='Organism Genus') | 58 parser.add_argument('--genus', help='Organism Genus') |
38 parser.add_argument('--species', help='Organism Species') | 59 parser.add_argument('--species', help='Organism Species') |
39 parser.add_argument('--public', action='store_true', help='Make organism public') | 60 parser.add_argument('--public', action='store_true', help='Make organism public') |
40 parser.add_argument('--group', help='Give access to a user group') | 61 parser.add_argument('--group', help='Give access to a user group') |
41 parser.add_argument('--remove_old_directory', action='store_true', help='Remove old directory') | 62 parser.add_argument('--remove_old_directory', action='store_true', help='Remove old directory') |
63 parser.add_argument('--no_reload_sequences', action='store_true', help='Disable update genome sequence') | |
64 parser.add_argument('--userid', help='User unique id') | |
42 args = parser.parse_args() | 65 args = parser.parse_args() |
43 CHUNK_SIZE = 2**20 | 66 CHUNK_SIZE = 2**20 |
44 blat_db = None | 67 blat_db = None |
45 | 68 |
69 path_fasta = args.jbrowse_src + '/seq/genome.fasta' | |
70 | |
46 # Cleanup if existing | 71 # Cleanup if existing |
47 if(os.path.exists(args.jbrowse)): | 72 if not IsRemote(): |
48 shutil.rmtree(args.jbrowse) | 73 if(os.path.exists(args.jbrowse)): |
49 # Copy files | 74 shutil.rmtree(args.jbrowse) |
50 shutil.copytree(args.jbrowse_src, args.jbrowse, symlinks=True) | 75 # Copy files |
51 | 76 shutil.copytree(args.jbrowse_src, args.jbrowse, symlinks=True) |
52 path_fasta = args.jbrowse + '/seq/genome.fasta' | 77 |
53 path_2bit = args.jbrowse + '/seq/genome.2bit' | 78 path_2bit = args.jbrowse + '/seq/genome.2bit' |
79 else: | |
80 twobittemp = tempfile.NamedTemporaryFile(prefix="genome.2bit") | |
81 path_2bit = twobittemp.name | |
82 os.chmod(path_2bit, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH) | |
54 | 83 |
55 # Convert fasta if existing | 84 # Convert fasta if existing |
56 if(IsBlatEnabled() and os.path.exists(path_fasta)): | 85 if IsBlatEnabled() and os.path.exists(path_fasta): |
57 arg = ['faToTwoBit', path_fasta, path_2bit] | 86 arg = ['faToTwoBit', path_fasta, path_2bit] |
58 tmp_stderr = tempfile.NamedTemporaryFile(prefix="tmp-twobit-converter-stderr") | 87 proc = subprocess.Popen(args=arg, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
59 proc = subprocess.Popen(args=arg, shell=False, cwd=args.jbrowse, stderr=tmp_stderr.fileno()) | 88 out, err = proc.communicate() |
60 return_code = proc.wait() | 89 if proc.returncode: |
61 if return_code: | |
62 tmp_stderr.flush() | |
63 tmp_stderr.seek(0) | |
64 print("Error building index:", file=sys.stderr) | 90 print("Error building index:", file=sys.stderr) |
65 while True: | 91 sys.stderr.write(err) |
66 chunk = tmp_stderr.read(CHUNK_SIZE) | 92 sys.exit(proc.returncode) |
67 if not chunk: | 93 if not IsRemote(): |
68 break | 94 # No need to send this in remote mode, it will be in the archive |
69 sys.stderr.write(chunk) | 95 blat_db = path_2bit |
70 sys.exit(return_code) | 96 |
71 blat_db = path_2bit | 97 wa = get_apollo_instance() |
72 tmp_stderr.close() | 98 |
73 | 99 # User must have an account, if not, create it |
74 wa = WebApolloInstance(args.apollo, args.username, args.password) | 100 gx_user = UserObj(**wa.users._assert_or_create_user(args.email)) |
101 handle_credentials(gx_user) | |
75 | 102 |
76 org_cn = GuessOrg(args, wa) | 103 org_cn = GuessOrg(args, wa) |
77 if isinstance(org_cn, list): | 104 if isinstance(org_cn, list): |
78 org_cn = org_cn[0] | 105 org_cn = org_cn[0] |
79 | 106 |
80 # User must have an account, if not, create it | 107 if args.org_raw: |
81 gx_user = wa.users.assertOrCreateUser(args.email) | 108 suffix = IsOrgCNSuffixEnabled() |
109 if suffix == 'id' and args.userid: | |
110 org_cn += ' (gx%s)' % args.userid | |
111 elif suffix == 'email': | |
112 org_cn += ' (%s)' % args.email | |
82 | 113 |
83 log.info("Determining if add or update required") | 114 log.info("Determining if add or update required") |
84 try: | 115 try: |
85 org = wa.organisms.findOrganismByCn(org_cn) | 116 org = wa.organisms.show_organism(org_cn) |
86 except Exception: | 117 except Exception: |
87 org = None | 118 org = None |
88 | 119 |
89 if org: | 120 if org and 'error' not in org: |
90 old_directory = org['directory'] | 121 old_directory = org['directory'] |
91 | 122 |
92 if not PermissionCheck(gx_user, org_cn, "WRITE"): | 123 all_orgs = wa.organisms.get_organisms() |
93 print("Naming Conflict. You do not have permissions to access this organism. Either request permission from the owner, or choose a different name for your organism.") | 124 if 'error' in all_orgs: |
94 sys.exit(2) | 125 all_orgs = [] |
126 all_orgs = [x['commonName'] for x in all_orgs] | |
127 if org_cn not in all_orgs: | |
128 raise Exception("Could not find organism %s" % org_cn) | |
129 | |
130 orgs = accessible_organisms(gx_user, [org_cn], 'WRITE') | |
131 if not orgs: | |
132 raise Exception("Naming Conflict. You do not have write permission on this organism. Either request permission from the owner, or choose a different name for your organism.") | |
95 | 133 |
96 log.info("\tUpdating Organism") | 134 log.info("\tUpdating Organism") |
97 data = wa.organisms.updateOrganismInfo( | 135 if IsRemote(): |
98 org['id'], | 136 with tempfile.NamedTemporaryFile(suffix='.tar.gz') as archive: |
99 org_cn, | 137 with tarfile.open(archive.name, mode="w:gz") as tar: |
100 args.jbrowse, | 138 dataset_data_dir = args.jbrowse_src |
101 # mandatory | 139 for file in glob.glob(dataset_data_dir): |
102 genus=args.genus, | 140 tar.add(file, arcname=file.replace(dataset_data_dir, './')) |
103 species=args.species, | 141 if IsBlatEnabled(): |
104 public=args.public, | 142 tar.add(path_2bit, arcname="./searchDatabaseData/genome.2bit") |
105 blatdb=blat_db | 143 data = wa.remote.update_organism( |
106 ) | 144 org['id'], |
145 archive, | |
146 # mandatory | |
147 blatdb=blat_db, | |
148 genus=args.genus, | |
149 species=args.species, | |
150 public=args.public, | |
151 no_reload_sequences=args.no_reload_sequences | |
152 ) | |
153 else: | |
154 data = wa.organisms.update_organism( | |
155 org['id'], | |
156 org_cn, | |
157 args.jbrowse, | |
158 # mandatory | |
159 genus=args.genus, | |
160 species=args.species, | |
161 public=args.public, | |
162 blatdb=blat_db, | |
163 no_reload_sequences=args.no_reload_sequences | |
164 ) | |
107 time.sleep(2) | 165 time.sleep(2) |
108 if args.remove_old_directory and args.jbrowse != old_directory: | 166 |
167 if not IsRemote() and args.remove_old_directory and args.jbrowse != old_directory: | |
109 shutil.rmtree(old_directory) | 168 shutil.rmtree(old_directory) |
110 | 169 |
111 data = [wa.organisms.findOrganismById(org['id'])] | 170 data = wa.organisms.show_organism(org_cn) |
112 | 171 |
113 else: | 172 else: |
114 # New organism | 173 # New organism |
115 log.info("\tAdding Organism") | 174 log.info("\tAdding Organism") |
116 data = wa.organisms.addOrganism( | 175 |
117 org_cn, | 176 if IsRemote(): |
118 args.jbrowse, | 177 with tempfile.NamedTemporaryFile(suffix='.tar.gz') as archive: |
119 genus=args.genus, | 178 with tarfile.open(archive.name, mode="w:gz") as tar: |
120 species=args.species, | 179 dataset_data_dir = args.jbrowse_src |
121 public=args.public, | 180 for file in glob.glob(dataset_data_dir): |
122 blatdb=blat_db | 181 tar.add(file, arcname=file.replace(dataset_data_dir, './')) |
123 ) | 182 if IsBlatEnabled(): |
183 with tempfile.TemporaryDirectory() as empty_dir: | |
184 os.chmod(empty_dir, stat.S_IRUSR | stat.S_IXUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IXOTH) | |
185 tar.add(empty_dir, arcname="./searchDatabaseData/") | |
186 tar.add(path_2bit, arcname="./searchDatabaseData/genome.2bit") | |
187 data = wa.remote.add_organism( | |
188 org_cn, | |
189 archive, | |
190 blatdb=blat_db, | |
191 genus=args.genus, | |
192 species=args.species, | |
193 public=args.public, | |
194 metadata=None | |
195 ) | |
196 if isinstance(data, list) and len(data) > 0: | |
197 data = data[0] | |
198 else: | |
199 data = wa.organisms.add_organism( | |
200 org_cn, | |
201 args.jbrowse, | |
202 blatdb=blat_db, | |
203 genus=args.genus, | |
204 species=args.species, | |
205 public=args.public, | |
206 metadata=None | |
207 ) | |
124 | 208 |
125 # Must sleep before we're ready to handle | 209 # Must sleep before we're ready to handle |
126 time.sleep(2) | 210 time.sleep(2) |
127 log.info("Updating permissions for %s on %s", gx_user, org_cn) | 211 log.info("Updating permissions for %s on %s", gx_user, org_cn) |
128 wa.users.updateOrganismPermission( | 212 wa.users.update_organism_permissions( |
129 gx_user, org_cn, | 213 gx_user.username, |
214 org_cn, | |
130 write=True, | 215 write=True, |
131 export=True, | 216 export=True, |
132 read=True, | 217 read=True, |
133 ) | 218 ) |
134 | 219 |
135 # Group access | 220 # Group access |
136 if args.group: | 221 if args.group: |
137 group = wa.groups.loadGroupByName(name=args.group) | 222 group = wa.groups.get_groups(name=args.group)[0] |
138 res = wa.groups.updateOrganismPermission(group, org_cn, | 223 res = wa.groups.update_organism_permissions(group['name'], org_cn, |
139 administrate=False, write=True, read=True, | 224 administrate=False, write=True, read=True, |
140 export=True) | 225 export=True) |
141 | 226 |
142 data = [o for o in data if o['commonName'] == org_cn] | |
143 print(json.dumps(data, indent=2)) | 227 print(json.dumps(data, indent=2)) |