annotate templates/html_selectable_report.py @ 1:812de0e282bd draft default tip

cosmetic edits
author damion
date Tue, 03 Mar 2015 15:50:47 -0500
parents 7db7ecc78ad6
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
1 import os.path
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
2 import time
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
3 import csv
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
4 import collections
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
5 import re
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
6 import common
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
7
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
8 HTML_REPORT_HEADER_FILE = 'html_report_header.html'
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
9
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
10 class HTMLReport(object):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
11
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
12 """ This receives and sets up the general meta-data fields available to the html rendering engine
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
13
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
14 """
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
15 def __init__(self, tagGroup, options, query_stats = []):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
16
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
17 self.columns = tagGroup.columns
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
18 self.display_columns = [field for field in self.columns if field['group']=='column']
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
19 self.row_limit = options.row_limit
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
20 self.section_bins = {}
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
21 self.todo = collections.deque([]) # stack of things to do
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
22 self.query_stats = query_stats
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
23 self.empty_queries = [query['id'] for query in query_stats if query['filtered_rows'] == 0]
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
24 self.initialized = False
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
25
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
26 # These items are available for display in html generation via dictionary string replacement: [string ... %(filters)s ...] % self.lookup
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
27 self.lookup = {
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
28 'depth': 0,
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
29 'filters': 'Filters: ' + options.filters_HTML if len(options.filters_HTML) else '',
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
30 'timestamp': time.strftime('%Y/%m/%d'),
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
31 'visible_limit': 20,
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
32 'column_count': str(len([field for field in self.columns if field['group']=='column'])),
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
33 'table_rows':0,
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
34 'select_row':0,
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
35 'row_limit': self.row_limit,
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
36 'label':'',
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
37 'value':'',
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
38 'link':'',
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
39 'cssClass':'',
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
40 'table_header': self._tableHeader(),
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
41 'section_bins':'',
1
812de0e282bd cosmetic edits
damion
parents: 0
diff changeset
42 'section_counter':1,
812de0e282bd cosmetic edits
damion
parents: 0
diff changeset
43 'target_form':'select_subsets'
0
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
44 }
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
45
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
46 if hasattr(options,'dataset_selection_id'):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
47 self.lookup['dataset_selection_id'] = options.dataset_selection_id
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
48 self.initialized = True
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
49
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
50 else:
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
51 self.lookup['dataset_selection_id'] = 0
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
52 self.errorNotice = '<div style="width:400px;margin:auto"><h3>This Selectable HTML Report needs the "Basic Report Field Output" to include the qseq and sseq sequence fields (aligned part of query sequence and subject sequence). Add these fields or try a selection that has more than 12 columns.</h3></div>'
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
53
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
54 """
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
55 _processTagStack()
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
56 In the production of html, start tags and template bits are added to the outgoing html when
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
57 designated section columns of data change value. the self.todo stack keeps track of all the
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
58 tag closings that have to occur when a section or table section comes to an end (and new one
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
59 begins or end of document occurs).
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
60
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
61 This dynamically executes any functions listed in stack that are greater than given tag depth.
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
62 Generally the functions return html closing content.
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
63
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
64 @param depth integer >= 0
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
65 @uses self.todo stack of [depth, function_name] items
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
66 """
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
67 def _processTagStack(self, depth = 0):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
68 html = ''
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
69 while len(self.todo) and self.todo[0][0] >= depth:
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
70 html += getattr(self, self.todo.popleft()[1] )()
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
71 return html
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
72
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
73
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
74
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
75 ############################### HTML REPORT RENDERING ##############################
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
76 """ render() produces the html. Takes in tabular data + metainformation about that file,
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
77 and iterates through rows. This approach depends on detecting changes in stated report
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
78 section columns and table section columns, and triggers appropriate section start and end,
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
79 and table / table section start and end tags.
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
80
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
81 @param in_file string Full file path
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
82 @param out_html_file string Full output html data file path to write to.
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
83 """
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
84 def render (self, in_file, out_html_file):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
85
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
86 try:
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
87
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
88 fp_in = open(in_file, "rb")
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
89 fp_out = open(out_html_file, 'w')
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
90
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
91 fp_out.write( self._header(HTML_REPORT_HEADER_FILE) )
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
92
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
93 if self.initialized:
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
94
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
95 fp_out.write( self._bodyStart() )
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
96 self.todo.appendleft([0,'_bodyEnd'])
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
97
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
98 reader = csv.reader(fp_in, delimiter="\t")
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
99
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
100 for row in reader:
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
101
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
102 html = ''
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
103 self.rowdata = []
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
104 row_bins = []
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
105 section_reset = False
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
106
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
107 for (idx, field) in enumerate(self.columns):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
108
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
109 value = field['value'] = row[idx]
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
110 depth = idx + 1
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
111
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
112 # If a bin is mentioned on this row, its put into self.selection_bins.
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
113 if field['type'] == 'bin' and value != '':
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
114 row_bins.append(value)
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
115 if not value in self.section_bins:
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
116 self.section_bins[value] = field['label']
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
117
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
118 grouping = field['group']
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
119 # Section or table grouping here:
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
120 if grouping == 'section' or grouping == 'table':
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
121
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
122 # Check to see if a new section or table section is triggered by change in field's value:
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
123 if section_reset or (not 'valueOld' in field) or value != field['valueOld']:
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
124
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
125 self.lookup['value'] = value
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
126 self.lookup['label'] = field['label']
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
127
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
128 html += self._processTagStack(depth)
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
129
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
130 if grouping == 'section':
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
131 section_reset = True
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
132 self.lookup['section_depth'] = depth
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
133 self.lookup['section_counter'] += 1
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
134 self.lookup['table_rows'] = 0
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
135 self.section_bins = {}
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
136
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
137 html += self._sectionStart()
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
138
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
139 html += self._sectionFormStart()
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
140 self.todo.appendleft([depth,'_sectionFormEnd'])
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
141
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
142 self.todo.appendleft([depth,'_sectionEnd'])
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
143
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
144 elif grouping == 'table':
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
145
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
146 lastToDo = self.todo[0]
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
147 if lastToDo[1] == '_sectionEnd': #Just started a section
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
148 html += self._tableStart()
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
149 self.todo.appendleft([lastToDo[0]+1,'_tableEnd'])
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
150
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
151 html += self._tbodyHeader() + self._tbodyStart()
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
152 self.todo.appendleft([lastToDo[0]+2,'_tbodyEnd'])
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
153
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
154 field['valueOld'] = value
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
155
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
156 else:
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
157
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
158 if grouping == 'column': self.rowdata.append(row[idx])
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
159
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
160 lastToDo = self.todo[0]
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
161 # No table level, instead going right from section to column field:
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
162 if lastToDo[1] == '_sectionEnd':
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
163 html += self._tableStart() + self._tbodyStart()
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
164 self.todo.appendleft([lastToDo[0]+1,'_tableEnd'])
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
165 self.todo.appendleft([lastToDo[0]+2,'_tbodyEnd'])
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
166
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
167 self.lookup['row_bins'] = ",".join(row_bins)
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
168
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
169 fp_out.write(html)
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
170
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
171 self.lookup['table_rows'] += 1
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
172
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
173 # Now output table row of data:
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
174 fp_out.write( self._tableRow() )
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
175
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
176
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
177 #Not initialized here, so just write created error notice.
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
178 else:
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
179
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
180 fp_out.write('<h3>' + self.errorNotice + '</body></html>')
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
181
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
182 fp_out.write( self._processTagStack() )
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
183
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
184 except IOError as e:
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
185 print 'Operation failed: %s' % e.strerror
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
186
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
187 fp_in.close()
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
188 fp_out.close()
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
189
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
190
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
191 ############################### HTML REPORT PART TEMPLATES ##############################
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
192 def _header(self, filename):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
193
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
194 with open(os.path.join(os.path.dirname(__file__), filename), "r") as fphtml:
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
195 data = fphtml.read()
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
196
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
197 return data
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
198
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
199
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
200 def _bodyStart(self):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
201 # The form enables the creation of a dataset from selected entries. It passes selections (based on a certain column's value) to the "Select tabular rows" tool, which then creates a dataset from the selected rows.
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
202 with open(os.path.join(os.path.dirname(__file__), "html_selectable_report_tool_state.txt"), "r") as form_code_file:
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
203 self.lookup['form_state'] = form_code_file.readline().strip()
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
204
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
205 html = """
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
206 <script>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
207 // Toggle checkbox inputs of given table according to state of checkbox
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
208 function toggleInputs(mycheckbox, table) {
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
209 var checkboxes = table.getElementsByTagName('INPUT');
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
210 // Loop skips first toggler checkbox
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
211 for (var ptr = 1; ptr < checkboxes.length; ptr ++ ) {
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
212 checkboxes[ptr].checked = mycheckbox.checked;
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
213 }
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
214 return true; // prevents click processing
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
215 }
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
216
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
217 //Drops hidden section id from form submission when no section items were selected
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
218 function formCheck() {
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
219 var tables = document.getElementsByTagName('TABLE');
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
220 for (var ptr = 0; ptr < tables.length; ptr ++) {
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
221 var inputs = tables[ptr].getElementsByTagName('INPUT');
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
222 var selected = 0;
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
223 // 1st item in table is select-all toggle
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
224 for (var ptr2 = 1; ptr2 < inputs.length; ptr2 ++) {
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
225 if (inputs[ptr2].getAttribute('name') == 'select' && inputs[ptr2].checked) selected ++;
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
226 }
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
227 if (selected==0) {
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
228 id = tables[ptr].getAttribute("id");
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
229 secInput = document.getElementById(id + '_start');
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
230 secInput.disabled = true;
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
231 secInput.setAttribute('disabled','disabled');
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
232 secInput.value='';
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
233 }
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
234
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
235 }
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
236 return true;
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
237 }
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
238 </script>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
239
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
240 <form id="tool_form" name="tool_form" action="../../../tool_runner" target="galaxy_main" method="post" enctype="application/x-www-form-urlencoded">
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
241 <input type="hidden" name="refresh" value="refresh"/>
1
812de0e282bd cosmetic edits
damion
parents: 0
diff changeset
242 <input type="hidden" name="tool_id" value="%(target_form)s"/>
0
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
243 <input type="hidden" name="tool_state" value="%(form_state)s">
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
244 <input type="hidden" name="input" value="%(dataset_selection_id)s"/>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
245 <input type="hidden" name="incl_excl" value="1"/>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
246 """ % self.lookup
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
247
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
248 if len(self.empty_queries):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
249 qnames = ''
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
250 for name in self.empty_queries: qnames += '<li>' + name + '</li>\n'
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
251 html += """
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
252 <div class="headerMessage">The following %s queries yielded 0 results (check filters):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
253 <ul>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
254 %s
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
255 </ul>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
256 </div>""" % (len(self.empty_queries), qnames)
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
257
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
258 return html % self.lookup
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
259
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
260 # Repeated for each grouped section table display
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
261 def _sectionStart(self):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
262 self.lookup['select_row'] +=1
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
263 return """
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
264 <div class="section section_depth%(section_depth)s">
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
265 <div class="section_title">%(label)s: %(value)s</div>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
266 """ % self.lookup
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
267
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
268
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
269
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
270 def _sectionFormStart (self):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
271 # This sets up the selection form with the minimal necessary parameters #
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
272 return """
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
273 <input type="checkbox" name="select" value="%(select_row)s" id="secId_%(select_row)s_start" checked="checked" style="display:none">
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
274 <input type="submit" class="btn btn-primary nonprintable" name="runtool_btn" value="Submit" onclick="formCheck()">
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
275 """ % self.lookup
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
276
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
277
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
278 def _tableStart (self):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
279
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
280 return """
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
281 <div class="checkUncheckAllPlaceholder"></div>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
282 <table class="report" id="secId_%(select_row)s">
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
283 %(table_header)s
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
284 """ % self.lookup
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
285
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
286
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
287 def _tableHeader(self):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
288
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
289 colTags = ''
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
290 thTags = ''
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
291 firstColumnFlag = True
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
292 # Style numeric fields
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
293 for field in self.columns:
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
294 if field['group'] == 'column':
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
295 colTags += ('<col />' if field['type'] == 'text' else '<col class="numeric" />')
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
296 if firstColumnFlag == True:
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
297 thTags += '''<th>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
298 <input type="checkbox" class="sectionCheckbox nonprintable" value="1"/>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
299 ''' + field['label'] + '</th>'
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
300 firstColumnFlag = False
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
301 else:
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
302 thTags += '<th>' + field['label'] + '</th>'
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
303
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
304 return """
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
305 <colgroup>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
306 %s
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
307 </colgroup>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
308 <thead class="top">
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
309 <tr>%s</tr>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
310 </thead>""" % (colTags, thTags)
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
311
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
312 def _tbodyHeader (self):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
313 if self.lookup['value'] == '': self.lookup['value'] = '(no match)'
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
314 return """
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
315 <thead class="inside">
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
316 <tr>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
317 <th colspan="%(column_count)s">%(label)s: %(value)s</th>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
318 </tr>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
319 </thead>""" % self.lookup
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
320
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
321 def _tbodyStart (self):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
322 return """
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
323 <tbody>""" % self.lookup
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
324
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
325
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
326 def _tableRow(self):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
327 self.lookup['select_row'] +=1
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
328
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
329 tdTags = ''
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
330 for (col, field) in enumerate(self.display_columns):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
331 value = self.rowdata[col]
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
332 self.lookup['value'] = value
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
333 self.lookup['cssClass'] = ' class="numeric"' if field['type'] == 'numeric' else ''
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
334 #See http://www.ncbi.nlm.nih.gov/books/NBK21091/table/ch18.T.refseq_accession_numbers_and_mole/?report=objectonly
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
335 #See http://www.ncbi.nlm.nih.gov/Sequin/acc.html
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
336 accessionID = re.search(r'[a-z]+[_]?[0-9]+(.[0-9]+)*' ,value, re.I)
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
337 if (accessionID) :
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
338 self.lookup['link'] = '<a href="https://google.com/#q=%s+gene" target="search">%s</a>' % (accessionID.group(), value)
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
339 else:
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
340 self.lookup['link'] = value
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
341 # First column optionally gets bin indicator as well as row checkbox selector
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
342 if (col == 0):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
343 tdTags += '<td%(cssClass)s><input type="checkbox" name="select" value="%(select_row)s" />%(link)s<span class="super">%(row_bins)s</span></td>' % self.lookup
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
344 else:
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
345 tdTags += '<td%(cssClass)s>%(value)s</td>' % self.lookup
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
346
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
347 return """\n\t\t\t<tr>%s</tr>""" % tdTags
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
348
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
349
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
350 def _tbodyEnd (self):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
351 return """
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
352 </tbody>"""
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
353
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
354 def _tableEnd (self):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
355 if len(self.section_bins):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
356 bins = []
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
357 for key in sorted(self.section_bins):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
358 bins.append( '<span class="super">(%s)</span>%s' % (key, self.section_bins[key]) )
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
359 self.lookup['section_bins'] = 'Bins: ' + ', '.join(bins)
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
360 else:
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
361 self.lookup['section_bins'] = ''
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
362
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
363 return """
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
364 <tfoot>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
365 <tr>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
366 <td colspan="%(column_count)s">
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
367 <div class="footerCenter">
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
368 %(filters)s.
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
369 </div>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
370 <div class="footerLeft">
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
371 <span class="rowViewer0"></span> %(table_rows)s results.
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
372 <span class="rowViewer1 nonprintable"></span>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
373 %(section_bins)s
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
374 </div>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
375 <div class="footerRight">
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
376 Report produced on %(timestamp)s
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
377 </div>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
378
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
379 </td>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
380 </tr>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
381 </tfoot>
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
382 </table>""" % self.lookup
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
383
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
384 def _sectionFormEnd (self):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
385 return """
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
386
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
387 """
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
388
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
389 def _sectionEnd (self):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
390 return """
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
391
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
392 </div>"""
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
393
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
394
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
395 def _bodyEnd (self):
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
396
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
397 return """
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
398 </form>\n\t</body>\n</html>"""
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
399
7db7ecc78ad6 Uploaded
damion
parents:
diff changeset
400