Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions estate/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import models
from . import controllers
35 changes: 35 additions & 0 deletions estate/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
'name': 'Real Estate',
'summary': 'Manage real estate properties and offers',
'description': "This module allows managing property advertisements,including property details, offers, and related data.",
'author': 'Sudarshan Maity (sumai)',
'website': '',
'category': 'Real Estate',
'version': '1.0',
'license': 'LGPL-3',
'depends': [
'base',
'mail',
'crm',
'website'
],

'data': [
'security/ir.model.access.csv',
'data/mail_template.xml',
'data/offer_cron.xml',
'data/estate_website_templates.xml',
'views/res_config_settings_views.xml',
'views/estate_property_views.xml',
'views/estate_property_offer_views.xml',
'views/estate_property_type_views.xml',
'views/estate_property_tag_views.xml',
'views/estate_property_visit_views.xml',
'views/estate_property_issue_views.xml',
'views/res_users_views.xml',
'views/estate_menus.xml',
],

'installable': True,
'application': True,
}
1 change: 1 addition & 0 deletions estate/controllers/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import main
53 changes: 53 additions & 0 deletions estate/controllers/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
from odoo.http import Controller, route, request


class EstateWebsite(Controller):

_property_per_page = 6

@route(
["/properties", "/properties/page/<int:page>"],
type="http",
auth="public",
website=True)
def properties(self, page=1, **kwargs):
website = request.website
found_properties = request.env["estate.property"].sudo().search([])

pager = website.pager(
url="/properties",
total=len(found_properties),
page=page,
step=self._property_per_page,
url_args=kwargs,
)

offset = pager["offset"]
properties_list = found_properties[offset: offset + self._property_per_page]

return request.render(
"estate.estate_properties_template",
{
"properties": properties_list,
"pager": pager,
}
)

@route(
['/properties/<int:property_id>'],
type='http',
auth='public',
website=True
)
def property_detail(self, property_id, **kwargs):

property_record = request.env[
'estate.property'
].sudo().browse(property_id)

return request.render(
'estate.estate_property_detail_template',
{
'property': property_record
}
)
124 changes: 124 additions & 0 deletions estate/data/estate_website_templates.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
<odoo>

<data>

<record id="menu_property" model="website.menu">
<field name="name">Properties</field>
<field name="url">/properties</field>
<field name="parent_id" ref="website.main_menu"/>
<field name="sequence" type="int"> 20 </field>
</record>

<template id="estate_properties_template" name="Estate Properties">
<t t-call="website.layout">
<div class="container mt-4 mb-4">
<form action="/properties" method="get" class="row g-3 align-items-end">
<div class="col-md-3">
<label class="form-label">
Selling Mode
</label>

<select name="selling_mode" class="form-select">
<option value="">All</option>
<option value="regular" t-att-selected=" 'selected' if selling_mode == 'regular' else None ">
Regular
</option>
<option value="auction" t-att-selected=" 'selected' if selling_mode == 'auction' else None ">
Auction
</option>
</select>
</div>

<div class="col-md-2">
<button type="submit" class="btn btn-primary w-100">
Filter
</button>
</div>
</form>
</div>

<div class="container mt-5">
<div class="text-center mb-5">
<h1>Estate Properties</h1>
<p class="text-muted"> Explore available properties </p>
</div>
<div class="row">
<t t-foreach="properties" t-as="property">
<div class="col-lg-4 col-md-6 mb-4">
<div class="card h-100 shadow-sm border-0">
<img
t-if="property.image_1920"
t-att-src="image_data_uri(property.image_1920)"
class="card-img-top"
style="height:250px; object-fit:cover;"
/>
<div class="card-body">
<h4 class="card-title">
<a t-att-href="'/properties/%s' % property.id" class="text-decoration-none">
<t t-esc="property.name"/>
</a>
</h4>
<p class="text-muted">
<t t-esc="property.description"/>
</p>
<p>
<strong> Available From: </strong>
<t t-esc="property.date_availability"/>
</p>
</div>
</div>
</div>
</t>
</div>
</div>
</t>
</template>

<template id="estate_property_detail_template" name="Property Detail">
<t t-call="website.layout">
<div class="container mt-5">
<div class="row">
<div class="col-lg-7">
<img
t-if="property.image_1920"
t-att-src="image_data_uri(property.image_1920)"
class="img-fluid rounded shadow"
style=" width:100%; height:500px; object-fit:cover "/>
</div>
<div class="col-lg-5">
<h1 class="mb-4">
<t t-esc="property.name"/>
</h1> <hr/>
<p>
<strong>Description:</strong>
<br/>
<t t-esc="property.description"/>
</p>
<p>
<strong>Expected Price:</strong> ₹
<t t-esc="property.expected_price"/>
</p>
<p>
<strong>Bedrooms:</strong>
<t t-esc="property.bedrooms"/>
</p>
<p>
<strong>Living Area:</strong>
<t t-esc="property.living_area"/> sq.ft
</p>
<p>
<strong>Salesperson:</strong>
<t t-esc="property.salesperson_id.name"/>
</p>
<p>
<strong>Available From:</strong>
<t t-esc="property.date_availability"/>
</p>
</div>
</div>
</div>
</t>
</template>
</data>

</odoo>
27 changes: 27 additions & 0 deletions estate/data/mail_template.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="email_template_edi_estate" model="mail.template">
<field name="name">Estate: Sold property</field>
<field name="model_id" ref="estate.model_estate_property"/>
<field name="subject">Property {{ object.name }} is Sold</field>
<field name="email_from">{{ object.salesperson_id.email or '' }}</field>
<!-- <field name="partner_to" eval="False"/>
<field name="use_default_to" eval="True"/>
<field name="description">Used by salespeople when they send quotations or proforma to prospects</field> -->
<field name="body_html" type="html">
<div style="margin: 0px; padding: 0px;">
<p style="margin: 0px; padding: 0px; font-size: 13px;">
<t t-set="doc_name" t-value="'property'"/>
<b>Hello</b><br/><br/>
The property <t t-out="object.name or ''"></t> has been successfully sold.<br/>
Buyer: <t t-out="object.buyer_id.name or ''"></t><br/>
Salesperson:<t t-out="object.salesperson_id.name or ''"></t><br/><br/>

Thank you.
</p>
</div>
</field>
</record>
</data>
</odoo>
14 changes: 14 additions & 0 deletions estate/data/offer_cron.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>

<record id="ir_cron_offer_validity" model="ir.cron">
<field name="name">vaccum expired offers automatically</field>
<field name="model_id" ref="estate.model_estate_property_offer"/>
<field name="state">code</field>
<field name="code">model._cron_offers_expire(job_count=20)</field>
<field name="user_id" ref="base.user_root"/>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
</record>

</odoo>
9 changes: 9 additions & 0 deletions estate/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from . import estate_property
from . import estate_property_type
from . import estate_property_tag
from . import estate_property_offer
from . import estate_property_visit
from . import estate_property_issue
from . import res_users
from . import mail_compose_message
from . import res_config_settings
Loading