BrickTracker/bricktracker/views/set.py

195 lines
5.5 KiB
Python
Raw Normal View History

2025-01-17 11:03:00 +01:00
import logging
from flask import (
Blueprint,
2025-01-28 23:07:12 +01:00
current_app,
2025-01-17 11:03:00 +01:00
jsonify,
render_template,
redirect,
request,
url_for,
)
from flask_login import login_required
from werkzeug.wrappers.response import Response
from .exceptions import exception_handler
from ..minifigure import BrickMinifigure
from ..part import BrickPart
from ..set import BrickSet
2025-01-31 18:08:53 +01:00
from ..set_list import BrickSetList
2025-01-31 16:34:52 +01:00
from ..set_owner import BrickSetOwner
from ..set_owner_list import BrickSetOwnerList
2025-01-30 16:23:47 +01:00
from ..set_status import BrickSetStatus
from ..set_status_list import BrickSetStatusList
2025-01-31 18:08:53 +01:00
from ..set_tag import BrickSetTag
from ..set_tag_list import BrickSetTagList
2025-01-28 23:07:12 +01:00
from ..socket import MESSAGES
2025-01-17 11:03:00 +01:00
logger = logging.getLogger(__name__)
set_page = Blueprint('set', __name__, url_prefix='/sets')
# List of all sets
@set_page.route('/', methods=['GET'])
@exception_handler(__file__)
def list() -> str:
return render_template(
'sets.html',
collection=BrickSetList().all(),
2025-01-31 16:34:52 +01:00
brickset_owners=BrickSetOwnerList(BrickSetOwner).list(),
2025-01-30 16:23:47 +01:00
brickset_statuses=BrickSetStatusList(BrickSetStatus).list(),
2025-01-31 18:08:53 +01:00
brickset_tags=BrickSetTagList(BrickSetTag).list(),
)
2025-01-17 11:03:00 +01:00
2025-01-31 16:34:52 +01:00
# Change the state of a owner
@set_page.route('/<id>/owner/<metadata_id>', methods=['POST'])
@login_required
@exception_handler(__file__, json=True)
def update_owner(*, id: str, metadata_id: str) -> Response:
brickset = BrickSet().select_light(id)
owner = BrickSetOwnerList(BrickSetOwner).get(metadata_id)
state = owner.update_set_state(brickset, json=request.json)
return jsonify({'value': state})
# Change the state of a status
@set_page.route('/<id>/status/<metadata_id>', methods=['POST'])
2025-01-17 11:03:00 +01:00
@login_required
@exception_handler(__file__, json=True)
def update_status(*, id: str, metadata_id: str) -> Response:
brickset = BrickSet().select_light(id)
2025-01-30 16:23:47 +01:00
status = BrickSetStatusList(BrickSetStatus).get(metadata_id)
2025-01-17 11:03:00 +01:00
state = status.update_set_state(brickset, request.json)
2025-01-17 11:03:00 +01:00
return jsonify({'value': state})
2025-01-17 11:03:00 +01:00
2025-01-31 18:08:53 +01:00
# Change the state of a tag
@set_page.route('/<id>/tag/<metadata_id>', methods=['POST'])
@login_required
@exception_handler(__file__, json=True)
def update_tag(*, id: str, metadata_id: str) -> Response:
brickset = BrickSet().select_light(id)
tag = BrickSetTagList(BrickSetTag).get(metadata_id)
state = tag.update_set_state(brickset, json=request.json)
return jsonify({'value': state})
2025-01-17 11:03:00 +01:00
# Ask for deletion of a set
@set_page.route('/<id>/delete', methods=['GET'])
@login_required
@exception_handler(__file__)
def delete(*, id: str) -> str:
return render_template(
'delete.html',
item=BrickSet().select_specific(id),
error=request.args.get('error'),
)
# Actually delete of a set
@set_page.route('/<id>/delete', methods=['POST'])
@login_required
2025-01-17 11:03:00 +01:00
@exception_handler(__file__, post_redirect='set.delete')
def do_delete(*, id: str) -> Response:
brickset = BrickSet().select_light(id)
2025-01-17 11:03:00 +01:00
brickset.delete()
# Info
logger.info('Set {set} ({id}): deleted'.format(
set=brickset.fields.set,
id=brickset.fields.id,
2025-01-17 11:03:00 +01:00
))
return redirect(url_for('set.deleted', id=id))
# Set is deleted
@set_page.route('/<id>/deleted', methods=['GET'])
@login_required
2025-01-17 11:03:00 +01:00
@exception_handler(__file__)
def deleted(*, id: str) -> str:
return render_template(
'success.html',
message='Set "{id}" has been successfuly deleted.'.format(id=id),
)
# Details of one set
@set_page.route('/<id>/details', methods=['GET'])
@exception_handler(__file__)
def details(*, id: str) -> str:
return render_template(
'set.html',
item=BrickSet().select_specific(id),
open_instructions=request.args.get('open_instructions'),
2025-01-31 16:34:52 +01:00
brickset_owners=BrickSetOwnerList(BrickSetOwner).list(),
2025-01-30 16:23:47 +01:00
brickset_statuses=BrickSetStatusList(BrickSetStatus).list(all=True),
2025-01-31 18:08:53 +01:00
brickset_tags=BrickSetTagList(BrickSetTag).list(),
2025-01-17 11:03:00 +01:00
)
2025-01-28 19:18:51 +01:00
# Update the missing pieces of a part
@set_page.route('/<id>/parts/<part>/<int:color>/<int:spare>/missing', defaults={'figure': None}, methods=['POST']) # noqa: E501
@set_page.route('/<id>/minifigures/<figure>/parts/<part>/<int:color>/<int:spare>/missing', methods=['POST']) # noqa: E501
2025-01-17 11:03:00 +01:00
@login_required
@exception_handler(__file__, json=True)
2025-01-28 19:18:51 +01:00
def missing_part(
*,
id: str,
figure: str | None,
part: str,
color: int,
spare: int,
) -> Response:
2025-01-17 11:03:00 +01:00
brickset = BrickSet().select_specific(id)
2025-01-28 19:18:51 +01:00
if figure is not None:
brickminifigure = BrickMinifigure().select_specific(brickset, figure)
else:
brickminifigure = None
2025-01-27 11:21:15 +01:00
brickpart = BrickPart().select_specific(
2025-01-17 11:03:00 +01:00
brickset,
2025-01-27 11:21:15 +01:00
part,
2025-01-28 19:18:51 +01:00
color,
spare,
2025-01-27 11:21:15 +01:00
minifigure=brickminifigure,
2025-01-17 11:03:00 +01:00
)
2025-01-29 15:58:41 +01:00
brickpart.update_missing(request.json)
2025-01-17 11:03:00 +01:00
# Info
2025-01-28 19:18:51 +01:00
logger.info('Set {set} ({id}): updated part ({part} color: {color}, spare: {spare}, minifigure: {figure}) missing count to {missing}'.format( # noqa: E501
set=brickset.fields.set,
id=brickset.fields.id,
2025-01-28 19:18:51 +01:00
figure=figure,
part=brickpart.fields.part,
color=brickpart.fields.color,
spare=brickpart.fields.spare,
missing=brickpart.fields.missing,
2025-01-17 11:03:00 +01:00
))
2025-01-29 15:58:41 +01:00
return jsonify({'missing': brickpart.fields.missing})
2025-01-28 23:07:12 +01:00
# Refresh a set
@set_page.route('/<id>/refresh', methods=['GET'])
@login_required
2025-01-28 23:07:12 +01:00
@exception_handler(__file__)
def refresh(*, id: str) -> str:
return render_template(
'refresh.html',
item=BrickSet().select_specific(id),
path=current_app.config['SOCKET_PATH'],
namespace=current_app.config['SOCKET_NAMESPACE'],
messages=MESSAGES
)