MerginMaps / MerginMaps/qgis-plugin

Too many project info

Open
#945 0 comments 0 reactions 0 assignees View on GitHub

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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.