def pre_process(self): ''' Pre-processing method Inputs: - Output: None ''' # --- Definitions nid = self.inputs.getvalue('note') pid = self.inputs.getvalue('id') pos = self.inputs.getvalue('position') # --- Database note = DB('../Notes/{0}/{1}/Note.db'.format(self.session.user['id'], nid)) # Update following pages position note.update('Pages', 'position', 'position+1', 'position>=?', pos, encode=False) # Insert element note.insert('Pages', id=pid, position=pos)
def pre_process(self): ''' Pre-processing method Inputs: - Output: None ''' # --- Definitions nid = self.inputs.getvalue('note') pos = self.inputs.getvalue('position') # --- Database note = DB('../Notes/{0}/{1}/Note.db'.format(self.session.user['id'], nid)) # Get page id tmp = note.single('SELECT * FROM Pages WHERE position=?', pos) pid = tmp['id'] # Delete page note.delete('Pages', 'id=?', pid) # Update following pages position note.update('Pages', 'position', 'position-1', 'position>=?', pos, encode=False) # Delete page elements note.delete('Elements', 'page=?', pid)
def pre_process(self): ''' Pre-processing method Inputs: - Output: None ''' # --- Definitions eid = self.inputs.getvalue('elm') # --- Update Note db = DB('../Notes/{0}/{1}/Note.db'.format(self.session.user['id'], self.inputs.getvalue('note'))) db.update('Elements', 'highlight', 'NOT highlight', 'id=?', eid, encode=False)
def __init__(self): ''' Constructor Inputs: None ''' self.DB = DB('../Data.db')
class Session(): def __init__(self, cookie, settings, data): # Definitions self.cookie = cookie self.id = cookie['sid'].value self.DB = DB('Sessions.db') # --- Get session res = self.DB.single("SELECT * FROM Sessions WHERE sid=?", self.cookie['sid'].value) # No session ? if res is None: # Create session entry self.DB.insert('Sessions', sid = self.id, user = None, lang = settings.get('default_language'), last_connection = datetime.now().strftime("%Y-%m-%d %H:%M:%S"), num_failed_conn = 0) # Get session res = self.DB.single("SELECT * FROM Sessions WHERE sid=?", self.id) # --- Get user info if res['user'] is None: self.user = None else: usr = data.DB.single('SELECT * FROM Users WHERE id=?', res['user']) if usr is None: self.user = None # This should NOT happen else: self.user = dict(usr) # Convert to dictionnary self.language = res['lang']
def __init__(self): ''' Constructor Inputs: - ''' self.settings = { 'root': os.path.dirname(os.path.dirname(os.path.dirname(__file__))) + '/' } self.DB = DB('Settings.db')
def pre_process(self): ''' Pre-processing method Inputs: - Output: None ''' # --- Definitions nid = self.inputs.getvalue('note') eid = self.inputs.getvalue('elm') # --- Update Note # Access DB db = DB('../Notes/{0}/{1}/Note.db'.format(self.session.user['id'], nid)) # Get element elm = db.single('SELECT * FROM Elements WHERE id=?', eid) # Remove equation (if any) if elm['type'] in ('equation'): path = '../Notes/{0}/{1}/Medias/{2}.svg'.format(self.session.user['id'], nid, eid) if os.path.isfile(path): os.remove(path) # Remove media file (if any) if elm['type'] in ('media'): frow = db.single('SELECT ext FROM media WHERE id=?', eid); path = '../Notes/{0}/{1}/Medias/{2}.{3}'.format(self.session.user['id'], nid, eid, frow['ext']) if os.path.isfile(path): os.remove(path) # Delete element db.delete('Elements', 'id=?', eid) db.delete(elm['type'], 'id=?', eid) # Update remaining elements db.update('Elements', 'position', 'position-1', 'position>?', elm['position'], encode=False)
def pre_process(self): ''' Pre-processing method Inputs: - Output: None ''' # --- Definitions typ = self.inputs.getvalue('type') val = self.inputs.getvalue('value') # --------------------------------------- # RENAME # --------------------------------------- if typ == 'page': nid = self.inputs.getvalue('note') pid = self.inputs.getvalue('page') # --- Update page name note = DB('../Notes/{0}/{1}/Note.db'.format(self.session.user['id'], nid)) note.update('Pages', 'name', val, 'id=?', pid) if typ == 'note': nid = self.inputs.getvalue('note') # --- Update note name note = DB('../Notes/{0}/Tree.db'.format(self.session.user['id'])) note.update('Elements', 'name', val, 'id=?', nid) if typ == 'group': gid = self.inputs.getvalue('group') # --- Update note name note = DB('../Notes/{0}/Tree.db'.format(self.session.user['id'])) note.update('Elements', 'name', val, 'id=?', gid)
def set_html(self): ''' Sets html code Inputs: - Output: None ''' if self.inputs.getvalue('parent') is None or self.inputs.getvalue('parent')=='0': parent = 0 else: parent = self.inputs.getvalue('parent') # --- Definitions H = self.html # --- Head H.style('home') # --- Structure H.table(0, id='structure') H.tr() menu = H.td(id='menu_bar') main = H.td(id='main') # --------------------------------------- # MENU # --------------------------------------- # Menu containers H.ref = menu H.img(0, 'Core/Style/Logo.svg', id='logo') # --- Disconnection H.div(0, id='menu') H.a(0, '?spot=connection', id='disconnection') H.a(-1, '?', id='profile', cls='menu_item') H.text(0, ("My account", "Mon profil")) H.a(-1, '?', id='param', cls='menu_item') H.text(0, ("Settings", "Paramètres")) # --------------------------------------- # MAIN # --------------------------------------- tree = DB('../Notes/{0}/Tree.db'.format(self.session.user['id'])) # --- Display --------------------------- # --- Navigation bar self.navbar(tree, main, parent) # --- Groups and notes cont = H.div(main, id='Notes') res = tree.single("SELECT type FROM Elements WHERE id=?", parent) if res is None or res['type']=='group': # Groups for row in tree.multi("SELECT * FROM Elements WHERE parent=? AND type='group'", parent): H.a(cont, '?spot=home&parent={0}'.format(row['id']), cls='elm') H.center(0) H.img(0, 'Core/Style/Icons/folder.png') H.p(0) if row['name']: H.text(0, row['name']) else: H.span(0, cls='nav_undef') H.text(0, 'Group {0}'.format(row['id'])) # Notes for row in tree.multi("SELECT * FROM Elements WHERE parent=? AND type='note'", parent): H.a(cont, '?spot=note¬e={0}'.format(row['id']), cls='elm') H.center(0) H.img(0, 'Core/Style/Icons/note.png') H.p(0) if row['name']: H.text(0, row['name']) else: H.span(0, cls='nav_undef') H.text(0, 'Note {0}'.format(row['id'])) elif res['type']=='note': row = tree.single("SELECT * FROM Elements WHERE id=?", parent) # row['name'] for i in range(10): H.a(cont, '?spot=page¬e={0}&page=1'.format(row['id']), cls='page') H.div(0, cls='minipage') H.text(0, 'This is a test !') H.center(-1) H.p(0) H.text(0, 'Page {0}'.format(i))
def pre_process(self): ''' Pre-processing method Inputs: - Output: None ''' # --- Definitions pid = self.inputs.getvalue('page') eid = self.inputs.getvalue('elm') type_elm = self.inputs.getvalue('type') # --- Update Note # Access DB db = DB('../Notes/{0}/{1}/Note.db'.format(self.session.user['id'], self.inputs.getvalue('note'))) # Get inserting position if eid is '0': tmp = db.single('SELECT MAX(position) as mp FROM Elements WHERE page=?', pid) if tmp['mp'] is None: pos = 1 else: pos = int(tmp['mp']) + 1 else: elm = db.single('SELECT * FROM Elements WHERE id=?', eid) pos = int(elm['position']) # Update remaining elements db.update('Elements', 'position', 'position+1', 'position>=?', pos, encode=False) # Insert element db.insert('Elements', page=pid, position=pos, type=type_elm) newid = db.lastid('Elements') if type_elm in ('header', 'text', 'equation'): db.insert(type_elm, id=newid, text='') if type_elm in ('media'): db.insert(type_elm, id=newid) print('OK {{"newid": {0}}}'.format(newid))
def pre_process(self): ''' Pre-processing method Inputs: - Output: None ''' # --- Definitions nid = self.inputs.getvalue('note') eid = self.inputs.getvalue('elm') # --- Update Note db = DB('../Notes/{0}/{1}/Note.db'.format(self.session.user['id'], nid)) res = db.single('SELECT type FROM Elements WHERE id=?', eid); # --------------------------------------- # HEADER # --------------------------------------- if res['type'] in ('header'): key = self.inputs.getvalue('key') value = self.inputs.getvalue('value') if key in ('level'): db.update(res['type'], key, value, 'id=?', eid) else: if not isinstance(value, str): value = '' db.update(res['type'], 'text', value, 'id=?', eid) # --------------------------------------- # TEXT # --------------------------------------- if res['type'] in ('text'): value = self.inputs.getvalue('value') if not isinstance(value, str): value = '' db.update(res['type'], 'text', value, 'id=?', eid) # --------------------------------------- # EQUATION # --------------------------------------- if res['type'] in ('equation'): # Get value value = self.inputs.getvalue('value').strip() if not isinstance(value, str): value = '' # Image name fname = '../Notes/{0}/{1}/Medias/{2}.svg'.format(self.session.user['id'], nid, eid) prev = db.single('SELECT text FROM equation WHERE id=?', eid); if prev['text']!=value: # --- Update DB db.update(res['type'], 'text', value, 'id=?', eid) # --- Recompute image import tempfile import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt fig = plt.figure() F = re.sub("\n+", "\n", value) F = '$'+F.replace('\n', '$\n$')+'$' text = fig.text(0, 0, F) # Saving the figure will render the text dpi = 100 tmp = tempfile.NamedTemporaryFile() fig.savefig(tmp.name, dpi=dpi) tmp.close() # Now we can work with text's bounding box bbox = text.get_window_extent() width, height = bbox.size / float(dpi) + 0.005 # Adjust the figure size so it can hold the entire text fig.set_size_inches((width, height)) # Adjust text's vertical position dy = (bbox.ymin/float(dpi))/height text.set_position((0, -dy)) # Save the adjusted text fig.savefig(fname, transparent=True) # Get image width w = None ifile = open(fname, 'r') for line in ifile: m = re.search('width="([0-9]*)pt"', line) if m is not None: w = float(m.group(1)) break print('OK {{"src": "{0}", "width": {1}}}'.format(fname, w*float(self.settings.get('equation_display_factor')))) # --------------------------------------- # IMAGE, MOVIE # --------------------------------------- if res['type'] in ('media'): # Upload file F = self.inputs['file'] if not F.filename: print('Error during file upload.') return # --- Check file information # Get name and extension name, ext = os.path.splitext(F.filename) ext = ext[1:] # Check extension if ext in self.settings.IMAGE: type = 'image' elif ext in self.settings.VIDEO: type = 'video' else: print("Couldn't recognize the file type during upload.") return # --- Remove previous file prev = db.single('SELECT ext FROM {0} WHERE id=?'.format(res['type']), eid); path = '../Notes/{0}/{1}/Medias/{2}.{3}'.format(self.session.user['id'], nid, eid, prev['ext']) if os.path.isfile(path): os.remove(path) # --- Save new file path = 'Notes/{0}/{1}/Medias/{2}.{3}'.format(self.session.user['id'], nid, eid, ext) open('../{0}'.format(path), 'wb').write(F.file.read()) db.update(res['type'], 'name', name, 'id=?', eid) db.update(res['type'], 'ext', ext, 'id=?', eid) db.update(res['type'], 'type', type, 'id=?', eid) print('OK {{"type": "{0}", "src": "{1}"}}'.format(type, path)) # --- Update last modification timestamp now = str(datetime.now())[0:19] db.update('Elements', 't_modification', now, 'id=?', eid)
def set_html(self): ''' Sets html code Inputs: - Output: None ''' # --- Definitions nid = self.inputs.getvalue('note') H = self.html # --- Head H.style('note') H.jsfile('Core/JS/note.js') # Context menu H.style('ContextMenu') H.jsfile('Core/JS/jquery.contextMenu.min.js') H.jsfile('Core/JS/jquery.ui.position.min.js') # --- Structure H.table(0, id='structure') H.tr() menu_bar = H.td(id='menu_bar') main = H.td(id='main') # --------------------------------------- # MENU # --------------------------------------- # Logo tree = DB('../Notes/{0}/Tree.db'.format(self.session.user['id'])) res = tree.single('SELECT parent FROM Elements WHERE id=?', nid) H.a(menu_bar, '?spot=home&parent={0}'.format(res['parent'])) H.img(0, 'Core/Style/Logo.svg', id='logo') # --- Menu menu = H.div(menu_bar, id='menu') H.div(menu, id='cont_page') self.icon('new_page_before', "new_page('before');", ('New page before', 'Nouvelle page avant')) self.icon('merge_previous', "merge('previous');", ('Merge with previous page', 'Fusionnez avec\nla page précédente')) self.icon('merge_next', "merge('next');", ('Merge with next page', 'Fusionnez avec\nla page suivante')) self.icon('new_page_after', "new_page('after');", ('New page after', 'Nouvelle page après')) self.icon('delete_page', 'delete_page();', ('Delete page', 'Supprimer la page')) H.div(menu, id='cont_spacer') self.icon('new_page_here', 'new_page();', ('New page', 'Nouvelle page')) self.icon('merge', 'merge();', ('Merge pages', 'Fusionner les pages')) # --------------------------------------- # MAIN # --------------------------------------- tree = DB('../Notes/{0}/Tree.db'.format(self.session.user['id'])) note = DB('../Notes/{0}/{1}/Note.db'.format(self.session.user['id'], nid)) # --- Display --------------------------- # --- Navigation bar self.navbar(tree, main, nid) # --- Pages Pcont = H.div(main, id='Pages') for page in note.multi("SELECT * FROM Pages ORDER BY position"): pcont = H.div(Pcont, cls='page_cont') pid = page['id'] # --- Spacer before H.a(pcont, '#', id='spacer_b{0}'.format(pid), cls='spacer_before') # --- Page link H.a(pcont, '?spot=page¬e={0}&page={1}'.format(nid, pid), id='page_{0}'.format(pid), cls='page') # --- Page name H.center(0) H.p(0, cls='page_name') if page['name']: H.text(0, page['name']) else: H.span(0, cls='nav_undef') H.text(0, 'Page {0}'.format(page['position'])) # --- Minipage mini = H.div(-1, cls='minipage') for row in note.multi('SELECT * FROM Elements WHERE page=? ORDER BY position LIMIT 7', pid): # --- Highlight ? if row['highlight']: H.div(mini, cls='highlight') else: H.div(mini) # --- Element res = note.single('SELECT * FROM {0} WHERE id=?'.format(row['type']), row['id']) # HEADER if row['type'] in ('header'): H.p(0, cls='mini_h'+str(res['level'])) H.text(0, res['text']) # TEXT if row['type'] in ('text'): H.p(0, cls='mini_p') H.text(0, self.truncate(res['text'], limit=65)) # EQUATION if row['type'] in ('equation'): iname = '../Notes/{0}/{1}/Medias/{2}.svg'.format(self.session.user['id'], nid, row['id']) if not isfile(iname): iname = 'Core/Style/default.png' H.img(0, iname, cls='mini_equation') # IMAGE / MOVIE if row['type'] in ('media'): Mtype = res['type'] Mname = '../Notes/{0}/{1}/Medias/{2}.{3}'.format(self.session.user['id'], nid, row['id'], res['ext']) if not isfile(Mname): Mtype = 'image' Mname = 'Core/Style/default.png' if Mtype in ('image'): H.img(0, Mname) if Mtype in ('video'): H.video(0, Mname) # --- Spacer after H.a(pcont, '#', id='spacer_a{0}'.format(pid), cls='spacer_after') # --------------------------------------- # PHANTOM BOX # --------------------------------------- H.div(H.body, id='phantom', onclick='close_phantom();') H.div(0, id='box')
def pre_process(self): ''' Pre-processing method Inputs: - Output: None ''' # --- Definitions pid = self.inputs.getvalue('page') eid = self.inputs.getvalue('elm') tid = self.inputs.getvalue('target') # --- Update Note # Access DB db = DB('../Notes/{0}/{1}/Note.db'.format(self.session.user['id'], self.inputs.getvalue('note'))) # Get source and target positions tmp = db.single('SELECT position as pos FROM Elements WHERE id=?', eid) src = int(tmp['pos']) if tid is '0': tmp = db.single('SELECT MAX(position) as pos FROM Elements WHERE page=?', pid) pos = int(tmp['pos'])+1 else: tmp = db.single('SELECT position as pos FROM Elements WHERE id=?', tid) pos = int(tmp['pos']) # Store source element db.update('Elements', 'position', 0, 'id=?', eid) # Update in-between elements if src<pos: # Update in-between elements db.update('Elements', 'position', 'position-1', 'position>? AND position<?', src, pos, encode=False) # Restore element db.update('Elements', 'position', pos-1, 'id=?', eid) else: # Update in-between elements db.update('Elements', 'position', 'position+1', 'position>=? AND position<?', pos, src, encode=False) # Restore element db.update('Elements', 'position', pos, 'id=?', eid)
def set_html(self): ''' Sets html code Inputs: - Output: None ''' # --- Definitions pid = self.inputs.getvalue('page') nid = self.inputs.getvalue('note') H = self.html # --- Head H.style('page') H.jsfile('Core/JS/page.js') # Context menu H.style('ContextMenu') H.jsfile('Core/JS/jquery.contextMenu.min.js') H.jsfile('Core/JS/jquery.ui.position.min.js') # --- Structure H.table(0, id='structure') H.tr() menu_bar = H.td(id='menu_bar') main = H.td(id='main') # --------------------------------------- # MENU # --------------------------------------- # Logo tree = DB('../Notes/{0}/Tree.db'.format(self.session.user['id'])) res = tree.single('SELECT parent FROM Elements WHERE id=?', nid) H.a(menu_bar, '?spot=home&parent={0}'.format(res['parent'])) H.img(0, 'Core/Style/Logo.svg', id='logo') # --- Menu menu = H.div(menu_bar, id='menu') H.div(menu, id='cont_links') self.icon('read', '', ('Switch to read mode', 'Passer en mode lecture')) self.icon('pdf', '', ('Export to pdf', 'Exporter en pdf')) self.icon('link', '', ('Link to this note (URL)', 'Lien vers cette note (URL)')) self.icon('share', '', ('Share this note', 'Partage de la note')) H.div(menu, id='cont_pages') self.icon('new_page', '', ('Create a new page', 'Créer une nouvelle page')) self.icon('merge_prev', '', ('Merge with previous page', 'Fusionnez avec\nla page précédente')) H.div(menu, id='cont_new_elm') self.icon('new_header', "insert_elm('header');", ('Insert title', 'Insérer un titre')) self.icon('new_text', "insert_elm('text');", ('Insert text paragraph', 'Insérer un paragraphe')) self.icon('new_equation', "insert_elm('equation');", ('Insert equation', 'Insérer une équation')) self.icon('new_code', '', ('Insert code', 'Insérer du code')) self.icon('new_timestamp', '', ('Insert timestamp', 'Insérer un repère temporel')) self.icon('new_image', "insert_elm('media');", ('Insert image/movie', 'Insérer une image ou un film')) self.icon('new_drawing', '', ('Insert freehand drawing', 'Insérer un dessin à main levée')) H.div(menu, id='cont_elm') self.icon('elm_modify', 'modify();', ('Modify this element', 'Modifier cet élément')) self.icon('elm_highlight', 'highlight();', ('Highlight this element', 'Mettre en valeur')) self.icon('elm_comment', '', ('Comment this element', 'Commenter cet élément')) self.icon('elm_delete', 'delete_elm();', ('Delete this element', 'Supprimer cet élément')) #H.ref = menu #H.text(H.a('#', onclick='console.log(mov_state); return 0;'), 'Test') #H.text(H.div(id='node'), 'Test') # --------------------------------------- # MAIN # --------------------------------------- tree = DB('../Notes/{0}/Tree.db'.format(self.session.user['id'])) note = DB('../Notes/{0}/{1}/Note.db'.format(self.session.user['id'], nid)) # --- Display --------------------------- # --- Navigation bar self.navbar(tree, main, nid, page=(note, nid, pid)) # --- Fake element for the first spacer H.div(main, cls='elm_text', style='height:50px') for row in note.multi('SELECT * FROM Elements WHERE page=? ORDER BY position', pid): # --- Spacer H.div(main, cls='spacer', id='spacer_{0}'.format(row['id'])) # --- Element elmid = 'elm_{0}'.format(row['id']) res = note.single('SELECT * FROM {0} WHERE id=?'.format(row['type']), row['id']) if row['highlight']: H.div(main, cls='elm elm_{0} highlight'.format(row['type']), id=elmid) else: H.div(main, cls='elm elm_{0}'.format(row['type']), id=elmid) # ----------------------------------- # HEADER # ----------------------------------- if row['type'] in ('header'): H.p(0, id='{0}_text'.format(elmid), cls='elm_h'+str(res['level'])) H.text(0, res['text']) # ----------------------------------- # TEXT # ----------------------------------- if row['type'] in ('text'): H.p(0, id='{0}_text'.format(elmid)) H.text(0, res['text']) # ----------------------------------- # EQUATION # ----------------------------------- if row['type'] in ('equation'): ref = H.ref H.div(0, cls='eq_node') H.p(0, id='{0}_text'.format(elmid)) H.text(0, res['text']) iname = '../Notes/{0}/{1}/Medias/{2}.svg'.format(self.session.user['id'], nid, row['id']) if isfile(iname): w = None ifile = open(iname, 'r') for line in ifile: m = re.search('width="([0-9]*)pt"', line) if m is not None: w = float(m.group(1)) break else: iname = 'Core/Style/default.png' if w is None: H.img(-2, iname, id='{0}_img'.format(elmid)) else: H.img(-2, iname, id='{0}_img'.format(elmid), width='{0}px'.format(w*float(self.settings.get('equation_display_factor')))) # ----------------------------------- # IMAGE, MOVIE # ----------------------------------- if row['type'] in ('media'): Mtype = res['type'] Mname = '../Notes/{0}/{1}/Medias/{2}.{3}'.format(self.session.user['id'], nid, row['id'], res['ext']) if not isfile(Mname): Mtype = 'image' Mname = 'Core/Style/default.png' if Mtype in ('image'): H.img(0, Mname, id='{0}_media'.format(elmid)) if Mtype in ('video'): H.video(0, Mname, id='{0}_media'.format(elmid)) H.form(0, id='{0}_form'.format(elmid)) H._hidden(0, 'note', nid) H._hidden(0, 'elm', str(row['id'])) H._file(0, id='{0}_file'.format(elmid), name="file", cls='file') # --- Last spacer H.div(main, cls='spacer default_spacer', id='spacer_0') # --- Fake element for the last spacer H.div(main, cls='elm_text', style='height:50px') # --------------------------------------- # UNSELECT BOX # --------------------------------------- H.div(main, id='unselect') # --------------------------------------- # PHANTOM BOX # --------------------------------------- H.div(H.body, id='phantom', onclick='close_phantom();') H.div(0, id='box')