Backend improvements: views, fields_get, session, RPC stubs

- Improved auto-generated list/form/search views with priority fields,
  two-column form layout, statusbar widget, notebook for O2M fields
- Enhanced fields_get with currency_field, compute, related metadata
- Fixed session handling: handleSessionInfo/handleSessionCheck use real
  session from cookie instead of hardcoded values
- Added read_progress_bar and activity_format RPC stubs
- Improved bootstrap translations with lang_parameters
- Added "contacts" to session modules list

Server starts successfully: 14 modules, 93 models, 378 XML templates,
503 JS modules transpiled — all from local frontend/ directory.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Marc
2026-03-31 23:16:26 +02:00
parent 8741282322
commit 9c444061fd
32 changed files with 3416 additions and 148 deletions

View File

@@ -1,6 +1,9 @@
package models
import "odoo-go/pkg/orm"
import (
"fmt"
"odoo-go/pkg/orm"
)
// initProjectProject registers the project.project model.
// Mirrors: odoo/addons/project/models/project_project.py
@@ -34,12 +37,12 @@ func initProjectProject() {
// initProjectTask registers the project.task model.
// Mirrors: odoo/addons/project/models/project_task.py
func initProjectTask() {
m := orm.NewModel("project.task", orm.ModelOpts{
task := orm.NewModel("project.task", orm.ModelOpts{
Description: "Task",
Order: "priority desc, sequence, id desc",
})
m.AddFields(
task.AddFields(
orm.Char("name", orm.FieldOpts{String: "Title", Required: true, Index: true}),
orm.HTML("description", orm.FieldOpts{String: "Description"}),
orm.Boolean("active", orm.FieldOpts{String: "Active", Default: true}),
@@ -75,6 +78,48 @@ func initProjectTask() {
{Value: "line_note", Label: "Note"},
}, orm.FieldOpts{String: "Display Type"}),
)
// DefaultGet: set company_id from session
task.DefaultGet = func(env *orm.Environment, fields []string) orm.Values {
vals := make(orm.Values)
if env.CompanyID() > 0 {
vals["company_id"] = env.CompanyID()
}
return vals
}
// action_done: mark task as done
task.RegisterMethod("action_done", func(rs *orm.Recordset, args ...interface{}) (interface{}, error) {
env := rs.Env()
for _, id := range rs.IDs() {
env.Tx().Exec(env.Ctx(),
`UPDATE project_task SET state = 'done' WHERE id = $1`, id)
}
return true, nil
})
// action_cancel: mark task as cancelled
task.RegisterMethod("action_cancel", func(rs *orm.Recordset, args ...interface{}) (interface{}, error) {
env := rs.Env()
for _, id := range rs.IDs() {
env.Tx().Exec(env.Ctx(),
`UPDATE project_task SET state = 'cancel' WHERE id = $1`, id)
}
return true, nil
})
// action_reopen: reopen a cancelled/done task
task.RegisterMethod("action_reopen", func(rs *orm.Recordset, args ...interface{}) (interface{}, error) {
env := rs.Env()
for _, id := range rs.IDs() {
env.Tx().Exec(env.Ctx(),
`UPDATE project_task SET state = 'open' WHERE id = $1`, id)
}
return true, nil
})
// Ensure fmt is used
_ = fmt.Sprintf
}
// initProjectTaskType registers the project.task.type model (stages).