|
@@ -1413,6 +1413,15 @@ class GitHubRestoreService:
|
|
|
quantity = _restored_number(entry.get("quantity"), maximum=10_000, integer=True)
|
|
quantity = _restored_number(entry.get("quantity"), maximum=10_000, integer=True)
|
|
|
if quantity is None:
|
|
if quantity is None:
|
|
|
quantity = 1
|
|
quantity = 1
|
|
|
|
|
+ # A print running when the backup was made is long over: closed
|
|
|
|
|
+ # here the way the stale-archive cleanup closes one. Restored as
|
|
|
|
|
+ # running, the next reconnect closed it as a print that had just
|
|
|
|
|
+ # failed, with a failure notification and a Print Log row (ST/I7).
|
|
|
|
|
+ status = entry.get("status") or "completed"
|
|
|
|
|
+ failure_reason = entry.get("failure_reason")
|
|
|
|
|
+ backed_up_in_flight = status in ("printing", "paused")
|
|
|
|
|
+ if backed_up_in_flight:
|
|
|
|
|
+ status, failure_reason = "cancelled", "noStatusUpdate"
|
|
|
fields = {
|
|
fields = {
|
|
|
"print_name": entry.get("print_name"),
|
|
"print_name": entry.get("print_name"),
|
|
|
"print_time_seconds": numbers["print_time_seconds"],
|
|
"print_time_seconds": numbers["print_time_seconds"],
|
|
@@ -1425,7 +1434,7 @@ class GitHubRestoreService:
|
|
|
"bed_temperature": entry.get("bed_temperature"),
|
|
"bed_temperature": entry.get("bed_temperature"),
|
|
|
"nozzle_temperature": entry.get("nozzle_temperature"),
|
|
"nozzle_temperature": entry.get("nozzle_temperature"),
|
|
|
"sliced_for_model": entry.get("sliced_for_model"),
|
|
"sliced_for_model": entry.get("sliced_for_model"),
|
|
|
- "status": entry.get("status") or "completed",
|
|
|
|
|
|
|
+ "status": status,
|
|
|
"started_at": started_at,
|
|
"started_at": started_at,
|
|
|
"completed_at": _parse_dt(entry.get("completed_at")),
|
|
"completed_at": _parse_dt(entry.get("completed_at")),
|
|
|
"makerworld_url": entry.get("makerworld_url"),
|
|
"makerworld_url": entry.get("makerworld_url"),
|
|
@@ -1435,7 +1444,7 @@ class GitHubRestoreService:
|
|
|
"tags": entry.get("tags"),
|
|
"tags": entry.get("tags"),
|
|
|
"notes": entry.get("notes"),
|
|
"notes": entry.get("notes"),
|
|
|
"cost": numbers["cost"],
|
|
"cost": numbers["cost"],
|
|
|
- "failure_reason": entry.get("failure_reason"),
|
|
|
|
|
|
|
+ "failure_reason": failure_reason,
|
|
|
"quantity": quantity,
|
|
"quantity": quantity,
|
|
|
"energy_kwh": numbers["energy_kwh"],
|
|
"energy_kwh": numbers["energy_kwh"],
|
|
|
"energy_cost": numbers["energy_cost"],
|
|
"energy_cost": numbers["energy_cost"],
|
|
@@ -1541,6 +1550,13 @@ class GitHubRestoreService:
|
|
|
"archivesUndeleted",
|
|
"archivesUndeleted",
|
|
|
"Archive(s) deleted since the backup are visible again — overwrite was on",
|
|
"Archive(s) deleted since the backup are visible again — overwrite was on",
|
|
|
)
|
|
)
|
|
|
|
|
+ if backed_up_in_flight:
|
|
|
|
|
+ # The local row is that same print, still running or since
|
|
|
|
|
+ # ended: it knows more about its outcome than the backup's
|
|
|
|
|
+ # snapshot of it mid-way. Closing it here would end a live
|
|
|
|
|
+ # print's archive, or overwrite a real result.
|
|
|
|
|
+ for key in ("status", "failure_reason", "completed_at"):
|
|
|
|
|
+ fields.pop(key, None)
|
|
|
for key, value in fields.items():
|
|
for key, value in fields.items():
|
|
|
setattr(existing, key, value)
|
|
setattr(existing, key, value)
|
|
|
tally.restored += 1
|
|
tally.restored += 1
|
|
@@ -1689,6 +1705,9 @@ class GitHubRestoreService:
|
|
|
baseline = _restored_number(entry.get("weight_used_baseline"))
|
|
baseline = _restored_number(entry.get("weight_used_baseline"))
|
|
|
if baseline is not None:
|
|
if baseline is not None:
|
|
|
fields["weight_used_baseline"] = baseline
|
|
fields["weight_used_baseline"] = baseline
|
|
|
|
|
+ # When it was last used (LU-4), same late-field rule.
|
|
|
|
|
+ if "last_used" in entry:
|
|
|
|
|
+ fields["last_used"] = _parse_dt(entry.get("last_used"))
|
|
|
# Last drying (#2863), same late-field rule.
|
|
# Last drying (#2863), same late-field rule.
|
|
|
if "last_dried_at" in entry:
|
|
if "last_dried_at" in entry:
|
|
|
fields["last_dried_at"] = _parse_dt(entry.get("last_dried_at"))
|
|
fields["last_dried_at"] = _parse_dt(entry.get("last_dried_at"))
|