From 917d9db4c64d08914ccfa325e7ddcb3c511f890b Mon Sep 17 00:00:00 2001 From: Claudia Malzer Date: Tue, 31 Oct 2023 16:58:08 +0100 Subject: [PATCH] Catalogs view should filter by site #801 * set storeid cookie in management views.py * clear localStorage in new session * filter by currentSite when catalogs page first loads" --- .../assets/js/store/configureStore.js | 22 +++++++++++++++++-- rdmo/management/views.py | 8 +++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/rdmo/management/assets/js/store/configureStore.js b/rdmo/management/assets/js/store/configureStore.js index e4720e7d4c..450d8b96d3 100644 --- a/rdmo/management/assets/js/store/configureStore.js +++ b/rdmo/management/assets/js/store/configureStore.js @@ -1,5 +1,7 @@ import { applyMiddleware, createStore } from 'redux' +import Cookies from 'js-cookie' import thunk from 'redux-thunk' +import isEmpty from 'lodash/isEmpty' import isNil from 'lodash/isNil' import { parseLocation } from '../utils/location' @@ -12,6 +14,15 @@ import * as elementActions from '../actions/elementActions' export default function configureStore() { const middlewares = [thunk] + // empty localStorage in new session + const currentStoreId = Cookies.get('storeid') + const localStoreId = localStorage.getItem('rdmo.storeid') + + if (isEmpty(localStoreId) || localStoreId !== currentStoreId) { + localStorage.clear() + localStorage.setItem('rdmo.storeid', currentStoreId) + } + if (process.env.NODE_ENV === 'development') { const { logger } = require('redux-logger') middlewares.push(logger) @@ -28,7 +39,6 @@ export default function configureStore() { // load: restore the config from the local storage const updateConfigFromLocalStorage = () => { const ls = {...localStorage} - Object.entries(ls).forEach(([lsPath, lsValue]) => { const path = lsPath.replace('rdmo.management.config.', '') let value @@ -46,9 +56,11 @@ export default function configureStore() { }) } + let currentSiteId // load, popstate: fetch elements depending on the location const fetchElementsFromLocation = () => { const baseUrl = store.getState().config.baseUrl + currentSiteId = store.getState().config.currentSite?.id.toString() || '' const pathname = window.location.pathname let { elementType, elementId, elementAction } = parseLocation(baseUrl, pathname) @@ -69,7 +81,13 @@ export default function configureStore() { // this event is triggered when the page first loads window.addEventListener('load', () => { updateConfigFromLocalStorage() - fetchConfig().then(() => fetchElementsFromLocation()) + fetchConfig().then(() => { + fetchElementsFromLocation() + if (!isEmpty(currentSiteId) && isEmpty(store.getState().config.filter)) { + store.dispatch(configActions.updateConfig('filter.sites', currentSiteId)) + } + }) + }) // this event is triggered when when the forward/back buttons are used diff --git a/rdmo/management/views.py b/rdmo/management/views.py index 18ce86b5bf..c4bbd062a7 100644 --- a/rdmo/management/views.py +++ b/rdmo/management/views.py @@ -1,3 +1,4 @@ +import hashlib import logging from django.contrib.auth.mixins import LoginRequiredMixin @@ -18,3 +19,10 @@ class ManagementView(LoginRequiredMixin, PermissionRedirectMixin, RulesPermissio def has_permission(self): # Use test_rule from rules for permissions check return test_rule('management.can_view_management', self.request.user, self.request.site) + + def render_to_response(self, context, **response_kwargs): + storeid = hashlib.sha256(self.request.session.session_key.encode()).hexdigest() + + response = super().render_to_response(context, **response_kwargs) + response.set_cookie('storeid', storeid) + return response