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:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user