MerginMaps / MerginMaps/qgis-plugin
Too many project info
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 44
- Forks
- 20
- Avg merge
- 3d 12h
- Merged PRs (30d)
- 5
Description
Current situation
Opening the project status dialog makes three back-to-back requests for the same project info, each returning the project's full file list.
In MerginProjectsManager.project_status() (Mergin/projects_manager.py):
| # | call | what it is after |
|---|---|---|
| 1 | self.mc.project_status(project_dir) → project_info(name, since=vN) |
files, version |
| 2 | self.mc.has_writing_permissions(project_name) → project_info(name) |
permissions.upload |
| 3 | self.mc.project_info(project_name)["role"] |
role |
permissions and role are sibling fields of the same ProjectSchema, and the since= response is already ProjectSchema(exclude=["storage_params"]). So the first response carries everything the other two go back to the server for.
Beyond the wasted payload, has_write_permissions and project_permission reach the dialog from two different responses. They are two snapshots of the same state and can in principle disagree, and the dialog uses one to warn about read-only access and the other to drive MerginProjectValidator.
What we want
One request per status dialog, with the permission and the role coming from the same response.
Proposed approach
Step 1 — plugin only. Drop has_writing_permissions and read both values off a single project_info call. Takes it from three requests to two, no client release needed:
project_info = self.mc.project_info(project_name)
dlg = ProjectStatusDialog(
pull_changes,
push_changes,
push_changes_summary,
project_info["permissions"]["upload"],
mp,
project_info["role"],
)
Step 2 — needs python-api-client. project_status() cannot simply return the server info as a fourth element: 19 call sites (db-sync, cli.py, the plugin) unpack exactly three values. A non-breaking shape is a richer method with the existing one as a thin wrapper:
def project_status(self, directory):
pull, push, summary, _ = self.project_status_with_info(directory)
return pull, push, summary
The plugin then calls project_status_with_info() and takes role and permissions from the response it has already paid for, bringing it to one request.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start in Mergin/projects_manager.py at MerginProjectsManager.project_status() and inspect its 19 call sites before changing the return shape. Then trace the project status dialog and its current permission and role inputs; done means the dialog obtains both values from one response while existing three-value callers continue to work.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- performance
- Issue type
- Refactor
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Clearly specified
- Newbie friendliness
- 68/100