diff --git a/ihatemoney/tests/budget_test.py b/ihatemoney/tests/budget_test.py index 1b51554a..6110fabd 100644 --- a/ihatemoney/tests/budget_test.py +++ b/ihatemoney/tests/budget_test.py @@ -1665,6 +1665,26 @@ class BudgetTestCase(IhatemoneyTestCase): # No bills, the previous one was not added self.assertIn("No bills", resp.data.decode("utf-8")) + def test_session_projects_migration_to_list(self): + """In https://github.com/spiral-project/ihatemoney/pull/1082, session["projects"] + was migrated from a list to a dict. We need to handle this. + """ + self.post_project("raclette") + self.client.get("/exit") + + with self.client as c: + c.post("/authenticate", data={"id": "raclette", "password": "raclette"}) + self.assertTrue(session["raclette"]) + # New behavior + self.assertIsInstance(session["projects"], dict) + # Now, go back to the past + with c.session_transaction() as sess: + sess["projects"] = [("raclette", "raclette")] + # It should convert entry to dict + c.get("/") + self.assertIsInstance(session["projects"], dict) + self.assertIn("raclette", session["projects"]) + if __name__ == "__main__": unittest.main() diff --git a/ihatemoney/web.py b/ihatemoney/web.py index 9e034029..19135a0c 100644 --- a/ihatemoney/web.py +++ b/ihatemoney/web.py @@ -112,6 +112,13 @@ def add_project_id(endpoint, values): values["project_id"] = g.project.id +@main.url_value_preprocessor +def migrate_session(endpoint, values): + if "projects" in session and isinstance(session["projects"], list): + # Migrate https://github.com/spiral-project/ihatemoney/pull/1082 + session["projects"] = {id: name for (id, name) in session["projects"]} + + @main.url_value_preprocessor def set_show_admin_dashboard_link(endpoint, values): """Sets the "show_admin_dashboard_link" variable application wide