odoo 16
This commit is contained in:
parent
fb301db2b3
commit
bcd039d89c
11 changed files with 118 additions and 108 deletions
|
|
@ -27,22 +27,24 @@
|
||||||
'author': 'Bemade Inc.',
|
'author': 'Bemade Inc.',
|
||||||
'website': 'http://www.bemade.org',
|
'website': 'http://www.bemade.org',
|
||||||
'license': 'OPL-1',
|
'license': 'OPL-1',
|
||||||
'depends': ['project_enterprise',
|
'depends': [
|
||||||
'project_forecast',
|
'project_enterprise',
|
||||||
'stock',
|
'project_forecast',
|
||||||
'sale',
|
'stock',
|
||||||
'sale_project',
|
'sale',
|
||||||
'sale_stock',
|
'sale_project',
|
||||||
'sale_planning',
|
'sale_stock',
|
||||||
'worksheet',
|
'sale_planning',
|
||||||
'industry_fsm_stock',
|
'worksheet',
|
||||||
'industry_fsm_report',
|
'industry_fsm_stock',
|
||||||
'industry_fsm_sale_report',
|
'industry_fsm_report',
|
||||||
'bemade_partner_root_ancestor',
|
'industry_fsm_sale_report',
|
||||||
'mail',
|
'bemade_partner_root_ancestor',
|
||||||
],
|
'mail',
|
||||||
|
],
|
||||||
'data': [
|
'data': [
|
||||||
'data/fsm_data.xml',
|
# BV: FOR MIGRATION
|
||||||
|
# 'data/fsm_data.xml',
|
||||||
'views/task_template_views.xml',
|
'views/task_template_views.xml',
|
||||||
'views/equipment.xml',
|
'views/equipment.xml',
|
||||||
'security/ir.model.access.csv',
|
'security/ir.model.access.csv',
|
||||||
|
|
@ -51,8 +53,8 @@
|
||||||
'views/menus.xml',
|
'views/menus.xml',
|
||||||
'views/task_views.xml',
|
'views/task_views.xml',
|
||||||
'views/sale_order_views.xml',
|
'views/sale_order_views.xml',
|
||||||
'reports/worksheet_custom_report_templates.xml',
|
# 'reports/worksheet_custom_report_templates.xml',
|
||||||
'reports/worksheet_custom_reports.xml',
|
# 'reports/worksheet_custom_reports.xml',
|
||||||
],
|
],
|
||||||
'assets': {
|
'assets': {
|
||||||
'web.assets_tests': [
|
'web.assets_tests': [
|
||||||
|
|
|
||||||
|
|
@ -119,7 +119,7 @@ class Task(models.Model):
|
||||||
])
|
])
|
||||||
return self.env['planning.slot'].search(domain)
|
return self.env['planning.slot'].search(domain)
|
||||||
|
|
||||||
@api.depends('forecast_hours')
|
@api.depends('planned_hours')
|
||||||
def _compute_planned_dates(self):
|
def _compute_planned_dates(self):
|
||||||
forecast_data = self._get_related_planning_slots()
|
forecast_data = self._get_related_planning_slots()
|
||||||
mapped_data = {}
|
mapped_data = {}
|
||||||
|
|
|
||||||
|
|
@ -14,8 +14,9 @@
|
||||||
'purchase'
|
'purchase'
|
||||||
],
|
],
|
||||||
"data": [
|
"data": [
|
||||||
'views/sale.xml',
|
# BV : FOR MIGRATION
|
||||||
'views/purchase.xml'
|
# 'views/sale.xml',
|
||||||
|
# 'views/purchase.xml'
|
||||||
],
|
],
|
||||||
"auto_install": False,
|
"auto_install": False,
|
||||||
"installable": True,
|
"installable": True,
|
||||||
|
|
|
||||||
|
|
@ -6,17 +6,14 @@ class MailAlias(models.Model):
|
||||||
|
|
||||||
mailcow_id = fields.One2many('mail.mailcow.alias', 'alias_id')
|
mailcow_id = fields.One2many('mail.mailcow.alias', 'alias_id')
|
||||||
|
|
||||||
@api.model
|
@api.model_create_multi
|
||||||
def create(self, vals):
|
def create(self, vals_list):
|
||||||
alias = super(MailAlias, self).create(vals)
|
alias_list = super().create(vals_list)
|
||||||
|
for alias in alias_list:
|
||||||
if not alias.alias_name:
|
if not alias.alias_name:
|
||||||
return alias
|
continue
|
||||||
|
alias_domain = self.env["ir.config_parameter"].sudo().get_param("mail.catchall.domain")
|
||||||
alias_domain = self.env["ir.config_parameter"].sudo().get_param("mail.catchall.domain"),
|
catchall_alias = self.env["ir.config_parameter"].sudo().get_param("mail.catchall.alias")
|
||||||
catchall_alias = self.env["ir.config_parameter"].sudo().get_param("mail.catchall.alias"),
|
|
||||||
|
|
||||||
alias_domain = alias_domain[0]
|
|
||||||
catchall_alias = catchall_alias[0]
|
|
||||||
|
|
||||||
if alias_domain:
|
if alias_domain:
|
||||||
mailcow_alias = self.env['mail.mailcow.alias'].search([('address', '=', alias.alias_name + '@' + alias_domain)])
|
mailcow_alias = self.env['mail.mailcow.alias'].search([('address', '=', alias.alias_name + '@' + alias_domain)])
|
||||||
|
|
@ -28,4 +25,4 @@ class MailAlias(models.Model):
|
||||||
'goto': catchall_alias + '@' + alias_domain,
|
'goto': catchall_alias + '@' + alias_domain,
|
||||||
'alias_id': alias.id,
|
'alias_id': alias.id,
|
||||||
})
|
})
|
||||||
return alias
|
return alias_list
|
||||||
|
|
|
||||||
|
|
@ -24,11 +24,12 @@ class MailcowAlias(models.Model):
|
||||||
('address_unique', 'UNIQUE(address)', 'The alias address must be unique!'),
|
('address_unique', 'UNIQUE(address)', 'The alias address must be unique!'),
|
||||||
]
|
]
|
||||||
|
|
||||||
@api.model
|
@api.model_create_multi
|
||||||
def create(self, vals):
|
def create(self, vals_list):
|
||||||
alias = super(MailcowAlias, self).create(vals)
|
alias_list = super().create(vals_list)
|
||||||
|
for alias in alias_list:
|
||||||
|
|
||||||
if 'mc_id' not in vals:
|
if 'mc_id' not in alias:
|
||||||
data = {
|
data = {
|
||||||
"active": bool(alias.active),
|
"active": bool(alias.active),
|
||||||
"address": alias.address,
|
"address": alias.address,
|
||||||
|
|
@ -42,7 +43,7 @@ class MailcowAlias(models.Model):
|
||||||
#pass
|
#pass
|
||||||
raise ValidationError("Failed to create alias on Mailcow server.")
|
raise ValidationError("Failed to create alias on Mailcow server.")
|
||||||
|
|
||||||
return alias
|
return alias_list
|
||||||
|
|
||||||
def unlink(self):
|
def unlink(self):
|
||||||
for record in self:
|
for record in self:
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import json
|
||||||
|
|
||||||
_logger = logging.getLogger(__name__)
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class MailcowBlacklist(models.Model):
|
class MailcowBlacklist(models.Model):
|
||||||
_name = 'mail.mailcow.blacklist'
|
_name = 'mail.mailcow.blacklist'
|
||||||
_description = 'Mailcow Blacklist'
|
_description = 'Mailcow Blacklist'
|
||||||
|
|
@ -14,30 +15,26 @@ class MailcowBlacklist(models.Model):
|
||||||
email = fields.Char(string='Email', required=True, tracking=True)
|
email = fields.Char(string='Email', required=True, tracking=True)
|
||||||
mc_id = fields.Integer(string='Mailcow ID', required=True, tracking=True)
|
mc_id = fields.Integer(string='Mailcow ID', required=True, tracking=True)
|
||||||
|
|
||||||
@api.model
|
@api.model_create_multi
|
||||||
def create(self, vals):
|
def create(self, vals_list):
|
||||||
"""
|
alias_list = super().create(vals_list)
|
||||||
Overridden create method to add the new blacklist entry to the Mailcow server.
|
for alias in alias_list:
|
||||||
"""
|
|
||||||
domain = self.env['ir.config_parameter'].sudo().get_param('mail.catchall.domain')
|
|
||||||
|
|
||||||
endpoint_add = '/api/v1/add/domain-policy'
|
if 'mc_id' not in alias:
|
||||||
endpoint_get_bl = f"/api/v1/get/policy_bl_domain/{domain}"
|
data = {
|
||||||
data = {
|
"active": bool(alias.active),
|
||||||
'domain': domain,
|
"address": alias.address,
|
||||||
'object_from': vals['email'],
|
"catchall": bool(alias.catchall),
|
||||||
'object_list': 'bl'
|
"goto": alias.goto,
|
||||||
}
|
"private_comment": f"Created by {self.env.user.name} on {fields.Datetime.now()}",
|
||||||
|
"public_comment": "Alias created in Odoo"
|
||||||
|
}
|
||||||
|
result = self.env['mail.mailcow'].api_request('/api/v1/add/alias', 'POST', data)
|
||||||
|
if not result:
|
||||||
|
#pass
|
||||||
|
raise ValidationError("Failed to create alias on Mailcow server.")
|
||||||
|
|
||||||
self.api_request(endpoint_add, 'POST', data)
|
return alias_list
|
||||||
_logger.info(f'Added {vals["email"]} to Mailcow blacklist')
|
|
||||||
|
|
||||||
bl_emails = self.api_request(endpoint_get_bl, 'GET', None)
|
|
||||||
|
|
||||||
mc_id = [d['prefid'] for d in bl_emails if d['value'] == vals['email']]
|
|
||||||
vals['mc_id'] = mc_id[0]
|
|
||||||
res = super().create(vals)
|
|
||||||
return res
|
|
||||||
|
|
||||||
def write(self, vals):
|
def write(self, vals):
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -47,37 +47,44 @@ class MailcowMailbox(models.Model):
|
||||||
'active': item['active'],
|
'active': item['active'],
|
||||||
})
|
})
|
||||||
|
|
||||||
@api.model
|
@api.model_create_multi
|
||||||
def create(self, vals):
|
def create(self, vals_list):
|
||||||
"""
|
"""
|
||||||
Override the create function to create a Mailcow mailbox whenever a user is created in Odoo.
|
Overridden create method to add a new mailbox entry on the Mailcow server for each user created in Odoo.
|
||||||
"""
|
"""
|
||||||
password = secrets.token_hex(16)
|
|
||||||
vals['password'] = password
|
|
||||||
|
|
||||||
# Check if email exists on Mailcow
|
res_list = []
|
||||||
endpoint = f"/api/v1/get/mailbox/{vals['local_part']}@{vals['domain']}"
|
|
||||||
response = self.api_request(endpoint)
|
|
||||||
|
|
||||||
if not response:
|
for vals in vals_list:
|
||||||
# If email does not exist on Mailcow, create it
|
password = secrets.token_hex(16)
|
||||||
endpoint = '/api/v1/add/mailbox'
|
vals['password'] = password
|
||||||
data = {
|
|
||||||
'local_part': vals['local_part'],
|
|
||||||
'domain': vals['domain'],
|
|
||||||
'name': vals['name'],
|
|
||||||
'password': password,
|
|
||||||
'password2': password,
|
|
||||||
'quota': "3072",
|
|
||||||
'active': "1",
|
|
||||||
'force_pw_update': "0",
|
|
||||||
'tls_enforce_in': "0",
|
|
||||||
'tls_enforce_out': "0",
|
|
||||||
}
|
|
||||||
self.api_request(endpoint, method='POST', data=data)
|
|
||||||
_logger.info(f"Mailbox {vals['local_part']}@{vals['domain']} has been created on Mailcow server")
|
|
||||||
|
|
||||||
return super().create(vals)
|
# Check if email exists on Mailcow
|
||||||
|
endpoint = f"/api/v1/get/mailbox/{vals['local_part']}@{vals['domain']}"
|
||||||
|
response = self.api_request(endpoint)
|
||||||
|
|
||||||
|
if not response:
|
||||||
|
# If email does not exist on Mailcow, create it
|
||||||
|
endpoint = '/api/v1/add/mailbox'
|
||||||
|
data = {
|
||||||
|
'local_part': vals['local_part'],
|
||||||
|
'domain': vals['domain'],
|
||||||
|
'name': vals['name'],
|
||||||
|
'password': password,
|
||||||
|
'password2': password,
|
||||||
|
'quota': "3072",
|
||||||
|
'active': "1",
|
||||||
|
'force_pw_update': "0",
|
||||||
|
'tls_enforce_in': "0",
|
||||||
|
'tls_enforce_out': "0",
|
||||||
|
}
|
||||||
|
self.api_request(endpoint, method='POST', data=data)
|
||||||
|
_logger.info(f"Mailbox {vals['local_part']}@{vals['domain']} has been created on Mailcow server")
|
||||||
|
|
||||||
|
res = super().create(vals)
|
||||||
|
res_list.append(res)
|
||||||
|
|
||||||
|
return res_list
|
||||||
|
|
||||||
def write(self, vals):
|
def write(self, vals):
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -25,12 +25,13 @@ class ResUsers(models.Model):
|
||||||
rec.mailcow_auto_create = get_mailcow_auto_create
|
rec.mailcow_auto_create = get_mailcow_auto_create
|
||||||
|
|
||||||
|
|
||||||
@api.model
|
@api.model_create_multi
|
||||||
def create(self, vals):
|
def create(self, vals_list):
|
||||||
res = super(ResUsers, self).create(vals)
|
res_list = super().create(vals_list)
|
||||||
|
|
||||||
if res.mailcow_mailbox:
|
for res in res_list:
|
||||||
self.env['mail.mailcow.mailbox'].create_mailbox_for_user(res)
|
if res.mailcow_mailbox:
|
||||||
|
self.env['mail.mailcow.mailbox'].create_mailbox_for_user(res)
|
||||||
|
|
||||||
return res
|
return res_list
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,8 @@
|
||||||
'stock',
|
'stock',
|
||||||
],
|
],
|
||||||
"data": [
|
"data": [
|
||||||
'views/stock_warehouse_orderpoint.xml',
|
# BV : FOR MIGRATION
|
||||||
|
# 'views/stock_warehouse_orderpoint.xml',
|
||||||
],
|
],
|
||||||
"auto_install": False,
|
"auto_install": False,
|
||||||
"installable": True,
|
"installable": True,
|
||||||
|
|
|
||||||
|
|
@ -4,14 +4,16 @@ from odoo import models, api
|
||||||
class StockPicking(models.Model):
|
class StockPicking(models.Model):
|
||||||
_inherit = 'stock.picking'
|
_inherit = 'stock.picking'
|
||||||
|
|
||||||
@api.model
|
|
||||||
def create(self, vals):
|
|
||||||
picking = super(StockPicking, self).create(vals)
|
|
||||||
|
|
||||||
|
@api.model_create_multi
|
||||||
|
def create(self, vals_list):
|
||||||
|
pickings = super().create(vals_list)
|
||||||
|
|
||||||
|
for picking, vals in zip(pickings, vals_list):
|
||||||
if 'origin' in vals:
|
if 'origin' in vals:
|
||||||
sale_order = self.env['sale.order'].search([('name', '=', vals['origin'])], limit=1)
|
sale_order = self.env['sale.order'].search([('name', '=', vals['origin'])], limit=1)
|
||||||
if sale_order:
|
if sale_order:
|
||||||
for follower in sale_order.message_follower_ids:
|
for follower in sale_order.message_follower_ids:
|
||||||
picking.message_subscribe(partner_ids=[follower.partner_id.id])
|
picking.message_subscribe(partner_ids=[follower.partner_id.id])
|
||||||
|
|
||||||
return picking
|
return pickings
|
||||||
|
|
|
||||||
|
|
@ -5,16 +5,17 @@ from odoo import models, fields, api
|
||||||
class HrEmployee(models.Model):
|
class HrEmployee(models.Model):
|
||||||
_inherit = 'hr.employee'
|
_inherit = 'hr.employee'
|
||||||
|
|
||||||
@api.model
|
@api.model_create_multi
|
||||||
def create(self, vals):
|
def create(self, vals_list):
|
||||||
newemployee = super(HrEmployee, self).create(vals)
|
new_employees = super().create(vals_list)
|
||||||
pw_bundle = self.env['password.bundle'].create({
|
for newemployee in new_employees:
|
||||||
'name': newemployee.name,
|
pw_bundle = self.env['password.bundle'].create({
|
||||||
'notes': f"Created new employee Password Bundle for {newemployee.name}"
|
'name': newemployee.name,
|
||||||
})
|
'notes': f"Created new employee Password Bundle for {newemployee.name}"
|
||||||
self.env['password.access'].create({
|
})
|
||||||
'bundle_id': pw_bundle.id,
|
self.env['password.access'].create({
|
||||||
'user_id': newemployee.user_id.id,
|
'bundle_id': pw_bundle.id,
|
||||||
'access_level': 'full',
|
'user_id': newemployee.user_id.id,
|
||||||
})
|
'access_level': 'full',
|
||||||
return newemployee
|
})
|
||||||
|
return new_employees
|
||||||
Loading…
Reference in a new issue