From f909f52c3d62e236c3b5032d3fcef3c244b27dd0 Mon Sep 17 00:00:00 2001 From: DenisMth Date: Tue, 15 Sep 2026 14:05:13 +0200 Subject: [PATCH 1/4] [ADD] initialized app and db fields up to tutorial chap3 --- estate/__init__.py | 1 + estate/__manifest__.py | 8 ++++++++ estate/models/__init__.py | 1 + estate/models/estate_property.py | 21 +++++++++++++++++++++ 4 files changed, 31 insertions(+) create mode 100644 estate/__init__.py create mode 100644 estate/__manifest__.py create mode 100644 estate/models/__init__.py create mode 100644 estate/models/estate_property.py diff --git a/estate/__init__.py b/estate/__init__.py new file mode 100644 index 00000000000..9a7e03eded3 --- /dev/null +++ b/estate/__init__.py @@ -0,0 +1 @@ +from . import models \ No newline at end of file diff --git a/estate/__manifest__.py b/estate/__manifest__.py new file mode 100644 index 00000000000..ce39a3563e0 --- /dev/null +++ b/estate/__manifest__.py @@ -0,0 +1,8 @@ +{ + 'name': "Real Estate", + 'depends': ['base'], + 'application': True, + 'installable': True, + 'author': "Demat", + 'license': "AGPL-3" +} \ No newline at end of file diff --git a/estate/models/__init__.py b/estate/models/__init__.py new file mode 100644 index 00000000000..f4c8fd6db6d --- /dev/null +++ b/estate/models/__init__.py @@ -0,0 +1 @@ +from . import estate_property \ No newline at end of file diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py new file mode 100644 index 00000000000..063ccccc891 --- /dev/null +++ b/estate/models/estate_property.py @@ -0,0 +1,21 @@ +from odoo import fields, models + +class TestModel(models.Model): + _name = "estate_property_model" + _description = "Estate property model test description" + + name = fields.Char('Estate Property Model Name', required=True) + description = fields.Text("Description of the Estate Propert Model") + postcode = fields.Char("5000") + date_availability = fields.Date("2026-09-15") + expected_price = fields.Float(required=True) + selling_price = fields.Float() + bedrooms = fields.Integer() + living_area = fields.Integer() + facades = fields.Integer() + garage = fields.Boolean() + garden = fields.Boolean() + garden_area = fields.Integer() + garden_orientation = fields.Selection([("north", "North"), ("south", "South"), ("west", "West"), ("east", "East")]) + + \ No newline at end of file From e70a5c1d11a650cccfde8f9e214b00b732e7a0f1 Mon Sep 17 00:00:00 2001 From: DenisMth Date: Wed, 16 Sep 2026 10:22:25 +0200 Subject: [PATCH 2/4] [ADD] Added some UI for the form and list view and experimented with menu depth until chap5 --- estate/__manifest__.py | 7 +++++- estate/models/estate_property.py | 15 +++++++------ estate/models/ir.model.access.csv | 2 ++ estate/views/estate_property_views.xml | 7 ++++++ estate/views/menu_estate_property.xml | 30 ++++++++++++++++++++++++++ 5 files changed, 53 insertions(+), 8 deletions(-) create mode 100644 estate/models/ir.model.access.csv create mode 100644 estate/views/estate_property_views.xml create mode 100644 estate/views/menu_estate_property.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index ce39a3563e0..e2c8d32dcca 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -4,5 +4,10 @@ 'application': True, 'installable': True, 'author': "Demat", - 'license': "AGPL-3" + 'license': "AGPL-3", + 'data': [ + "models/ir.model.access.csv", + "views/estate_property_views.xml", + "views/menu_estate_property.xml", + ] } \ No newline at end of file diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 063ccccc891..135f7894c98 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,21 +1,22 @@ from odoo import fields, models +import datetime class TestModel(models.Model): _name = "estate_property_model" _description = "Estate property model test description" - name = fields.Char('Estate Property Model Name', required=True) + name = fields.Char(default="Unknown", required=True) description = fields.Text("Description of the Estate Propert Model") - postcode = fields.Char("5000") - date_availability = fields.Date("2026-09-15") + postcode = fields.Char("Post code") + date_availability = fields.Date("Availability date", default=datetime.date.today() + datetime.timedelta(days=90), copy=False) expected_price = fields.Float(required=True) - selling_price = fields.Float() - bedrooms = fields.Integer() + selling_price = fields.Float(copy=False, readonly=True) + bedrooms = fields.Integer(default=2) living_area = fields.Integer() facades = fields.Integer() garage = fields.Boolean() garden = fields.Boolean() garden_area = fields.Integer() garden_orientation = fields.Selection([("north", "North"), ("south", "South"), ("west", "West"), ("east", "East")]) - - \ No newline at end of file + active = fields.Boolean(default=True) + state = fields.Selection([("new", "New"), ("offer_received", "Offer Received"), ("offer_accepted", "Offer Accepted"), ("sold", "Sold"), ("cancelled", "Cancelled")], default="new") \ No newline at end of file diff --git a/estate/models/ir.model.access.csv b/estate/models/ir.model.access.csv new file mode 100644 index 00000000000..2d9a241c0e1 --- /dev/null +++ b/estate/models/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink +estate_property_model,estate_property_model,model_estate_property_model,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml new file mode 100644 index 00000000000..ebc03d433cf --- /dev/null +++ b/estate/views/estate_property_views.xml @@ -0,0 +1,7 @@ + + + Test + estate_property_model + list,form + + \ No newline at end of file diff --git a/estate/views/menu_estate_property.xml b/estate/views/menu_estate_property.xml new file mode 100644 index 00000000000..357b6826b76 --- /dev/null +++ b/estate/views/menu_estate_property.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From a2b49482dd4ba4ad5f0db6c0de8a819f05fdb0a1 Mon Sep 17 00:00:00 2001 From: DenisMth Date: Thu, 17 Sep 2026 13:54:31 +0200 Subject: [PATCH 3/4] [ADD] Chap 6 views + Chap7 until many2one --- estate/__init__.py | 2 +- estate/__manifest__.py | 8 ++- estate/models/__init__.py | 3 +- estate/models/estate_property.py | 36 +++++++++-- estate/models/estate_property_type.py | 8 +++ estate/models/ir.model.access.csv | 3 +- estate/views/estate_property_type_views.xml | 8 +++ estate/views/estate_property_views.xml | 7 +- estate/views/form_estate_property.xml | 71 +++++++++++++++++++++ estate/views/list_estate_property.xml | 17 +++++ estate/views/menu_estate_property.xml | 32 ++-------- estate/views/search_estate_property.xml | 25 ++++++++ 12 files changed, 180 insertions(+), 40 deletions(-) create mode 100644 estate/models/estate_property_type.py create mode 100644 estate/views/estate_property_type_views.xml create mode 100644 estate/views/form_estate_property.xml create mode 100644 estate/views/list_estate_property.xml create mode 100644 estate/views/search_estate_property.xml diff --git a/estate/__init__.py b/estate/__init__.py index 9a7e03eded3..0650744f6bc 100644 --- a/estate/__init__.py +++ b/estate/__init__.py @@ -1 +1 @@ -from . import models \ No newline at end of file +from . import models diff --git a/estate/__manifest__.py b/estate/__manifest__.py index e2c8d32dcca..9bf8603185b 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -8,6 +8,10 @@ 'data': [ "models/ir.model.access.csv", "views/estate_property_views.xml", + "views/estate_property_type_views.xml", "views/menu_estate_property.xml", - ] -} \ No newline at end of file + "views/list_estate_property.xml", + "views/form_estate_property.xml", + "views/search_estate_property.xml" + ] +} diff --git a/estate/models/__init__.py b/estate/models/__init__.py index f4c8fd6db6d..40092a2d810 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1,2 @@ -from . import estate_property \ No newline at end of file +from . import estate_property +from . import estate_property_type diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 135f7894c98..2a753d49d2a 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,14 +1,19 @@ from odoo import fields, models import datetime -class TestModel(models.Model): - _name = "estate_property_model" + +class EstateProperty(models.Model): + _name = "estate.property" _description = "Estate property model test description" - name = fields.Char(default="Unknown", required=True) + name = fields.Char(required=True) description = fields.Text("Description of the Estate Propert Model") postcode = fields.Char("Post code") - date_availability = fields.Date("Availability date", default=datetime.date.today() + datetime.timedelta(days=90), copy=False) + date_availability = fields.Date( + "Availability date", + default=lambda self: datetime.date.today() + datetime.timedelta(days=90), + copy=False + ) expected_price = fields.Float(required=True) selling_price = fields.Float(copy=False, readonly=True) bedrooms = fields.Integer(default=2) @@ -17,6 +22,25 @@ class TestModel(models.Model): garage = fields.Boolean() garden = fields.Boolean() garden_area = fields.Integer() - garden_orientation = fields.Selection([("north", "North"), ("south", "South"), ("west", "West"), ("east", "East")]) + garden_orientation = fields.Selection( + selection=[ + ("north", "North"), + ("south", "South"), + ("west", "West"), + ("east", "East") + ] + ) active = fields.Boolean(default=True) - state = fields.Selection([("new", "New"), ("offer_received", "Offer Received"), ("offer_accepted", "Offer Accepted"), ("sold", "Sold"), ("cancelled", "Cancelled")], default="new") \ No newline at end of file + state = fields.Selection( + selection=[ + ("new", "New"), + ("offer_received", "Offer Received"), + ("offer_accepted", "Offer Accepted"), + ("sold", "Sold"), + ("cancelled", "Cancelled") + ], + default="new", + ) + property_type_id = fields.Many2one("estate.property.type", string="Property Type") + buyer_id = fields.Many2one("res.partner", string="Buyer") + salesperson_id = fields.Many2one("res.users", string="Salesperson") diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py new file mode 100644 index 00000000000..20c3a3986dd --- /dev/null +++ b/estate/models/estate_property_type.py @@ -0,0 +1,8 @@ +from odoo import fields, models + + +class EstatePropertyType(models.Model): + _name = "estate.property.type" + _description = "Test property type description" + + name = fields.Char(required=True) diff --git a/estate/models/ir.model.access.csv b/estate/models/ir.model.access.csv index 2d9a241c0e1..ef595fc3a74 100644 --- a/estate/models/ir.model.access.csv +++ b/estate/models/ir.model.access.csv @@ -1,2 +1,3 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink -estate_property_model,estate_property_model,model_estate_property_model,base.group_user,1,1,1,1 \ No newline at end of file +estate_property,estate.property,model_estate_property,base.group_user,1,1,1,1 +estate_property_type,estate.property.type,model_estate_property_type,base.group_user,1,1,1,1 diff --git a/estate/views/estate_property_type_views.xml b/estate/views/estate_property_type_views.xml new file mode 100644 index 00000000000..440cdd3c1d3 --- /dev/null +++ b/estate/views/estate_property_type_views.xml @@ -0,0 +1,8 @@ + + + Test + estate.property.type + list,form + + + diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index ebc03d433cf..53e598044e7 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -1,7 +1,8 @@ - + Test - estate_property_model + estate.property list,form - \ No newline at end of file + + diff --git a/estate/views/form_estate_property.xml b/estate/views/form_estate_property.xml new file mode 100644 index 00000000000..28c0b580e1a --- /dev/null +++ b/estate/views/form_estate_property.xml @@ -0,0 +1,71 @@ + + + estate_property.form + estate.property + +
+ +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
diff --git a/estate/views/list_estate_property.xml b/estate/views/list_estate_property.xml new file mode 100644 index 00000000000..0749abd882f --- /dev/null +++ b/estate/views/list_estate_property.xml @@ -0,0 +1,17 @@ + + + estate_property.list + estate.property + + + + + + + + + + + + + diff --git a/estate/views/menu_estate_property.xml b/estate/views/menu_estate_property.xml index 357b6826b76..c116f7fe765 100644 --- a/estate/views/menu_estate_property.xml +++ b/estate/views/menu_estate_property.xml @@ -1,30 +1,10 @@ - - - + + + - - - - - - - - - - - - - - - - - - - - + + - - - \ No newline at end of file + diff --git a/estate/views/search_estate_property.xml b/estate/views/search_estate_property.xml new file mode 100644 index 00000000000..dd095a0103f --- /dev/null +++ b/estate/views/search_estate_property.xml @@ -0,0 +1,25 @@ + + + estate_property.form + estate.property + + + + + + + + + + + + + + + + + \ No newline at end of file From 11620be5c761d72f7bc9581adae9fc53d19ce079 Mon Sep 17 00:00:00 2001 From: DenisMth Date: Fri, 18 Sep 2026 09:17:35 +0200 Subject: [PATCH 4/4] [ADD] Chap 7 Relations Between Models done --- estate/__manifest__.py | 1 - estate/models/__init__.py | 3 +++ estate/models/estate_property.py | 2 ++ estate/models/estate_property_offer.py | 11 ++++++++ estate/models/estate_property_tag.py | 9 +++++++ estate/models/ir.model.access.csv | 3 +++ estate/views/estate_property_type_views.xml | 8 ------ estate/views/estate_property_views.xml | 16 +++++++++++- estate/views/form_estate_property.xml | 13 ++++++++++ estate/views/form_estate_property_offer.xml | 28 +++++++++++++++++++++ estate/views/list_estate_property_offer.xml | 13 ++++++++++ estate/views/menu_estate_property.xml | 2 ++ 12 files changed, 99 insertions(+), 10 deletions(-) create mode 100644 estate/models/estate_property_offer.py create mode 100644 estate/models/estate_property_tag.py delete mode 100644 estate/views/estate_property_type_views.xml create mode 100644 estate/views/form_estate_property_offer.xml create mode 100644 estate/views/list_estate_property_offer.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 9bf8603185b..c1c3a8eca32 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -8,7 +8,6 @@ 'data': [ "models/ir.model.access.csv", "views/estate_property_views.xml", - "views/estate_property_type_views.xml", "views/menu_estate_property.xml", "views/list_estate_property.xml", "views/form_estate_property.xml", diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 40092a2d810..9752b464357 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1,2 +1,5 @@ from . import estate_property from . import estate_property_type +from . import estate_property_tag +from . import estate_property_offer + diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 2a753d49d2a..e11c63e5922 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -44,3 +44,5 @@ class EstateProperty(models.Model): property_type_id = fields.Many2one("estate.property.type", string="Property Type") buyer_id = fields.Many2one("res.partner", string="Buyer") salesperson_id = fields.Many2one("res.users", string="Salesperson") + tag_ids = fields.Many2many("estate.property.tag", string="Property Tags") + offer_ids = fields.One2many("estate.property.offer", "property_id", string="Property Offers") diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py new file mode 100644 index 00000000000..36dbb5170b6 --- /dev/null +++ b/estate/models/estate_property_offer.py @@ -0,0 +1,11 @@ +from odoo import fields, models + + +class EstatePropertyOffer(models.Model): + _name = "estate.property.offer" + _description = "Estate Property Offer description test" + + price = fields.Float() + status = fields.Selection([("accepted", "Accepted"), ("refused", "Refused")], copy=False) + partner_id = fields.Many2one("res.partner", required=True) + property_id = fields.Many2one("estate.property", required=True) diff --git a/estate/models/estate_property_tag.py b/estate/models/estate_property_tag.py new file mode 100644 index 00000000000..ea8855cb564 --- /dev/null +++ b/estate/models/estate_property_tag.py @@ -0,0 +1,9 @@ +from odoo import fields, models + + +class EstatePropertyTag(models.Model): + _name = "estate.property.tag" + _description = "Estate property tag description" + + name = fields.Char(required=True) + \ No newline at end of file diff --git a/estate/models/ir.model.access.csv b/estate/models/ir.model.access.csv index ef595fc3a74..b73331dce80 100644 --- a/estate/models/ir.model.access.csv +++ b/estate/models/ir.model.access.csv @@ -1,3 +1,6 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink estate_property,estate.property,model_estate_property,base.group_user,1,1,1,1 estate_property_type,estate.property.type,model_estate_property_type,base.group_user,1,1,1,1 +estate_property_tag,estate.property.tag,model_estate_property_tag,base.group_user,1,1,1,1 +estate_property_offer,estate.property.offer,model_estate_property_offer,base.group_user,1,1,1,1 + diff --git a/estate/views/estate_property_type_views.xml b/estate/views/estate_property_type_views.xml deleted file mode 100644 index 440cdd3c1d3..00000000000 --- a/estate/views/estate_property_type_views.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - Test - estate.property.type - list,form - - - diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 53e598044e7..1b9c37cb47b 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -4,5 +4,19 @@ estate.property list,form - + + Test + estate.property.type + list,form + + + Test + estate.property.tag + list,form + + + Test + estate.property.offer + list,form + diff --git a/estate/views/form_estate_property.xml b/estate/views/form_estate_property.xml index 28c0b580e1a..ec0e6f8c10b 100644 --- a/estate/views/form_estate_property.xml +++ b/estate/views/form_estate_property.xml @@ -8,6 +8,9 @@

+ + + @@ -55,6 +58,16 @@ + + + + + + + + + + diff --git a/estate/views/form_estate_property_offer.xml b/estate/views/form_estate_property_offer.xml new file mode 100644 index 00000000000..4b7cad94414 --- /dev/null +++ b/estate/views/form_estate_property_offer.xml @@ -0,0 +1,28 @@ + + + estate_property_offer.form + estate.property.offer + +
+ + + + + + + + + + + + + + + + + + +
+
+
+
diff --git a/estate/views/list_estate_property_offer.xml b/estate/views/list_estate_property_offer.xml new file mode 100644 index 00000000000..3cf5829c758 --- /dev/null +++ b/estate/views/list_estate_property_offer.xml @@ -0,0 +1,13 @@ + + + estate_property_offer.list + estate.property.offer + + + + + + + + + \ No newline at end of file diff --git a/estate/views/menu_estate_property.xml b/estate/views/menu_estate_property.xml index c116f7fe765..6e20eb45088 100644 --- a/estate/views/menu_estate_property.xml +++ b/estate/views/menu_estate_property.xml @@ -5,6 +5,8 @@ + +