diff --git a/bricktracker/set.py b/bricktracker/set.py index 387d9b2..d873b6e 100644 --- a/bricktracker/set.py +++ b/bricktracker/set.py @@ -30,6 +30,7 @@ class BrickSet(RebrickableSet): insert_query: str = 'set/insert' update_purchase_date_query: str = 'set/update/purchase_date' update_purchase_price_query: str = 'set/update/purchase_price' + update_description_query: str = 'set/update/description' # Delete a set def delete(self, /) -> None: @@ -370,3 +371,36 @@ class BrickSet(RebrickableSet): # Update purchase price url def url_for_purchase_price(self, /) -> str: return url_for('set.update_purchase_price', id=self.fields.id) + + # Update description + def update_description(self, json: Any | None, /) -> Any: + value = json.get('value', None) # type: ignore + + if value == '': + value = None + + self.fields.description = value + + rows, _ = BrickSQL().execute_and_commit( + self.update_description_query, + parameters=self.sql_parameters() + ) + + if rows != 1: + raise DatabaseException('Could not update the description for set {set} ({id})'.format( # noqa: E501 + set=self.fields.set, + id=self.fields.id, + )) + + # Info + logger.info('Description changed to "{value}" for set {set} ({id})'.format( # noqa: E501 + value=value, + set=self.fields.set, + id=self.fields.id, + )) + + return value + + # Update description url + def url_for_description(self, /) -> str: + return url_for('set.update_description', id=self.fields.id) diff --git a/bricktracker/sql/set/base/base.sql b/bricktracker/sql/set/base/base.sql index 5ecc2cf..1c793a5 100644 --- a/bricktracker/sql/set/base/base.sql +++ b/bricktracker/sql/set/base/base.sql @@ -4,6 +4,7 @@ SELECT "bricktracker_sets"."purchase_date", "bricktracker_sets"."purchase_location", "bricktracker_sets"."purchase_price", + "bricktracker_sets"."description", "rebrickable_sets"."set", "rebrickable_sets"."number", "rebrickable_sets"."version", diff --git a/bricktracker/sql/set/update/description.sql b/bricktracker/sql/set/update/description.sql new file mode 100644 index 0000000..0786412 --- /dev/null +++ b/bricktracker/sql/set/update/description.sql @@ -0,0 +1,3 @@ +UPDATE "bricktracker_sets" +SET "description" = :description +WHERE "bricktracker_sets"."id" IS NOT DISTINCT FROM :id diff --git a/bricktracker/views/set.py b/bricktracker/views/set.py index 0ac0a82..5855fd6 100644 --- a/bricktracker/views/set.py +++ b/bricktracker/views/set.py @@ -158,6 +158,18 @@ def update_purchase_price(*, id: str) -> Response: return jsonify({'value': value}) +# Change the value of description +@set_page.route('//description', methods=['POST']) +@login_required +@exception_handler(__file__, json=True) +def update_description(*, id: str) -> Response: + brickset = BrickSet().select_light(id) + + value = brickset.update_description(request.json) + + return jsonify({'value': value}) + + # Change the state of a owner @set_page.route('//owner/', methods=['POST']) @login_required diff --git a/static/scripts/changer.js b/static/scripts/changer.js index a32af76..5b01ef8 100644 --- a/static/scripts/changer.js +++ b/static/scripts/changer.js @@ -38,6 +38,11 @@ class BrickChanger { listener = "change"; break; + case "TEXTAREA": + this.html_type = "textarea"; + listener = "change"; + break; + default: throw Error(`Unsupported HTML tag type for BrickChanger: ${this.html_element.tagName}`); } @@ -131,6 +136,7 @@ class BrickChanger { case "text": case "select": + case "textarea": value = this.html_element.value; break; diff --git a/templates/macro/form.html b/templates/macro/form.html index 13577f8..5a5ffaa 100644 --- a/templates/macro/form.html +++ b/templates/macro/form.html @@ -65,6 +65,30 @@ {% endif %} {% endmacro %} +{% macro textarea(name, id, prefix, url, value, all=none, read_only=none, icon=none, rows=3, delete=false) %} + {% if all or read_only %} + {{ value }} + {% else %} + +
+ {% if icon %} {{ name }}{% endif %} + + {% if g.login.is_authenticated() and not delete %} + + + {% else %} + + {% endif %} +
+ {% endif %} +{% endmacro %} + {% macro filter_toggle(filter_id) %}