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