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,16 +1,19 @@
package models
import "odoo-go/pkg/orm"
import (
"fmt"
"odoo-go/pkg/orm"
)
// initFleetVehicle registers the fleet.vehicle model.
// Mirrors: odoo/addons/fleet/models/fleet_vehicle.py
func initFleetVehicle() {
m := orm.NewModel("fleet.vehicle", orm.ModelOpts{
vehicle := orm.NewModel("fleet.vehicle", orm.ModelOpts{
Description: "Vehicle",
Order: "license_plate asc, name asc",
})
m.AddFields(
vehicle.AddFields(
orm.Char("name", orm.FieldOpts{String: "Name", Compute: "_compute_vehicle_name", Store: true}),
orm.Char("license_plate", orm.FieldOpts{String: "License Plate", Required: true, Index: true}),
orm.Char("vin_sn", orm.FieldOpts{String: "Chassis Number", Help: "Unique vehicle identification number (VIN)"}),
@@ -57,6 +60,42 @@ func initFleetVehicle() {
orm.One2many("log_services", "fleet.vehicle.log.services", "vehicle_id", orm.FieldOpts{String: "Services"}),
orm.Boolean("active", orm.FieldOpts{String: "Active", Default: true}),
)
// action_accept: set vehicle state to active
vehicle.RegisterMethod("action_accept", func(rs *orm.Recordset, args ...interface{}) (interface{}, error) {
env := rs.Env()
for _, id := range rs.IDs() {
// Find or create 'active' state
var stateID int64
env.Tx().QueryRow(env.Ctx(),
`SELECT id FROM fleet_vehicle_state WHERE name = 'Active' LIMIT 1`).Scan(&stateID)
if stateID > 0 {
env.Tx().Exec(env.Ctx(),
`UPDATE fleet_vehicle SET state_id = $1 WHERE id = $2`, stateID, id)
}
}
return true, nil
})
// log_odometer: record an odometer reading
vehicle.RegisterMethod("log_odometer", func(rs *orm.Recordset, args ...interface{}) (interface{}, error) {
env := rs.Env()
if len(args) < 1 {
return nil, fmt.Errorf("fleet: odometer value required")
}
value, ok := args[0].(float64)
if !ok {
return nil, fmt.Errorf("fleet: invalid odometer value")
}
for _, id := range rs.IDs() {
env.Tx().Exec(env.Ctx(),
`INSERT INTO fleet_vehicle_odometer (vehicle_id, value, date) VALUES ($1, $2, NOW())`,
id, value)
env.Tx().Exec(env.Ctx(),
`UPDATE fleet_vehicle SET odometer = $1 WHERE id = $2`, value, id)
}
return true, nil
})
}
// initFleetVehicleModel registers the fleet.vehicle.model model.