fix(sets): refreshing sets should work now

This commit is contained in:
2025-12-23 23:08:30 -05:00
parent 9518b0261c
commit 5418aca8f0
4 changed files with 72 additions and 3 deletions

View File

@@ -23,6 +23,8 @@ class BrickPart(RebrickablePart):
# Queries
insert_query: str = 'part/insert'
upsert_query: str = 'part/upsert'
update_on_refresh_query: str = 'part/update_on_refresh'
generic_query: str = 'part/select/generic'
select_query: str = 'part/select/specific'
@@ -66,7 +68,18 @@ class BrickPart(RebrickablePart):
# This must happen before inserting into bricktracker_parts due to FK constraint
self.insert_rebrickable()
if not refresh:
if refresh:
# Try to update existing part first (preserves checked, missing, and damaged states)
# Note: Cannot defer this because we need to check if rows were affected
rows, _ = BrickSQL().execute(
self.update_on_refresh_query,
parameters=self.sql_parameters(),
defer=False
)
# If no rows were updated, the part doesn't exist yet, so insert it
if rows == 0:
self.insert(commit=False)
else:
# Insert into bricktracker_parts database (child record)
self.insert(commit=False)

View File

@@ -56,8 +56,23 @@ class BrickSet(RebrickableSet):
# Grabbing the refresh flag
refresh: bool = bool(data.get('refresh', False))
# Generate an UUID for self
self.fields.id = str(uuid4())
# Generate an UUID for self (or use existing ID if refreshing)
if refresh:
# Find the existing set by set number to get its ID
result = BrickSQL().raw_execute(
'SELECT "id" FROM "bricktracker_sets" WHERE "set" = :set',
{'set': self.fields.set}
).fetchone()
if result:
# Use existing set ID
self.fields.id = result['id']
else:
# If set doesn't exist in database, treat as new import
refresh = False
self.fields.id = str(uuid4())
else:
self.fields.id = str(uuid4())
# Insert the rebrickable set into database FIRST
# This must happen before inserting bricktracker_sets due to FK constraint

View File

@@ -0,0 +1,11 @@
-- Update existing part quantities during refresh while preserving tracking data
UPDATE "bricktracker_parts"
SET
"quantity" = :quantity,
"element" = :element,
"rebrickable_inventory" = :rebrickable_inventory
WHERE "id" = :id
AND "figure" IS NOT DISTINCT FROM :figure
AND "part" = :part
AND "color" = :color
AND "spare" = :spare

View File

@@ -0,0 +1,30 @@
INSERT INTO "bricktracker_parts" (
"id",
"figure",
"part",
"color",
"spare",
"quantity",
"element",
"rebrickable_inventory",
"checked",
"missing",
"damaged"
) VALUES (
:id,
:figure,
:part,
:color,
:spare,
:quantity,
:element,
:rebrickable_inventory,
0,
0,
0
)
ON CONFLICT("id", "figure", "part", "color", "spare")
DO UPDATE SET
"quantity" = excluded."quantity",
"element" = excluded."element",
"rebrickable_inventory" = excluded."rebrickable_inventory"