chore: replace README and refactor manifest

Re-order manifest view declarations for consistency.
Simplify redundant field decorations in generation log tree view.
This commit is contained in:
Nicholas Riegel 2026-05-29 21:55:16 -04:00
parent 087c21a860
commit 392e56ded8
3 changed files with 36 additions and 180 deletions

209
README.md
View file

@ -1,193 +1,52 @@
# ITSulu Blog Publisher
# Gitlab component template
AI-powered blog post generation for Odoo with multi-LLM support, scheduling, and social media integration.
<!--
Update this readme with your component details. Replace content in `< >` with your project information.
For more information:
## Overview
- How to create a CI/CD component: https://docs.gitlab.com/ee/ci/components/#write-a-component
- How to write a clear README.md file: https://docs.gitlab.com/ee/ci/components/#write-a-clear-readmemd
- CI/CD Component security best practices: https://docs.gitlab.com/ee/ci/components/#cicd-component-security-best-practices
-->
ITSulu Blog Publisher replaces fragile external blog-generation workflows with a fully server-side Odoo addon. Generate blog posts on-demand or on a schedule using Claude (Anthropic), OpenAI, Google Gemini, or Ollama. Posts are auto-populated with SEO metadata and social media copy, ready to publish.
<!-- Uncomment and update the following link to display a release badge: https://docs.gitlab.com/ee/user/project/badges.html#latest-release-badges -->
<!-- [![Latest Release](https://gitlab.com/<your project path>/-/badges/release.svg)](https://gitlab.com/<your project path>/-/releases) -->
## Features
## Components
- **Multi-LLM Support**: Anthropic Claude, OpenAI GPT, Google Gemini, Ollama / Open WebUI
- **Three Configurable Daily Slots**: morning, afternoon, evening — each with independent LLM provider + model selection
- **On-Demand & Scheduled Generation**: Backend wizard + website toolbar button + hourly cron dispatcher
- **Topic Queue**: Priority-ranked topic suggestions from ITSulu/company services
- **Single Structured-JSON LLM Call**: Lowest possible token usage — one API call returns title, body, SEO fields, tags, and social copy
- **Auto-Populated SEO**: meta title, description, keywords, tags
- **Social Media Copy**: X/Twitter (A+B), BlueSky (A+B), Mastodon, LinkedIn — platform-specific length limits
- **Notification Email**: Matches ITSulu Insights template format with social copy and source citations
- **Generation Log**: Full audit trail with token usage, duration, error messages, and retry button
- **Editable Prompt Templates**: System and user prompts in Settings UI
### `<Component-name>`
## Requirements
Use this component to `<component-description>`.
### Odoo Version
- **Target**: Odoo 17.0 Community (development branch)
- **Planned**: Odoo 14.0 Community (separate branch for App Store)
To add this component to your CI/CD pipeline, add the following include entry to your
project's CI/CD configuration:
### Python Dependencies
- `requests` (included in Odoo)
- `anthropic` (for Anthropic Claude) — optional
- `openai` (for OpenAI) — optional
- `google-generativeai` (for Gemini) — optional
- Ollama uses OpenAI-compatible REST API (no SDK needed)
### Odoo Module Dependencies
- `base`
- `website`
- `website_blog`
- `mail`
- `base_setup`
## Installation
### From Source (Development)
```bash
# Clone the addon
git clone https://github.com/itsulu/itsulu-blog-publisher.git
cd itsulu-blog-publisher
# Copy addon into your Odoo addons path
cp -r addons/itsulu_blog_publisher /path/to/odoo/addons/
# Install via Odoo UI: Apps > Search "Blog Publisher" > Install
```yaml
include:
- component: https://gitlab.com/<your project path>/<name of your template>@<tag>
```
### Docker (Testing)
Where `<tag>` is the release tag you want to use ([releases list](https://gitlab.com/<your-project-path>/-/releases)).
```bash
docker build -t itsulu-blog-publisher:latest .
docker run -p 8069:8069 itsulu-blog-publisher:latest
```
## Inputs
## Configuration
The template contains some optional [inputs](https://docs.gitlab.com/ee/ci/yaml/inputs.html):
1. **Enable the addon**: Apps > Search "Blog Publisher" > Install
2. **Settings**: Go to Blog Publisher > Settings
- Set API keys for your LLM provider(s)
- Configure default LLM provider and model
- Set notification email recipients
- (Optional) Edit system and user prompt templates
3. **Create a blog**: Website > Blogs (if not already created)
4. **Schedule slots**: Blog Publisher > Schedule Slots
- Create or edit morning/afternoon/evening slots
- Select target blog, LLM provider + model, auto-publish
5. **Activate scheduling**: Set `active=True` on desired slots + enable the cron in Settings
<!-- Add or update rows if you change the inputs in the template -->
## Usage
| Input | Default value | Description |
|------------|------------------|-------------|
| `job_name` | `job-template` | The job name. |
| `image` | `busybox:latest` | The container image to use to run the job. |
| `stage` | `test` | The stage name for the job. |
### Generate On-Demand
1. **From backend**: Blog Publisher > Generate Now (wizard selects topic, LLM, blog, tone)
2. **From website**: Visit your blog frontend, click "Generate Post" button in toolbar
3. **View result**: Blog Publisher > Generation Log (inspect token usage, errors, or publish)
## Documentation
### Topic Queue
- Blog Publisher > Topic Queue
- Create topics with priority (low / normal / high / urgent)
- Scheduler pulls pending topics in priority order
- Mark used/skipped after generation
This project includes a MVC structure to help you get started with [Gitlab CI/CD components](https://docs.gitlab.com/ee/ci/components/).
The template provides the basic file structure to create your own single component.
This project should be public, or one of the jobs in the project's pipeline won't work.
### Scheduled Generation
- Enable the hourly cron: Settings > Blog Publisher > Activate Scheduling
- Each active slot (morning/afternoon/evening) triggers at configured UTC time
- Auto-publishes if `auto_publish=True`, otherwise in draft
## Licence
## Development
### Testing Framework
- **Unit tests**: `pytest-odoo` (TransactionCase)
- **BDD tests**: `pytest-bdd` (Gherkin features)
- **E2E tests**: Playwright (critical user journeys only)
Run tests locally:
```bash
# All tests
pytest addons/itsulu_blog_publisher/tests/ -v
# Single test class
pytest addons/itsulu_blog_publisher/tests/test_llm_router.py::TestLLMRouter -v
# With coverage
pytest addons/itsulu_blog_publisher/tests/ --cov=addons/itsulu_blog_publisher
# BDD features only
pytest addons/itsulu_blog_publisher/features/ -v
```
### Kubernetes CI/CD
The addon includes full Kubernetes test infrastructure:
- Template database priming (Odoo 17 init job)
- Ephemeral test job pods (auto-cleanup)
- PostgreSQL 15 persistent database
- GitLab Container Registry integration
See [kubernetes/itsulu-testing/README.md](kubernetes/itsulu-testing/README.md) for setup details.
## Architecture
See [ARCHITECTURE.md](ARCHITECTURE.md) for:
- Data model specifications
- LLM router design
- Generation orchestration flow
- Settings and notification email format
- CI/CD infrastructure
See [CLAUDE.md](CLAUDE.md) for:
- Odoo testing framework (TDD/BDD)
- Kubernetes test infrastructure gotchas
- Pre-commit hooks
- Failure recovery reference
## Contributing
We follow strict TDD discipline:
1. Write a failing test (show to reviewers)
2. Implement minimum code to pass
3. Refactor; test stays green
4. Run pre-commit hooks before submitting PR
All code contributions must:
- Have > 80% test coverage on new code
- Pass `pre-commit run --all-files`
- Follow PEP 8 (via black, isort, flake8)
- Include descriptive test names (not just "test1, test2")
See [CLAUDE.md](CLAUDE.md) for the complete TDD workflow.
## Roadmap
### Phase 1 (Current)
- ✅ Core generation orchestration
- ✅ Multi-LLM router
- ✅ Blog.post + social media model
- ✅ Schedule slots + cron dispatcher
- ✅ Settings + notification email
- ✅ Kubernetes test infrastructure
- 🔄 BDD/TDD test suite (in progress)
### Phase 2
- Image generation provider (DALL·E, Stable Diffusion)
- Coverage gates (≥80% on new code)
- Multi-language support
- Advanced scheduling (time zones, day-of-week patterns)
### Phase 3
- Playwright E2E journeys
- Performance regression testing
- Nightly smoke testing (CronJob)
- Runboat preview environment integration
## License
This addon is licensed under the LGPL v3.0. See [LICENSE](LICENSE) for details.
## Support
- **Issues**: https://github.com/itsulu/itsulu-blog-publisher/issues
- **Documentation**: See [CLAUDE.md](CLAUDE.md) and [ARCHITECTURE.md](ARCHITECTURE.md)
- **Testing Setup**: See [kubernetes/itsulu-testing/README.md](kubernetes/itsulu-testing/README.md)
## Authors
Built with ❤️ by [ITSulu](https://itsulu.com)
The licence can be changed. By default this project has the [MIT Licence](./LICENCE).
<!-- You should update the year and name in the license file. -->

View file

@ -39,11 +39,11 @@ Features
'security/ir.model.access.csv',
'data/mail_template_data.xml',
'data/ir_cron_data.xml',
'views/generate_now_wizard_views.xml',
'views/blog_topic_views.xml',
'views/blog_schedule_views.xml',
'views/blog_generation_log_views.xml',
'views/blog_post_social_views.xml',
'views/generate_now_wizard_views.xml',
'views/res_config_settings_views.xml',
'views/website_blog_publisher_templates.xml',
'views/menu_views.xml',

View file

@ -14,10 +14,7 @@
decoration-success="state=='success'"
decoration-info="state=='running'">
<field name="create_date" string="Date"/>
<field name="state" widget="badge"
decoration-success="state=='success'"
decoration-danger="state=='error'"
decoration-info="state=='running'"/>
<field name="state" widget="badge"/>
<field name="trigger_source"/>
<field name="schedule_slot" optional="show"/>
<field name="topic_used"/>