Refactor: Move SEO content files to root of module

This commit is contained in:
2026-07-12 07:08:33 +02:00
parent 8e01c7c8ec
commit 45c65e24dd
99 changed files with 0 additions and 3739 deletions
+199
View File
@@ -0,0 +1,199 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!-- Professional Corporate Voice -->
<record id="brand_voice_professional" model="otk.seo.brand.voice">
<field name="name">Professional Corporate</field>
<field name="sequence">10</field>
<field name="is_default">True</field>
<field name="voice_tone">formal</field>
<field name="writing_style">factual</field>
<field name="voice_personality">professional, trustworthy, reliable, authoritative</field>
<field name="brand_description">A professional corporate brand that values expertise, reliability, and trust. We communicate with clarity and purpose, always maintaining a polished and business-appropriate tone.</field>
<field name="target_audience">Business professionals, decision-makers, and corporate clients who value expertise and professionalism.</field>
<field name="preferred_words">excellence
innovative solutions
strategic
optimize
enterprise-grade
proven results
industry-leading
streamlined
efficient
comprehensive</field>
<field name="avoided_words">cheap
basic
simple
just
maybe
kind of
stuff
things
awesome
cool</field>
<field name="custom_instructions">Always maintain a professional tone. Use data and evidence to support claims. Avoid hyperbole and stick to factual statements. Include clear calls-to-action that are business-appropriate.</field>
</record>
<!-- Friendly Startup Voice -->
<record id="brand_voice_friendly" model="otk.seo.brand.voice">
<field name="name">Friendly Startup</field>
<field name="sequence">20</field>
<field name="voice_tone">friendly</field>
<field name="writing_style">conversational</field>
<field name="voice_personality">approachable, innovative, energetic, helpful</field>
<field name="brand_description">A modern startup brand that's approachable and human. We believe in making complex things simple and building genuine connections with our users.</field>
<field name="target_audience">Tech-savvy professionals, early adopters, and small business owners who appreciate innovation and simplicity.</field>
<field name="preferred_words">easy
simple
powerful
love
excited
amazing
game-changer
seamless
intuitive
user-friendly</field>
<field name="avoided_words">synergy
leverage
circle back
low-hanging fruit
move the needle
stakeholder
deliverables
bandwidth
enterprise
legacy</field>
<field name="custom_instructions">Write like you're talking to a friend who's smart but busy. Use contractions freely. Be enthusiastic but genuine. Break up long sentences. Use examples and analogies to explain complex concepts.</field>
</record>
<!-- Technical Expert Voice -->
<record id="brand_voice_technical" model="otk.seo.brand.voice">
<field name="name">Technical Expert</field>
<field name="sequence">30</field>
<field name="voice_tone">authoritative</field>
<field name="writing_style">detailed</field>
<field name="voice_personality">knowledgeable, precise, analytical, educational</field>
<field name="brand_description">A technical authority that provides in-depth, accurate information. We value precision and thoroughness, helping readers understand complex topics with clarity.</field>
<field name="target_audience">Developers, engineers, technical professionals, and anyone seeking detailed, accurate technical information.</field>
<field name="preferred_words">implementation
architecture
scalable
robust
optimize
configure
integrate
deploy
performance
documentation</field>
<field name="avoided_words">magic
automagically
simple (when it's not)
easy (when it's not)
just do
obviously
trivial
basic</field>
<field name="industry_terms">API (Application Programming Interface)
SDK (Software Development Kit)
REST/RESTful
JSON
CI/CD
DevOps</field>
<field name="custom_instructions">Be precise with technical terminology. Include code examples or specifications when relevant. Acknowledge complexity rather than oversimplifying. Provide step-by-step instructions when explaining processes. Always consider edge cases.</field>
</record>
<!-- E-commerce Sales Voice -->
<record id="brand_voice_ecommerce" model="otk.seo.brand.voice">
<field name="name">E-commerce Sales</field>
<field name="sequence">40</field>
<field name="voice_tone">conversational</field>
<field name="writing_style">persuasive</field>
<field name="voice_personality">enthusiastic, helpful, trustworthy, persuasive</field>
<field name="brand_description">An e-commerce brand focused on helping customers find the perfect products. We balance being persuasive with being genuinely helpful, building trust through honest recommendations.</field>
<field name="target_audience">Online shoppers looking for quality products, good value, and a trustworthy shopping experience.</field>
<field name="preferred_words">discover
perfect for
bestselling
premium quality
free shipping
limited time
customer favorite
handpicked
exclusive
save</field>
<field name="avoided_words">cheap
bargain bin
knockoff
discount (overuse)
clearance (overuse)
must buy
you need this
act now</field>
<field name="custom_instructions">Focus on benefits over features. Use social proof (bestseller, customer favorite) naturally. Create urgency without being pushy. Highlight value propositions clearly. Always include relevant product details like materials, dimensions, or care instructions.</field>
</record>
<!-- Educational Informative Voice -->
<record id="brand_voice_educational" model="otk.seo.brand.voice">
<field name="name">Educational Guide</field>
<field name="sequence">50</field>
<field name="voice_tone">educational</field>
<field name="writing_style">detailed</field>
<field name="voice_personality">patient, knowledgeable, encouraging, clear</field>
<field name="brand_description">An educational brand dedicated to helping readers learn and grow. We believe everyone can understand complex topics when they're explained clearly and patiently.</field>
<field name="target_audience">Learners of all levels, from beginners to advanced, who want to understand topics thoroughly and apply their knowledge.</field>
<field name="preferred_words">learn
understand
discover
explore
guide
step-by-step
example
practice
master
fundamentals</field>
<field name="avoided_words">obviously
everyone knows
simply
just
easy (when starting)
basic (dismissively)
dumb
stupid</field>
<field name="custom_instructions">Start with foundational concepts before advancing. Use analogies and real-world examples. Break complex topics into digestible sections. Include practical exercises or examples. Encourage the reader and acknowledge that learning takes time. Define jargon when first introduced.</field>
</record>
<!-- Luxury Premium Voice -->
<record id="brand_voice_luxury" model="otk.seo.brand.voice">
<field name="name">Luxury Premium</field>
<field name="sequence">60</field>
<field name="voice_tone">formal</field>
<field name="writing_style">storytelling</field>
<field name="voice_personality">sophisticated, exclusive, refined, elegant</field>
<field name="brand_description">A luxury brand that embodies sophistication and excellence. Every word should reflect the premium quality and exclusive nature of our offerings, creating an aspirational experience.</field>
<field name="target_audience">Discerning customers who appreciate quality, craftsmanship, and exclusive experiences. They value heritage, attention to detail, and timeless elegance.</field>
<field name="preferred_words">exquisite
artisan
heritage
curated
bespoke
timeless
craftsmanship
exclusive
refined
exceptional</field>
<field name="avoided_words">cheap
affordable
budget
discount
deal
bargain
basic
standard
mass-produced
generic</field>
<field name="custom_instructions">Evoke emotion and aspiration. Focus on craftsmanship, heritage, and the story behind products. Use sensory language to describe experiences. Maintain an air of exclusivity without being pretentious. Quality over quantity in descriptions.</field>
</record>
</data>
</odoo>
+89
View File
@@ -0,0 +1,89 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Cron job to submit pending images for generation -->
<record id="ir_cron_submit_pending_images" model="ir.cron">
<field name="name">SEO Content: Submit Pending Images</field>
<field name="model_id" ref="model_otk_seo_content_image"/>
<field name="state">code</field>
<field name="code">model.cron_submit_pending_images()</field>
<field name="interval_number">1</field>
<field name="interval_type">minutes</field>
<field name="active">True</field>
<field name="priority">10</field>
</record>
<!-- Cron job to poll image generation status -->
<record id="ir_cron_poll_image_status" model="ir.cron">
<field name="name">SEO Content: Poll Image Status</field>
<field name="model_id" ref="model_otk_seo_content_image"/>
<field name="state">code</field>
<field name="code">model.cron_poll_image_status()</field>
<field name="interval_number">1</field>
<field name="interval_type">minutes</field>
<field name="active">True</field>
<field name="priority">5</field>
</record>
<!-- Cron job to poll content generation status (async) -->
<record id="ir_cron_poll_content_status" model="ir.cron">
<field name="name">SEO Content: Poll Content Status</field>
<field name="model_id" ref="model_otk_seo_content"/>
<field name="state">code</field>
<field name="code">model.cron_poll_content_status()</field>
<field name="interval_number">1</field>
<field name="interval_type">minutes</field>
<field name="active">True</field>
<field name="priority">4</field>
</record>
<!-- Cron job to check for stale content and send alerts -->
<record id="ir_cron_check_stale_content" model="ir.cron">
<field name="name">SEO Content: Check Stale Content</field>
<field name="model_id" ref="model_otk_seo_content"/>
<field name="state">code</field>
<field name="code">model.cron_check_stale_content()</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="active">True</field>
<field name="priority">50</field>
<field name="nextcall" eval="(DateTime.now() + timedelta(days=1)).strftime('%Y-%m-%d 06:00:00')"/>
</record>
<!-- Cron job to process batch items asynchronously -->
<record id="ir_cron_process_batch_items" model="ir.cron">
<field name="name">SEO Content: Process Batch Items</field>
<field name="model_id" ref="model_otk_seo_content_batch"/>
<field name="state">code</field>
<field name="code">model.cron_process_batch_items()</field>
<field name="interval_number">1</field>
<field name="interval_type">minutes</field>
<field name="active">True</field>
<field name="priority">15</field>
</record>
<!-- Cron job to process scheduled content ideas -->
<record id="ir_cron_process_scheduled_ideas" model="ir.cron">
<field name="name">SEO Content: Process Scheduled Ideas</field>
<field name="model_id" ref="model_otk_seo_content_idea"/>
<field name="state">code</field>
<field name="code">model.cron_process_scheduled_ideas()</field>
<field name="interval_number">30</field>
<field name="interval_type">minutes</field>
<field name="active">True</field>
<field name="priority">20</field>
</record>
<!-- Cron job to check generating ideas completion -->
<record id="ir_cron_check_generating_ideas" model="ir.cron">
<field name="name">SEO Content: Check Generating Ideas</field>
<field name="model_id" ref="model_otk_seo_content_idea"/>
<field name="state">code</field>
<field name="code">model.cron_check_generating_ideas()</field>
<field name="interval_number">2</field>
<field name="interval_type">minutes</field>
<field name="active">True</field>
<field name="priority">6</field>
</record>
</odoo>
@@ -0,0 +1,8 @@
<odoo>
<data>
<record model="ir.module.category" id="module_category_otoolkit_seo">
<field name="name">O'Toolkit SEO</field>
<field name="sequence">40</field>
</record>
</data>
</odoo>
+254
View File
@@ -0,0 +1,254 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!-- How-To Guide Template -->
<record id="seo_template_how_to" model="otk.seo.template">
<field name="name">How-To Guide</field>
<field name="sequence">10</field>
<field name="content_type">blog_post</field>
<field name="description">Step-by-step instructional content that teaches readers how to accomplish a specific task or goal.</field>
<field name="default_tone">professional</field>
<field name="default_word_count">medium</field>
<field name="include_images">True</field>
<field name="default_image_count">2</field>
<field name="default_image_style">photorealistic</field>
<field name="include_toc">True</field>
<field name="include_faq">False</field>
<field name="include_cta">True</field>
<field name="header_structure">h2_h3</field>
<field name="system_prompt">You are an expert technical writer creating clear, actionable how-to guides.
Write in a helpful, instructive tone. Use numbered steps for processes.
Include practical tips and common pitfalls to avoid.
Make content scannable with clear headers and bullet points.</field>
<field name="content_prompt_template">Write a comprehensive how-to guide about: {topic}
Target keywords: {keywords}
Target word count: {word_count} words
Tone: {tone}
Language: {language}
Structure the content with:
1. Brief introduction explaining what readers will learn
2. Prerequisites or requirements (if applicable)
3. Step-by-step instructions with clear headers
4. Tips and best practices
5. Conclusion with next steps</field>
</record>
<!-- Listicle Template -->
<record id="seo_template_listicle" model="otk.seo.template">
<field name="name">Listicle (Top X...)</field>
<field name="sequence">20</field>
<field name="content_type">blog_post</field>
<field name="description">Numbered list format articles like "Top 10...", "5 Best...", etc. Great for engagement and social sharing.</field>
<field name="default_tone">conversational</field>
<field name="default_word_count">medium</field>
<field name="include_images">True</field>
<field name="default_image_count">1</field>
<field name="default_image_style">digital_art</field>
<field name="include_toc">True</field>
<field name="include_faq">False</field>
<field name="include_cta">True</field>
<field name="header_structure">h2_only</field>
<field name="system_prompt">You are a content creator writing engaging listicle articles.
Make each list item valuable and actionable.
Use engaging headlines for each item.
Include brief explanations for each point.
Keep the tone engaging and easy to read.</field>
<field name="content_prompt_template">Write a listicle article about: {topic}
Target keywords: {keywords}
Target word count: {word_count} words
Tone: {tone}
Language: {language}
Structure:
1. Engaging introduction with a hook
2. Numbered list items (5-10 items) with H2 headers
3. Each item should have a brief explanation (50-100 words)
4. Conclusion summarizing key takeaways</field>
</record>
<!-- Product Comparison Template -->
<record id="seo_template_comparison" model="otk.seo.template">
<field name="name">Product Comparison</field>
<field name="sequence">30</field>
<field name="content_type">blog_post</field>
<field name="description">Side-by-side comparison content for products, services, or solutions.</field>
<field name="default_tone">professional</field>
<field name="default_word_count">long</field>
<field name="include_images">True</field>
<field name="default_image_count">1</field>
<field name="default_image_style">illustration</field>
<field name="include_toc">True</field>
<field name="include_faq">True</field>
<field name="include_cta">True</field>
<field name="header_structure">h2_h3</field>
<field name="system_prompt">You are an expert analyst creating objective product comparisons.
Be balanced and fair in your comparisons.
Include specific features, pros, and cons.
Help readers make informed decisions.
Use tables or structured comparisons where appropriate.</field>
<field name="content_prompt_template">Write a detailed comparison article about: {topic}
Target keywords: {keywords}
Target word count: {word_count} words
Tone: {tone}
Language: {language}
Structure:
1. Introduction explaining the comparison criteria
2. Overview of each option
3. Feature-by-feature comparison
4. Pros and cons for each
5. Recommendation based on different use cases
6. FAQ section addressing common questions</field>
</record>
<!-- Industry News Template -->
<record id="seo_template_news" model="otk.seo.template">
<field name="name">Industry News/Trends</field>
<field name="sequence">40</field>
<field name="content_type">blog_post</field>
<field name="description">Thought leadership content about industry trends, news analysis, and expert insights.</field>
<field name="default_tone">professional</field>
<field name="default_word_count">medium</field>
<field name="include_images">True</field>
<field name="default_image_count">1</field>
<field name="default_image_style">photorealistic</field>
<field name="include_toc">False</field>
<field name="include_faq">False</field>
<field name="include_cta">True</field>
<field name="header_structure">h2_h3</field>
<field name="system_prompt">You are an industry expert writing insightful analysis.
Provide context and expert perspective.
Back up claims with reasoning.
Make content relevant and timely.
Maintain a professional, authoritative tone.</field>
<field name="content_prompt_template">Write an industry analysis/trends article about: {topic}
Target keywords: {keywords}
Target word count: {word_count} words
Tone: {tone}
Language: {language}
Structure:
1. Hook introducing the trend or news
2. Background and context
3. Analysis of implications
4. Expert insights and predictions
5. What this means for the reader
6. Call to action</field>
</record>
<!-- Case Study Template -->
<record id="seo_template_case_study" model="otk.seo.template">
<field name="name">Case Study</field>
<field name="sequence">50</field>
<field name="content_type">blog_post</field>
<field name="description">Success story format showcasing real-world results and implementations.</field>
<field name="default_tone">professional</field>
<field name="default_word_count">long</field>
<field name="include_images">True</field>
<field name="default_image_count">2</field>
<field name="default_image_style">photorealistic</field>
<field name="include_toc">True</field>
<field name="include_faq">False</field>
<field name="include_cta">True</field>
<field name="header_structure">h2_h3</field>
<field name="system_prompt">You are a content writer creating compelling case studies.
Follow the problem-solution-results format.
Include specific metrics and outcomes where possible.
Make the story relatable and inspiring.
Focus on the transformation and value delivered.</field>
<field name="content_prompt_template">Write a case study article about: {topic}
Target keywords: {keywords}
Target word count: {word_count} words
Tone: {tone}
Language: {language}
Structure:
1. Executive summary / Key results
2. The Challenge - What problem needed solving
3. The Solution - How it was addressed
4. Implementation - Steps taken
5. Results - Measurable outcomes
6. Lessons learned
7. Call to action</field>
</record>
<!-- FAQ Article Template -->
<record id="seo_template_faq" model="otk.seo.template">
<field name="name">FAQ Article</field>
<field name="sequence">60</field>
<field name="content_type">blog_post</field>
<field name="description">Question-and-answer format content addressing common queries about a topic.</field>
<field name="default_tone">conversational</field>
<field name="default_word_count">medium</field>
<field name="include_images">False</field>
<field name="default_image_count">0</field>
<field name="default_image_style">illustration</field>
<field name="include_toc">True</field>
<field name="include_faq">False</field>
<field name="include_cta">True</field>
<field name="header_structure">h2_only</field>
<field name="system_prompt">You are a helpful expert answering frequently asked questions.
Address each question thoroughly but concisely.
Use clear, accessible language.
Anticipate follow-up questions.
Make answers actionable where possible.</field>
<field name="content_prompt_template">Write an FAQ article about: {topic}
Target keywords: {keywords}
Target word count: {word_count} words
Tone: {tone}
Language: {language}
Structure:
1. Brief introduction about the topic
2. 8-12 frequently asked questions with detailed answers
3. Each question as an H2 header
4. Answers should be 50-150 words each
5. Conclusion with additional resources or contact info</field>
</record>
<!-- Product Description Template -->
<record id="seo_template_product_desc" model="otk.seo.template">
<field name="name">Product Description</field>
<field name="sequence">70</field>
<field name="content_type">product_desc</field>
<field name="description">Compelling product descriptions that highlight features, benefits, and value propositions.</field>
<field name="default_tone">persuasive</field>
<field name="default_word_count">short</field>
<field name="include_images">False</field>
<field name="default_image_count">0</field>
<field name="default_image_style">photorealistic</field>
<field name="include_toc">False</field>
<field name="include_faq">False</field>
<field name="include_cta">True</field>
<field name="header_structure">h2_only</field>
<field name="system_prompt">You are an expert copywriter creating compelling product descriptions.
Focus on benefits, not just features.
Use sensory and emotional language.
Address customer pain points.
Include a clear call to action.
Make content scannable with bullet points for features.</field>
<field name="content_prompt_template">Write a compelling product description for: {topic}
Product details: {product_name}
Target keywords: {keywords}
Tone: {tone}
Language: {language}
Structure:
1. Attention-grabbing opening line
2. Key benefits (what problems it solves)
3. Main features as bullet points
4. Social proof or trust elements
5. Clear call to action</field>
</record>
</data>
</odoo>
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!-- Translation Config for SEO Content -->
<record id="translation_config_seo_content" model="otk.translation.config">
<field name="model_id" ref="model_otk_seo_content"/>
<field name="active">True</field>
</record>
<!-- Translation Config for SEO Template -->
<record id="translation_config_seo_template" model="otk.translation.config">
<field name="model_id" ref="model_otk_seo_template"/>
<field name="active">True</field>
</record>
<!-- Translation Config for Brand Voice -->
<record id="translation_config_brand_voice" model="otk.translation.config">
<field name="model_id" ref="model_otk_seo_brand_voice"/>
<field name="active">True</field>
</record>
</data>
</odoo>