🎉 Initialize module repository
This commit is contained in:
104
views/menu_views.xml
Normal file
104
views/menu_views.xml
Normal file
@@ -0,0 +1,104 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<menuitem
|
||||
id="mvd_tcg_root_menu"
|
||||
name="TCG"
|
||||
sequence="60"
|
||||
action="mvd_tcg_base.mvd_tcg_card_action"
|
||||
web_icon="mvd_tcg_base,static/description/icon.png"
|
||||
groups="mvd_tcg_base.mvd_tcg_base_group_user,base.group_system"
|
||||
/>
|
||||
|
||||
<menuitem
|
||||
id="mvd_tcg_catalog_menu"
|
||||
name="Reference"
|
||||
parent="mvd_tcg_base.mvd_tcg_configuration_menu"
|
||||
sequence="10"
|
||||
groups="mvd_tcg_base.mvd_tcg_base_group_manager,base.group_system"
|
||||
/>
|
||||
|
||||
<menuitem
|
||||
id="mvd_tcg_operations_menu"
|
||||
name="Deck Builder"
|
||||
parent="mvd_tcg_base.mvd_tcg_configuration_menu"
|
||||
sequence="20"
|
||||
groups="mvd_tcg_base.mvd_tcg_base_group_manager,base.group_system"
|
||||
/>
|
||||
|
||||
<menuitem
|
||||
id="mvd_tcg_cards_menu"
|
||||
name="All Cards"
|
||||
parent="mvd_tcg_base.mvd_tcg_catalog_menu"
|
||||
sequence="10"
|
||||
action="mvd_tcg_base.mvd_tcg_card_action"
|
||||
groups="mvd_tcg_base.mvd_tcg_base_group_manager,base.group_system"
|
||||
/>
|
||||
|
||||
<menuitem
|
||||
id="mvd_tcg_configuration_menu"
|
||||
name="Configuration"
|
||||
parent="mvd_tcg_base.mvd_tcg_root_menu"
|
||||
sequence="90"
|
||||
groups="mvd_tcg_base.mvd_tcg_base_group_manager,base.group_system"
|
||||
/>
|
||||
|
||||
<menuitem
|
||||
id="mvd_tcg_games_menu"
|
||||
name="Games"
|
||||
parent="mvd_tcg_base.mvd_tcg_catalog_menu"
|
||||
sequence="20"
|
||||
action="mvd_tcg_base.mvd_tcg_game_action"
|
||||
groups="mvd_tcg_base.mvd_tcg_base_group_manager,base.group_system"
|
||||
/>
|
||||
|
||||
<menuitem
|
||||
id="mvd_tcg_settings_menu"
|
||||
name="TCG Settings"
|
||||
parent="mvd_tcg_base.mvd_tcg_configuration_menu"
|
||||
sequence="90"
|
||||
action="mvd_tcg_base.mvd_tcg_action_configuration"
|
||||
groups="mvd_tcg_base.mvd_tcg_base_group_administrator,base.group_system"
|
||||
/>
|
||||
|
||||
<record id="mvd_tcg_configuration_menu" model="ir.ui.menu">
|
||||
<field
|
||||
name="group_ids"
|
||||
eval="[(6, 0, [ref('mvd_tcg_base.mvd_tcg_base_group_manager'), ref('base.group_system')])]"
|
||||
/>
|
||||
</record>
|
||||
|
||||
<record id="mvd_tcg_catalog_menu" model="ir.ui.menu">
|
||||
<field
|
||||
name="group_ids"
|
||||
eval="[(6, 0, [ref('mvd_tcg_base.mvd_tcg_base_group_manager'), ref('base.group_system')])]"
|
||||
/>
|
||||
</record>
|
||||
|
||||
<record id="mvd_tcg_operations_menu" model="ir.ui.menu">
|
||||
<field
|
||||
name="group_ids"
|
||||
eval="[(6, 0, [ref('mvd_tcg_base.mvd_tcg_base_group_manager'), ref('base.group_system')])]"
|
||||
/>
|
||||
</record>
|
||||
|
||||
<record id="mvd_tcg_cards_menu" model="ir.ui.menu">
|
||||
<field
|
||||
name="group_ids"
|
||||
eval="[(6, 0, [ref('mvd_tcg_base.mvd_tcg_base_group_manager'), ref('base.group_system')])]"
|
||||
/>
|
||||
</record>
|
||||
|
||||
<record id="mvd_tcg_games_menu" model="ir.ui.menu">
|
||||
<field
|
||||
name="group_ids"
|
||||
eval="[(6, 0, [ref('mvd_tcg_base.mvd_tcg_base_group_manager'), ref('base.group_system')])]"
|
||||
/>
|
||||
</record>
|
||||
|
||||
<record id="mvd_tcg_settings_menu" model="ir.ui.menu">
|
||||
<field
|
||||
name="group_ids"
|
||||
eval="[(6, 0, [ref('mvd_tcg_base.mvd_tcg_base_group_administrator'), ref('base.group_system')])]"
|
||||
/>
|
||||
</record>
|
||||
</odoo>
|
||||
200
views/mvd_tcg_card_views.xml
Normal file
200
views/mvd_tcg_card_views.xml
Normal file
@@ -0,0 +1,200 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="mvd_tcg_card_view_search" model="ir.ui.view">
|
||||
<field name="name">mvd.tcg.card.view.search</field>
|
||||
<field name="model">mvd.tcg.card</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Cards">
|
||||
<field
|
||||
name="name"
|
||||
string="Card"
|
||||
filter_domain="[('name', 'ilike', self)]"
|
||||
/>
|
||||
<field name="game_id"/>
|
||||
<field name="external_ref" groups="mvd_tcg_base.mvd_tcg_base_group_administrator,base.group_system"/>
|
||||
<field name="state"/>
|
||||
<separator/>
|
||||
<filter name="draft" string="Draft" domain="[('state', '=', 'draft')]"/>
|
||||
<filter name="validated" string="Validated" domain="[('state', '=', 'validated')]"/>
|
||||
<filter name="inactive" string="Archived" domain="[('active', '=', False)]"/>
|
||||
<group>
|
||||
<filter
|
||||
name="group_by_game_id"
|
||||
string="Game"
|
||||
context="{'group_by': 'game_id'}"
|
||||
/>
|
||||
<filter
|
||||
name="group_by_state"
|
||||
string="State"
|
||||
context="{'group_by': 'state'}"
|
||||
/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mvd_tcg_card_view_list" model="ir.ui.view">
|
||||
<field name="name">mvd.tcg.card.view.list</field>
|
||||
<field name="model">mvd.tcg.card</field>
|
||||
<field name="arch" type="xml">
|
||||
<list string="Cards" sample="1" default_order="game_id, sequence, name, id">
|
||||
<field name="sequence" widget="handle"/>
|
||||
<field name="name"/>
|
||||
<field name="game_id" optional="show"/>
|
||||
<field name="state" widget="badge" optional="show"/>
|
||||
<field name="active" column_invisible="True"/>
|
||||
</list>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mvd_tcg_card_view_kanban" model="ir.ui.view">
|
||||
<field name="name">mvd.tcg.card.view.kanban</field>
|
||||
<field name="model">mvd.tcg.card</field>
|
||||
<field name="arch" type="xml">
|
||||
<kanban sample="1">
|
||||
<field name="name"/>
|
||||
<field name="game_id"/>
|
||||
<field name="image_128"/>
|
||||
<templates>
|
||||
<t t-name="card" class="flex-row">
|
||||
<main class="pe-2">
|
||||
<div class="mb-1">
|
||||
<div class="mb-0 h5">
|
||||
<field name="name"/>
|
||||
</div>
|
||||
<div class="text-muted">
|
||||
<field name="game_id"/>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
<aside>
|
||||
<field
|
||||
name="image_128"
|
||||
widget="image"
|
||||
alt="Card"
|
||||
options="{'img_class': 'w-100 object-fit-contain'}"
|
||||
invisible="not image_128"
|
||||
/>
|
||||
</aside>
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mvd_tcg_card_view_form" model="ir.ui.view">
|
||||
<field name="name">mvd.tcg.card.view.form</field>
|
||||
<field name="model">mvd.tcg.card</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Card">
|
||||
<header>
|
||||
<button
|
||||
name="action_validate"
|
||||
string="Validate"
|
||||
type="object"
|
||||
class="btn-primary"
|
||||
invisible="state != 'draft'"
|
||||
groups="mvd_tcg_base.mvd_tcg_base_group_manager,base.group_system"
|
||||
/>
|
||||
<button
|
||||
name="action_reset_to_draft"
|
||||
string="Reset to Draft"
|
||||
type="object"
|
||||
invisible="state != 'validated'"
|
||||
groups="mvd_tcg_base.mvd_tcg_base_group_manager,base.group_system"
|
||||
/>
|
||||
<field name="state" widget="statusbar" statusbar_visible="draft,validated"/>
|
||||
</header>
|
||||
<sheet name="card_form" readonly="state == 'validated'">
|
||||
<div class="oe_button_box" name="button_box"/>
|
||||
<widget name="web_ribbon" title="Archived" bg_color="text-bg-danger" invisible="active"/>
|
||||
<field name="id" invisible="1"/>
|
||||
<field name="active" invisible="1"/>
|
||||
<field name="state" invisible="1"/>
|
||||
<field
|
||||
name="image_1920"
|
||||
widget="image"
|
||||
class="oe_avatar"
|
||||
options="{'convert_to_webp': True, 'preview_image': 'image_128'}"
|
||||
readonly="state == 'validated'"
|
||||
/>
|
||||
<div class="oe_title">
|
||||
<label for="name" string="Card"/>
|
||||
<h1>
|
||||
<field
|
||||
class="text-break"
|
||||
name="name"
|
||||
widget="text"
|
||||
options="{'line_breaks': False}"
|
||||
placeholder="e.g. Black Lotus"
|
||||
readonly="state == 'validated'"
|
||||
/>
|
||||
</h1>
|
||||
<div class="text-muted fs-6">
|
||||
<field name="game_id" readonly="state == 'validated'"/>
|
||||
</div>
|
||||
</div>
|
||||
<notebook>
|
||||
<page string="General Information" name="general_information">
|
||||
<group readonly="state == 'validated'">
|
||||
<group name="group_identity">
|
||||
<field name="game_id"/>
|
||||
</group>
|
||||
<group name="group_management">
|
||||
<field name="sequence" groups="mvd_tcg_base.mvd_tcg_base_group_manager,base.group_system"/>
|
||||
</group>
|
||||
</group>
|
||||
<group string="Description" name="description_group">
|
||||
<field
|
||||
colspan="2"
|
||||
name="description"
|
||||
widget="html"
|
||||
nolabel="1"
|
||||
placeholder="Add a shared card reference description."
|
||||
/>
|
||||
</group>
|
||||
</page>
|
||||
<page
|
||||
string="Internal Notes"
|
||||
name="internal_notes"
|
||||
groups="mvd_tcg_base.mvd_tcg_base_group_manager,base.group_system"
|
||||
>
|
||||
<field
|
||||
name="note"
|
||||
placeholder="Add internal neutral notes for this card reference."
|
||||
readonly="state == 'validated'"
|
||||
/>
|
||||
</page>
|
||||
<page string="Technical" name="technical_information" groups="mvd_tcg_base.mvd_tcg_base_group_administrator,base.group_system">
|
||||
<group readonly="1">
|
||||
<group>
|
||||
<field name="external_ref"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="sequence"/>
|
||||
</group>
|
||||
</group>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mvd_tcg_card_action" model="ir.actions.act_window">
|
||||
<field name="name">Cards</field>
|
||||
<field name="res_model">mvd.tcg.card</field>
|
||||
<field name="view_mode">kanban,list,form</field>
|
||||
<field name="view_id" ref="mvd_tcg_base.mvd_tcg_card_view_kanban"/>
|
||||
<field name="search_view_id" ref="mvd_tcg_base.mvd_tcg_card_view_search"/>
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
Create a new card reference
|
||||
</p>
|
||||
<p>
|
||||
Card references in the base module stay game-neutral and can be
|
||||
enriched later by game-specific adapters such as MTG.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
||||
143
views/mvd_tcg_game_views.xml
Normal file
143
views/mvd_tcg_game_views.xml
Normal file
@@ -0,0 +1,143 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="mvd_tcg_game_view_search" model="ir.ui.view">
|
||||
<field name="name">mvd.tcg.game.view.search</field>
|
||||
<field name="model">mvd.tcg.game</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Games">
|
||||
<field name="name"/>
|
||||
<field
|
||||
name="code"
|
||||
groups="mvd_tcg_base.mvd_tcg_base_group_administrator,base.group_system"
|
||||
/>
|
||||
<separator/>
|
||||
<filter name="inactive" string="Archived" domain="[('active', '=', False)]"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mvd_tcg_game_view_list" model="ir.ui.view">
|
||||
<field name="name">mvd.tcg.game.view.list</field>
|
||||
<field name="model">mvd.tcg.game</field>
|
||||
<field name="arch" type="xml">
|
||||
<list string="Games" sample="1" multi_edit="1" default_order="sequence, name, id">
|
||||
<field name="sequence" widget="handle"/>
|
||||
<field name="name"/>
|
||||
<field
|
||||
name="code"
|
||||
optional="show"
|
||||
groups="mvd_tcg_base.mvd_tcg_base_group_administrator,base.group_system"
|
||||
/>
|
||||
<field name="card_count"/>
|
||||
<field name="active" column_invisible="True"/>
|
||||
</list>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mvd_tcg_game_view_kanban" model="ir.ui.view">
|
||||
<field name="name">mvd.tcg.game.view.kanban</field>
|
||||
<field name="model">mvd.tcg.game</field>
|
||||
<field name="arch" type="xml">
|
||||
<kanban sample="1">
|
||||
<field name="name"/>
|
||||
<field name="card_count"/>
|
||||
<templates>
|
||||
<t t-name="card">
|
||||
<main>
|
||||
<div class="mb-1">
|
||||
<div class="mb-0 h5">
|
||||
<field name="name"/>
|
||||
</div>
|
||||
</div>
|
||||
<span>
|
||||
<field name="card_count"/> Cards
|
||||
</span>
|
||||
</main>
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mvd_tcg_game_view_form" model="ir.ui.view">
|
||||
<field name="name">mvd.tcg.game.view.form</field>
|
||||
<field name="model">mvd.tcg.game</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Game">
|
||||
<sheet name="game_form">
|
||||
<div class="oe_button_box" name="button_box">
|
||||
<button
|
||||
name="action_open_cards"
|
||||
type="object"
|
||||
string="Cards"
|
||||
class="oe_stat_button"
|
||||
icon="fa-clone"
|
||||
>
|
||||
<field name="card_count" widget="statinfo"/>
|
||||
</button>
|
||||
</div>
|
||||
<widget name="web_ribbon" title="Archived" bg_color="text-bg-danger" invisible="active"/>
|
||||
<field name="active" invisible="1"/>
|
||||
<div class="oe_title">
|
||||
<label for="name" string="Game"/>
|
||||
<h1>
|
||||
<field
|
||||
class="text-break"
|
||||
name="name"
|
||||
widget="text"
|
||||
options="{'line_breaks': False}"
|
||||
placeholder="e.g. Magic: The Gathering"
|
||||
/>
|
||||
</h1>
|
||||
</div>
|
||||
<notebook>
|
||||
<page string="General Information" name="general_information">
|
||||
<group>
|
||||
<group name="group_identity">
|
||||
<field name="sequence"/>
|
||||
</group>
|
||||
<group name="group_management">
|
||||
<field name="card_count" readonly="1"/>
|
||||
</group>
|
||||
</group>
|
||||
<group string="Description" name="description_group">
|
||||
<field
|
||||
colspan="2"
|
||||
name="description"
|
||||
placeholder="Describe the supported game system."
|
||||
nolabel="1"
|
||||
/>
|
||||
</group>
|
||||
</page>
|
||||
<page
|
||||
string="Technical"
|
||||
name="technical_information"
|
||||
groups="mvd_tcg_base.mvd_tcg_base_group_administrator,base.group_system"
|
||||
>
|
||||
<group>
|
||||
<field name="code"/>
|
||||
</group>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mvd_tcg_game_action" model="ir.actions.act_window">
|
||||
<field name="name">Games</field>
|
||||
<field name="res_model">mvd.tcg.game</field>
|
||||
<field name="view_mode">kanban,list,form</field>
|
||||
<field name="view_id" ref="mvd_tcg_base.mvd_tcg_game_view_kanban"/>
|
||||
<field name="search_view_id" ref="mvd_tcg_base.mvd_tcg_game_view_search"/>
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
Register a supported trading card game
|
||||
</p>
|
||||
<p>
|
||||
Games define the neutral root taxonomy that later adapters and
|
||||
commerce modules can build on.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
||||
65
views/res_config_settings_views.xml
Normal file
65
views/res_config_settings_views.xml
Normal file
@@ -0,0 +1,65 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="mvd_tcg_res_config_settings_view_form" model="ir.ui.view">
|
||||
<field name="name">res.config.settings.view.form.inherit.mvd.tcg</field>
|
||||
<field name="model">res.config.settings</field>
|
||||
<field name="inherit_id" ref="base_setup.res_config_settings_view_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//form" position="inside">
|
||||
<app
|
||||
string="TCG"
|
||||
data-string="TCG"
|
||||
name="mvd_tcg"
|
||||
logo="/mvd_tcg_base/static/description/icon.png"
|
||||
groups="mvd_tcg_base.mvd_tcg_base_group_administrator,base.group_system"
|
||||
>
|
||||
<block title="Overview" name="mvd_tcg_overview">
|
||||
<setting
|
||||
id="mvd_tcg_overview_setting"
|
||||
string="Suite Configuration"
|
||||
help="Connector and AI defaults for the MVD TCG suite."
|
||||
>
|
||||
<div class="text-muted">
|
||||
Configure connector and analysis defaults here. Technical integration
|
||||
details stay in settings instead of user-facing data forms.
|
||||
</div>
|
||||
<div class="mt-3">
|
||||
<ul class="list-unstyled mb-0">
|
||||
<li>
|
||||
<strong>Scryfall Connector</strong>:
|
||||
import defaults and API behavior for MTG reference sync.
|
||||
</li>
|
||||
<li>
|
||||
<strong>OpenAI Analysis</strong>:
|
||||
model and batching defaults for deck analysis, role tagging,
|
||||
alternatives, and deck fill.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</setting>
|
||||
</block>
|
||||
<block title="Uploads" name="mvd_tcg_uploads">
|
||||
<setting
|
||||
id="mvd_tcg_max_file_upload_size_mb_setting"
|
||||
string="Maximum File Upload Size"
|
||||
help="Controls the file size limit exposed to the Odoo web client for TCG-related uploads and imports."
|
||||
>
|
||||
<field name="mvd_tcg_max_file_upload_size_mb"/>
|
||||
<div class="text-muted mt-2">
|
||||
Increase this value if large CSV, XLSX, ZIP, or image archives should be uploaded through the browser.
|
||||
</div>
|
||||
</setting>
|
||||
</block>
|
||||
</app>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mvd_tcg_action_configuration" model="ir.actions.act_window">
|
||||
<field name="name">TCG Settings</field>
|
||||
<field name="res_model">res.config.settings</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">current</field>
|
||||
<field name="context">{'module': 'mvd_tcg', 'bin_size': False}</field>
|
||||
</record>
|
||||
</odoo>
|
||||
Reference in New Issue
Block a user