annotate templates/html_selectable_report.py @ 0:7db7ecc78ad6 draft

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