115 lines
3.6 KiB
Python
115 lines
3.6 KiB
Python
"""Transient helpers for adding cards to game-neutral decks."""
|
|
|
|
from odoo import _, api, fields, models
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class MvdTcgAddToDeck(models.TransientModel):
|
|
"""Add one reference card to one deck board."""
|
|
|
|
_name = "mvd.tcg.add.to.deck"
|
|
_description = "Add TCG Card To Deck"
|
|
|
|
card_id = fields.Many2one(
|
|
"mvd.tcg.card",
|
|
required=True,
|
|
readonly=True,
|
|
)
|
|
game_id = fields.Many2one(
|
|
"mvd.tcg.game",
|
|
readonly=True,
|
|
)
|
|
deck_id = fields.Many2one(
|
|
"mvd.tcg.deck",
|
|
required=True,
|
|
domain="[('active', '=', True), ('game_id', '=', game_id)]",
|
|
)
|
|
board_id = fields.Many2one(
|
|
"mvd.tcg.deck.board",
|
|
required=True,
|
|
domain="[('deck_id', '=', deck_id)]",
|
|
)
|
|
quantity = fields.Integer(required=True, default=1)
|
|
role_ids = fields.Many2many(
|
|
"mvd.tcg.deck.role",
|
|
string="Roles",
|
|
)
|
|
note = fields.Char()
|
|
|
|
@api.model
|
|
def default_get(self, field_names):
|
|
"""Prefill the wizard from the active card context.
|
|
|
|
Args:
|
|
field_names: Requested wizard fields.
|
|
|
|
Returns:
|
|
dict: Initial field values.
|
|
"""
|
|
defaults = super().default_get(field_names)
|
|
card_id = defaults.get("card_id") or self.env.context.get("active_id")
|
|
if self.env.context.get("active_model") == "mvd.tcg.card" and card_id:
|
|
card = self.env["mvd.tcg.card"].browse(card_id).exists()
|
|
if card:
|
|
defaults["card_id"] = card.id
|
|
defaults["game_id"] = card.game_id.id
|
|
deck_id = defaults.get("deck_id") or self.env.context.get("default_deck_id")
|
|
if deck_id:
|
|
deck = self.env["mvd.tcg.deck"].browse(deck_id).exists()
|
|
if deck:
|
|
defaults["deck_id"] = deck.id
|
|
defaults.setdefault("game_id", deck.game_id.id)
|
|
board_id = defaults.get("board_id") or self.env.context.get("default_board_id")
|
|
if board_id:
|
|
board = self.env["mvd.tcg.deck.board"].browse(board_id).exists()
|
|
if board:
|
|
defaults["board_id"] = board.id
|
|
defaults.setdefault("deck_id", board.deck_id.id)
|
|
defaults.setdefault("game_id", board.deck_id.game_id.id)
|
|
return defaults
|
|
|
|
@api.onchange("deck_id")
|
|
def _onchange_deck_id(self):
|
|
"""Preselect the most likely target board for the chosen deck.
|
|
|
|
Returns:
|
|
None: The method updates wizard fields in place.
|
|
"""
|
|
if not self.deck_id:
|
|
self.board_id = False
|
|
return
|
|
preferred_board = self.deck_id.board_ids.filtered(
|
|
lambda board: board.code == "mainboard"
|
|
)[:1]
|
|
self.board_id = preferred_board or self.deck_id.board_ids[:1]
|
|
|
|
def action_add_to_deck(self):
|
|
"""Create or increment a deck line for the selected card.
|
|
|
|
Returns:
|
|
dict: Window action for the updated deck.
|
|
|
|
Raises:
|
|
UserError: If the wizard lacks a valid card context.
|
|
"""
|
|
self.ensure_one()
|
|
if not self.card_id:
|
|
raise UserError(_("Select a card first."))
|
|
|
|
self.deck_id._mvd_tcg_add_card_to_board(
|
|
self.card_id,
|
|
self.board_id,
|
|
quantity=self.quantity,
|
|
role_ids=self.role_ids,
|
|
note=self.note,
|
|
)
|
|
|
|
return {
|
|
"type": "ir.actions.act_window",
|
|
"name": _("Deck"),
|
|
"res_model": "mvd.tcg.deck",
|
|
"view_mode": "form",
|
|
"res_id": self.deck_id.id,
|
|
"target": "current",
|
|
}
|