Files
mvd_tcg_deck/wizards/mvd_tcg_add_to_deck.py
2026-04-03 23:08:57 +02:00

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",
}