Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ef6bdc823d |
+2
-4
@@ -4,10 +4,8 @@
|
|||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|
||||||
- **Fixed crash when importing sets containing minifigures or parts with no image on Rebrickable** (Issue #149c, branch `bugfix/issue-149c`): Adding or refreshing a set would fail entirely if any minifigure or part had no image URL, with error `Invalid URL '': No scheme supplied`
|
- **Fixed `BK_INSTRUCTIONS_ALLOWED_EXTENSIONS` being treated as a string instead of a list** (Issue #149b, branch `bugfix/issue-149b`): When this setting was saved via the admin panel, it was stored and cast as a plain string rather than a list, causing it to be iterated character by character (e.g. `['.', 'p', 'd', 'f']` instead of `['.pdf']`)
|
||||||
- Rebrickable returns an empty string (not `None`) for missing images; normalize empty strings to `None` at the point of ingestion in `rebrickable_minifigure.py` and `individual_minifigure.py`, matching the existing pattern in `rebrickable_set.py`
|
- Added `allowed_extensions` to the list-type keyword detection in `_cast_value()`, matching the existing pattern used for `badge_order` settings
|
||||||
- Updated `rebrickable_image.py` to treat empty strings the same as `None` throughout, falling back to the configured nil placeholder image
|
|
||||||
- Note: the originally reported sets could no longer reproduce the crash (images may have since been added on Rebrickable), so this fix is based on asumptions only
|
|
||||||
- **Fixed deleting a wish with an owner assigned** (Issue #152): Resolved foreign key constraint error when removing a set from the wishlist that had an owner assigned
|
- **Fixed deleting a wish with an owner assigned** (Issue #152): Resolved foreign key constraint error when removing a set from the wishlist that had an owner assigned
|
||||||
- Wish owners are now deleted before the wish itself, respecting the FK constraint
|
- Wish owners are now deleted before the wish itself, respecting the FK constraint
|
||||||
|
|
||||||
|
|||||||
@@ -192,7 +192,7 @@ class ConfigManager:
|
|||||||
def _cast_value(self, var_name: str, value: Any) -> Any:
|
def _cast_value(self, var_name: str, value: Any) -> Any:
|
||||||
"""Cast value to appropriate type based on variable name"""
|
"""Cast value to appropriate type based on variable name"""
|
||||||
# List variables (admin sections, badge order) - Check this FIRST before boolean check
|
# List variables (admin sections, badge order) - Check this FIRST before boolean check
|
||||||
if any(keyword in var_name.lower() for keyword in ['sections', 'badge_order']):
|
if any(keyword in var_name.lower() for keyword in ['sections', 'badge_order', 'allowed_extensions']):
|
||||||
if isinstance(value, str):
|
if isinstance(value, str):
|
||||||
return [section.strip() for section in value.split(',') if section.strip()]
|
return [section.strip() for section in value.split(',') if section.strip()]
|
||||||
elif isinstance(value, list):
|
elif isinstance(value, list):
|
||||||
|
|||||||
@@ -543,6 +543,6 @@ class IndividualMinifigure(RebrickableMinifigure):
|
|||||||
'figure': str(data['set_num']),
|
'figure': str(data['set_num']),
|
||||||
'number': int(number),
|
'number': int(number),
|
||||||
'name': str(data['set_name']),
|
'name': str(data['set_name']),
|
||||||
'image': str(data['set_img_url']) if data.get('set_img_url') else None,
|
'image': data.get('set_img_url'),
|
||||||
'number_of_parts': int(data.get('num_parts', 0)),
|
'number_of_parts': int(data.get('num_parts', 0)),
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ class RebrickableImage(object):
|
|||||||
|
|
||||||
# Get the URL (this handles nil images via url() method)
|
# Get the URL (this handles nil images via url() method)
|
||||||
url = self.url()
|
url = self.url()
|
||||||
if not url:
|
if url is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
# Grab the image
|
# Grab the image
|
||||||
@@ -88,7 +88,7 @@ class RebrickableImage(object):
|
|||||||
return self.part.fields.image_id
|
return self.part.fields.image_id
|
||||||
|
|
||||||
if self.minifigure is not None:
|
if self.minifigure is not None:
|
||||||
if not self.minifigure.fields.image:
|
if self.minifigure.fields.image is None:
|
||||||
return RebrickableImage.nil_minifigure_name()
|
return RebrickableImage.nil_minifigure_name()
|
||||||
else:
|
else:
|
||||||
return self.minifigure.fields.figure
|
return self.minifigure.fields.figure
|
||||||
@@ -113,13 +113,13 @@ class RebrickableImage(object):
|
|||||||
# Return the url depending on the objects provided
|
# Return the url depending on the objects provided
|
||||||
def url(self, /) -> str:
|
def url(self, /) -> str:
|
||||||
if self.part is not None:
|
if self.part is not None:
|
||||||
if not self.part.fields.image:
|
if self.part.fields.image is None:
|
||||||
return current_app.config['REBRICKABLE_IMAGE_NIL']
|
return current_app.config['REBRICKABLE_IMAGE_NIL']
|
||||||
else:
|
else:
|
||||||
return self.part.fields.image
|
return self.part.fields.image
|
||||||
|
|
||||||
if self.minifigure is not None:
|
if self.minifigure is not None:
|
||||||
if not self.minifigure.fields.image:
|
if self.minifigure.fields.image is None:
|
||||||
return current_app.config['REBRICKABLE_IMAGE_NIL_MINIFIGURE']
|
return current_app.config['REBRICKABLE_IMAGE_NIL_MINIFIGURE']
|
||||||
else:
|
else:
|
||||||
return self.minifigure.fields.image
|
return self.minifigure.fields.image
|
||||||
|
|||||||
@@ -110,5 +110,5 @@ class RebrickableMinifigure(BrickRecord):
|
|||||||
'number': int(number),
|
'number': int(number),
|
||||||
'name': str(data['set_name']),
|
'name': str(data['set_name']),
|
||||||
'quantity': int(data['quantity']),
|
'quantity': int(data['quantity']),
|
||||||
'image': str(data['set_img_url']) if data['set_img_url'] else None,
|
'image': data['set_img_url'],
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user