summaryrefslogtreecommitdiffstats
path: root/docs/release/scripts/minimaws/lib
diff options
context:
space:
mode:
author Robbbert <Robbbert@users.noreply.github.com>2021-10-27 14:57:10 +1100
committer Robbbert <Robbbert@users.noreply.github.com>2021-10-27 14:57:10 +1100
commit7963e94b66da5ae455d99e1cb700604006df5221 (patch)
tree7bb1e5b6f99f83bbbf7d30eafb5cd30dc5a04944 /docs/release/scripts/minimaws/lib
parent94b51d9776fe0f3bdd0878b710d4b6bccf17cd47 (diff)
Files for 0.237tag237
Diffstat (limited to 'docs/release/scripts/minimaws/lib')
-rw-r--r--docs/release/scripts/minimaws/lib/assets/common.js7
-rw-r--r--docs/release/scripts/minimaws/lib/assets/disclosedown.svg2
-rw-r--r--docs/release/scripts/minimaws/lib/assets/discloseup.svg2
-rw-r--r--docs/release/scripts/minimaws/lib/dbaccess.py32
-rw-r--r--docs/release/scripts/minimaws/lib/htmltmpl.py32
-rw-r--r--docs/release/scripts/minimaws/lib/lxparse.py20
-rw-r--r--docs/release/scripts/minimaws/lib/wsgiserve.py36
7 files changed, 112 insertions, 19 deletions
diff --git a/docs/release/scripts/minimaws/lib/assets/common.js b/docs/release/scripts/minimaws/lib/assets/common.js
index baedcf3940d..7439aaa5a21 100644
--- a/docs/release/scripts/minimaws/lib/assets/common.js
+++ b/docs/release/scripts/minimaws/lib/assets/common.js
@@ -37,6 +37,13 @@ function make_collapsible(heading, section)
}
}
});
+
+ return function ()
+ {
+ hidden = true;
+ icon.setAttribute('src', assetsurl + '/discloseup.svg');
+ section.style.display = 'none';
+ };
}
diff --git a/docs/release/scripts/minimaws/lib/assets/disclosedown.svg b/docs/release/scripts/minimaws/lib/assets/disclosedown.svg
index ddf75e25f0f..bb66c7f5de9 100644
--- a/docs/release/scripts/minimaws/lib/assets/disclosedown.svg
+++ b/docs/release/scripts/minimaws/lib/assets/disclosedown.svg
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="16" width="16">
- <path d="m 0,0 h 16 l -8,16 z" />
+ <path d="m 0,5 h 16 l -8,10 z" />
</svg>
diff --git a/docs/release/scripts/minimaws/lib/assets/discloseup.svg b/docs/release/scripts/minimaws/lib/assets/discloseup.svg
index 51e2bea9863..010065a446b 100644
--- a/docs/release/scripts/minimaws/lib/assets/discloseup.svg
+++ b/docs/release/scripts/minimaws/lib/assets/discloseup.svg
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="16" width="16">
- <path d="m 0,0 v 16 l 16,-8 z" />
+ <path d="m 5,0 v 16 l 10,-8 z" />
</svg>
diff --git a/docs/release/scripts/minimaws/lib/dbaccess.py b/docs/release/scripts/minimaws/lib/dbaccess.py
index c22b7c318fa..3cfbec0c508 100644
--- a/docs/release/scripts/minimaws/lib/dbaccess.py
+++ b/docs/release/scripts/minimaws/lib/dbaccess.py
@@ -33,6 +33,11 @@ class SchemaQueries(object):
' shortname TEXT NOT NULL,\n' \
' description TEXT NOT NULL,\n' \
' UNIQUE (shortname ASC))'
+ CREATE_SOFTWARELISTNOTES = \
+ 'CREATE TABLE softwarelistnotes (\n' \
+ ' softwarelist INTEGER PRIMARY KEY,\n' \
+ ' notes TEXT NOT NULL,\n' \
+ ' FOREIGN KEY (softwarelist) REFERENCES softwarelist (id))'
CREATE_SOFTWARE = \
'CREATE TABLE software (\n' \
' id INTEGER PRIMARY KEY,\n' \
@@ -50,6 +55,11 @@ class SchemaQueries(object):
' parent INTEGER NOT NULL,\n' \
' FOREIGN KEY (id) REFERENCES software (id),\n' \
' FOREIGN KEY (parent) REFERENCES software (id))'
+ CREATE_SOFTWARENOTES = \
+ 'CREATE TABLE softwarenotes (\n' \
+ ' software INTEGER PRIMARY KEY,\n' \
+ ' notes TEXT NOT NULL,\n' \
+ ' FOREIGN KEY (software) REFERENCES software (id))'
CREATE_SOFTWAREINFO = \
'CREATE TABLE softwareinfo (\n' \
' id INTEGER PRIMARY KEY,\n' \
@@ -390,8 +400,10 @@ class SchemaQueries(object):
CREATE_SOFTWARESHAREDFEATTYPE,
CREATE_SOFTWAREPARTFEATURETYPE,
CREATE_SOFTWARELIST,
+ CREATE_SOFTWARELISTNOTES,
CREATE_SOFTWARE,
CREATE_SOFTWARECLONEOF,
+ CREATE_SOFTWARENOTES,
CREATE_SOFTWAREINFO,
CREATE_SOFTWARESHAREDFEAT,
CREATE_SOFTWAREPART,
@@ -500,7 +512,9 @@ class UpdateQueries(object):
ADD_SOFTWARESHAREDFEATTYPE = 'INSERT OR IGNORE INTO softwaresharedfeattype (name) VALUES (?)'
ADD_SOFTWAREPARTFEATURETYPE = 'INSERT OR IGNORE INTO softwarepartfeaturetype (name) VALUES(?)'
ADD_SOFTWARELIST = 'INSERT INTO softwarelist (shortname, description) VALUES (?, ?)'
+ ADD_SOFTWARELISTNOTES = 'INSERT INTO softwarelistnotes (softwarelist, notes) VALUES (?, ?)'
ADD_SOFTWARE = 'INSERT INTO software (softwarelist, shortname, supported, description, year, publisher) VALUES (?, ?, ?, ?, ?, ?)'
+ ADD_SOFTWARENOTES = 'INSERT INTO softwarenotes (software, notes) VALUES (?, ?)'
ADD_SOFTWAREINFO = 'INSERT INTO softwareinfo (software, infotype, value) SELECT ?, id, ? FROM softwareinfotype WHERE name = ?'
ADD_SOFTWARESHAREDFEAT = 'INSERT INTO softwaresharedfeat (software, sharedfeattype, value) SELECT ?, id, ? FROM softwaresharedfeattype WHERE name = ?'
ADD_SOFTWAREPART = 'INSERT INTO softwarepart (software, shortname, interface) VALUES (?, ?, ?)'
@@ -785,15 +799,15 @@ class QueryCursor(object):
def get_softwarelist_details(self, shortname, pattern):
if pattern is not None:
return self.dbcurs.execute(
- 'SELECT softwarelist.id AS id, softwarelist.shortname AS shortname, softwarelist.description AS description, COUNT(software.id) 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 ' \
+ 'SELECT softwarelist.id AS id, softwarelist.shortname AS shortname, softwarelist.description AS description, softwarelistnotes.notes AS notes, COUNT(software.id) 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 softwarelistnotes ON softwarelist.id = softwarelistnotes.softwarelist LEFT JOIN software ON softwarelist.id = software.softwarelist ' \
'WHERE softwarelist.shortname = ? AND software.shortname GLOB ? ' \
'GROUP BY softwarelist.id',
(shortname, pattern))
else:
return self.dbcurs.execute(
- 'SELECT softwarelist.id AS id, softwarelist.shortname AS shortname, softwarelist.description AS description, COUNT(software.id) 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 ' \
+ 'SELECT softwarelist.id AS id, softwarelist.shortname AS shortname, softwarelist.description AS description, softwarelistnotes.notes AS notes, COUNT(software.id) 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 softwarelistnotes ON softwarelist.id = softwarelistnotes.softwarelist LEFT JOIN software ON softwarelist.id = software.softwarelist ' \
'WHERE softwarelist.shortname = ? ' \
'GROUP BY softwarelist.id',
(shortname, ))
@@ -836,8 +850,8 @@ class QueryCursor(object):
def get_software_details(self, softwarelist, software):
return self.dbcurs.execute(
- 'SELECT software.id AS id, software.shortname AS shortname, software.supported AS supported, software.description AS description, software.year AS year, software.publisher AS publisher, softwarelist.shortname AS softwarelist, softwarelist.description AS softwarelistdescription, parent.shortname AS parent, parent.description AS parentdescription, parentsoftwarelist.shortname AS parentsoftwarelist, parentsoftwarelist.description AS parentsoftwarelistdescription ' \
- 'FROM software LEFT JOIN softwarelist ON software.softwarelist = softwarelist.id LEFT JOIN softwarecloneof ON software.id = softwarecloneof.id LEFT JOIN software AS parent ON softwarecloneof.parent = parent.id LEFT JOIN softwarelist AS parentsoftwarelist ON parent.softwarelist = parentsoftwarelist.id ' \
+ 'SELECT software.id AS id, software.shortname AS shortname, software.supported AS supported, software.description AS description, software.year AS year, software.publisher AS publisher, softwarelist.shortname AS softwarelist, softwarelist.description AS softwarelistdescription, parent.shortname AS parent, parent.description AS parentdescription, parentsoftwarelist.shortname AS parentsoftwarelist, parentsoftwarelist.description AS parentsoftwarelistdescription, softwarenotes.notes AS notes ' \
+ 'FROM software LEFT JOIN softwarelist ON software.softwarelist = softwarelist.id LEFT JOIN softwarecloneof ON software.id = softwarecloneof.id LEFT JOIN software AS parent ON softwarecloneof.parent = parent.id LEFT JOIN softwarelist AS parentsoftwarelist ON parent.softwarelist = parentsoftwarelist.id LEFT JOIN softwarenotes ON softwarenotes.software = software.id ' \
'WHERE software.softwarelist = (SELECT id FROM softwarelist WHERE shortname = ?) AND software.shortname = ?',
(softwarelist, software))
@@ -912,6 +926,9 @@ class UpdateCursor(object):
self.dbcurs.execute(UpdateQueries.ADD_SOFTWARELIST, (shortname, description))
return self.dbcurs.lastrowid
+ def add_softwarelistnotes(self, softwarelist, notes):
+ self.dbcurs.execute(UpdateQueries.ADD_SOFTWARELISTNOTES, (softwarelist, notes))
+
def add_softwareinfotype(self, name):
self.dbcurs.execute(UpdateQueries.ADD_SOFTWAREINFOTYPE, (name, ))
@@ -929,6 +946,9 @@ class UpdateCursor(object):
self.dbcurs.execute(UpdateQueries.ADD_TEMPORARY_SOFTWARECLONEOF, (software, parent))
return self.dbcurs.lastrowid
+ def add_softwarenotes(self, software, notes):
+ self.dbcurs.execute(UpdateQueries.ADD_SOFTWARENOTES, (software, notes))
+
def add_softwareinfo(self, software, infotype, value):
self.dbcurs.execute(UpdateQueries.ADD_SOFTWAREINFO, (software, value, infotype))
return self.dbcurs.lastrowid
diff --git a/docs/release/scripts/minimaws/lib/htmltmpl.py b/docs/release/scripts/minimaws/lib/htmltmpl.py
index a80b4099787..62e1bbcf1ea 100644
--- a/docs/release/scripts/minimaws/lib/htmltmpl.py
+++ b/docs/release/scripts/minimaws/lib/htmltmpl.py
@@ -281,11 +281,27 @@ SOFTWARE_CLONES_ROW = string.Template(
' <td>${supported}</td>\n' \
' </tr>\n')
+SOFTWARE_NOTES_PROLOGUE = string.Template(
+ '<h2 id="heading-notes">Notes</h2>\n' \
+ '<div id="div-notes">\n')
+
+SOFTWARE_NOTES_EPILOGUE = string.Template(
+ '</div>\n' \
+ '<script>make_collapsible(document.getElementById("heading-notes"), document.getElementById("div-notes"))();</script>\n\n')
+
+SOFTWARE_PARTS_PROLOGUE = string.Template(
+ '<h2 id="heading-parts">Parts</h2>\n' \
+ '<div id="div-parts">\n\n')
+
+SOFTWARE_PARTS_EPILOGUE = string.Template(
+ '</div>\n' \
+ '<script>make_collapsible(document.getElementById("heading-parts"), document.getElementById("div-parts"));</script>\n\n')
+
SOFTWARE_PART_PROLOGUE = string.Template(
- '<h3>${heading}</h3>\n' \
- '<table class="sysinfo">\n' \
- ' <tr><th>Short name:</th><td>${shortname}</td></tr>\n' \
- ' <tr><th>Interface:</th><td>${interface}</td></tr>\n')
+ ' <h3>${heading}</h3>\n' \
+ ' <table class="sysinfo">\n' \
+ ' <tr><th>Short name:</th><td>${shortname}</td></tr>\n' \
+ ' <tr><th>Interface:</th><td>${interface}</td></tr>\n')
SOFTWARELIST_PROLOGUE = string.Template(
@@ -328,6 +344,14 @@ SOFTWARELIST_PROLOGUE = string.Template(
' </tr>\n' \
'</table>\n')
+SOFTWARELIST_NOTES_PROLOGUE = string.Template(
+ '<h2 id="heading-notes">Notes</h2>\n' \
+ '<div id="div-notes">\n')
+
+SOFTWARELIST_NOTES_EPILOGUE = string.Template(
+ '</div>\n' \
+ '<script>make_collapsible(document.getElementById("heading-notes"), document.getElementById("div-notes"))();</script>\n\n')
+
SOFTWARELIST_MACHINE_TABLE_HEADER = string.Template(
'<h2 id="heading-machines">Machines</h2>\n' \
'<table id="tbl-machines">\n' \
diff --git a/docs/release/scripts/minimaws/lib/lxparse.py b/docs/release/scripts/minimaws/lib/lxparse.py
index 46737ef438a..e773669080d 100644
--- a/docs/release/scripts/minimaws/lib/lxparse.py
+++ b/docs/release/scripts/minimaws/lib/lxparse.py
@@ -352,6 +352,7 @@ class SoftwareHandler(ElementHandler):
'description': TextAccumulator,
'year': TextAccumulator,
'publisher': TextAccumulator,
+ 'notes': TextAccumulator,
'part': SoftwarePartHandler }
def __init__(self, parent, **kwargs):
@@ -389,9 +390,15 @@ class SoftwareHandler(ElementHandler):
self.id = self.dbcurs.add_software(self.softwarelist, self.shortname, self.supported, self.description, self.year, self.publisher)
if self.cloneof is not None:
self.dbcurs.add_softwarecloneof(self.id, self.cloneof)
+ elif name == 'notes':
+ self.dbcurs.add_softwarenotes(self.id, handler.text)
class SoftwareListHandler(ElementHandler):
+ CHILD_HANDLERS = {
+ 'notes': TextAccumulator,
+ 'software': SoftwareHandler }
+
def __init__(self, dbconn, **kwargs):
super(SoftwareListHandler, self).__init__(parent=None, **kwargs)
self.dbconn = dbconn
@@ -419,15 +426,20 @@ class SoftwareListHandler(ElementHandler):
self.dbconn.commit()
def startChildElement(self, name, attrs):
- if name != 'software':
+ if name in self.CHILD_HANDLERS:
+ self.setChildHandler(name, attrs, self.CHILD_HANDLERS[name](self))
+ else:
raise xml.sax.SAXParseException(
- msg=('Expected "software" element but found "%s"' % (name, )),
+ msg=('Found unexpected element "%s"' % (name, )),
exception=None,
locator=self.locator)
- self.setChildHandler(name, attrs, SoftwareHandler(self))
def endChildHandler(self, name, handler):
- if name == 'software':
+ if name == 'notes':
+ dbcurs = self.dbconn.cursor()
+ dbcurs.add_softwarelistnotes(self.id, handler.text)
+ dbcurs.close()
+ elif name == 'software':
if self.entries >= 1023:
self.dbconn.commit()
self.entries = 0
diff --git a/docs/release/scripts/minimaws/lib/wsgiserve.py b/docs/release/scripts/minimaws/lib/wsgiserve.py
index 43d5dbc1253..1158528d954 100644
--- a/docs/release/scripts/minimaws/lib/wsgiserve.py
+++ b/docs/release/scripts/minimaws/lib/wsgiserve.py
@@ -661,6 +661,20 @@ class SoftwareListHandler(QueryPageHandler):
unsupported=htmlescape('%d' % (softwarelist_info['unsupported'], )),
unsupportedpc=htmlescape('%.1f' % (softwarelist_info['unsupported'] * 100.0 / (softwarelist_info['total'] or 1), ))).encode('utf-8')
+ if softwarelist_info['notes'] is not None:
+ yield htmltmpl.SOFTWARELIST_NOTES_PROLOGUE.substitute().encode('utf-8')
+ first = True
+ for line in softwarelist_info['notes'].strip().splitlines():
+ if line:
+ yield (('<p>%s' if first else '<br />\n%s') % (htmlescape(line), )).encode('utf-8')
+ first = False
+ elif not first:
+ yield '</p>\n'.encode('utf-8')
+ first = True
+ if not first:
+ yield '</p>\n'.encode('utf-8')
+ yield htmltmpl.SOFTWARELIST_NOTES_EPILOGUE.substitute().encode('utf-8')
+
first = True
for machine_info in self.dbcurs.get_softwarelist_machines(softwarelist_info['id']):
if first:
@@ -719,19 +733,35 @@ class SoftwareListHandler(QueryPageHandler):
yield htmltmpl.SORTABLE_TABLE_EPILOGUE.substitute(id='tbl-clones').encode('utf-8')
yield '<script>make_collapsible(document.getElementById("heading-clones"), document.getElementById("tbl-clones"));</script>\n'.encode('utf-8')
+ if software_info['notes'] is not None:
+ yield htmltmpl.SOFTWARE_NOTES_PROLOGUE.substitute().encode('utf-8')
+ first = True
+ for line in software_info['notes'].strip().splitlines():
+ if line:
+ yield (('<p>%s' if first else '<br />\n%s') % (htmlescape(line), )).encode('utf-8')
+ first = False
+ elif not first:
+ yield '</p>\n'.encode('utf-8')
+ first = True
+ if not first:
+ yield '</p>\n'.encode('utf-8')
+ yield htmltmpl.SOFTWARE_NOTES_EPILOGUE.substitute().encode('utf-8')
+
parts = self.dbcurs.get_software_parts(software_info['id']).fetchall()
first = True
for id, partname, interface, part_id in parts:
if first:
- yield '<h2>Parts</h2>\n'.encode('utf-8')
+ yield htmltmpl.SOFTWARE_PARTS_PROLOGUE.substitute().encode('utf-8')
first = False
yield htmltmpl.SOFTWARE_PART_PROLOGUE.substitute(
heading=htmlescape(('%s (%s)' % (part_id, partname)) if part_id is not None else partname),
shortname=htmlescape(partname),
interface=htmlescape(interface)).encode('utf-8')
for name, value in self.dbcurs.get_softwarepart_features(id):
- yield (' <tr><th>%s:</th><td>%s</td>\n' % (htmlescape(name), htmlescape(value))).encode('utf-8')
- yield '</table>\n\n'.encode('utf-8')
+ yield (' <tr><th>%s:</th><td>%s</td>\n' % (htmlescape(name), htmlescape(value))).encode('utf-8')
+ yield ' </table>\n\n'.encode('utf-8')
+ if not first:
+ yield htmltmpl.SOFTWARE_PARTS_EPILOGUE.substitute().encode('utf-8')
yield '</body>\n</html>\n'.encode('utf-8')