diff --git a/.env.sample b/.env.sample index c9b70de..a044078 100644 --- a/.env.sample +++ b/.env.sample @@ -32,6 +32,11 @@ # Default: https://www.bricklink.com/v2/catalog/catalogitem.page?P={part}&C={color} # BK_BRICKLINK_LINK_PART_PATTERN= +# Optional: Pattern of the link to Bricklink for a set. Will be passed to Python .format() +# Supports {set_num} parameter. Set numbers in format like '10255-1' are used. +# Default: https://www.bricklink.com/v2/catalog/catalogitem.page?S={set_num} +# BK_BRICKLINK_LINK_SET_PATTERN= + # Optional: Display Bricklink links wherever applicable # Default: false # BK_BRICKLINK_LINKS=true diff --git a/CHANGELOG.md b/CHANGELOG.md index 45439a9..4ac1f31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -75,6 +75,10 @@ - Works with both server-side and client-side pagination modes - Consolidated mode: Shows sets that have multiple instances - Non-consolidated mode: Shows sets that appear multiple times in collection +- Add BrickLink links for sets + - BrickLink badge links now appear on set cards and set details pages alongside Rebrickable links + - `BK_BRICKLINK_LINK_SET_PATTERN`: New environment variable for BrickLink set URL pattern (default: https://www.bricklink.com/v2/catalog/catalogitem.page?S={set_num}) + - Controlled by existing `BK_BRICKLINK_LINKS` environment variable - Add live environment variable configuration management system - Configuration Management interface in admin panel with live preview and badge system - Live settings: Can be changed without application restart (menu visibility, table display, pagination, features) diff --git a/bricktracker/config.py b/bricktracker/config.py index 5d1a7ea..f1571c5 100644 --- a/bricktracker/config.py +++ b/bricktracker/config.py @@ -11,6 +11,7 @@ CONFIG: Final[list[dict[str, Any]]] = [ {'n': 'AUTHENTICATION_PASSWORD', 'd': ''}, {'n': 'AUTHENTICATION_KEY', 'd': ''}, {'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}, {'n': 'DATABASE_PATH', 'd': './app.db'}, {'n': 'DATABASE_TIMESTAMP_FORMAT', 'd': '%Y-%m-%d-%H-%M-%S'}, diff --git a/bricktracker/config_manager.py b/bricktracker/config_manager.py index 185befb..2871d0d 100644 --- a/bricktracker/config_manager.py +++ b/bricktracker/config_manager.py @@ -62,6 +62,7 @@ LIVE_CHANGEABLE_VARS: Final[List[str]] = [ 'BK_WISHES_DEFAULT_ORDER', # URL and Pattern Variables 'BK_BRICKLINK_LINK_PART_PATTERN', + 'BK_BRICKLINK_LINK_SET_PATTERN', 'BK_REBRICKABLE_IMAGE_NIL', 'BK_REBRICKABLE_IMAGE_NIL_MINIFIGURE', 'BK_REBRICKABLE_LINK_MINIFIGURE_PATTERN', diff --git a/bricktracker/rebrickable_set.py b/bricktracker/rebrickable_set.py index 6beffc2..72a6d97 100644 --- a/bricktracker/rebrickable_set.py +++ b/bricktracker/rebrickable_set.py @@ -179,6 +179,15 @@ class RebrickableSet(BrickRecord): return '' + # Compute the url for the bricklink page + def url_for_bricklink(self, /) -> str: + if current_app.config['BRICKLINK_LINKS']: + return current_app.config['BRICKLINK_LINK_SET_PATTERN'].format( + set_num=self.fields.set + ) + + return '' + # Compute the url for the refresh button def url_for_refresh(self, /) -> str: return url_for('set.refresh', set=self.fields.set) diff --git a/templates/set/card.html b/templates/set/card.html index 8aa8e42..23fe0a8 100644 --- a/templates/set/card.html +++ b/templates/set/card.html @@ -83,6 +83,7 @@ {{ badge.instructions(item, solo=solo, last=last) }} {% endif %} {{ badge.rebrickable(item, solo=solo, last=last) }} + {{ badge.bricklink(item, solo=solo, last=last) }} {% endif %} {% if not tiny and brickset_statuses | length %}