Viewsettings
viewsettings
¶
VIEWSETTINGS
¶
Handles the settings that customize the look and feel on the page.
In fact, all parameters that originate from the user are treated here. They are stored in local storage in the browser, to when a page is loaded, these stored settings will be merged with the incoming request variables, and the outcome of that will again be stored in LocalStorage.
Source code in modules/viewsettings.py
class VIEWSETTINGS:
"""Handles the settings that customize the look and feel on the page.
In fact, all parameters that originate from the user are treated here.
They are stored in local storage in the browser,
to when a page is loaded, these stored settings will be merged with
the incoming request variables, and the outcome of that will again
be stored in LocalStorage.
"""
def __init__(self, Books):
self.Books = Books
Check = current.Check
self.state = collections.defaultdict(
lambda: collections.defaultdict(lambda: {})
)
self.pref = Check.field("rest", "", "pref")
def page(self):
"""Determines all settings and writes them out to Javascript.
This is the start of rendering a page.
At the client, the Javascript picks up the data and uses
it to customise the view.
Client code: [{viewstate}][viewstate]
"""
ViewDefs = current.ViewDefs
pageConfig = self.writeConfig()
return dict(
pageConfig=pageConfig,
colorPicker=ViewDefs.colorPicker,
legend=LEGEND,
tabLabels=ViewDefs.tabLabels,
trLabels=ViewDefs.trLabels,
nTabViews=ViewDefs.nTabViews,
trInfo=ViewDefs.trInfo,
)
def initState(self):
Books = self.Books
ViewDefs = current.ViewDefs
Check = current.Check
VERSIONS = current.VERSIONS
settings = ViewDefs.settings
validation = ViewDefs.validation
requestVars = current.request.vars
requestCookies = current.request.cookies
responseCookies = current.response.cookies
for (group, groupSettings) in settings.items():
self.state[group] = {}
for qw in groupSettings:
self.state[group][qw] = {}
fromCookie = {}
if (self.pref + group + qw) in requestCookies:
if self.pref == "my":
try:
fromCookie = json.loads(
urllib.parse.unquote(
requestCookies[self.pref + group + qw].value
)
)
except ValueError:
pass
if group == "colormap":
for fid in fromCookie:
if len(fid) <= 32 and fid.replace("_", "").isalnum():
validationState = validation[group][qw]["0"](
None, fromCookie[fid]
)
if validationState is not None:
self.state[group][qw][fid] = validationState
for f in requestVars:
if not f.startswith(f"c_{qw}"):
continue
fid = f[3:]
if len(fid) <= 32 and fid.replace("_", "").isalnum():
validationState = Check.field(group, qw, fid, default=False)
if validationState is not None:
fromCookie[fid] = validationState
self.state[group][qw][fid] = validationState
elif group != "rest":
for f in settings[group][qw]:
init = settings[group][qw][f]
validationState = validation[group][qw][f](
init, fromCookie.get(f, None)
)
vstater = Check.field(group, qw, f, default=False)
if vstater is not None:
validationState = vstater
fromCookie[f] = validationState
self.state[group][qw][f] = validationState
if group != "rest":
responseCookies[self.pref + group + qw] = urllib.parse.quote(
json.dumps(fromCookie)
)
responseCookies[self.pref + group + qw]["expires"] = 30 * 24 * 3600
responseCookies[self.pref + group + qw]["path"] = "/"
books = {}
booksOrder = {}
bookIds = {}
bookName = {}
self.books = books
self.booksOrder = booksOrder
self.bookIds = bookIds
self.bookName = bookName
for v in VERSIONS:
(books[v], booksOrder[v], bookIds[v], bookName[v]) = Books.get(v)
def currentVersion(self):
"""Return the current version.
This is the version as determined by the latest request.
See [∈ version][elem-version].
"""
return self.state["material"][""]["version"]
def writeConfig(self):
ViewDefs = current.ViewDefs
URL = current.URL
VERSIONS = current.VERSIONS
return dedent(
f"""
var Config = {{
bookLangs: {json.dumps(BOOK_LANGS[BIBLANG])},
bookLatin: {json.dumps(BOOK_NAMES[BIBLANG]["la"])},
bookOrder: {json.dumps(self.booksOrder)},
books: {json.dumps(self.books)},
bookTrans: {json.dumps(BOOK_TRANS)},
colorsDefault: {json.dumps(ViewDefs.colorsDefault)},
colorsCls: {json.dumps(ViewDefs.makeColors())},
colors: {json.dumps(ViewDefs.colors)},
nDefaultClrCols: {ViewDefs.nDefaultClrCols},
nDefaultClrRows: {ViewDefs.nDefaultClrRows},
featureHost: "https://etcbc.github.io/bhsa/features",
nextTp: {json.dumps(ViewDefs.nextTp)},
nextTr: {json.dumps(ViewDefs.nextTr)},
noteStatusCls: {json.dumps(ViewDefs.noteStatusCls)},
noteStatusNxt: {json.dumps(ViewDefs.noteStatusNxt)},
noteStatusSym: {json.dumps(ViewDefs.noteStatusSym)},
pref: "{self.pref}",
itemStyle: {json.dumps(ViewDefs.itemStyle)},
nTabViews: {ViewDefs.nTabViews},
tabInfo: {json.dumps(ViewDefs.tabInfo)},
tabLabels: {json.dumps(ViewDefs.tabLabels)},
trInfo: {json.dumps(ViewDefs.trInfo)},
trLabels: {json.dumps(ViewDefs.trLabels)},
versions: {json.dumps(list(VERSIONS))},
viewInit: {json.dumps(self.state)},
pageShareUrl: "{URL("hebrew", "text", host=True)}",
wordShareUrl: "{URL("hebrew", "word", host=True)}",
queryShareUrl: "{URL("hebrew", "query", host=True)}",
noteShareUrl: "{URL("hebrew", "note", host=True)}",
pageUrl: "{URL("hebrew", "text")}",
pageMaterialUrl: "{URL("hebrew", "material")}",
pageSidebarUrl: "{URL("hebrew", "side")}",
verseFeaturesUrl: "{URL("hebrew", "verse")}",
wordsPageUrl: "{URL("hebrew", "words")}",
queriesPageUrl: "{URL("hebrew", "queries")}",
notesPageUrl: "{URL("hebrew", "notes")}",
queryTreeJsonUrl: "{URL("hebrew", "querytree.json")}",
noteTreeJsonUrl: "{URL("hebrew", "notetree.json")}",
queriesRecentJsonUrl: "{URL("hebrew", "queriesr.json")}",
queryUpdateJsonUrl: "{URL("hebrew", "queryupdate.json")}",
querySharingJsonUrl: "{URL("hebrew", "querysharing.json")}",
getNotesVerseJsonUrl: "{URL("hebrew", "getversenotes.json")}",
putNotesVerseJsonUrl: "{URL("hebrew", "putversenotes.json")}",
noteUploadJsonUrl: "{URL("hebrew", "noteupload.json")}",
itemRecordJsonUrl: "{URL("hebrew", "itemrecord.json")}",
chartUrl: "{URL("hebrew", "chart")}",
itemCsvUrl: "{URL("hebrew", "item.csv")}",
bolUrl: "http://bibleol.3bmoodle.dk/text/show_text",
pblUrl: "https://parabible.com",
}}
"""
)
__init__(self, Books)
special
¶
Source code in modules/viewsettings.py
def __init__(self, Books):
self.Books = Books
Check = current.Check
self.state = collections.defaultdict(
lambda: collections.defaultdict(lambda: {})
)
self.pref = Check.field("rest", "", "pref")
page(self)
¶
Determines all settings and writes them out to Javascript.
This is the start of rendering a page. At the client, the Javascript picks up the data and uses it to customise the view.
Client code: {viewstate}
Source code in modules/viewsettings.py
def page(self):
"""Determines all settings and writes them out to Javascript.
This is the start of rendering a page.
At the client, the Javascript picks up the data and uses
it to customise the view.
Client code: [{viewstate}][viewstate]
"""
ViewDefs = current.ViewDefs
pageConfig = self.writeConfig()
return dict(
pageConfig=pageConfig,
colorPicker=ViewDefs.colorPicker,
legend=LEGEND,
tabLabels=ViewDefs.tabLabels,
trLabels=ViewDefs.trLabels,
nTabViews=ViewDefs.nTabViews,
trInfo=ViewDefs.trInfo,
)
initState(self)
¶
Source code in modules/viewsettings.py
def initState(self):
Books = self.Books
ViewDefs = current.ViewDefs
Check = current.Check
VERSIONS = current.VERSIONS
settings = ViewDefs.settings
validation = ViewDefs.validation
requestVars = current.request.vars
requestCookies = current.request.cookies
responseCookies = current.response.cookies
for (group, groupSettings) in settings.items():
self.state[group] = {}
for qw in groupSettings:
self.state[group][qw] = {}
fromCookie = {}
if (self.pref + group + qw) in requestCookies:
if self.pref == "my":
try:
fromCookie = json.loads(
urllib.parse.unquote(
requestCookies[self.pref + group + qw].value
)
)
except ValueError:
pass
if group == "colormap":
for fid in fromCookie:
if len(fid) <= 32 and fid.replace("_", "").isalnum():
validationState = validation[group][qw]["0"](
None, fromCookie[fid]
)
if validationState is not None:
self.state[group][qw][fid] = validationState
for f in requestVars:
if not f.startswith(f"c_{qw}"):
continue
fid = f[3:]
if len(fid) <= 32 and fid.replace("_", "").isalnum():
validationState = Check.field(group, qw, fid, default=False)
if validationState is not None:
fromCookie[fid] = validationState
self.state[group][qw][fid] = validationState
elif group != "rest":
for f in settings[group][qw]:
init = settings[group][qw][f]
validationState = validation[group][qw][f](
init, fromCookie.get(f, None)
)
vstater = Check.field(group, qw, f, default=False)
if vstater is not None:
validationState = vstater
fromCookie[f] = validationState
self.state[group][qw][f] = validationState
if group != "rest":
responseCookies[self.pref + group + qw] = urllib.parse.quote(
json.dumps(fromCookie)
)
responseCookies[self.pref + group + qw]["expires"] = 30 * 24 * 3600
responseCookies[self.pref + group + qw]["path"] = "/"
books = {}
booksOrder = {}
bookIds = {}
bookName = {}
self.books = books
self.booksOrder = booksOrder
self.bookIds = bookIds
self.bookName = bookName
for v in VERSIONS:
(books[v], booksOrder[v], bookIds[v], bookName[v]) = Books.get(v)
currentVersion(self)
¶
Return the current version.
This is the version as determined by the latest request.
See ∈ version.
Source code in modules/viewsettings.py
def currentVersion(self):
"""Return the current version.
This is the version as determined by the latest request.
See [∈ version][elem-version].
"""
return self.state["material"][""]["version"]
writeConfig(self)
¶
Source code in modules/viewsettings.py
def writeConfig(self):
ViewDefs = current.ViewDefs
URL = current.URL
VERSIONS = current.VERSIONS
return dedent(
f"""
var Config = {{
bookLangs: {json.dumps(BOOK_LANGS[BIBLANG])},
bookLatin: {json.dumps(BOOK_NAMES[BIBLANG]["la"])},
bookOrder: {json.dumps(self.booksOrder)},
books: {json.dumps(self.books)},
bookTrans: {json.dumps(BOOK_TRANS)},
colorsDefault: {json.dumps(ViewDefs.colorsDefault)},
colorsCls: {json.dumps(ViewDefs.makeColors())},
colors: {json.dumps(ViewDefs.colors)},
nDefaultClrCols: {ViewDefs.nDefaultClrCols},
nDefaultClrRows: {ViewDefs.nDefaultClrRows},
featureHost: "https://etcbc.github.io/bhsa/features",
nextTp: {json.dumps(ViewDefs.nextTp)},
nextTr: {json.dumps(ViewDefs.nextTr)},
noteStatusCls: {json.dumps(ViewDefs.noteStatusCls)},
noteStatusNxt: {json.dumps(ViewDefs.noteStatusNxt)},
noteStatusSym: {json.dumps(ViewDefs.noteStatusSym)},
pref: "{self.pref}",
itemStyle: {json.dumps(ViewDefs.itemStyle)},
nTabViews: {ViewDefs.nTabViews},
tabInfo: {json.dumps(ViewDefs.tabInfo)},
tabLabels: {json.dumps(ViewDefs.tabLabels)},
trInfo: {json.dumps(ViewDefs.trInfo)},
trLabels: {json.dumps(ViewDefs.trLabels)},
versions: {json.dumps(list(VERSIONS))},
viewInit: {json.dumps(self.state)},
pageShareUrl: "{URL("hebrew", "text", host=True)}",
wordShareUrl: "{URL("hebrew", "word", host=True)}",
queryShareUrl: "{URL("hebrew", "query", host=True)}",
noteShareUrl: "{URL("hebrew", "note", host=True)}",
pageUrl: "{URL("hebrew", "text")}",
pageMaterialUrl: "{URL("hebrew", "material")}",
pageSidebarUrl: "{URL("hebrew", "side")}",
verseFeaturesUrl: "{URL("hebrew", "verse")}",
wordsPageUrl: "{URL("hebrew", "words")}",
queriesPageUrl: "{URL("hebrew", "queries")}",
notesPageUrl: "{URL("hebrew", "notes")}",
queryTreeJsonUrl: "{URL("hebrew", "querytree.json")}",
noteTreeJsonUrl: "{URL("hebrew", "notetree.json")}",
queriesRecentJsonUrl: "{URL("hebrew", "queriesr.json")}",
queryUpdateJsonUrl: "{URL("hebrew", "queryupdate.json")}",
querySharingJsonUrl: "{URL("hebrew", "querysharing.json")}",
getNotesVerseJsonUrl: "{URL("hebrew", "getversenotes.json")}",
putNotesVerseJsonUrl: "{URL("hebrew", "putversenotes.json")}",
noteUploadJsonUrl: "{URL("hebrew", "noteupload.json")}",
itemRecordJsonUrl: "{URL("hebrew", "itemrecord.json")}",
chartUrl: "{URL("hebrew", "chart")}",
itemCsvUrl: "{URL("hebrew", "item.csv")}",
bolUrl: "http://bibleol.3bmoodle.dk/text/show_text",
pblUrl: "https://parabible.com",
}}
"""
)