馃捇 Ejercicios Pr谩cticos
Completa el c贸digo y comprueba tu respuesta
En un modelo de Pedido, necesitas crear un campo que relacione cada pedido con un cliente (modelo res.partner). El campo debe ser obligatorio.
from odoo import models, fields class Pedido(models.Model): _name = 'mi.pedido' _description = 'Pedido de cliente' name = fields.Char('Referencia', required=True) fecha = fields.Date('Fecha') # TODO: Completa el campo cliente_id (Many2one a res.partner, obligatorio)cliente_id = _____
En un modelo de Autor, crea un campo que muestre todos los libros escritos por ese autor. El modelo de libros es biblioteca.libro y tiene un campo autor_id que referencia al autor.
from odoo import models, fields class Autor(models.Model): _name = 'biblioteca.autor' _description = 'Autor de libros' name = fields.Char('Nombre', required=True) nacionalidad = fields.Char('Nacionalidad') # TODO: Completa el campo libro_ids (One2many a biblioteca.libro)libro_ids = _____
En un modelo de Libro, necesitas un campo para asignar m煤ltiples categor铆as. El modelo de categor铆as es biblioteca.categoria.
from odoo import models, fields class Libro(models.Model): _name = 'biblioteca.libro' _description = 'Libro de biblioteca' name = fields.Char('T铆tulo', required=True) isbn = fields.Char('ISBN') # TODO: Completa el campo categoria_ids (Many2many a biblioteca.categoria)categoria_ids = _____
En un modelo de L铆nea de Pedido, crea un campo que relacione con el pedido principal (mi.pedido). Si se borra el pedido, las l铆neas tambi茅n deben borrarse.
from odoo import models, fields class LineaPedido(models.Model): _name = 'mi.pedido.linea' _description = 'L铆nea de pedido' producto = fields.Char('Producto') cantidad = fields.Integer('Cantidad') precio = fields.Float('Precio') # TODO: Completa pedido_id (Many2one a mi.pedido, con cascade)pedido_id = _____
Crea un campo total que calcule autom谩ticamente cantidad 脳 precio_unitario.
from odoo import models, fields, api class LineaPedido(models.Model): _name = 'mi.pedido.linea' cantidad = fields.Integer('Cantidad') precio_unitario = fields.Float('Precio Unitario') total = fields.Float('Total', compute='_compute_total') # TODO: Completa el m茅todo _compute_total@api.depends(_____) def _compute_total(self): for record in self: record.total = _____
En un pedido con l铆neas, calcula el total_pedido sumando los totales de todas las l铆neas (linea_ids.total).
from odoo import models, fields, api class Pedido(models.Model): _name = 'mi.pedido' linea_ids = fields.One2many('mi.pedido.linea', 'pedido_id') total_pedido = fields.Float('Total Pedido', compute='_compute_total_pedido') # TODO: Completa el m茅todo@api.depends(_____) def _compute_total_pedido(self): for record in self: record.total_pedido = _____
Crea un campo nombre_completo que concatene nombre y apellido, y que se guarde en la base de datos.
from odoo import models, fields, api class Empleado(models.Model): _name = 'mi.empleado' nombre = fields.Char('Nombre') apellido = fields.Char('Apellido') # TODO: Completa el campo y m茅todonombre_completo = fields.Char('Nombre Completo', compute='_compute_nombre_completo', _____) @api.depends(_____) def _compute_nombre_completo(self): for record in self: record.nombre_completo = _____
Crea una validaci贸n que impida que el precio sea negativo. Debe lanzar un ValidationError.
from odoo import models, fields, api from odoo.exceptions import ValidationError class Producto(models.Model): _name = 'mi.producto' name = fields.Char('Nombre') precio = fields.Float('Precio') # TODO: Completa el constraint@api.constrains(_____) def _check_precio(self): for record in self: if _____: raise ValidationError(_____)
A帽ade una restricci贸n SQL para que el campo codigo sea 煤nico.
from odoo import models, fields class Producto(models.Model): _name = 'mi.producto' name = fields.Char('Nombre') codigo = fields.Char('C贸digo') # TODO: Completa el _sql_constraints_sql_constraints = [ (_____, _____, _____) ]
A帽ade una restricci贸n SQL para que el stock no pueda ser negativo.
from odoo import models, fields class Producto(models.Model): _name = 'mi.producto' name = fields.Char('Nombre') stock = fields.Integer('Stock') # TODO: Completa el _sql_constraints_sql_constraints = [ (_____, _____, _____) ]
Completa la vista formulario para el modelo mi.producto con los campos name, codigo y precio.
<record id="view_producto_form" model="ir.ui.view"> <field name="name">producto.form</field> <field name="model">mi.producto</field> <field name="arch" type="xml"> <form string="Producto"> <sheet> <group><!-- TODO: A帽ade los campos name, codigo y precio --> _____ _____ _____</group> </sheet> </form> </field> </record>
Completa la vista formulario organizando los campos en dos grupos: uno con t铆tulo "Informaci贸n" (name, codigo) y otro con t铆tulo "Datos" (precio, stock).
<form string="Producto"> <sheet> <group><!-- TODO: Grupo "Informaci贸n" con name y codigo --> _____ <!-- TODO: Grupo "Datos" con precio y stock --> _____</group> </sheet> </form>
Completa la vista tree (lista) para mostrar los productos con los campos name, codigo, precio y stock.
<record id="view_producto_tree" model="ir.ui.view"> <field name="name">producto.tree</field> <field name="model">mi.producto</field> <field name="arch" type="xml"><!-- TODO: Completa el tree con los 4 campos --> <tree string="Productos"> _____ </tree></field> </record>
Completa la vista kanban para tareas. Debe mostrar el nombre de la tarea en negrita y el responsable debajo.
<kanban> <field name="name"/> <field name="responsable_id"/> <templates> <t t-name="kanban-box"> <div class="oe_kanban_global_click"><!-- TODO: Nombre en negrita y responsable --> _____ _____</div> </t> </templates> </kanban>
Completa la etiqueta kanban para que agrupe las tarjetas por el campo estado por defecto.
<record id="view_tarea_kanban" model="ir.ui.view"> <field name="name">tarea.kanban</field> <field name="model">mi.tarea</field> <field name="arch" type="xml"><!-- TODO: A帽ade el atributo para agrupar por estado --> <kanban _____><field name="name"/> <field name="estado"/> ... </kanban> </field> </record>
Completa la vista calendar para eventos. El campo de fecha inicio es fecha_inicio y el de fin es fecha_fin.
<record id="view_evento_calendar" model="ir.ui.view"> <field name="name">evento.calendar</field> <field name="model">mi.evento</field> <field name="arch" type="xml"><!-- TODO: Completa los atributos del calendar --> <calendar string="Eventos" _____ _____> <field name="name"/> </calendar></field> </record>
Completa la vista calendar para que los eventos se coloreen seg煤n el campo tipo_id.
<record id="view_evento_calendar" model="ir.ui.view"> <field name="name">evento.calendar</field> <field name="model">mi.evento</field> <field name="arch" type="xml"><!-- TODO: A帽ade el atributo color --> <calendar string="Eventos" date_start="fecha" _____> <field name="name"/> </calendar></field> </record>
Completa la l铆nea del archivo ir.model.access.csv para dar permisos de lectura, escritura y creaci贸n (pero NO borrado) al grupo base.group_user sobre el modelo mi.producto.
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink_____ (completa toda la l铆nea)
Completa la l铆nea para dar permisos COMPLETOS (lectura, escritura, creaci贸n y borrado) al grupo de administradores (base.group_system) sobre el modelo biblioteca.libro.
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink_____ (completa toda la l铆nea)
Completa el manifest para un m贸dulo llamado "Mi Biblioteca" que depende del m贸dulo base y carga los archivos de seguridad y vistas.
{'name': _____, 'version': '1.0', 'depends': _____, 'data': [ _____, _____, ],'installable': True, 'application': True, }