Skip to content

Conversation

@SurryaT10
Copy link

Initialized Estate module and created 'estate_property' model.

…nifest.

Created 'estate_property' model and fields.
@robodoo
Copy link

robodoo commented Dec 15, 2025

Pull request status dashboard

@lost-odoo
Copy link

Hello, can you please ensure that your runbot is green 😄

Copy link

@lost-odoo lost-odoo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hello, I already made a small review. Not a big deal but just some nitpicking stuff that we try to avoid. 😄

@lost-odoo
Copy link

Also please don't forget to make one commit per chapter. Try to make a correct title. Don't hesitate to amend or squash your commits.

SurryaT10 added 2 commits December 18, 2025 09:51
Added estate_property_views.xml which contains list and form views

Added a separate estate_property_search_view.xml for search with filters for active and availability as well as group by based on postcode.

Also addressed code review comments.
Added estate.property.type model which specifies the type of property. Eg: House/Apartment

Added estate.property.tag model to indicate the tags(cozy, renovated) for each property

Added estate.property.offer model which indicates the offers for each property.

Also added views for each model mentioned above.
@lost-odoo
Copy link

Hey don't forget to close all the comments I did on the review when you did them 😄
Also please follow the git guidelines. ADD should only be used when you add a new module otherwise use IMP for an improvement.

lost-odoo and others added 2 commits December 18, 2025 10:39
total_area field is based on the size of both garden_area and living_area

best_offer field is based on the max price among the list of offers

Also added validity and deadline for the offers as a computed and inverse function impacting each other.
SurryaT10 added 2 commits December 19, 2025 09:19
Added Sold and Cancel buttons:
When a property is sold it cannot be canceled
When a property is canceled it cannot be sold

Added offer accept and rejected icon button:
When an offer is accepted:
 1. The selling price is automatically updated by button actions
 2. Status changes to 'Offer Accepted'
 3. Rejects all other offers

 Added  an onchange, which updates the status to 'Offer Received' when there is an offer.
Added SQL constraints for expected_price, selling_price, property_tag_name and property_type_name

Added python constraint for selling_price to be >= 90% of expected_price unless it is 0.0
'website': "https://www.odoo.com",

'category': 'Tutorials',
'version': '0.1',

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can switch this to 1.0 which is the default for a new module.

required=True)
status = fields.Selection(
string="Status",
selection=[('new', "New"), ('offer_received', "Offer Received"), ('offer_accepted', "Offer Accepted"), ('sold', "Sold"), ('canceled', "Canceled")],

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you split this into multiple lines please. Same for above.

Comment on lines +55 to +56
else:
record.status = record.status

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not needed anymore as you changed the compute to onchange.

def action_mark_sold(self):
for record in self:
if record.status == 'canceled':
raise UserError("Canceled properties cannot be sold.")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You need to translate this string. You can use self.env._("Canceled properties cannot be sold.") to make it translatable.

def action_mark_cancel(self):
for record in self:
if record.status == 'sold':
raise UserError("Sold properties cannot be canceled.")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here

Comment on lines +79 to +87
_check_expected_price = models.Constraint(
'CHECK(expected_price > 0)',
'The expected price must be strictly positive'
)

_check_selling_price = models.Constraint(
'CHECK(selling_price >= 0)',
'The selling price must be positive'
)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you move that on top of the class. It seems a bit lost here, I would put it after or before the fields but, before any functions.

Comment on lines +92 to +93
if not float_is_zero(record.selling_price, precision_digits=2):
if float_compare(record.selling_price, record.expected_price * 0.9, precision_digits=2) < 0:

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why two conditions ? I think it could be merged into one.

for record in self:
if not float_is_zero(record.selling_price, precision_digits=2):
if float_compare(record.selling_price, record.expected_price * 0.9, precision_digits=2) < 0:
raise ValidationError('The selling price must be atleast 90% of the expected price! You must reduce the expected price to accept the offer')

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't forget about the double quotes here 😄


class PropertyTag(models.Model):
_name = 'estate.property.tag'
_description = 'Estate Property Tag'

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here this can be double quotes


_check_price = models.Constraint(
'CHECK(price > 0)',
'The offer price must be strictly positive'

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here this can also be double quotes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants