# HG changeset patch # User Goffi # Date 1509121902 -7200 # Node ID e59edcae4c18b98bc9f625d70a9c9c0bf8721356 # Parent 968eda9e982abeff34f6ca5a01c1074d755c5c24 pages(session): added method to handle reload resistant page specific data: Liberiva Page can now register session data specific to a page using ISatSession methods (see docstrings for details). Those data can resist a page reload, are specific to a session and a page. diff -r 968eda9e982a -r e59edcae4c18 src/server/session_iface.py --- a/src/server/session_iface.py Sun Sep 24 16:50:39 2017 +0200 +++ b/src/server/session_iface.py Fri Oct 27 18:31:42 2017 +0200 @@ -20,6 +20,8 @@ from sat.tools.common import data_objects import shortuuid +FLAGS_KEY = '_flags' + class ISATSession(Interface): profile = Attribute("Sat profile") jid = Attribute("JID associated with the profile") @@ -36,7 +38,80 @@ self.uuid = unicode(shortuuid.uuid()) self.identities = data_objects.Identities() self.csrf_token = unicode(shortuuid.uuid()) - self.flags = set() + self.pages_data = {} # used to keep data accross reloads (key is page instance) + + def getPageData(self, page, key): + """get session data for a page + + @param page(LiberviaPage): instance of the page + @param key(object): data key + return (None, object): value of the key + None if not found or page_data doesn't exist + """ + return self.pages_data.get(page, {}).get(key) + + def popPageData(self, page, key, default=None): + """like getPageData, but remove key once value is gotten + + @param page(LiberviaPage): instance of the page + @param key(object): data key + @param default(object): value to return if key is not found + @return (object): found value or default + """ + page_data = self.pages_data.get(page) + if page_data is None: + return default + value = page_data.pop(key, default) + if not page_data: + # no need to keep unused page_data + del self.pages_data[page] + return value + + def setPageData(self, page, key, value): + """set data to persist on reload + + @param page(LiberviaPage): instance of the page + @param key(object): data key + @param value(object): value to set + @return (object): set value + """ + page_data = self.pages_data.setdefault(page, {}) + page_data[key] = value + return value + + def setPageFlag(self, page, flag): + """set a flag for this page + + @param page(LiberviaPage): instance of the page + @param flag(unicode): flag to set + """ + flags = self.getPageData(page, FLAGS_KEY) + if flags is None: + flags = self.setPageData(page, FLAGS_KEY, set()) + flags.add(flag) + + def popPageFlag(self, page, flag): + """return True if flag is set + + flag is removed if it was set + @param page(LiberviaPage): instance of the page + @param flag(unicode): flag to set + @return (bool): True if flaag was set + """ + page_data = self.pages_data.get(page, {}) + flags = page_data.get(FLAGS_KEY) + if flags is None: + return False + if flag in flags: + flags.remove(flag) + # we remove data if they are not used anymore + if not flags: + del page_data[FLAGS_KEY] + if not page_data: + del self.pages_data[page] + return True + else: + return False class ISATGuestSession(Interface):