[2] | 1 | """ |
---|
| 2 | Contains the UCSC proxy |
---|
| 3 | """ |
---|
| 4 | |
---|
| 5 | from galaxy.web.base.controller import * |
---|
| 6 | |
---|
| 7 | import sys |
---|
| 8 | from galaxy import web, util |
---|
| 9 | |
---|
| 10 | import re, urllib, logging |
---|
| 11 | |
---|
| 12 | log = logging.getLogger( __name__ ) |
---|
| 13 | |
---|
| 14 | class UCSCProxy( BaseController ): |
---|
| 15 | |
---|
| 16 | def create_display(self, store): |
---|
| 17 | """Creates a more meaningulf display name""" |
---|
| 18 | track = store.get('hgta_track','no track') |
---|
| 19 | table = store.get('hgta_table','no table') |
---|
| 20 | region = store.get('hgta_regionType','') |
---|
| 21 | if region not in [ 'genome', 'encode']: |
---|
| 22 | region = store.get('position','') |
---|
| 23 | if track == table: |
---|
| 24 | display = 'UCSC: %s (%s)' % (track, region) |
---|
| 25 | else: |
---|
| 26 | display = 'UCSC: %s, %s (%s)' % (track, table, region) |
---|
| 27 | return display |
---|
| 28 | |
---|
| 29 | @web.expose |
---|
| 30 | def index(self, trans, init=False, **kwd): |
---|
| 31 | base_url = None |
---|
| 32 | params = dict(kwd) |
---|
| 33 | try: |
---|
| 34 | store = params.get("__GALAXY__", None) |
---|
| 35 | if store: |
---|
| 36 | store = util.string_to_object(store) |
---|
| 37 | else: |
---|
| 38 | store = {} |
---|
| 39 | UCSC_URL = 'UCSC_URL' |
---|
| 40 | base_url = store.get(UCSC_URL, "http://genome.ucsc.edu/cgi-bin/hgTables?") |
---|
| 41 | params = dict(kwd) |
---|
| 42 | params['init'] = init |
---|
| 43 | |
---|
| 44 | if not init: |
---|
| 45 | for key, value in kwd.items(): |
---|
| 46 | store[key] = value |
---|
| 47 | try: del store["__GALAXY__"] |
---|
| 48 | except: pass |
---|
| 49 | else: |
---|
| 50 | store = {} |
---|
| 51 | |
---|
| 52 | if init == "1": |
---|
| 53 | base_url = "http://genome.ucsc.edu/cgi-bin/hgTables?" |
---|
| 54 | params['db'] = 'hg17' |
---|
| 55 | if init == "2": |
---|
| 56 | base_url = "http://genome-test.cse.ucsc.edu/cgi-bin/hgTables?" |
---|
| 57 | params['db'] = 'hg17' |
---|
| 58 | if init == "3": |
---|
| 59 | base_url = "http://archaea.ucsc.edu/cgi-bin/hgTables?" |
---|
| 60 | |
---|
| 61 | store[UCSC_URL] = base_url |
---|
| 62 | |
---|
| 63 | try: del params["__GALAXY__"] |
---|
| 64 | except: pass |
---|
| 65 | url = base_url + urllib.urlencode(params) |
---|
| 66 | |
---|
| 67 | page = urllib.urlopen(url) |
---|
| 68 | content = page.info().get('Content-type', '') |
---|
| 69 | except Exception, exc: |
---|
| 70 | trans.log_event( "Proxy Error -> %s" % str(exc) ) |
---|
| 71 | msg = 'There has been a problem connecting to <i>%s</i> <p> <b>%s<b>' % (base_url, exc) |
---|
| 72 | return msg |
---|
| 73 | |
---|
| 74 | if content.startswith('text/plain'): |
---|
| 75 | params['display'] = self.create_display(store) |
---|
| 76 | params['dbkey'] = store.get('db', '*') |
---|
| 77 | params['tool_id'] = 'ucsc_proxy' |
---|
| 78 | params['proxy_url'] = base_url |
---|
| 79 | params['runtool_btn'] = 'T' |
---|
| 80 | #url = "/echo?" + urllib.urlencode(params) |
---|
| 81 | url = "/tool_runner/index?" + urllib.urlencode(params) |
---|
| 82 | trans.response.send_redirect(url) |
---|
| 83 | else: |
---|
| 84 | try: |
---|
| 85 | text = page.read() |
---|
| 86 | |
---|
| 87 | # Serialize store into a form element |
---|
| 88 | store_text = "<INPUT TYPE=\"HIDDEN\" NAME=\"__GALAXY__\" ID=\"__GALAXY__\" VALUE=\"" \ |
---|
| 89 | + util.object_to_string(store) + "\" \>" |
---|
| 90 | |
---|
| 91 | # Remove text regions that should not be exposed |
---|
| 92 | for key,value in altered_regions.items(): |
---|
| 93 | text = text.replace(key,value) |
---|
| 94 | # Capture only the forms |
---|
| 95 | newtext = beginning |
---|
| 96 | for form in re.finditer("(?s)(<FORM.*?)(</FORM>)",text): |
---|
| 97 | newtext = newtext + form.group(1) + store_text + form.group(2) |
---|
| 98 | if 'hgta_doLookupPosition' in params: |
---|
| 99 | lookup = re.search("(?s).*?(<H2>.*</PRE>)",text) |
---|
| 100 | if lookup: |
---|
| 101 | newtext = newtext + lookup.group(1) |
---|
| 102 | # if these keys are in the params, then pass the content through |
---|
| 103 | passthruContent = ['hgta_doSummaryStats', 'hgta_doSchema', 'hgta_doSchemaDb'] |
---|
| 104 | for k in passthruContent: |
---|
| 105 | if k in params: |
---|
| 106 | content = re.search("(?s)CONTENT TABLES.*?-->(.*/TABLE>)",text) |
---|
| 107 | if content: |
---|
| 108 | newtext = newtext + "<TABLE>" + content.group(1) |
---|
| 109 | |
---|
| 110 | newtext = newtext + ending |
---|
| 111 | return newtext |
---|
| 112 | except KeyError, exc: |
---|
| 113 | log.error(str(exc)) |
---|
| 114 | trans.log_event( "Proxy Error -> %s" % str(exc) ) |
---|
| 115 | msg = 'There has been a problem connecting to <i>%s</i> <p> <b>%s<b>' % (base_url, exc) |
---|
| 116 | return msg |
---|
| 117 | |
---|
| 118 | # HTML for generating the proxy page. |
---|
| 119 | beginning = '''<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
---|
| 120 | <html> |
---|
| 121 | |
---|
| 122 | <head> |
---|
| 123 | <title>Galaxy</title> |
---|
| 124 | <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
---|
| 125 | <link href="/static/style/base.css" rel="stylesheet" type="text/css" /> |
---|
| 126 | <script language="javascript" type="text/javascript"> |
---|
| 127 | function changeTarget(target) |
---|
| 128 | { |
---|
| 129 | document.forms['mainForm'].target = target; |
---|
| 130 | } |
---|
| 131 | </script> |
---|
| 132 | </head> |
---|
| 133 | |
---|
| 134 | <body> |
---|
| 135 | <div class="toolForm" id="ucsc_proxy"> |
---|
| 136 | <div class="toolFormTitle">UCSC Table Browser</div> |
---|
| 137 | |
---|
| 138 | <div class="toolFormBody"> |
---|
| 139 | ''' |
---|
| 140 | ending = ''' |
---|
| 141 | <P>This is a proxy to the data services provided by the <a href=\"http://genome.ucsc.edu\" target=\"_blank\">UCSC Genome Browser</a>'s <a href=\"http://genome.ucsc.edu/cgi-bin/hgTables\" target=\"_blank\">Table Browser.</a></P> |
---|
| 142 | </div> |
---|
| 143 | </div> |
---|
| 144 | </body> |
---|
| 145 | </html>''' |
---|
| 146 | |
---|
| 147 | # This is a mess of mappings of text to make the proxy friendlier to |
---|
| 148 | # galaxy users. |
---|
| 149 | altered_regions = { |
---|
| 150 | '"../cgi-bin/hgTables' : '"/ucsc_proxy/index', |
---|
| 151 | '<TR><TD>\n<B>output file:</B> <INPUT TYPE=TEXT NAME="hgta_outFileName" SIZE=29 VALUE=""> (leave blank to keep output in browser)</TD></TR>\n<TR><TD>\n<B>file type returned: </B><INPUT TYPE=RADIO NAME="hgta_compressType" VALUE="none" CHECKED> plain text  <INPUT TYPE=RADIO NAME="hgta_compressType" VALUE="gzip" > gzip compressed</TD></TR>' : '<INPUT TYPE=HIDDEN NAME="hgta_compressType" VALUE="none" /><INPUT TYPE=HIDDEN NAME="hgta_outFileName" VALUE="" />', |
---|
| 152 | ' <P>To reset <B>all</B> user cart settings (including custom tracks), \n<A HREF="/cgi-bin/cartReset?destination=/cgi-bin/hgTables">click here</A>.' : '', |
---|
| 153 | 'ACTION="../cgi-bin/hgTables"' : 'ACTION="/ucsc_proxy/index"', |
---|
| 154 | '<A HREF="/goldenPath/help/customTrack.html" TARGET=_blank>custom track</A>' : '<A HREF="http://genome.ucsc.edu/goldenPath/help/customTrack.html" TARGET=_blank>custom track</A>', |
---|
| 155 | '<INPUT TYPE=RADIO NAME="hgta_regionType" VALUE="genome" onClick="regionType=\'genome\';" CHECKED>' : '<INPUT TYPE=RADIO NAME="hgta_regionType" VALUE="genome" onClick="regionType=\'genome\';">', |
---|
| 156 | '<INPUT TYPE=RADIO NAME="hgta_regionType" VALUE="range" onClick="regionType=\'range\';">' : '<INPUT TYPE=RADIO NAME="hgta_regionType" VALUE="range" onClick="regionType=\'range\';" CHECKED>', |
---|
| 157 | "<OPTION VALUE=bed>" : "<OPTION VALUE=bed SELECTED>" , |
---|
| 158 | '<INPUT TYPE=SUBMIT NAME="hgta_doSchema" VALUE="describe table schema">' : '<INPUT TYPE=SUBMIT NAME="hgta_doSchema" VALUE="describe table schema" onClick="changeTarget(\'_blank\')" onMouseOut="changeTarget(\'_self\')">' |
---|
| 159 | } |
---|