@ -0,0 +1,47 @@ |
|||
.. image:: https://img.shields.io/badge/license-LGPL--3-green.svg |
|||
:target: https://www.gnu.org/licenses/lgpl-3.0-standalone.html |
|||
:alt: License: LGPL-3 |
|||
|
|||
Import Bill Of Materials |
|||
======================== |
|||
Import Bill Of Materials using CSV or Excel files |
|||
|
|||
Configuration |
|||
============= |
|||
* Check the Import BOM field in users |
|||
|
|||
Company |
|||
------- |
|||
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__ |
|||
|
|||
License |
|||
------- |
|||
General Public License, Version 3 (LGPL v3). |
|||
(https://www.gnu.org/licenses/lgpl-3.0-standalone.html) |
|||
|
|||
Credits |
|||
------- |
|||
* Developers: (V17) Developer Anurudh P, |
|||
(V18) Developer Ranjith R, |
|||
Contact: odoo@cybrosys.com |
|||
Contacts |
|||
-------- |
|||
* Mail Contact : odoo@cybrosys.com |
|||
* Website : https://cybrosys.com |
|||
|
|||
Bug Tracker |
|||
----------- |
|||
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. |
|||
|
|||
Maintainer |
|||
========== |
|||
.. image:: https://cybrosys.com/images/logo.png |
|||
:target: https://cybrosys.com |
|||
|
|||
This module is maintained by Cybrosys Technologies. |
|||
|
|||
For support and more information, please visit `Our Website <https://cybrosys.com/>`__ |
|||
|
|||
Further information |
|||
=================== |
|||
HTML Description: `<static/description/index.html>`__ |
@ -0,0 +1,22 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Ranjith R(<https://www.cybrosys.com>) |
|||
# |
|||
# You can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
from . import wizards |
@ -0,0 +1,56 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Ranjith R (<https://www.cybrosys.com>) |
|||
# |
|||
# You can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
{ |
|||
'name': 'Import Bill Of Materials', |
|||
'version': '18.0.1.0.0', |
|||
'category': 'Manufacturing', |
|||
'summary': """Import Bill of materials using CSV, Excel file""", |
|||
'description': 'Using this module we can import bom by searching' |
|||
' the products in diffrent ways in csv or excel files', |
|||
'author': 'Cybrosys Techno Solutions', |
|||
'company': 'Cybrosys Techno Solutions', |
|||
'maintainer': 'Cybrosys Techno Solutions', |
|||
'website': 'https://www.cybrosys.com', |
|||
'depends': ['base', 'stock', 'mrp'], |
|||
'data': { |
|||
'security/ir.model.access.csv', |
|||
'security/import_bom_security.xml', |
|||
'views/bom_import_menu_view.xml', |
|||
'wizards/bom_import_view.xml', |
|||
'wizards/success_message_view.xml', |
|||
}, |
|||
'assets': { |
|||
'web.assets_backend': [ |
|||
'import_bill_of_materials_in_mrp/static/src/css/style.css' |
|||
], |
|||
}, |
|||
'external_dependencies': { |
|||
'python': [ |
|||
'openpyxl' |
|||
], |
|||
}, |
|||
'images': ['static/description/banner.png'], |
|||
'license': 'LGPL-3', |
|||
'installable': True, |
|||
'auto_install': False, |
|||
'application': False, |
|||
} |
@ -0,0 +1,6 @@ |
|||
## Module <import_bill_of_materials_in_mrp> |
|||
|
|||
#### 21.12.2025 |
|||
#### Version 18.0.1.0.0 |
|||
#### ADD |
|||
- Initial commit for Import Bill Of Materials |
@ -0,0 +1,7 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<!-- Security groups for Import BOM --> |
|||
<record id="import_bom_group_id" model="res.groups"> |
|||
<field name="name">Import BOM</field> |
|||
</record> |
|||
</odoo> |
|
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 210 KiB |
After Width: | Height: | Size: 209 KiB |
After Width: | Height: | Size: 109 KiB |
After Width: | Height: | Size: 495 B |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 624 B |
After Width: | Height: | Size: 136 KiB |
After Width: | Height: | Size: 214 KiB |
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 310 B |
After Width: | Height: | Size: 929 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 542 B |
After Width: | Height: | Size: 576 B |
After Width: | Height: | Size: 733 B |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 738 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 911 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 600 B |
After Width: | Height: | Size: 673 B |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 462 B |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 926 B |
After Width: | Height: | Size: 9.0 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 7.0 KiB |
After Width: | Height: | Size: 878 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 653 B |
After Width: | Height: | Size: 800 B |
After Width: | Height: | Size: 905 B |
After Width: | Height: | Size: 189 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 839 B |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 5.9 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 34 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 427 B |
After Width: | Height: | Size: 627 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 988 B |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 5.0 KiB |
After Width: | Height: | Size: 875 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 767 KiB |
After Width: | Height: | Size: 138 KiB |
After Width: | Height: | Size: 760 KiB |
After Width: | Height: | Size: 92 KiB |
After Width: | Height: | Size: 697 KiB |
After Width: | Height: | Size: 1.1 MiB |
After Width: | Height: | Size: 108 KiB |
After Width: | Height: | Size: 97 KiB |
After Width: | Height: | Size: 124 KiB |
After Width: | Height: | Size: 88 KiB |
After Width: | Height: | Size: 87 KiB |
After Width: | Height: | Size: 145 KiB |
After Width: | Height: | Size: 97 KiB |
After Width: | Height: | Size: 130 KiB |
After Width: | Height: | Size: 9.8 KiB |
|
@ -0,0 +1,19 @@ |
|||
.div_pos{ |
|||
margin-left: 508px !important; |
|||
margin-top: 10px; |
|||
} |
|||
.csv{ |
|||
margin: 0 10px; |
|||
font-size: 12px; |
|||
line-height: 1.5; |
|||
border-radius: 3px; |
|||
padding: 8px 10px; |
|||
color: #ffffff; |
|||
} |
|||
.xlsx{ |
|||
font-size: 12px; |
|||
line-height: 1.5; |
|||
border-radius: 3px; |
|||
padding: 8px 10px; |
|||
color: #ffffff; |
|||
} |
@ -0,0 +1,15 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<!-- Menu for Import BOM --> |
|||
<record id="action_import_bom" model="ir.actions.act_window"> |
|||
<field name="name">Import BOM</field> |
|||
<field name="res_model">bom.import</field> |
|||
<field name="view_mode">form</field> |
|||
<field name="target">new</field> |
|||
</record> |
|||
<menuitem id="menu_import_bom" |
|||
parent="mrp.menu_mrp_bom" |
|||
action="action_import_bom" |
|||
groups="import_bill_of_materials_in_mrp.import_bom_group_id" |
|||
/> |
|||
</odoo> |
@ -0,0 +1,23 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Ranjith R (<https://www.cybrosys.com>) |
|||
# |
|||
# You can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
from . import bom_import |
|||
from . import success_message |
@ -0,0 +1,261 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Ranjith R (<https://www.cybrosys.com>) |
|||
# |
|||
# You can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
import binascii |
|||
import certifi |
|||
import csv |
|||
import tempfile |
|||
import urllib3 |
|||
import xlrd |
|||
from odoo import fields,models, _ |
|||
import base64 |
|||
import openpyxl |
|||
from io import BytesIO |
|||
from odoo.exceptions import UserError |
|||
from odoo.tools import ustr |
|||
|
|||
|
|||
class BomImport(models.TransientModel): |
|||
"""This is a transient model for creating a wizard for importing bom """ |
|||
_name = 'bom.import' |
|||
_description = 'Import Bom wizard' |
|||
|
|||
file_type = fields.Selection([('csv', 'CSV File'), |
|||
('xls', 'Excel File')], |
|||
String='File Type', Required=True, |
|||
default='csv', |
|||
help='File type of importing file') |
|||
name = fields.Char(string='name') |
|||
bom_type = fields.Selection( |
|||
[('mtp', 'Manufacture This Product'), ('kit', 'Kit')], |
|||
String='BOM Type', Required=True, |
|||
default='mtp', helf='Type of Bill of Materials') |
|||
product_variant_by = fields.Selection( |
|||
[('default_code', 'Internal Reference'), |
|||
('barcode', 'Barcode')], String='Product Variant By', Required=True, |
|||
default='default_code', help='Product variant type in file') |
|||
product_by = fields.Selection([('name', 'Name'), |
|||
('default_code', 'Internal Reference'), |
|||
('barcode', 'Barcode')], String='Product By', |
|||
Required=True, default='name', |
|||
help='Product type in file') |
|||
file = fields.Binary(String='Upload File', Required=True, |
|||
help='File to Import') |
|||
|
|||
def action_import_bom(self): |
|||
"""function for importing bom through csv or Excel file""" |
|||
if self.file: |
|||
if self.file_type == 'csv': |
|||
try: |
|||
file = base64.b64decode(self.file) |
|||
file_string = file.decode('utf-8') |
|||
file_string.split('\n') |
|||
urllib3.PoolManager(cert_reqs='CERT_REQUIRED', |
|||
ca_certs=certifi.where()) |
|||
except: |
|||
raise UserError(_("Please choose the correct file!")) |
|||
for rec in self: |
|||
file = str(base64.decodebytes( |
|||
rec.file).decode('utf-8')) |
|||
reader = csv.reader(file.splitlines()) |
|||
next(reader) |
|||
last_bom_id = False |
|||
rec_count = 0 |
|||
try: |
|||
for col in reader: |
|||
bom_data = {} |
|||
bom_line_dict = {} |
|||
if col[1]: |
|||
rec_count += 1 |
|||
if rec.product_by == 'name': |
|||
product_search = 'name' |
|||
elif rec.product_by == 'default_code': |
|||
product_search = 'default_code' |
|||
else: |
|||
product_search = 'barcode' |
|||
product = self.env['product.template'].search( |
|||
[(product_search, '=', col[1])], limit=1) |
|||
bom_data.update({'product_tmpl_id': product.id, |
|||
'code': col[0]}) |
|||
if col[2]: |
|||
if rec.product_variant_by == 'default_code': |
|||
variant_search = 'default_code' |
|||
else: |
|||
variant_search = 'barcode' |
|||
variant = self.env[ |
|||
'product.product'].search( |
|||
[(variant_search, '=', col[2])], |
|||
limit=1) |
|||
bom_data.update({'product_id': variant.id}) |
|||
if col[4]: |
|||
uom = self.env['uom.uom'].search( |
|||
[('name', '=', col[4])], limit=1) |
|||
bom_data.update( |
|||
{'product_uom_id': uom.id}) |
|||
else: |
|||
bom_data.update( |
|||
{'product_uom_id': variant.uom_id}) |
|||
if col[3]: |
|||
bom_data.update({'product_qty': col[3]}) |
|||
else: |
|||
bom_data.update({'product_qty': 1}) |
|||
|
|||
if rec.bom_type == 'mtp': |
|||
bom_data.update({'type': 'normal'}) |
|||
else: |
|||
bom_data.update({'type': 'phantom'}) |
|||
bom_bom = rec.env['mrp.bom'].create(bom_data) |
|||
last_bom_id = bom_bom.id |
|||
if col[5]: |
|||
if rec.product_variant_by == 'default_code': |
|||
variant_search = 'default_code' |
|||
else: |
|||
variant_search = 'barcode' |
|||
variant = self.env['product.product'].search( |
|||
[(variant_search, '=', col[5])], limit=1) |
|||
bom_line_dict.update({'product_id': variant.id, |
|||
'bom_id': last_bom_id |
|||
}) |
|||
if col[6]: |
|||
bom_line_dict.update( |
|||
{'product_qty': col[6]}) |
|||
else: |
|||
bom_line_dict.update({'product_qty': 1}) |
|||
if col[7]: |
|||
uom = self.env['uom.uom'].search( |
|||
[('name', '=', col[7])], limit=1) |
|||
bom_line_dict.update( |
|||
{'product_uom_id': uom.id}) |
|||
else: |
|||
bom_line_dict.update( |
|||
{'product_uom_id': product.uom_id}) |
|||
self.env['mrp.bom.line'].create(bom_line_dict) |
|||
return rec.success_message(rec_count) |
|||
except Exception as e: |
|||
raise UserError( |
|||
_("Sorry, The CSV file you provided " |
|||
"does not match our required format" + ustr( |
|||
e))) |
|||
|
|||
if self.file_type == 'xls': |
|||
try: |
|||
file_string = tempfile.NamedTemporaryFile(suffix=".xlsx") |
|||
file_string.write(binascii.a2b_base64(self.file)) |
|||
book = xlrd.open_workbook(file_string.name) |
|||
book.sheet_by_index(0) |
|||
urllib3.PoolManager(cert_reqs='CERT_REQUIRED', |
|||
ca_certs=certifi.where()) |
|||
except: |
|||
raise UserError(_("Please choose the correct file")) |
|||
for rec in self: |
|||
try: |
|||
wb = openpyxl.load_workbook( |
|||
filename=BytesIO(base64.b64decode(rec.file)), |
|||
read_only=True) |
|||
ws = wb.active |
|||
rec_count = 0 |
|||
for col in ws.iter_rows(min_row=2, values_only=True): |
|||
bom_data = {} |
|||
bom_line_dict = {} |
|||
if col[1]: |
|||
rec_count += 1 |
|||
if rec.product_by == 'name': |
|||
product_search = 'name' |
|||
elif rec.product_by == 'default_code': |
|||
product_search = 'default_code' |
|||
else: |
|||
product_search = 'barcode' |
|||
product = self.env['product.template'].search( |
|||
[(product_search, '=', col[1])], limit=1) |
|||
bom_data.update({'product_tmpl_id': product.id, |
|||
'code': col[0]}) |
|||
if col[2]: |
|||
if rec.product_variant_by == 'default_code': |
|||
variant_search = 'default_code' |
|||
else: |
|||
variant_search = 'barcode' |
|||
variant = self.env[ |
|||
'product.product'].search( |
|||
[(variant_search, '=', col[2])], |
|||
limit=1) |
|||
bom_data.update({'product_id': variant.id}) |
|||
if col[4]: |
|||
uom = self.env['uom.uom'].search( |
|||
[('name', '=', col[4])], limit=1) |
|||
bom_data.update( |
|||
{'product_uom_id': uom.id}) |
|||
else: |
|||
bom_data.update( |
|||
{'product_uom_id': variant.uom_id}) |
|||
if col[3]: |
|||
bom_data.update({'product_qty': col[3]}) |
|||
else: |
|||
bom_data.update({'product_qty': 1}) |
|||
|
|||
if rec.bom_type == 'mtp': |
|||
bom_data.update({'type': 'normal'}) |
|||
else: |
|||
bom_data.update({'type': 'phantom'}) |
|||
bom_bom = rec.env['mrp.bom'].create(bom_data) |
|||
last_bom_id = bom_bom.id |
|||
if col[5]: |
|||
if rec.product_variant_by == 'default_code': |
|||
variant_search = 'default_code' |
|||
else: |
|||
variant_search = 'barcode' |
|||
variant = self.env['product.product'].search( |
|||
[(variant_search, '=', col[5])], limit=1) |
|||
bom_line_dict.update({'product_id': variant.id, |
|||
'bom_id': last_bom_id |
|||
}) |
|||
if col[6]: |
|||
bom_line_dict.update( |
|||
{'product_qty': col[6]}) |
|||
else: |
|||
bom_line_dict.update({'product_qty': 1}) |
|||
if col[7]: |
|||
uom = self.env['uom.uom'].search( |
|||
[('name', '=', col[7])], limit=1) |
|||
bom_line_dict.update( |
|||
{'product_uom_id': uom.id}) |
|||
else: |
|||
bom_line_dict.update( |
|||
{'product_uom_id': product.uom_id}) |
|||
self.env['mrp.bom.line'].create(bom_line_dict) |
|||
return rec.success_message(rec_count) |
|||
except Exception as e: |
|||
raise UserError( |
|||
_("Sorry, The Excel file you provided" |
|||
" does not match our required format" + ustr( |
|||
e))) |
|||
|
|||
def success_message(self, rec_count): |
|||
"""function for displaying success message""" |
|||
message_id = self.env['success.message'].create( |
|||
{'message': str(rec_count) + " Records imported successfully"}) |
|||
return { |
|||
'name': 'Message', |
|||
'type': 'ir.actions.act_window', |
|||
'view_mode': 'form', |
|||
'res_model': 'success.message', |
|||
'res_id': message_id.id, |
|||
'target': 'new' |
|||
} |
@ -0,0 +1,43 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<!-- wizard of importing Bill of Materials --> |
|||
<record id="bom_import_view_form" model="ir.ui.view"> |
|||
<field name="name">bom.import</field> |
|||
<field name="model">bom.import</field> |
|||
<field name="arch" type="xml"> |
|||
<form name="Import BOM"> |
|||
<group> |
|||
<group> |
|||
<field name="file_type" widget="radio"/> |
|||
<field name="bom_type" widget="radio"/> |
|||
<field name="file" filename="name"/> |
|||
</group> |
|||
<group> |
|||
<field name="product_variant_by" widget="radio"/> |
|||
<field name="product_by" widget="radio"/> |
|||
</group> |
|||
<field name="name" invisible="1"/> |
|||
</group> |
|||
<footer> |
|||
<button name="action_import_bom" string="Apply" |
|||
type="object" class="btn-primary"/> |
|||
<button string="Cancel" class="btn-default" |
|||
special="cancel"/> |
|||
<div class="div_pos"> |
|||
<strong>Download Sample:</strong> |
|||
<a href="/import_bill_of_materials_in_mrp/static/download/import_bom_csv.csv" |
|||
class="oe_link" target="_blank"> |
|||
<i class="fa fa-download"/> |
|||
CSV file |
|||
</a> |
|||
<a href="/import_bill_of_materials_in_mrp/static/download/import_bom_excel.xlsx" |
|||
class="oe_link" target="_blank"> |
|||
<i class="fa fa-download"/> |
|||
Excel file |
|||
</a> |
|||
</div> |
|||
</footer> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
</odoo> |
@ -0,0 +1,35 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Ranjith R (<https://www.cybrosys.com>) |
|||
# |
|||
# You can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
from odoo import fields, models |
|||
|
|||
|
|||
class SuccessMessage(models.TransientModel): |
|||
"""model for adding warning message """ |
|||
|
|||
_name = 'success.message' |
|||
_description = "Show Message" |
|||
|
|||
message = fields.Text('Success', required=True) |
|||
|
|||
def action_close(self): |
|||
"""function for close button""" |
|||
return {'type': 'ir.actions.act_window_close'} |
@ -0,0 +1,16 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<!--This XML defines a view for displaying a success message in an Odoo wizard--> |
|||
<record id="success_message_wizard" model="ir.ui.view"> |
|||
<field name="name">success.message.form</field> |
|||
<field name="model">success.message</field> |
|||
<field name="arch" type="xml"> |
|||
<form> |
|||
<field name="message" readonly="True"/> |
|||
<footer> |
|||
<button name="action_close" string="Ok" type="object" class="oe_highlight"/> |
|||
</footer> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
</odoo> |