fix: push detects locally modified files, renumber migration to 010

- Fix FreeCAD Push command: compare local file mtime against server's
  latest file revision timestamp instead of just checking file existence.
  Previously, any file already uploaded (even at an older revision) was
  skipped, causing 'All local files are already uploaded' when local
  files were newer.
- Add SiloClient.latest_file_revision() helper method
- Renumber 009_item_extended_fields.sql to 010 to avoid collision
  with 009_auth.sql from the auth system
This commit is contained in:
Zoe Forbes
2026-01-31 19:13:09 -06:00
parent e84823227f
commit fc6e47437e
2 changed files with 37 additions and 3 deletions

View File

@@ -534,6 +534,17 @@ class SiloClient:
except Exception:
return False, None
def latest_file_revision(self, part_number: str) -> Optional[Dict]:
"""Return the most recent revision that has a file attached, or None."""
try:
revisions = self.get_revisions(part_number)
for rev in revisions: # revisions come newest-first from the API
if rev.get("file_key"):
return rev
return None
except Exception:
return None
def compare_revisions(
self, part_number: str, from_rev: int, to_rev: int
) -> Dict[str, Any]:
@@ -1757,9 +1768,11 @@ class Silo_Push:
}
def Activated(self):
from datetime import datetime, timezone
from PySide import QtGui
# Find unuploaded files
# Find files that need uploading (no server file, or local is newer)
local_files = search_local_files()
unuploaded = []
@@ -1767,9 +1780,30 @@ class Silo_Push:
pn = lf["part_number"]
try:
_client.get_item(pn) # Check if in DB
has_file, _ = _client.has_file(pn)
if not has_file:
server_rev = _client.latest_file_revision(pn)
if not server_rev:
# No file on server at all
unuploaded.append(lf)
else:
# Compare local mtime against server revision timestamp
try:
local_mtime = os.path.getmtime(lf["path"])
server_time_str = server_rev.get("created_at", "")
if server_time_str:
server_dt = datetime.fromisoformat(
server_time_str.replace("Z", "+00:00")
)
local_dt = datetime.fromtimestamp(
local_mtime, tz=timezone.utc
)
if local_dt > server_dt:
unuploaded.append(lf)
else:
# Can't parse server time, assume needs upload
unuploaded.append(lf)
except Exception:
# On any comparison error, include it
unuploaded.append(lf)
except Exception:
pass # Not in DB, skip