def outputHtmlUserlist(fname, db, keys): h = HTML() head = h.head("") with h.body(""): with h.table(border='1', newlines=True): with h.colgroup: h.col(span="1", style="width: 64px;") h.col(span="1", style="width: 130px;") h.col(span="1", style="width: 250px;") h.col(span="1", style="width: 250px;") with h.tr: h.th("avatar") h.th("username") h.th("fullname") h.th("location") for u in keys: with h.tr: with h.td(): h.img('', src=escape(db.usernames[u].avatar), width="64", height="64") h.td(u) h.td(escape(db.usernames[u].fullname)) h.td(escape(db.usernames[u].location)) open(fname, "w").write(str(h))
def outputHtmlUserlist(fname, db, keys): h = HTML() head = h.head("") with h.body(""): with h.table(border='1', newlines=True): with h.colgroup: h.col(span="1", style="width: 64px;") h.col(span="1", style="width: 130px;") h.col(span="1", style="width: 250px;") h.col(span="1", style="width: 250px;") with h.tr: h.th("avatar") h.th("username") h.th("fullname") h.th("location") for u in keys: with h.tr: with h.td(): h.img('',src=escape(db.usernames[u].avatar), width="64", height="64") h.td(u) h.td(escape(db.usernames[u].fullname)) h.td(escape(db.usernames[u].location)) open(fname, "w").write(str(h))
class Spot: """ The Spot class """ # ---------------------------------------------------------------------- def __init__(self, settings, session, data, inputs): # --- Definitions self.settings = settings self.session = session self.data = data self.inputs = inputs self.html = HTML(self) self.display = True; # --- Pre-processing self.pre_process() # --- Actions if self.inputs.getvalue('form_action') is not None: # NB: stop is for redirection stop = self.form_action() else: stop = None # --- Html if stop is None: self.html.meta(Language=self.session.language) self.html.favicon('Core/Style/Icons/favicon.ico?v={0}'.format(time())) self.html.style('fonts') self.html.style('common') self.html.jsfile('Core/JS/jquery.js') self.html.jsfile('Core/JS/common.js') self.set_html() # ---------------------------------------------------------------------- def pre_process(self): ''' Pre-processing method Inputs: - Output: None ''' # --- Set language self.set_lang() # ---------------------------------------------------------------------- def set_html(self): ''' Sets html code Inputs: - Output: None ''' pass # ---------------------------------------------------------------------- def set_lang(self): ''' Determine spot language Inputs: - Output: None ''' # self.session.language # --- Modification lang = self.inputs.getvalue('lang') if lang is not None and lang in self.settings.LANGUAGES: # Update database self.session.DB.update('Sessions', 'lang', lang, 'sid=?', self.session.id) # Update session self.session.language = lang # --- Conversion self.LangIdx = self.settings.LANGUAGES.index(self.session.language) # ---------------------------------------------------------------------- def mlt(self, M, decode=True, newlines=True): ''' Multi-language text handler Inputs: M (tuple) The text in many languages decode (bool=true) Decode html or not newlines (bool=true) Convert newlines ('\n' -> '<br>') Output: The text in the current language ''' # --- Manage input if isinstance(M, str): tmp = M else: tmp = M[self.LangIdx] # --- Convert special chararters (decode) if decode: res = '' K = list(html.entities.entitydefs.keys()) V = list(html.entities.entitydefs.values()) for char in tmp: if char in V: res += '&{0};'.format(K[V.index(char)]) else: res += char else: res = tmp # --- Convert newlines if newlines: res = str.replace(res, '\n', '<br>') # --- Return return res # ---------------------------------------------------------------------- def truncate(self, s, limit=100, suffix='...'): ''' Smart truncate Inputs: M (tuple) The text in many languages Output: The text in the current language ''' if len(s) <= limit: return s else: return ' '.join(s[:limit+1].split(' ')[0:-1]) + suffix # ---------------------------------------------------------------------- def redirect(self, location): ''' Redirection (javascript based) Inputs: location (str) The new spot location Output None ''' self.html.javascript('document.location.href="{0}"'.format(location)) # ---------------------------------------------------------------------- def language_chooser(self): ''' Language chooser Inputs: - Output None ''' # --- Store reference ref = self.html.ref # Language container self.html.div(0, id='language') if self.session.language != 'en': self.html.a(0, "?spot={0}&lang=en".format(self.settings.get('spot'))) self.html.img(0, 'Core/Style/Icons/Flags/English.png') if self.session.language != 'fr': self.html.a(0, "?spot={0}&lang=fr".format(self.settings.get('spot'))) self.html.img(0, 'Core/Style/Icons/Flags/French.png') # --- Restore reference self.html.ref = ref # ---------------------------------------------------------------------- def main_menu(self, mid): ''' Append the main menu. Inputs: None Output: None ''' # Logo self.html.a(mid, '?spot=home') self.html.img(0, 'Core/Style/Logo.svg', id='logo') # Language chooser self.html.ref = mid self.language_chooser() self.html.a(0, '?spot=connection', id='disconnection') # Menu containers self.html.div(mid, id='menu') self.html.a(0, '?spot=settings', id="menu_Param", cls='menu_item') self.html.text(0, ("General settings", "Paramètres généraux")) self.html.a(-1, '?spot=users', id='menu_Users', cls='menu_item') self.html.text(0, ("Manage users", "Gestion des utilisateurs")) self.html.a(-1, '?spot=locations', id='menu_Locations', cls='menu_item') self.html.text(0, ("Storage locations", "Espaces de stockage"))
class Spot: """ The Spot class """ # ---------------------------------------------------------------------- def __init__(self, settings, session, data, inputs): # --- Definitions self.settings = settings self.session = session self.data = data self.inputs = inputs self.html = HTML(self) self.display = True # --- Pre-processing self.pre_process() # --- Actions if self.inputs.getvalue('form_action') is not None: # NB: stop is for redirection stop = self.form_action() else: stop = None # --- Html if stop is None: self.html.meta(Language=self.session.language) self.html.favicon('Core/Style/Icons/favicon.ico?v={0}'.format( time())) self.html.style('fonts') self.html.style('common') self.html.jsfile('Core/JS/jquery.js') self.html.jsfile('Core/JS/common.js') self.set_html() # ---------------------------------------------------------------------- def pre_process(self): ''' Pre-processing method Inputs: - Output: None ''' # --- Set language self.set_lang() # ---------------------------------------------------------------------- def set_html(self): ''' Sets html code Inputs: - Output: None ''' pass # ---------------------------------------------------------------------- def set_lang(self): ''' Determine spot language Inputs: - Output: None ''' # self.session.language # --- Modification lang = self.inputs.getvalue('lang') if lang is not None and lang in self.settings.LANGUAGES: # Update database self.session.DB.update('Sessions', 'lang', lang, 'sid=?', self.session.id) # Update session self.session.language = lang # --- Conversion self.LangIdx = self.settings.LANGUAGES.index(self.session.language) # ---------------------------------------------------------------------- def mlt(self, M, decode=True, newlines=True): ''' Multi-language text handler Inputs: M (tuple) The text in many languages decode (bool=true) Decode html or not newlines (bool=true) Convert newlines ('\n' -> '<br>') Output: The text in the current language ''' # --- Manage input if isinstance(M, str): tmp = M else: tmp = M[self.LangIdx] # --- Convert special chararters (decode) if decode: res = '' K = list(html.entities.entitydefs.keys()) V = list(html.entities.entitydefs.values()) for char in tmp: if char in V: res += '&{0};'.format(K[V.index(char)]) else: res += char else: res = tmp # --- Convert newlines if newlines: res = str.replace(res, '\n', '<br>') # --- Return return res # ---------------------------------------------------------------------- def truncate(self, s, limit=100, suffix='...'): ''' Smart truncate Inputs: M (tuple) The text in many languages Output: The text in the current language ''' if len(s) <= limit: return s else: return ' '.join(s[:limit + 1].split(' ')[0:-1]) + suffix # ---------------------------------------------------------------------- def redirect(self, location): ''' Redirection (javascript based) Inputs: location (str) The new spot location Output None ''' self.html.javascript('document.location.href="{0}"'.format(location)) # ---------------------------------------------------------------------- def language_chooser(self): ''' Language chooser Inputs: - Output None ''' # --- Store reference ref = self.html.ref # Language container self.html.div(0, id='language') if self.session.language != 'en': self.html.a(0, "?spot={0}&lang=en".format(self.settings.get('spot'))) self.html.img(0, 'Core/Style/Icons/Flags/English.png') if self.session.language != 'fr': self.html.a(0, "?spot={0}&lang=fr".format(self.settings.get('spot'))) self.html.img(0, 'Core/Style/Icons/Flags/French.png') # --- Restore reference self.html.ref = ref # ---------------------------------------------------------------------- def main_menu(self, mid): ''' Append the main menu. Inputs: None Output: None ''' # Logo self.html.a(mid, '?spot=home') self.html.img(0, 'Core/Style/Logo.svg', id='logo') # Language chooser self.html.ref = mid self.language_chooser() self.html.a(0, '?spot=connection', id='disconnection') # Menu containers self.html.div(mid, id='menu') self.html.a(0, '?spot=settings', id="menu_Param", cls='menu_item') self.html.text(0, ("General settings", "Paramètres généraux")) self.html.a(-1, '?spot=users', id='menu_Users', cls='menu_item') self.html.text(0, ("Manage users", "Gestion des utilisateurs")) self.html.a(-1, '?spot=locations', id='menu_Locations', cls='menu_item') self.html.text(0, ("Storage locations", "Espaces de stockage"))
class Spot: """ The Spot class """ # ---------------------------------------------------------------------- def __init__(self, settings, session, inputs): # --- Definitions self.settings = settings self.session = session self.inputs = inputs self.html = HTML(self) self.display = True # --- Pre-processing self.pre_process() # --- Actions if self.inputs.getvalue("form_action") is not None: # NB: stop is for redirection stop = self.form_action() else: stop = None # --- Html if stop is None: self.html.meta(Language=self.session.language) self.html.favicon("Core/Style/Icons/favicon.ico?v={0}".format(time())) self.html.style("fonts") self.html.style("common") self.html.jsfile("Core/JS/jquery.js") self.html.jsfile("Core/JS/common.js") self.set_html() # ---------------------------------------------------------------------- def pre_process(self): """ Pre-processing method Inputs: - Output: None """ # --- Set language self.set_lang() # ---------------------------------------------------------------------- def set_html(self): """ Sets html code Inputs: - Output: None """ pass # ---------------------------------------------------------------------- def set_lang(self): """ Determine spot language Inputs: - Output: None """ # self.session.language # --- Modification lang = self.inputs.getvalue("lang") if lang is not None and lang in self.settings.LANGUAGES: # Update database self.session.DB.update("Sessions", "lang", lang, "sid=?", self.session.id) # Update session self.session.language = lang # --- Conversion self.LangIdx = self.settings.LANGUAGES.index(self.session.language) # ---------------------------------------------------------------------- def mlt(self, M, decode=True, newlines=True): """ Multi-language text handler Inputs: M (tuple) The text in many languages decode (bool=true) Decode html or not newlines (bool=true) Convert newlines ('\n' -> '<br>') Output: The text in the current language """ # --- Manage input if isinstance(M, str): tmp = M else: tmp = M[self.LangIdx] # --- Convert special chararters (decode) if decode: res = "" K = list(html.entities.entitydefs.keys()) V = list(html.entities.entitydefs.values()) for char in tmp: if char in V: res += "&{0};".format(K[V.index(char)]) else: res += char else: res = tmp # --- Convert newlines if newlines: res = str.replace(res, "\n", "<br>") # --- Return return res # ---------------------------------------------------------------------- def truncate(self, s, limit=100, suffix="..."): """ Smart truncate Inputs: M (tuple) The text in many languages Output: The text in the current language """ if len(s) <= limit: return s else: return " ".join(s[: limit + 1].split(" ")[0:-1]) + suffix # ---------------------------------------------------------------------- def redirect(self, location): """ Redirection (javascript based) Inputs: location (str) The new spot location Output None """ self.html.javascript('document.location.href="{0}"'.format(location)) # ---------------------------------------------------------------------- def language_chooser(self): """ Language chooser Inputs: - Output None """ # --- Store reference ref = self.html.ref # Language container self.html.div(0, id="language") if self.session.language != "en": self.html.a(0, "?spot={0}&lang=en".format(self.settings.get("spot"))) self.html.img(0, "Core/Style/Icons/Flags/English.png") if self.session.language != "fr": self.html.a(0, "?spot={0}&lang=fr".format(self.settings.get("spot"))) self.html.img(0, "Core/Style/Icons/Flags/French.png") # --- Restore reference self.html.ref = ref # ---------------------------------------------------------------------- def navbar(self, tree, main, last, page=()): """ Append a navigation bar. Inputs: - parent (int) The identifier of the most remote element Output: None """ # Append style and javascript to the head self.html.style("navbar") self.html.jsfile("Core/JS/navbar.js") # Main contener self.html.div(main, id="navbar") # Get parent list P = int(last) Plist = [] while True: Plist.extend([P]) if P == 0: break else: tmp = tree.single("SELECT parent FROM Elements WHERE id=?", P) P = tmp["parent"] # Display navbar for P in reversed(Plist): ref = self.html.ref if P: # --- Spacer tmp = self.html.div(0, cls="nav_cont") self.html.a(tmp, "#", id="nav_spacer_{0}".format(P), cls="nav_spacer") self.html.text(0, "▼", decode=False) # --- Element res = tree.single("SELECT * FROM Elements WHERE id=?", P) if res["type"] == "group": if P == int(last) and not page: if res["name"]: self.html.p(tmp, cls="nav_elm_group nav_elm_mod", contenteditable="true") self.html.text(0, res["name"]) else: self.html.p(tmp, cls="nav_elm_group nav_elm_mod nav_elm_mod_empty", contenteditable="true") self.html.span(0, cls="nav_undef") self.html.text(0, "Group {0}".format(P)) else: self.html.a(tmp, "?spot=home&parent={0}".format(P), cls="nav_elm_group") if res["name"]: self.html.text(0, res["name"]) else: self.html.span(0, cls="nav_undef") self.html.text(0, "Group {0}".format(P)) elif res["type"] == "note": if P == int(last) and not page: if res["name"]: self.html.p(tmp, cls="nav_elm_note nav_elm_mod", contenteditable="true") self.html.text(0, res["name"]) else: self.html.p(tmp, cls="nav_elm_note nav_elm_mod nav_elm_mod_empty", contenteditable="true") self.html.span(0, cls="nav_undef") self.html.text(0, "Note {0}".format(P)) else: self.html.a(tmp, "?spot=note¬e={0}".format(P), cls="nav_elm_note") if res["name"]: self.html.text(0, res["name"]) else: self.html.span(0, cls="nav_undef") self.html.text(0, "Note {0}".format(P)) # --- List tmp = self.html.div(tmp, id="nav_list_{0}".format(P), cls="nav_list") for alt in tree.multi( "SELECT * FROM Elements WHERE id!=? AND parent=(SELECT parent FROM Elements WHERE id=?)", P, P ): if alt["type"] == "group": self.html.a(tmp, "?spot=home&parent={0}".format(alt["id"]), cls="nav_menu_item") self.html.img(0, "Core/Style/Icons/navbar_group.png", cls="nav_icon_group") elif alt["type"] == "note": self.html.a(tmp, "?spot=note¬e={0}".format(alt["id"]), cls="nav_menu_item") self.html.img(0, "Core/Style/Icons/navbar_note.png", cls="nav_icon_note") if alt["name"]: self.html.text(0, alt["name"]) elif alt["type"] == "note": self.html.span(0, cls="nav_undef") self.html.text(0, "Note {0}".format(alt["id"])) elif alt["type"] == "group": self.html.span(0, cls="nav_undef") self.html.text(0, "Group {0}".format(alt["id"])) else: self.html.a(0, "?spot=home", cls="nav_elm") self.html.img(0, "Core/Style/Icons/navbar_home.png", id="nav_icon_home") self.html.text(0, "Home") self.html.ref = ref if page: # --- Get page infos note = page[0] nid = page[1] pid = page[2] # --- Spacer tmp = self.html.div(0, cls="nav_cont") self.html.a(tmp, "#", id="nav_spacer_page", cls="nav_spacer_page") self.html.text(0, "▼", decode=False) # --- Element res = note.single("SELECT * FROM Pages WHERE id=?", pid) if res["name"]: self.html.p(tmp, cls="nav_elm_page nav_elm_mod", contenteditable="true") self.html.text(0, res["name"]) else: self.html.p(tmp, cls="nav_elm_page nav_elm_mod nav_elm_mod_empty", contenteditable="true") self.html.span(0, cls="nav_undef") self.html.text(0, "Page {0}".format(res["position"])) # --- List tmp = self.html.div(tmp, id="nav_list_page", cls="nav_list") for res in note.multi("SELECT * FROM Pages ORDER BY position"): self.html.a( tmp, "?spot=page¬e={0}&page={1}".format(nid, res["id"]), id="nav_menu_item_{0}".format(res["id"]), cls="nav_menu_item_page", ) if res["name"]: self.html.text(0, "{0}. {1}".format(res["position"], res["name"])) else: self.html.text( 0, '{0}. <span class="nav_undef">Page {1}</span>'.format(res["position"], res["position"]), decode=False, )