fix(sets): refreshing sets should work now
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
11
bricktracker/sql/part/update_on_refresh.sql
Normal file
11
bricktracker/sql/part/update_on_refresh.sql
Normal 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
|
||||
30
bricktracker/sql/part/upsert.sql
Normal file
30
bricktracker/sql/part/upsert.sql
Normal 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"
|
||||
Reference in New Issue
Block a user