root/galaxy-central/lib/galaxy/web/controllers/ucsc_proxy.py

リビジョン 2, 7.1 KB (コミッタ: hatakeyama, 14 年 前)

import galaxy-central

行番号 
1"""
2Contains the UCSC proxy
3"""
4
5from galaxy.web.base.controller import *
6
7import sys
8from galaxy import web, util
9
10import re, urllib, logging
11
12log = logging.getLogger( __name__ )
13
14class 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.
119beginning = '''<!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">
127function 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 '''
140ending = '''
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.
149altered_regions = {
150        '"../cgi-bin/hgTables' : '"/ucsc_proxy/index',
151        '<TR><TD>\n<B>output file:</B>&nbsp;<INPUT TYPE=TEXT NAME="hgta_outFileName" SIZE=29 VALUE="">&nbsp;(leave blank to keep output in browser)</TD></TR>\n<TR><TD>\n<B>file type returned:&nbsp;</B><INPUT TYPE=RADIO NAME="hgta_compressType" VALUE="none" CHECKED>&nbsp;plain text&nbsp&nbsp<INPUT TYPE=RADIO NAME="hgta_compressType" VALUE="gzip" >&nbsp;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        }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。