Skip to content

Commit fa97a05

Browse files
committed
Refresh user's project role in metadata on project status
1 parent de6f50c commit fa97a05

3 files changed

Lines changed: 39 additions & 0 deletions

File tree

mergin/client.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1157,6 +1157,10 @@ def project_status(self, directory):
11571157
mp = MerginProject(directory)
11581158
server_info = self.project_info(mp.project_full_name(), since=mp.version())
11591159

1160+
# the response carries the caller's current role, which is otherwise never refreshed
1161+
if server_info.get("role"):
1162+
mp.update_project_role(server_info["role"])
1163+
11601164
pull_changes = mp.get_pull_changes(server_info.get("files", []), server_info.get("version"))
11611165

11621166
push_changes = mp.get_push_changes()

mergin/merginproject.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,16 @@ def project_role(self) -> str:
167167
self._read_metadata()
168168
return self._metadata.get("role")
169169

170+
def update_project_role(self, role: str) -> None:
171+
"""Stores the user's current role on the project.
172+
173+
Roles change without creating a new project version, so unlike the rest of the metadata
174+
they cannot be kept up to date from the sync history alone.
175+
"""
176+
self._read_metadata()
177+
self._metadata["role"] = role
178+
MerginProject.write_metadata(self.dir, self._metadata)
179+
170180
def project_id(self) -> str:
171181
"""Returns ID of the project (UUID using 8-4-4-4-12 formatting without braces)
172182

mergin/test/test_mergin_project.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,3 +471,28 @@ def test_tables_to_skip_and_include_mutually_exclusive():
471471
mp.set_tables_to_skip(["table_a"])
472472
with pytest.raises(GeoDiffLibError):
473473
mp.set_tables_to_include(["table_b"])
474+
475+
476+
def test_update_project_role():
477+
with tempfile.TemporaryDirectory() as tmp_dir:
478+
project_dir = os.path.join(tmp_dir, "test_update_project_role")
479+
shutil.copytree(TEST_DATA_DIR, project_dir)
480+
481+
os.makedirs(os.path.join(project_dir, ".mergin"), exist_ok=True)
482+
with open(os.path.join(project_dir, "v2_metadata.json"), "r") as f:
483+
metadata = json.load(f)
484+
project_metadata_file = os.path.join(project_dir, ".mergin", "mergin.json")
485+
with open(project_metadata_file, "w") as f:
486+
json.dump(metadata, f, indent=2)
487+
488+
mp = MerginProject(project_dir)
489+
assert mp.project_role() == "owner"
490+
491+
mp.update_project_role("reader")
492+
assert mp.project_role() == "reader"
493+
# the rest of the metadata has to survive, otherwise the local sync state would be lost
494+
assert mp.version() == metadata.get("version")
495+
assert mp.files() == metadata.get("files")
496+
497+
# the new role is on disk, not just in the in-memory cache
498+
assert MerginProject(project_dir).project_role() == "reader"

0 commit comments

Comments
 (0)