From 24c8f1e5dfd84f3d17744baadb49490f8d8deb2c Mon Sep 17 00:00:00 2001 From: FrederikBaerentsen Date: Sun, 18 Jan 2026 21:06:32 +0100 Subject: [PATCH] feat(core): integrate individual items features with app configuration and versioning --- bricktracker/app.py | 6 ++++++ bricktracker/config.py | 9 ++++++++- bricktracker/config_manager.py | 9 ++++++++- bricktracker/version.py | 2 +- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/bricktracker/app.py b/bricktracker/app.py index e791597..88f30fc 100644 --- a/bricktracker/app.py +++ b/bricktracker/app.py @@ -31,10 +31,13 @@ from bricktracker.views.admin.theme import admin_theme_page from bricktracker.views.data import data_page from bricktracker.views.error import error_404 from bricktracker.views.index import index_page +from bricktracker.views.individual_minifigure import individual_minifigure_page +from bricktracker.views.individual_part import individual_part_page from bricktracker.views.instructions import instructions_page from bricktracker.views.login import login_page from bricktracker.views.minifigure import minifigure_page from bricktracker.views.part import part_page +from bricktracker.views.purchase_location import purchase_location_page from bricktracker.views.set import set_page from bricktracker.views.statistics import statistics_page from bricktracker.views.storage import storage_page @@ -138,10 +141,13 @@ def setup_app(app: Flask) -> None: app.register_blueprint(add_page) app.register_blueprint(data_page) app.register_blueprint(index_page) + app.register_blueprint(individual_minifigure_page) + app.register_blueprint(individual_part_page) app.register_blueprint(instructions_page) app.register_blueprint(login_page) app.register_blueprint(minifigure_page) app.register_blueprint(part_page) + app.register_blueprint(purchase_location_page) app.register_blueprint(set_page) app.register_blueprint(statistics_page) app.register_blueprint(storage_page) diff --git a/bricktracker/config.py b/bricktracker/config.py index 061b75b..71e925e 100644 --- a/bricktracker/config.py +++ b/bricktracker/config.py @@ -10,6 +10,8 @@ from typing import Any, Final CONFIG: Final[list[dict[str, Any]]] = [ {'n': 'AUTHENTICATION_PASSWORD', 'd': ''}, {'n': 'AUTHENTICATION_KEY', 'd': ''}, + # BrickLink minifigure links disabled - Rebrickable doesn't provide BrickLink minifigure IDs + # {'n': 'BRICKLINK_LINK_MINIFIGURE_PATTERN', 'd': 'https://www.bricklink.com/v2/catalog/catalogitem.page?M={figure}'}, # noqa: E501 {'n': 'BRICKLINK_LINK_PART_PATTERN', 'd': 'https://www.bricklink.com/v2/catalog/catalogitem.page?P={part}&C={color}'}, # noqa: E501 {'n': 'BRICKLINK_LINK_SET_PATTERN', 'd': 'https://www.bricklink.com/v2/catalog/catalogitem.page?S={set_num}'}, # noqa: E501 {'n': 'BRICKLINK_LINKS', 'c': bool}, @@ -17,6 +19,9 @@ CONFIG: Final[list[dict[str, Any]]] = [ {'n': 'DATABASE_TIMESTAMP_FORMAT', 'd': '%Y-%m-%d-%H-%M-%S'}, {'n': 'DEBUG', 'c': bool}, {'n': 'DEFAULT_TABLE_PER_PAGE', 'd': 25, 'c': int}, + {'n': 'DISABLE_INDIVIDUAL_MINIFIGURES', 'c': bool}, + {'n': 'DISABLE_INDIVIDUAL_PARTS', 'c': bool}, + {'n': 'DISABLE_QUICK_ADD_INDIVIDUAL_PARTS', 'c': bool}, {'n': 'DOMAIN_NAME', 'e': 'DOMAIN_NAME', 'd': ''}, {'n': 'FILE_DATETIME_FORMAT', 'd': '%d/%m/%Y, %H:%M:%S'}, {'n': 'HOST', 'd': '0.0.0.0'}, @@ -29,7 +34,9 @@ CONFIG: Final[list[dict[str, Any]]] = [ {'n': 'ADMIN_DEFAULT_EXPANDED_SECTIONS', 'd': ['database'], 'c': list}, {'n': 'HIDE_ALL_INSTRUCTIONS', 'c': bool}, {'n': 'HIDE_ALL_MINIFIGURES', 'c': bool}, + {'n': 'HIDE_INDIVIDUAL_MINIFIGURES', 'c': bool}, {'n': 'HIDE_ALL_PARTS', 'c': bool}, + {'n': 'HIDE_INDIVIDUAL_PARTS', 'c': bool}, {'n': 'HIDE_ALL_PROBLEMS_PARTS', 'e': 'BK_HIDE_MISSING_PARTS', 'c': bool}, {'n': 'HIDE_ALL_SETS', 'c': bool}, {'n': 'HIDE_ALL_STORAGES', 'c': bool}, @@ -47,7 +54,7 @@ CONFIG: Final[list[dict[str, Any]]] = [ {'n': 'NO_THREADED_SOCKET', 'c': bool}, {'n': 'PARTS_SERVER_SIDE_PAGINATION', 'c': bool}, {'n': 'SETS_SERVER_SIDE_PAGINATION', 'c': bool}, - {'n': 'PARTS_DEFAULT_ORDER', 'd': '"rebrickable_parts"."name" ASC, "rebrickable_parts"."color_name" ASC, "bricktracker_parts"."spare" ASC'}, # noqa: E501 + {'n': 'PARTS_DEFAULT_ORDER', 'd': '"rebrickable_parts"."name" ASC, "rebrickable_parts"."color_name" ASC, "combined"."spare" ASC'}, # noqa: E501 {'n': 'PARTS_FOLDER', 'd': 'data/parts'}, {'n': 'PARTS_PAGINATION_SIZE_DESKTOP', 'd': 10, 'c': int}, {'n': 'PARTS_PAGINATION_SIZE_MOBILE', 'd': 5, 'c': int}, diff --git a/bricktracker/config_manager.py b/bricktracker/config_manager.py index 963da3e..f3e173a 100644 --- a/bricktracker/config_manager.py +++ b/bricktracker/config_manager.py @@ -17,7 +17,9 @@ LIVE_CHANGEABLE_VARS: Final[List[str]] = [ 'BK_ADMIN_DEFAULT_EXPANDED_SECTIONS', 'BK_HIDE_ALL_INSTRUCTIONS', 'BK_HIDE_ALL_MINIFIGURES', + 'BK_HIDE_INDIVIDUAL_MINIFIGURES', 'BK_HIDE_ALL_PARTS', + 'BK_HIDE_INDIVIDUAL_PARTS', 'BK_HIDE_ALL_PROBLEMS_PARTS', 'BK_HIDE_ALL_SETS', 'BK_HIDE_ALL_STORAGES', @@ -26,6 +28,7 @@ LIVE_CHANGEABLE_VARS: Final[List[str]] = [ 'BK_HIDE_TABLE_DAMAGED_PARTS', 'BK_HIDE_TABLE_MISSING_PARTS', 'BK_HIDE_TABLE_CHECKED_PARTS', + 'BK_DISABLE_QUICK_ADD_INDIVIDUAL_PARTS', 'BK_HIDE_WISHES', 'BK_MINIFIGURES_PAGINATION_SIZE_DESKTOP', 'BK_MINIFIGURES_PAGINATION_SIZE_MOBILE', @@ -68,6 +71,8 @@ LIVE_CHANGEABLE_VARS: Final[List[str]] = [ 'BK_STORAGE_DEFAULT_ORDER', 'BK_WISHES_DEFAULT_ORDER', # URL and Pattern Variables + # BrickLink minifigure links disabled - no ID mapping available + # 'BK_BRICKLINK_LINK_MINIFIGURE_PATTERN', 'BK_BRICKLINK_LINK_PART_PATTERN', 'BK_BRICKLINK_LINK_SET_PATTERN', 'BK_REBRICKABLE_IMAGE_NIL', @@ -90,6 +95,8 @@ RESTART_REQUIRED_VARS: Final[List[str]] = [ 'BK_AUTHENTICATION_KEY', 'BK_DATABASE_PATH', 'BK_DEBUG', + 'BK_DISABLE_INDIVIDUAL_PARTS', + 'BK_DISABLE_INDIVIDUAL_MINIFIGURES', 'BK_DOMAIN_NAME', 'BK_HOST', 'BK_PORT', @@ -199,7 +206,7 @@ class ConfigManager: except (ValueError, TypeError): return 0 # Boolean variables - More specific patterns to avoid conflicts - if any(keyword in var_name.lower() for keyword in ['hide_', 'server_side_pagination', '_links', 'random', 'skip_', 'show_', 'use_', '_consolidation', '_charts', '_expanded']): + if any(keyword in var_name.lower() for keyword in ['hide_', 'disable_', 'server_side_pagination', '_links', 'random', 'skip_', 'show_', 'use_', '_consolidation', '_charts', '_expanded']): if isinstance(value, str): return value.lower() in ('true', '1', 'yes', 'on') return bool(value) diff --git a/bricktracker/version.py b/bricktracker/version.py index 17c1e83..e5c6e1d 100644 --- a/bricktracker/version.py +++ b/bricktracker/version.py @@ -1,4 +1,4 @@ from typing import Final __version__: Final[str] = '1.4.0' -__database_version__: Final[int] = 20 +__database_version__: Final[int] = 27