def setgridstate(self): """Stores the current grid configuration (visible columns, column order, grouping, sorting etc.) persistent in dictstorage. """ if not self.user_is_logged_in(): return # extract the data state = self.request.get('gridstate', None) if not state or not isinstance(state, str): return if state == '{}': state = '' # get the tab view view_name = self.request.get('view_name', None) if not view_name: return listing_view = self._resolve_tab(view_name) if not listing_view: return # get the key for storing the state generator = queryMultiAdapter( (self.context, listing_view, self.request), IGridStateStorageKeyGenerator) key = generator.get_key() # store the data storage = IDictStorage(listing_view) storage.set(key, state)
def load_grid_state(self): """Loads the stored grid state - if any is stored. """ # get the key from the key generator generator = queryMultiAdapter((self.context, self, self.request), IGridStateStorageKeyGenerator) key = generator.get_key() # get the state (string) storage = IDictStorage(self) state = storage.get(key, None) if state: parsed_state = json.loads(state) # Do not persistently store grouping, since loading the group # initially would not work. if 'group' in parsed_state: del parsed_state['group'] # In some situations the sorting in the state is corrupt. Every # visible row should have a 'sortable' by default. column_state_by_id = dict((col['id'], col) for col in parsed_state['columns']) for column in self.columns: if not isinstance(column, dict): continue name = column.get('sort_index', column.get('column', None)) if name not in column_state_by_id: continue col_state = column_state_by_id[name] if 'sortable' not in col_state: col_state['sortable'] = True state = json.dumps(parsed_state) if state: self.table_options.update({'gridstate': state}) else: return # if the sorting order is set in the state and is not set in the # request, we need to change it in the config using the state # config. if self.request.get('dir', _marker) == _marker and \ self.request.get('sort', _marker) == _marker and \ 'sort' in parsed_state: if 'field' in parsed_state['sort']: self.sort_on = parsed_state['sort']['field'] if parsed_state['sort']['direction'] == 'ASC': self.sort_order = 'asc' self.sort_reverse = False else: self.sort_order = 'reverse' self.sort_reverse = True
def load_grid_state(self): """Loads the stored grid state - if any is stored. """ # get the key from the key generator generator = queryMultiAdapter((self.context, self, self.request), IGridStateStorageKeyGenerator) key = generator.get_key() # get the state (string) storage = IDictStorage(self) state = storage.get(key, None) if state: parsed_state = json.loads(state) # Do not persistently store grouping, since loading the group # initially would not work. if 'group' in parsed_state: del parsed_state['group'] # In some situations the sorting in the state is corrupt. Every # visible row should have a 'sortable' by default. column_state_by_id = dict( (col['id'], col) for col in parsed_state['columns']) for column in self.columns: if not isinstance(column, dict): continue name = column.get('sort_index', column.get('column', None)) if name not in column_state_by_id: continue col_state = column_state_by_id[name] if 'sortable' not in col_state: col_state['sortable'] = True state = json.dumps(parsed_state) if state: self.table_options.update({'gridstate': state}) else: return # if the sorting order is set in the state and is not set in the # request, we need to change it in the config using the state # config. if self.request.get('dir', _marker) == _marker and \ self.request.get('sort', _marker) == _marker and \ 'sort' in parsed_state: if 'field' in parsed_state['sort']: self.sort_on = parsed_state['sort']['field'] if parsed_state['sort']['direction'] == 'ASC': self.sort_order = 'asc' self.sort_reverse = False else: self.sort_order = 'reverse' self.sort_reverse = True
def update_sync_stamp(context): """update the SYNC key with the actual timestamp in the dictstorage""" storage = IDictStorage(DictStorageConfigurationContext()) timestamp = datetime.now().isoformat() storage.set(DICTSTORAGE_SYNC_KEY, timestamp) logger.info("Updated sync_stamp in dictstorage" " to current timestamp (%s)" % timestamp) return timestamp
def test_call_storage_with_proxy_will_change_context_to_subview(self): proxy_view = self.dossier.restrictedTraverse( 'tabbedview_view-documents-proxy') sub_view = self.dossier.restrictedTraverse( 'tabbedview_view-documents') self.assertNotIsInstance( IDictStorage(sub_view).context, proxy_view.__class__) self.assertIsInstance( IDictStorage(sub_view).context, sub_view.__class__)
def get_grid_state(self, view_name): """Load tabbedview gridstate of the logged in users for the given view. """ tabbedview = self.context.restrictedTraverse( "@@tabbedview_view-{}".format(view_name), default=None) if not tabbedview: return None generator = queryMultiAdapter((self.context, tabbedview, self.request), IGridStateStorageKeyGenerator) key = generator.get_key() storage = IDictStorage(tabbedview) return json.loads(storage.get(key, '{}'))
def get_tab_items(self): """Returns the tab items from get_tabs with additional information for use in the tabbed template. """ if not self.user_is_logged_in(): default_tab = '' else: key_generator = getMultiAdapter((self.context, self, self.request), IDefaultTabStorageKeyGenerator) key = key_generator.get_key() default_tab = IDictStorage(self).get(key, '') actions = [] for action in self.get_tabs(): action = action.copy() if action['id'].lower() == default_tab: action['class'] = '%s initial' % action['class'] view = self._resolve_tab(action['id']) action['tab_menu_actions'] = self.get_tab_menu_actions(view) actions.append(action) return actions
def test_strip_proxy_returns_proxy_view_without_postfix(self): view = self.dossier.restrictedTraverse('tabbedview_view-documents-proxy') self.assertTrue(ITabbedViewProxy.providedBy(view)) self.assertEqual( 'tabbedview_view-documents', IDictStorage(view).strip_proxy_postfix(view, view.__name__))
def test_strip_proxy_postfix_will_replace_only_if_ITabbedViewProxy_is_provided(self): view = self.dossier.restrictedTraverse('tabbedview_view-documents') value = 'documents_view-documents-proxy' self.assertFalse(ITabbedViewProxy.providedBy(view)) self.assertEqual( 'documents_view-documents-proxy', IDictStorage(view).strip_proxy_postfix(view, value))
def set_default_tab(self, tab=None, view=None): """Sets the default tab. The id of the tab is passed as argument or in the request payload as ``tab``. """ user = AccessControl.getSecurityManager().getUser() if user == AccessControl.SpecialUsers.nobody: tab = None else: tab = tab or self.request.get('tab') if not tab: return json.dumps([ 'error', translate('Error', 'plone', context=self.request), translate(_(u'error_set_default_tab', u'Could not set default tab.'), context=self.request) ]) tab_title = translate(tab, 'ftw.tabbedview', context=self.request) success = [ 'info', translate('Information', 'plone', context=self.request), translate(_(u'info_set_default_tab', u'The tab ${title} is now your default tab. ' + u'This is a personal setting.', mapping={'title': tab_title}), context=self.request) ] if not view and self.request.get('viewname', False): view = self.context.restrictedTraverse( self.request.get('viewname')) else: view = self key_generator = getMultiAdapter((self.context, view, self.request), IDefaultTabStorageKeyGenerator) key = key_generator.get_key() storage = IDictStorage(self) storage.set(key, tab.lower()) return json.dumps(success)
def __call__(self): storage_key_generator = queryMultiAdapter( (getContext(self.published), self.published, self.request), IDefaultTabStorageKeyGenerator) if storage_key_generator is None: return '' storage_key = storage_key_generator.get_key() return IDictStorage(self.published).get(storage_key) or ''
def set_default_tab(self, tab=None, view=None): """Sets the default tab. The id of the tab is passed as argument or in the request payload as ``tab``. """ user = AccessControl.getSecurityManager().getUser() if user == AccessControl.SpecialUsers.nobody: tab = None else: tab = tab or self.request.get('tab') if not tab: return json.dumps([ 'error', translate('Error', 'plone', context=self.request), translate(_(u'error_set_default_tab', u'Could not set default tab.'), context=self.request)]) tab_title = translate(tab, 'ftw.tabbedview', context=self.request) success = [ 'info', translate('Information', 'plone', context=self.request), translate(_(u'info_set_default_tab', u'The tab ${title} is now your default tab. ' + u'This is a personal setting.', mapping={'title': tab_title}), context=self.request)] if not view and self.request.get('viewname', False): view = self.context.restrictedTraverse( self.request.get('viewname')) else: view = self key_generator = getMultiAdapter((self.context, view, self.request), IDefaultTabStorageKeyGenerator) key = key_generator.get_key() storage = IDictStorage(self) storage.set(key, tab.lower()) return json.dumps(success)
def test_initial_tab_is_reseted_on_every_request(self): portal = self.layer['portal'] foobar_view = queryMultiAdapter((portal, portal.REQUEST), name='tabbed_view') key_generator = getMultiAdapter((portal, foobar_view, portal.REQUEST), IDefaultTabStorageKeyGenerator) key = key_generator.get_key() # first call IDictStorage(foobar_view)[key] = 'footab' html = foobar_view() doc = pq(html) initial_tab = doc('#tabbedview-header .tabbedview-tabs a.initial') self.assertEqual(1, len(initial_tab)) self.assertEqual('MyTitle', initial_tab.text()) # second call IDictStorage(foobar_view)[key] = 'notranslation' html = foobar_view() doc = pq(html) initial_tab = doc('#tabbedview-header .tabbedview-tabs a.initial') self.assertEqual(1, len(initial_tab)) self.assertEqual('notranslation', initial_tab.text())
def test_implements_interface(self): self.assertTrue( IDictStorage.implementedBy(statestorage.DefaultDictStorage)) verifyClass(IDictStorage, statestorage.DefaultDictStorage)
def get(key): """Retrieve a value from the key-value store.""" return IDictStorage(DictStorageConfigurationContext()).get(key)
def test_implements_interface(self): self.assertTrue(IDictStorage.implementedBy( statestorage.DefaultDictStorage)) verifyClass(IDictStorage, statestorage.DefaultDictStorage)
def set(key, value): """Set a value in the key-value store.""" return IDictStorage(DictStorageConfigurationContext()).set(key, value)
def get_db_sync_stamp(self): storage = IDictStorage(DictStorageConfigurationContext()) timestamp = storage.get(DICTSTORAGE_SYNC_KEY) return timestamp
def test_call_storage_with_subview_will_not_change_context(self): sub_view = self.dossier.restrictedTraverse( 'tabbedview_view-documents') self.assertIsInstance( IDictStorage(sub_view).context, sub_view.__class__)