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:
Forbes
2026-01-31 19:13:09 -06:00
parent ab15582e26
commit d5be2eb152
2 changed files with 37 additions and 3 deletions

View File

@@ -534,6 +534,17 @@ class SiloClient:
except Exception: except Exception:
return False, None 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( def compare_revisions(
self, part_number: str, from_rev: int, to_rev: int self, part_number: str, from_rev: int, to_rev: int
) -> Dict[str, Any]: ) -> Dict[str, Any]:
@@ -1757,9 +1768,11 @@ class Silo_Push:
} }
def Activated(self): def Activated(self):
from datetime import datetime, timezone
from PySide import QtGui from PySide import QtGui
# Find unuploaded files # Find files that need uploading (no server file, or local is newer)
local_files = search_local_files() local_files = search_local_files()
unuploaded = [] unuploaded = []
@@ -1767,8 +1780,29 @@ class Silo_Push:
pn = lf["part_number"] pn = lf["part_number"]
try: try:
_client.get_item(pn) # Check if in DB _client.get_item(pn) # Check if in DB
has_file, _ = _client.has_file(pn) server_rev = _client.latest_file_revision(pn)
if not has_file: 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) unuploaded.append(lf)
except Exception: except Exception:
pass # Not in DB, skip pass # Not in DB, skip