Files
odoo-addons/addons/tk_construction_management/models/construction_site.py

204 lines
7.9 KiB
Python

# -*- coding: utf-8 -*-
# Copyright 2020-Today TechKhedut.
# Part of TechKhedut. See LICENSE file for full copyright and licensing details.
from odoo import fields, api, models, _
from odoo.exceptions import ValidationError
class ConstructionSite(models.Model):
_name = 'tk.construction.site'
_description = "Construction Project"
_inherit = ['mail.thread', 'mail.activity.mixin']
name = fields.Char(string="Title", tracking=True)
start_date = fields.Date(string="Start Date", tracking=True)
end_date = fields.Date(string="End Date", tracking=True)
status = fields.Selection([('draft', 'Draft'), ('in_progress', 'In Progress'), ('complete', 'Complete')],
default='draft', tracking=True)
con_project_id = fields.Many2one('tk.construction.project', string="Project", tracking=True)
phone = fields.Char(string="Phone")
mobile = fields.Char(string="Mobile")
email = fields.Char(string="Email")
warehouse_id = fields.Many2one('stock.warehouse', string="Warehouse", tracking=True)
# Address
zip = fields.Char(string='Pin Code')
street = fields.Char(string='Street1')
street2 = fields.Char(string='Street2')
city = fields.Char(string='City')
country_id = fields.Many2one('res.country', 'Country')
state_id = fields.Many2one("res.country.state", string='State', readonly=False, store=True,
domain="[('country_id', '=?', country_id)]")
longitude = fields.Char(string="Longitude")
latitude = fields.Char(string="Latitude")
# One2Many
stakeholder_ids = fields.One2many('stakeholder.line', 'site_id')
site_image_ids = fields.One2many('site.images', 'site_id')
site_dimension_ids = fields.One2many('site.dimension', 'site_id')
document_permit_ids = fields.One2many('document.permit', 'site_id')
construction_project_ids = fields.One2many('tk.construction.project', 'construction_site_id')
boq_ids = fields.One2many('tk.construction.project', 'construction_site_id')
# Count & Totals
document_count = fields.Integer(string="Document Count", compute="_compute_count")
project_count = fields.Integer(string="Project Count", compute="_compute_count")
total_area = fields.Float(string="Total Area ", compute="_compute_total_area")
# Create, Write, Unlink, Constrain
@api.constrains('stakeholder_ids')
def _check_stakeholder_stack(self):
for record in self.stakeholder_ids:
duplicates = self.stakeholder_ids.filtered(
lambda r: r.id != record.id and r.stakeholder_id.id == record.stakeholder_id.id)
if duplicates:
raise ValidationError(_("Stakeholder already added !"))
@api.constrains('stakeholder_ids')
def _check_stakeholder_ids(self):
percentage = 0.0
for record in self.stakeholder_ids:
percentage = percentage + record.percentage
if percentage > 100:
raise ValidationError(_("Percentage cannot exceed the limit of 100%."))
# Compute
def _compute_count(self):
for rec in self:
rec.document_count = self.env['site.documents'].search_count([('site_id', '=', rec.id)])
rec.project_count = self.env['tk.construction.project'].search_count(
[('construction_site_id', '=', rec.id)])
@api.depends('site_dimension_ids')
def _compute_total_area(self):
for rec in self:
total = 0.0
if rec.site_dimension_ids:
for data in rec.site_dimension_ids:
total = total + data.area
rec.total_area = total
# Smart Bottom
def action_gmap_location(self):
if self.longitude and self.latitude:
longitude = self.longitude
latitude = self.latitude
http_url = 'https://maps.google.com/maps?q=loc:' + latitude + ',' + longitude
return {
'type': 'ir.actions.act_url',
'target': 'new',
'url': http_url,
}
else:
raise ValidationError(_("! Enter Proper Longitude and Latitude Values"))
def action_site_document(self):
return {
'type': 'ir.actions.act_window',
'name': _('Documents'),
'res_model': 'site.documents',
'domain': [('site_id', '=', self.id)],
'context': {'default_site_id': self.id},
'view_mode': 'list',
'target': 'current'
}
def action_view_project(self):
return {
'type': 'ir.actions.act_window',
'name': _('Project'),
'res_model': 'tk.construction.project',
'domain': [('construction_site_id', '=', self.id)],
'context': {'default_construction_site_id': self.id},
'view_mode': 'list,form',
'target': 'current'
}
# Button
def action_site_complete(self):
self.status = 'complete'
def action_site_in_progress(self):
self.status = 'in_progress'
# Stakeholder
class StakeholderLine(models.Model):
_name = 'stakeholder.line'
_description = "Stack Holder Line"
_rec_name = 'stakeholder_id'
site_id = fields.Many2one('tk.construction.site', string="Construction Project")
stakeholder_id = fields.Many2one('res.partner', domain="[('stack_holder','=',True)]")
percentage = fields.Float(string="Percentage")
image_1920 = fields.Binary(related="stakeholder_id.image_1920")
phone = fields.Char(related="stakeholder_id.phone", string="Phone")
email = fields.Char(related="stakeholder_id.email", string="Email")
# Project Documents
class SiteDocuments(models.Model):
_name = 'site.documents'
_description = "Project Documents"
_rec_name = 'document_type_id'
document_type_id = fields.Many2one('site.document.type', string="Document Type")
date = fields.Date(string="Date", default=fields.Date.today())
site_id = fields.Many2one('tk.construction.site', string="Construction Project", ondelete='cascade')
document = fields.Binary(string='Documents', required=True)
file_name = fields.Char(string='File Name')
# Project Images
class SiteImages(models.Model):
_name = 'site.images'
_description = "Project Images"
site_id = fields.Many2one('tk.construction.site', string="Construction Project", ondelete='cascade')
name = fields.Char(string='Title')
image = fields.Image(string='Images')
# Project Dimension
class SiteDimension(models.Model):
_name = 'site.dimension'
_description = "Project Dimension"
_rec_name = "site_id"
name = fields.Char(string="Title")
site_id = fields.Many2one('tk.construction.site', string="Construction Project", ondelete='cascade')
length = fields.Float(string="Length(m)")
width = fields.Float(string="Width(m)")
area = fields.Float(string="Area", compute="_compute_area")
@api.depends('length', 'width')
def _compute_area(self):
for rec in self:
area = 0.0
if rec.length and rec.width:
area = rec.length * rec.width
rec.area = area
# Document Permit
class DocumentPermit(models.Model):
_name = 'document.permit'
_description = "Document Permit"
_rec_name = 'document_type_id'
document_type_id = fields.Many2one('site.document.type', string="Document Type")
date = fields.Date(string="Date", default=fields.Date.today())
site_id = fields.Many2one('tk.construction.site', string="Construction Project", ondelete='cascade')
document = fields.Binary(string='Documents', required=True)
file_name = fields.Char(string='File Name')
status = fields.Selection([('a', 'Approve'), ('r', 'Reject')], string="Status")
feedback = fields.Char(string="Feedback")
submitted_by = fields.Many2one('res.users', string="Submitted by",
default=lambda self: self.env.user and self.env.user.id or False)
def action_approve(self):
self.status = 'a'
def action_reject(self):
self.status = 'r'