diff options
Diffstat (limited to 'scripts/minimaws')
-rw-r--r-- | scripts/minimaws/lib/dbaccess.py | 14 | ||||
-rw-r--r-- | scripts/minimaws/lib/htmltmpl.py | 39 | ||||
-rw-r--r-- | scripts/minimaws/lib/lxparse.py | 3 | ||||
-rw-r--r-- | scripts/minimaws/lib/wsgiserve.py | 42 |
4 files changed, 97 insertions, 1 deletions
diff --git a/scripts/minimaws/lib/dbaccess.py b/scripts/minimaws/lib/dbaccess.py index f81dad66b83..d5fe557ff91 100644 --- a/scripts/minimaws/lib/dbaccess.py +++ b/scripts/minimaws/lib/dbaccess.py @@ -644,6 +644,20 @@ class QueryCursor(object): 'ORDER BY ramoption.size', (machine, )) + def get_softwarelists(self, pattern): + if pattern is not None: + return self.dbcurs.execute( + 'SELECT softwarelist.shortname AS shortname, softwarelist.description AS description, COUNT(*) AS total, COUNT(CASE software.supported WHEN 0 THEN 1 ELSE NULL END) AS supported, COUNT(CASE software.supported WHEN 1 THEN 1 ELSE NULL END) AS partiallysupported, COUNT(CASE software.supported WHEN 2 THEN 1 ELSE NULL END) AS unsupported ' \ + 'FROM softwarelist LEFT JOIN software ON softwarelist.id = software.softwarelist ' \ + 'WHERE softwarelist.shortname GLOB ? ' \ + 'GROUP BY softwarelist.id', + (pattern, )) + else: + return self.dbcurs.execute( + 'SELECT softwarelist.shortname AS shortname, softwarelist.description AS description, COUNT(*) AS total, COUNT(CASE software.supported WHEN 0 THEN 1 ELSE NULL END) AS supported, COUNT(CASE software.supported WHEN 1 THEN 1 ELSE NULL END) AS partiallysupported, COUNT(CASE software.supported WHEN 2 THEN 1 ELSE NULL END) AS unsupported ' \ + 'FROM softwarelist LEFT JOIN software ON softwarelist.id = software.softwarelist ' \ + 'GROUP BY softwarelist.id') + def get_rom_dumps(self, crc, sha1): return self.dbcurs.execute( 'SELECT machine.shortname AS shortname, machine.description AS description, romdump.name AS label, romdump.bad AS bad ' \ diff --git a/scripts/minimaws/lib/htmltmpl.py b/scripts/minimaws/lib/htmltmpl.py index 55034b0d079..627de7de2bc 100644 --- a/scripts/minimaws/lib/htmltmpl.py +++ b/scripts/minimaws/lib/htmltmpl.py @@ -164,6 +164,45 @@ SOURCEFILE_LIST_ROW = string.Template( ' <td style="text-align: right">${machines}</td>\n' \ ' </tr>\n') + +SOFTWARELIST_LIST_PROLOGUE = string.Template( + '<!DOCTYPE html>\n' \ + '<html>\n' \ + '<head>\n' \ + ' <meta http-equiv="Content-Type" content="text/html; charset=utf-8">\n' \ + ' <meta http-equiv="Content-Style-Type" content="text/css">\n' \ + ' <meta http-equiv="Content-Script-Type" content="text/javascript">\n' \ + ' <link rel="stylesheet" type="text/css" href="${assets}/style.css">\n' \ + ' <script type="text/javascript">var assetsurl="${assets}"</script>\n' \ + ' <script type="text/javascript" src="${assets}/common.js"></script>\n' \ + ' <title>${title}</title>\n' \ + '</head>\n' \ + '<body>\n' \ + '<h1>${heading}</h1>\n' \ + '<table id="tbl-softwarelists">\n' \ + ' <thead>\n' \ + ' <tr>\n' \ + ' <th>Short name</th>\n' \ + ' <th>Description</th>\n' \ + ' <th class="numeric">Total</th>\n' \ + ' <th class="numeric">Supported</th>\n' \ + ' <th class="numeric">Partially supported</th>\n' \ + ' <th class="numeric">Unsupported</th>\n' \ + ' </tr>\n' \ + ' </thead>\n' \ + ' <tbody>\n') + +SOFTWARELIST_LIST_ROW = string.Template( + ' <tr>\n' \ + ' <td><a href="${href}">${shortname}</a></td>\n' \ + ' <td><a href="${href}">${description}</a></td>\n' \ + ' <td style="text-align: right">${total}</td>\n' \ + ' <td style="text-align: right">${supported}</td>\n' \ + ' <td style="text-align: right">${partiallysupported}</td>\n' \ + ' <td style="text-align: right">${unsupported}</td>\n' \ + ' </tr>\n') + + ROMIDENT_PAGE = string.Template( '<!DOCTYPE html>\n' \ '<html>\n' \ diff --git a/scripts/minimaws/lib/lxparse.py b/scripts/minimaws/lib/lxparse.py index 746cba33fe8..91208eb7fb1 100644 --- a/scripts/minimaws/lib/lxparse.py +++ b/scripts/minimaws/lib/lxparse.py @@ -406,7 +406,8 @@ def load_info(options): if options.softwarepath: parser.setContentHandler(SoftwareListHandler(dbconn)) for path in options.softwarepath: - for filename in [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.xml')]: + files = [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.xml')] + for filename in files: parser.parse(filename) dbconn.finalise_load() diff --git a/scripts/minimaws/lib/wsgiserve.py b/scripts/minimaws/lib/wsgiserve.py index da9cbed0f36..7ea3823bb02 100644 --- a/scripts/minimaws/lib/wsgiserve.py +++ b/scripts/minimaws/lib/wsgiserve.py @@ -103,6 +103,9 @@ class QueryPageHandler(HandlerBase): def sourcefile_href(self, sourcefile): return cgi.escape(urlparse.urljoin(self.application_uri, 'sourcefile/%s' % (urlquote(sourcefile), )), True) + def softwarelist_href(self, softwarelist): + return cgi.escape(urlparse.urljoin(self.application_uri, 'softwarelist/%s' % (urlquote(softwarelist), )), True) + class MachineRpcHandlerBase(QueryPageHandler): def __init__(self, app, application_uri, environ, start_response, **kwargs): @@ -426,6 +429,43 @@ class SourceFileHandler(QueryPageHandler): parent=cgi.escape(machine_info['cloneof'] or '')).encode('utf-8') +class SoftwareListHandler(QueryPageHandler): + def __init__(self, app, application_uri, environ, start_response, **kwargs): + super(SoftwareListHandler, self).__init__(app=app, application_uri=application_uri, environ=environ, start_response=start_response, **kwargs) + + def __iter__(self): + self.filename = self.environ['PATH_INFO'] + if self.filename and (self.filename[0] == '/'): + self.filename = self.filename[1:] + if (not self.filename) or ('*' in self.filename) or ('?' in self.filename): + if self.environ['REQUEST_METHOD'] != 'GET': + self.start_response('405 %s' % (self.STATUS_MESSAGE[405], ), [('Content-type', 'text/html; charset=utf-8'), ('Accept', 'GET, HEAD, OPTIONS'), ('Cache-Control', 'public, max-age=3600')]) + return self.error_page(405) + else: + self.start_response('200 OK', [('Content-type', 'text/html; chearset=utf-8'), ('Cache-Control', 'public, max-age=3600')]) + return self.softwarelist_listing_page(self.filename if self.filename else None) + + def softwarelist_listing_page(self, pattern): + if not pattern: + title = heading = 'All Software Lists' + else: + title = heading = 'Software Lists: ' + cgi.escape(pattern) + yield htmltmpl.SOFTWARELIST_LIST_PROLOGUE.substitute( + assets=cgi.escape(urlparse.urljoin(self.application_uri, 'static'), True), + title=title, + heading=heading).encode('utf-8') + for shortname, description, total, supported, partiallysupported, unsupported in self.dbcurs.get_softwarelists(pattern): + yield htmltmpl.SOFTWARELIST_LIST_ROW.substitute( + href=self.softwarelist_href(shortname), + shortname=cgi.escape(shortname), + description=cgi.escape(description), + total=cgi.escape('%d' % total), + supported=cgi.escape('%d' % supported), + partiallysupported=cgi.escape('%d' % partiallysupported), + unsupported=cgi.escape('%d' % unsupported)).encode('utf-8') + yield ' </tbody>\n</table>\n<script>make_table_sortable(document.getElementById("tbl-softwarelists"));</script>\n</body>\n</html>\n'.encode('utf-8') + + class RomIdentHandler(QueryPageHandler): def __init__(self, app, application_uri, environ, start_response, **kwargs): super(QueryPageHandler, self).__init__(app=app, application_uri=application_uri, environ=environ, start_response=start_response, **kwargs) @@ -598,6 +638,8 @@ class MiniMawsApp(object): return MachineHandler(self, application_uri, environ, start_response) elif module == 'sourcefile': return SourceFileHandler(self, application_uri, environ, start_response) + elif module == 'softwarelist': + return SoftwareListHandler(self, application_uri, environ, start_response) elif module == 'romident': return RomIdentHandler(self, application_uri, environ, start_response) elif module == 'static': |