ffxivbis/src/service/api/views/html/loot.py

71 lines
2.4 KiB
Python

#
# Copyright (c) 2019 Evgeniy Alekseev.
#
# This file is part of ffxivbis
# (see https://github.com/arcan1s/ffxivbis).
#
# License: 3-clause BSD, see https://opensource.org/licenses/BSD-3-Clause
#
from aiohttp.web import HTTPFound, Response
from aiohttp_jinja2 import template
from typing import Any, Dict, List
from service.models.piece import Piece
from service.models.player import Player, PlayerId
from service.models.upgrade import Upgrade
from service.api.utils import wrap_exception, wrap_invalid_param
from service.api.views.common.loot_base import LootBaseView
from service.api.views.common.player_base import PlayerBaseView
class LootHtmlView(LootBaseView, PlayerBaseView):
@template('loot.jinja2')
async def get(self) -> Dict[str, Any]:
error = None
items: List[Dict[str, str]] = []
players: List[Player] = []
try:
players = self.player_get(None)
items = [
{
'player': player.player_id.pretty_name,
'piece': piece.name,
'is_tome': 'yes' if getattr(piece, 'is_tome', True) else 'no'
}
for player in players
for piece in player.loot
]
except Exception as e:
self.request.app.logger.exception('could not get loot')
error = repr(e)
return {
'items': items,
'pieces': Piece.available() + [upgrade.name for upgrade in Upgrade],
'players': [player.player_id.pretty_name for player in players],
'request_error': error
}
async def post(self) -> Response:
data = await self.request.post()
required = ['action', 'piece', 'player']
if any(param not in data for param in required):
return wrap_invalid_param(required, data)
try:
player_id = PlayerId.from_pretty_name(data.getone('player')) # type: ignore
is_tome = (data.getone('is_tome', None) == 'on')
await self.loot_post(data.getone('action'), player_id, # type: ignore
Piece.get({'piece': data.getone('piece'), 'is_tome': is_tome})) # type: ignore
except Exception as e:
self.request.app.logger.exception('could not manage loot')
return wrap_exception(e, data)
return HTTPFound(self.request.url)