Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 14 additions & 34 deletions Mergin/projects_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
UnsavedChangesStrategy,
write_project_variables,
bytes_to_human_size,
push_error_message,
)
from .utils_auth import get_stored_mergin_server_url

Expand Down Expand Up @@ -126,7 +127,17 @@ def create_project(self, project_name, project_dir, is_public, namespace):
f"Projects quota: {quota}"
)
elif e.server_code == ErrorCode.StorageLimitHit.value:
msg = f"{e.detail}\nCurrent limit: {bytes_to_human_size(e.server_response['storage_limit'])}"
data = e.server_response
if isinstance(data, str):
try:
data = json.loads(data)
except json.JSONDecodeError:
data = {}

storage_limit = data.get("storage_limit")
human_limit = bytes_to_human_size(storage_limit) if storage_limit is not None else "unknown"

msg = f"{e.detail}\nCurrent limit: {human_limit}"

QMessageBox.critical(
None,
Expand Down Expand Up @@ -182,18 +193,7 @@ def create_project(self, project_name, project_dir, is_public, namespace):
dlg.exec() # blocks until success, failure or cancellation

if dlg.exception:
# push failed for some reason
if isinstance(dlg.exception, LoginError):
login_error_message(dlg.exception)
elif isinstance(dlg.exception, ClientError):
QMessageBox.critical(None, "Project sync", "Client error: " + str(dlg.exception))
else:
unhandled_exception_message(
dlg.exception_details(),
"Project sync",
f"Something went wrong while synchronising your project {project_name}.",
self.mc,
)
push_error_message(dlg, project_name, self.plugin, self.mc)
return True

if not dlg.is_complete:
Expand Down Expand Up @@ -455,27 +455,7 @@ def sync_project(self, project_dir, project_name=None):
self.open_project(project_dir)

if dlg.exception:
# push failed for some reason
if isinstance(dlg.exception, LoginError):
login_error_message(dlg.exception)
elif isinstance(dlg.exception, ClientError):
if dlg.exception.http_error == 400 and "Another process" in dlg.exception.detail:
# To note we check for a string since error in flask doesn't return server error code
msg = "Somebody else is syncing, please try again later"
elif dlg.exception.server_code == ErrorCode.StorageLimitHit.value:
msg = f"{dlg.exception.detail}\nCurrent limit: {bytes_to_human_size(dlg.exception.server_response['storage_limit'])}"
else:
msg = str(dlg.exception)
QMessageBox.critical(None, "Project sync", "Client error: \n" + msg)
elif isinstance(dlg.exception, AuthTokenExpiredError):
self.plugin.auth_token_expired()
else:
unhandled_exception_message(
dlg.exception_details(),
"Project sync",
f"Something went wrong while synchronising your project {project_name}.",
self.mc,
)
push_error_message(dlg, project_name, self.plugin, self.mc)
return

if dlg.is_complete:
Expand Down
39 changes: 38 additions & 1 deletion Mergin/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@

try:
from .mergin.common import ClientError, ErrorCode, LoginError, InvalidProject
from .mergin.client import MerginClient, ServerType
from .mergin.client import MerginClient, ServerType, AuthTokenExpiredError
from .mergin.client_pull import (
download_project_async,
download_project_is_running,
Expand Down Expand Up @@ -1732,3 +1732,40 @@ def sanitize_path(expr: str) -> str:
parts = expr.split("/")
cleaned = [p.rstrip() for p in parts]
return "/".join(cleaned)


def storage_limit_fail(exc):
data = exc.server_response
if isinstance(data, str):
try:
data = json.loads(data)
except json.JSONDecodeError:
data = {}
storage_limit = data.get("storage_limit")
human_limit = bytes_to_human_size(storage_limit) if storage_limit is not None else "unknown"
return f"{exc.detail}\nCurrent limit: {human_limit}"


def push_error_message(dlg, project_name, plugin, mc):
if isinstance(dlg.exception, LoginError):
login_error_message(dlg.exception)
elif isinstance(dlg.exception, ClientError):
exc = dlg.exception

if exc.http_error == 400 and "Another process" in exc.detail:
msg = "Somebody else is syncing, please try again later"
elif exc.server_code == ErrorCode.StorageLimitHit.value:
msg = storage_limit_fail(exc)
else:
msg = str(exc)

QMessageBox.critical(None, "Project sync", "Client error: \n" + msg)
elif isinstance(dlg.exception, AuthTokenExpiredError):
plugin.auth_token_expired()
else:
unhandled_exception_message(
dlg.exception_details(),
"Project sync",
f"Something went wrong while synchronising your project {project_name}.",
mc,
)
Loading