Server Framework 101 - Solusi 7

 Solusi untuk tutorial https://www.odoo.com/documentation/18.0/developer/tutorials/server_framework_101/08_compute_onchange.html

file estate_property.py

from odoo import api, fields, models
from dateutil.relativedelta import relativedelta

class EstateProperty(models.Model):
    _name = "estate.property"
    _description = "Estate property"

    name = fields.Char('Estate Name', required=True)
    description = fields.Text('Description')
    postcode = fields.Char('Poscode')
    date_availability = fields.Date('Available from', copy=False,
                                    default=lambda self: fields.Date.today() + relativedelta(months=3))
    expected_price = fields.Float('Expected price', required=True)
    selling_price = fields.Float('Selling price', readonly=True, copy=False)
    bedrooms = fields.Integer('Bedrooms', default=2)
    living_area = fields.Integer('Living area (sqm)')
    facades = fields.Integer('Facades')
    garage = fields.Boolean('Garage')
    garden = fields.Boolean('Garden')
    garden_area = fields.Integer('Garden area (sqm)')
    garden_orientation = fields.Selection(
        string='Garden orientation',
        selection=[('north', 'North'),
                   ('south', 'South'),
                   ('east', 'East'),
                   ('west', 'West')])
    active = fields.Boolean('Active', default=True)
    state = fields.Selection(
        string='Status',
        selection=[('new', 'New'),
                   ('offer received', 'Offer Received'),
                   ('offer accepted', 'Offer Accepted'),
                   ('sold', 'Sold'),
                   ('cancelled', 'Cancelled')],
        default='new',
        copy=False)
   
    property_type_id = fields.Many2one('estate.property.type', string="Property Type")
    user_id = fields.Many2one('res.users', string='Salesman', default=lambda self: self.env.user)
    buyer_id = fields.Many2one('res.partner', string="Buyer", copy=False)
    tag_ids = fields.Many2many('estate.property.tag')
    offer_ids = fields.One2many('estate.property.offer', 'property_id', string="Offers")
   
    total_area = fields.Integer('Total area (sqm)', compute="_compute_total_area")
    best_price = fields.Float('Best offer', compute="_compute_best_price")
   
    @api.depends("living_area", "garden_area")
    def _compute_total_area(self):
        for record in self:
            record.total_area = record.living_area + record.garden_area
           
    @api.depends("offer_ids.price")
    def _compute_best_price(self):
        for record in self:
            record.best_price = max(record.offer_ids.mapped("price")) if record.offer_ids else 0.0
           
    @api.onchange("garden")
    def _onchange_garden(self):
        if self.garden:
            self.garden_area = 10
            self.garden_orientation = 'north'
        else:
            self.garden_area = 0
            self.garden_orientation = False


file estate_property_offer.py

from dateutil.relativedelta import relativedelta

from odoo import api, fields, models

class EstatePropertyOffer(models.Model):
    _name = 'estate.property.offer'
    _description = 'Estate property offer'
   
    price = fields.Float('Price', required=True)
    status = fields.Selection(string='Status',
        selection=[
            ('accepted', 'Accepted'),
            ('refused', 'Refused'),
        ],
        copy=False,
        default=False)
    partner_id = fields.Many2one('res.partner', string='Partner', required=True)
    property_id = fields.Many2one('estate.property', string="Property", required=True)
    validity = fields.Integer('Validity (days)', default=7)
    date_deadline = fields.Date('Deadline', compute="_compute_deadline", inverse="_inverse_deadline")
   
    @api.depends("create_date", "validity")
    def _compute_deadline(self):
        for rec in self:
            date = rec.create_date.date() if rec.create_date else fields.date.today()
            rec.date_deadline = date + relativedelta(days=rec.validity)
           
    def _inverse_deadline(self):
        for rec in self:
            date = rec.create_date.date() if rec.create_date else fields.date.today()
            rec.validity = (rec.date_deadline - date).days


file estate_property.xml

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <record id="estate_property_action" model="ir.actions.act_window">
        <field name="name">Estate Property</field>
        <field name="res_model">estate.property</field>
        <field name="view_mode">list,form</field>
    </record>

    <!--search-->
    <record id="estate_property_search" model="ir.ui.view">
        <field name="name">estate.property.search</field>
        <field name="model">estate.property</field>
        <field name="arch" type="xml">
            <search string="Search properties">
                <field name="name" string="Title"/>
                <field name="postcode"/>
                <field name="expected_price"/>
                <field name="bedrooms"/>
                <field name="living_area" string="Living Area (sqm)"/>
                <field name="facades"/>                
                <separator/>
                <filter string="Available" name="avaliable" domain="['|', ('state', '=', 'new'),
                ('state', '=', 'offer received')]"/>
                <group expand="1" string="Group By">
                    <filter string="Postcode" name="postcode" context="{'group_by':'postcode'}"/>
                </group>
            </search>
        </field>
    </record>    

    <!--list view-->
    <record id="estate_property_view_tree" model="ir.ui.view">
        <field name="name">estate.property.tree</field>
        <field name="model">estate.property</field>
        <field name="arch" type="xml">
            <list string="Properties">
                <field name="name" string="Title"/>
                <field name="postcode"/>
                <field name="bedrooms"/>
                <field name="living_area"/>
                <field name="expected_price"/>
                <field name="selling_price"/>
                <field name="date_availability" string="Available from"/>
            </list>
        </field>
    </record>

    <!--form-->
    <record id="estate_property_view_form" model="ir.ui.view">
        <field name="name">estate.property.form</field>
        <field name="model">estate.property</field>
        <field name="arch" type="xml">
            <form>
                <sheet>
                    <h1><field name="name" placeholder="Property Title"/></h1>
                    <field name="tag_ids" widget="many2many_tags"/>
                    <group>
                        <group>
                            <field name="property_type_id"/>
                            <field name="postcode"/>
                            <field name="date_availability" string="Available From"/>
                        </group>
                        <group>
                            <field name="expected_price"/>
                            <field name="best_price"/>
                            <field name="selling_price"/>
                        </group>
                    </group>
                    <notebook>
                        <page string="Description">
                            <group>
                                <field name="description"/>
                                <field name="bedrooms"/>
                                <field name="living_area" string="Living Area (sqm)"/>
                                <field name="facades"/>
                                <field name="garage"/>
                                <field name="garden"/>
                                <field name="garden_area" string="Garden Area (sqm)"/>
                                <field name="garden_orientation"/>
                                <field name="total_area"/>
                            </group>
                        </page>
                        <page string="Offers">
                            <field name="offer_ids"/>
                        </page>                        
                        <page string="Other Info">
                            <group>
                                <field name="user_id"/>
                                <field name="buyer_id"/>
                            </group>
                        </page>                        
                    </notebook>
                </sheet>
            </form>
        </field>
    </record>
</odoo>


file estate_property_offer.xml

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <record id="estate_property_offer_view_form" model="ir.ui.view">
        <field name="name">estate.property.offer.form</field>
        <field name="model">estate.property.offer</field>
        <field name="arch" type="xml">
            <form string="Property Offer">
                <group>
                    <field name="price"/>
                    <field name="partner_id"/>
                    <field name="validity"/>
                    <field name="date_deadline"/>
                </group>
            </form>
        </field>
    </record>

    <record id="estate_property_offer_view_tree" model="ir.ui.view">
        <field name="name">estate.property.offer.tree</field>
        <field name="model">estate.property.offer</field>
        <field name="arch" type="xml">
            <list string="Properties Offers">
                <field name="price" string="Price"/>
                <field name="partner_id" string="Partner"/>
                <field name="status" string="Status"/>
            </list>
        </field>
    </record>

    <record id="estate_property_offer_action" model="ir.actions.act_window">
        <field name="name">Property Offers</field>
        <field name="res_model">estate.property.offer</field>
        <field name="domain">[('property_type_id','=', active_id)]</field>
        <field name="view_mode">tree,form</field>
    </record>
</odoo>




Comments

Popular posts from this blog

Solusi Tutorial Owl Components - Counter

Solusi Tutorial Owl Components - Todo List

Odoo Development Setup menggunakan Windows dan Docker