diff --git a/mergin/client.py b/mergin/client.py index 1555051..0028f61 100644 --- a/mergin/client.py +++ b/mergin/client.py @@ -1157,6 +1157,8 @@ def project_status(self, directory): mp = MerginProject(directory) server_info = self.project_info(mp.project_full_name(), since=mp.version()) + mp.update_project_role(server_info["role"]) + pull_changes = mp.get_pull_changes(server_info.get("files", []), server_info.get("version")) push_changes = mp.get_push_changes() diff --git a/mergin/merginproject.py b/mergin/merginproject.py index 12d798f..5476f8a 100644 --- a/mergin/merginproject.py +++ b/mergin/merginproject.py @@ -167,6 +167,12 @@ def project_role(self) -> str: self._read_metadata() return self._metadata.get("role") + def update_project_role(self, role: str) -> None: + """Stores the user's current role on the project.""" + self._read_metadata() + self._metadata["role"] = role + MerginProject.write_metadata(self.dir, self._metadata) + def project_id(self) -> str: """Returns ID of the project (UUID using 8-4-4-4-12 formatting without braces) diff --git a/mergin/test/test_mergin_project.py b/mergin/test/test_mergin_project.py index 97fe554..9b040ad 100644 --- a/mergin/test/test_mergin_project.py +++ b/mergin/test/test_mergin_project.py @@ -471,3 +471,28 @@ def test_tables_to_skip_and_include_mutually_exclusive(): mp.set_tables_to_skip(["table_a"]) with pytest.raises(GeoDiffLibError): mp.set_tables_to_include(["table_b"]) + + +def test_update_project_role(): + with tempfile.TemporaryDirectory() as tmp_dir: + project_dir = os.path.join(tmp_dir, "test_update_project_role") + shutil.copytree(TEST_DATA_DIR, project_dir) + + os.makedirs(os.path.join(project_dir, ".mergin"), exist_ok=True) + with open(os.path.join(project_dir, "v2_metadata.json"), "r") as f: + metadata = json.load(f) + project_metadata_file = os.path.join(project_dir, ".mergin", "mergin.json") + with open(project_metadata_file, "w") as f: + json.dump(metadata, f, indent=2) + + mp = MerginProject(project_dir) + assert mp.project_role() == "owner" + + mp.update_project_role("reader") + assert mp.project_role() == "reader" + # the rest of the metadata has to survive, otherwise the local sync state would be lost + assert mp.version() == metadata.get("version") + assert mp.files() == metadata.get("files") + + # the new role is on disk, not just in the in-memory cache + assert MerginProject(project_dir).project_role() == "reader"