馃捇 Ejercicios Pr谩cticos

Completa el c贸digo y comprueba tu respuesta

0/20
Ejercicio 1: Campo Many2one Relacional

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 = _____

                    
Ejercicio 2: Campo One2many Relacional

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 = _____

                    
Ejercicio 3: Campo Many2many Relacional

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 = _____

                    
Ejercicio 4: Many2one con ondelete Relacional

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 = _____

                    
Ejercicio 5: Campo computado simple Computado

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 = _____

                    
Ejercicio 6: Computado con relaci贸n Computado

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 = _____

                    
Ejercicio 7: Computado almacenado Computado

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茅todo
nombre_completo = fields.Char('Nombre Completo', compute='_compute_nombre_completo', _____) @api.depends(_____) def _compute_nombre_completo(self): for record in self: record.nombre_completo = _____

                    
Ejercicio 8: Python Constraint Constraint

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(_____)

                    
Ejercicio 9: SQL Constraint 煤nico Constraint

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 = [ (_____, _____, _____) ]

                    
Ejercicio 10: SQL Constraint CHECK Constraint

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 = [ (_____, _____, _____) ]

                    
Ejercicio 11: Vista Form b谩sica Vista Form

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>

                    
Ejercicio 12: Vista Form con grupos Vista Form

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>

                    
Ejercicio 13: Vista Tree Vista 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>

                    
Ejercicio 14: Vista Kanban b谩sica Vista Kanban

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>

                    
Ejercicio 15: Kanban con agrupaci贸n Vista 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>

                    
Ejercicio 16: Vista Calendar Vista Calendar

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>

                    
Ejercicio 17: Calendar con color Vista Calendar

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>

                    
Ejercicio 18: Permisos CSV Seguridad

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)

                    
Ejercicio 19: Permisos completos Seguridad

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)

                    
Ejercicio 20: Manifest completo Manifest

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, }

                    

馃搳 Tu Progreso

0 Correctos
0 Incorrectos
20 Pendientes