itsulu-blog-publisher/addons/itsulu_blog_publisher/views/blog_topic_views.xml
Nicholas Riegel 6c51b11b27 Implement wizard and complete UI views for Blog Publisher addon
Create wizard package and complete view layer:

Wizard implementation:
- Create wizards/__init__.py with generate_now_wizard import
- Wizard already fully implemented in generate_now_wizard.py
- Update main addon __init__.py to import wizards

Menu structure:
- Create menu_views.xml with main menu and submenu structure
- Organize menus: Generation, Configuration, Output, Settings

View files (split from consolidated views):
- Create blog_schedule_views.xml (schedule slot tree/form/action)
- Create blog_generation_log_views.xml (log tree/form/action with retry)
- Create blog_post_social_views.xml (social copy tree/form/action)
- Create generate_now_wizard_views.xml (wizard form/action)
- Update blog_topic_views.xml to contain only topic views

Features included:
- Schedule slot management with LLM provider/model selection
- Social media platform toggles per schedule
- Generation log viewer with retry capability
- Wizard for on-demand blog generation
- Complete navigation menu structure
- Dark mode and responsive design support

All views ready for Odoo 14+ deployment.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-05-29 12:35:49 -04:00

108 lines
5.2 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- ================================================================
TOPIC QUEUE VIEWS
================================================================ -->
<record id="view_blog_topic_tree" model="ir.ui.view">
<field name="name">itsulu.blog.topic.tree</field>
<field name="model">itsulu.blog.topic</field>
<field name="arch" type="xml">
<tree string="Topic Queue" decoration-muted="state=='used'" decoration-warning="priority=='urgent'">
<field name="sequence" widget="handle"/>
<field name="priority" widget="priority"/>
<field name="name"/>
<field name="blog_id"/>
<field name="state" widget="badge"
decoration-success="state=='pending'"
decoration-info="state=='used'"
decoration-warning="state=='skipped'"/>
<field name="used_date" optional="show"/>
<button name="action_mark_pending" type="object" string="↩ Reset"
attrs="{'invisible': [('state', '=', 'pending')]}"
class="btn-sm btn-secondary"/>
<button name="action_mark_skipped" type="object" string="Skip"
attrs="{'invisible': [('state', '!=', 'pending')]}"
class="btn-sm btn-warning"/>
</tree>
</field>
</record>
<record id="view_blog_topic_form" model="ir.ui.view">
<field name="name">itsulu.blog.topic.form</field>
<field name="model">itsulu.blog.topic</field>
<field name="arch" type="xml">
<form string="Blog Topic">
<header>
<button name="action_mark_pending" type="object" string="Reset to Pending"
attrs="{'invisible': [('state', '=', 'pending')]}"
class="btn-secondary"/>
<button name="action_mark_skipped" type="object" string="Skip"
attrs="{'invisible': [('state', '!=', 'pending')]}"
class="btn-warning"/>
<field name="state" widget="statusbar" statusbar_visible="pending,used"/>
</header>
<sheet>
<group>
<group string="Topic">
<field name="name" placeholder="e.g. How ITSulu Helps SMBs Migrate to the Cloud"/>
<field name="priority" widget="priority"/>
<field name="sequence"/>
<field name="blog_id"/>
<field name="tone"/>
</group>
<group string="Status">
<field name="state"/>
<field name="used_date" readonly="1"/>
<field name="generation_log_id" readonly="1"/>
</group>
</group>
<notebook>
<page string="Notes / Context for LLM">
<field name="notes" placeholder="Additional context: specific services to highlight, recent news, preferred angle, key statistics..."/>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="action_blog_topic_list" model="ir.actions.act_window">
<field name="name">Topic Queue</field>
<field name="res_model">itsulu.blog.topic</field>
<field name="view_mode">tree,form</field>
<field name="context">{'search_default_state_pending': 1}</field>
</record>
<record id="view_blog_topic_search" model="ir.ui.view">
<field name="name">itsulu.blog.topic.search</field>
<field name="model">itsulu.blog.topic</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
<filter name="state_pending" string="Pending" domain="[('state','=','pending')]"/>
<filter name="state_used" string="Used" domain="[('state','=','used')]"/>
<filter name="priority_urgent" string="Urgent" domain="[('priority','=','urgent')]"/>
<group expand="0" string="Group By">
<filter name="group_state" string="State" context="{'group_by': 'state'}"/>
<filter name="group_priority" string="Priority" context="{'group_by': 'priority'}"/>
<filter name="group_blog" string="Blog" context="{'group_by': 'blog_id'}"/>
</group>
</search>
</field>
</record>
<!-- ================================================================
SETTINGS ACTION
================================================================ -->
<record id="action_blog_publisher_settings" model="ir.actions.act_window">
<field name="name">Blog Publisher Settings</field>
<field name="res_model">res.config.settings</field>
<field name="view_mode">form</field>
<field name="target">inline</field>
<field name="context">{'module': 'itsulu_blog_publisher'}</field>
</record>
</odoo>