| @ -0,0 +1,52 @@ | |||
| .. 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 Product variant | |||
| ======================== | |||
| This module is used to import the product and their attributes using xlsx file and csv file. | |||
| And also through this files with product | |||
| importing we can also import some basic fields such as char ,many2one and many2many | |||
| fields.Using this module we can update a product using the product's internal reference or barcode we can change the date through the importing and also these can be implemented using the two files. | |||
| 
 | |||
| Configuration | |||
| ============= | |||
| * No additional configurations needed | |||
| 
 | |||
| 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 | |||
| ------- | |||
| * Developer: (V16) Gayathri V, | |||
|             (V15) Busthana, | |||
| 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,23 @@ | |||
| """Import product variant""" | |||
| # -*- coding: utf-8 -*- | |||
| ############################################################################# | |||
| # | |||
| #    Cybrosys Technologies Pvt. Ltd. | |||
| # | |||
| #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | |||
| #    Author: Cybrosys Techno Solutions(<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,50 @@ | |||
| # -*- coding: utf-8 -*- | |||
| ############################################################################# | |||
| # | |||
| #    Cybrosys Technologies Pvt. Ltd. | |||
| # | |||
| #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | |||
| #    Author: Cybrosys Techno Solutions(<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 Product variant', | |||
|     'version': '15.0.1.0.0', | |||
|     'category': 'Sales', | |||
|     'summary': """This module is used to import the product and product  | |||
|      variants.""", | |||
|     'description': """This module is used to import the product and their  | |||
|      attributes using xlsx file and csv file. And also through this files with  | |||
|      product importing we can also import some basic fields such as char,many2one | |||
|      and many2many fields.Using this module we can update a product using the  | |||
|      product's internal reference or barcode we can change the date through the  | |||
|      importing and also these can be implemented using the two files.""", | |||
|     'author': 'Cybrosys Techno Solutions', | |||
|     'company': 'Cybrosys Techno Solutions', | |||
|     'maintainer': 'Cybrosys Techno Solutions', | |||
|     'website': 'https://www.cybrosys.com', | |||
|     'depends': ['sale_management', 'stock'], | |||
|     'data': [ | |||
|         'security/ir.model.access.csv', | |||
|         'security/product_variant_import_groups.xml', | |||
|         'wizards/import_product_variant_views.xml', | |||
|     ], | |||
|     'images': ['static/description/banner.png'], | |||
|     'license': 'LGPL-3', | |||
|     'installable': True, | |||
|     'auto_install': False, | |||
|     'application': False, | |||
| } | |||
| 
 | |||
| @ -0,0 +1,6 @@ | |||
| ## Module <product_variant_import> | |||
| 
 | |||
| #### 27.08.2024 | |||
| #### Version 15.0.1.0.0 | |||
| ##### ADD | |||
| - Initial commit for Import Product variant | |||
| 
 | 
| @ -0,0 +1,13 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <odoo> | |||
|     <!--Product variant Import/Export user group--> | |||
|     <record model="ir.module.category" id="product_variant_import_module_management"> | |||
|         <field name="name">Import</field> | |||
|         <field name="description">Import Product Variant</field> | |||
|         <field name="sequence">10</field> | |||
|     </record> | |||
|     <record id="product_variant_access" model="res.groups"> | |||
|         <field name="name">Variant Manager</field> | |||
|         <field name="category_id" ref="product_variant_import_module_management"/> | |||
|     </record> | |||
| </odoo> | |||
| After Width: | Height: | Size: 3.6 KiB | 
| After Width: | Height: | Size: 310 B | 
| After Width: | Height: | Size: 1.3 KiB | 
| After Width: | Height: | Size: 1.4 KiB | 
| After Width: | Height: | Size: 576 B | 
| After Width: | Height: | Size: 733 B | 
| After Width: | Height: | Size: 911 B | 
| After Width: | Height: | Size: 1.1 KiB | 
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 3.4 KiB | 
| After Width: | Height: | Size: 673 B | 
| After Width: | Height: | Size: 878 B | 
| After Width: | Height: | Size: 653 B | 
| After Width: | Height: | Size: 905 B | 
| After Width: | Height: | Size: 839 B | 
| After Width: | Height: | Size: 427 B | 
| After Width: | Height: | Size: 627 B | 
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 988 B | 
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 1.5 KiB | 
| After Width: | Height: | Size: 1.1 KiB | 
| After Width: | Height: | Size: 1.9 KiB | 
| After Width: | Height: | Size: 1.1 KiB | 
| After Width: | Height: | Size: 2.1 KiB | 
| After Width: | Height: | Size: 4.4 KiB | 
| After Width: | Height: | Size: 589 B | 
| After Width: | Height: | Size: 3.4 KiB | 
| After Width: | Height: | Size: 1.7 KiB | 
| After Width: | Height: | Size: 2.3 KiB | 
| After Width: | Height: | Size: 967 B | 
| After Width: | Height: | Size: 1.6 KiB | 
| After Width: | Height: | Size: 3.8 KiB | 
| After Width: | Height: | Size: 5.0 KiB | 
| After Width: | Height: | Size: 59 KiB | 
| After Width: | Height: | Size: 60 KiB | 
| After Width: | Height: | Size: 60 KiB | 
| After Width: | Height: | Size: 60 KiB | 
| After Width: | Height: | Size: 56 KiB | 
| After Width: | Height: | Size: 58 KiB | 
| After Width: | Height: | Size: 119 KiB | 
| After Width: | Height: | Size: 111 KiB | 
| After Width: | Height: | Size: 15 KiB | 
| After Width: | Height: | Size: 22 KiB | 
| After Width: | Height: | Size: 43 KiB | 
| After Width: | Height: | Size: 44 KiB | 
| After Width: | Height: | Size: 41 KiB | 
| After Width: | Height: | Size: 64 KiB | 
| After Width: | Height: | Size: 96 KiB | 
| After Width: | Height: | Size: 22 KiB | 
| After Width: | Height: | Size: 23 KiB | 
| After Width: | Height: | Size: 18 KiB | 
| After Width: | Height: | Size: 47 KiB | 
| After Width: | Height: | Size: 9.6 KiB | 
| @ -0,0 +1,639 @@ | |||
| <div class="container" style="padding: 1rem !important; margin-bottom: 1rem !important;"> | |||
|     <div class="row"> | |||
|         <div class="col-sm-12 col-md-12 col-lg-12 d-flex justify-content-between" | |||
|             style="border-bottom: 1px solid #d5d5d5;"> | |||
|             <div class="my-3"> | |||
|                 <img src="./assets/icons/logo.png" style="width: auto !important; height: 40px !important;"> | |||
|             </div> | |||
|             <div class="my-3 d-flex align-items-center"> | |||
|                 <div | |||
|                     style="background-color: #7C7BAD !important; color: #fff !important; font-weight: 600 !important; padding: 5px 15px 8px !important; margin: 0 5px !important;"> | |||
|                     <i class="fa fa-check mr-1"></i>Community | |||
|                 </div> | |||
|                 <div | |||
|                     style="background-color: #875A7B !important; color: #fff !important; font-weight: 600 !important; padding: 5px 15px 8px !important; margin: 0 5px !important;"> | |||
|                     <i class="fa fa-check mr-1"></i>Enterprise | |||
|                 </div> | |||
| 
 | |||
|             </div> | |||
|         </div> | |||
|     </div> | |||
| </div> | |||
| 
 | |||
| <div class="container" style="padding: 0rem 1.5rem 4rem !important"> | |||
|     <div class="row" style="height: 900px !important;"> | |||
|         <div class="col-sm-12 col-md-12 col-lg-12" | |||
|             style="padding: 4rem 1rem !important; background-color: #714B67 !important; height: 600px !important; border-radius: 20px !important;"> | |||
|             <h1 | |||
|                 style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #FFFFFF !important;  font-size: 3.3rem !important; text-align: center !important;"> | |||
|                 Import Product Variant</h1> | |||
|             <p | |||
|                 style="font-family: 'Montserrat', sans-serif !important; font-weight: 300 !important; color: #FFFFFF !important;  font-size: 1.4rem !important; text-align: center !important;"> | |||
|                 This Module Is Helps To Import Product And Product Variants. | |||
|             </p> | |||
|             <img src="./assets/screenshots/hero.gif" class="img-responsive" width="100%" height="auto" /> | |||
|         </div> | |||
|     </div> | |||
| 
 | |||
|     <div class="row"> | |||
|         <div class="col-md-12" style="border-bottom: 1px solid #d5d5d5 !important; margin-bottom: 2rem !important"> | |||
|             <h2 | |||
|                 style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.5rem !important;"> | |||
|                 <i class="fa fa-compass mr-2"></i>Explore this module | |||
|             </h2> | |||
|         </div> | |||
|         <div class="col-md-6"> | |||
|             <a href="#overview" style="text-decoration: none !important;"> | |||
|                 <div class="row" | |||
|                     style="background-color: #f5f2f5 !important; border-radius: 10px !important; margin: 1rem !important; padding: 1.5em !important; height: 100px !important;"> | |||
|                     <div class="col-8"> | |||
|                         <h3 | |||
|                             style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.2rem !important;"> | |||
|                             Overview</h3> | |||
|                         <p | |||
|                             style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #714B67 !important; font-size: 0.9rem !important;"> | |||
|                             Learn more about this module</p> | |||
|                     </div> | |||
|                     <div class="col-4 text-right d-flex justify-content-end align-items-center"> | |||
|                         <i class="fa fa-chevron-right" style="color: #714B67 !important;"></i> | |||
|                     </div> | |||
|                 </div> | |||
|             </a> | |||
|         </div> | |||
|         <div class="col-md-6"> | |||
|             <a href="#features" style="text-decoration: none !important;"> | |||
|                 <div class="row" | |||
|                     style="background-color: #f5f2f5 !important; border-radius: 10px !important; margin: 1rem !important; padding: 1.5em !important; height: 100px !important;"> | |||
|                     <div class="col-8"> | |||
|                         <h3 | |||
|                             style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.2rem !important;"> | |||
|                             Features</h3> | |||
|                         <p | |||
|                             style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #714B67 !important; font-size: 0.9rem !important;"> | |||
|                             View features of this module</p> | |||
|                     </div> | |||
|                     <div class="col-4 text-right d-flex justify-content-end align-items-center"> | |||
|                         <i class="fa fa-chevron-right" style="color: #714B67 !important;"></i> | |||
|                     </div> | |||
|                 </div> | |||
|             </a> | |||
|         </div> | |||
|         <div class="col-md-6"> | |||
|             <a href="#screenshots" style="text-decoration: none !important;"> | |||
|                 <div class="row" | |||
|                     style="background-color: #f5f2f5 !important; border-radius: 10px !important; margin: 1rem !important; padding: 1.5em !important; height: 100px !important;"> | |||
|                     <div class="col-8"> | |||
|                         <h3 | |||
|                             style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.2rem !important;"> | |||
|                             Screenshots</h3> | |||
|                         <p | |||
|                             style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #714B67 !important; font-size: 0.9rem !important;"> | |||
|                             See key screenshots of this module</p> | |||
|                     </div> | |||
|                     <div class="col-4 text-right d-flex justify-content-end align-items-center"> | |||
|                         <i class="fa fa-chevron-right" style="color: #714B67 !important;"></i> | |||
|                     </div> | |||
|                 </div> | |||
|             </a> | |||
|         </div> | |||
|     </div> | |||
| 
 | |||
| 
 | |||
|     <div class="row" id="overview"> | |||
|         <div class="col-md-12" style="border-bottom: 1px solid #d5d5d5 !important; margin: 2rem 0 !important"> | |||
|             <h2 | |||
|                 style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.5rem !important;"> | |||
|                 <i class="fa fa-pie-chart mr-2"></i>Overview | |||
|             </h2> | |||
|         </div> | |||
| 
 | |||
|         <div class="col-mg-12 pl-3"> | |||
|             <p | |||
|                 style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important; line-height: 30px !important;"> | |||
|                 This module is used to import the product and their attributes using | |||
|                 xlsx file and csv file. And also through these files with product | |||
|                 importing we can also import some | |||
|                 basic fields such as char, many2one and many2many fields.Using this | |||
|                 module we can update a product using the product's internal | |||
|                 reference or barcode we can change the date through the importing | |||
|                 and also these can be implemented using the two files. | |||
|         </div> | |||
|     </div> | |||
| 
 | |||
| <!-- FEATURES SECTION --> | |||
| 
 | |||
|     <div class="d-flex align-items-center" | |||
|      style="border-bottom: 2px solid #714B67; padding: 15px 0px;" | |||
|      id="features"> | |||
|     <div class="d-flex justify-content-center align-items-center mr-2" | |||
|          style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> | |||
|         <img src="./assets/misc/features.png"/> | |||
|     </div> | |||
|     <h2 class="mt-2" | |||
|         style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> | |||
|         Features | |||
|     </h2> | |||
| </div> | |||
|     <div class="row" | |||
|      style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;"> | |||
|     <div class="col-sm-12 col-md-6"> | |||
| 
 | |||
|         <div class="d-flex flex-column justify-content-center align-items-start" | |||
|              style="margin-top: 40px; margin-bottom: 40px"> | |||
|             <img src="./assets/misc/check-box.png" class="mr-2"/> | |||
|             <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | |||
|                     You can or update product variants by barcode & internal reference. </span> | |||
|         </div> | |||
|         <div class="d-flex flex-column justify-content-center align-items-start" | |||
|              style="margin-top: 30px; margin-bottom: 30px"> | |||
|             <img src="./assets/misc/check-box.png" class="mr-2"/> | |||
|             <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">You can import product images by image URL or local image path</span> | |||
|         </div> | |||
|         <div class="d-flex flex-column justify-content-center align-items-start" | |||
|              style="margin-top: 30px; margin-bottom: 30px"> | |||
|             <img src="./assets/misc/check-box.png" class="mr-2"/> | |||
|             <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | |||
|                 Easy to create and update product variants.</span> | |||
|         </div> | |||
|         <div class="d-flex flex-column justify-content-center align-items-start" | |||
|              style="margin-top: 30px; margin-bottom: 30px"> | |||
|             <img src="./assets/misc/check-box.png" class="mr-2"/> | |||
|             <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | |||
|                 Easy to import custom fields with product variants.</span> | |||
|         </div> | |||
|         <div class="d-flex flex-column justify-content-center align-items-start" | |||
|              style="margin-top: 30px; margin-bottom: 30px"> | |||
|             <img src="./assets/misc/check-box.png" class="mr-2"/> | |||
|             <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | |||
|                 Easy to import Product Variant (image, price, invoicing type, product type etc.) from CSV or Excel.</span> | |||
|         </div> | |||
|         <div class="d-flex flex-column justify-content-center align-items-start" | |||
|              style="margin-top: 30px; margin-bottom: 30px"> | |||
|             <img src="./assets/misc/check-box.png" class="mr-2"/> | |||
|             <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | |||
|                 Useful for mass records.</span> | |||
|         </div> | |||
|     </div> | |||
| </div> | |||
| <!-- END OF FEATURES SECTION --> | |||
| 
 | |||
| <div class="d-flex flex-column justify-content-center align-items-start" | |||
|          style="margin-top: 40px; margin-bottom: 40px"> | |||
|         <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | |||
|                    An example template for a xlsx file is at this path.: | |||
|                 product_variant_import/static/test_files/product_test.xlsx</span> | |||
|     </div> | |||
| 
 | |||
| <!-- SCREENSHOTS SECTION --> | |||
| <div class="d-flex align-items-center" | |||
|      style="border-bottom: 2px solid #714B67; padding: 15px 0px;" | |||
|      id="screenshots"> | |||
|     <div class="d-flex justify-content-center align-items-center mr-2" | |||
|          style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> | |||
|         <img src="./assets/misc/pictures.png"/> | |||
|     </div> | |||
|     <h2 class="mt-2" | |||
|         style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> | |||
|         Screenshots | |||
|     </h2> | |||
| </div> | |||
| <div class="row"> | |||
|     <div class="col-sm-12"> | |||
| 
 | |||
|         <div style="display: block; margin: 30px auto;"> | |||
|             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | |||
|                 Set the user access.</h3> | |||
|             <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"></p> | |||
|             <img src="./assets/screenshots/image1.png" | |||
|                  class="img-thumbnail"> | |||
|         </div> | |||
|         <div style="display: block; margin: 30px auto;"> | |||
|             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | |||
|                 Import menu in the sales module under the product tab.</h3> | |||
|             <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"></p> | |||
|             <img src="./assets/screenshots/image2.png" | |||
|                  class="img-thumbnail"> | |||
|         </div> | |||
| 
 | |||
|         <div style="display: block; margin: 30px auto;"> | |||
|             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | |||
|                 Sample example of csv file.</h3> | |||
|             <img src="./assets/screenshots/image7.png" | |||
|                  class="img-thumbnail"> | |||
|             <img src="./assets/screenshots/image8.png" | |||
|                  class="img-thumbnail"> | |||
|         </div> | |||
| 
 | |||
|         <div style="display: block; margin: 30px auto;"> | |||
|             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | |||
|                 Upload csv/xlsx file to create the product with | |||
|                 variants.</h3> | |||
|             <img src="./assets/screenshots/image3.png" | |||
|                  class="img-thumbnail"> | |||
|         </div> | |||
| 
 | |||
|         <div style="display: block; margin: 30px auto;"> | |||
|             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | |||
|                 Sample example of xlsx file.</h3> | |||
|             <img src="./assets/screenshots/image9.png" | |||
|                  class="img-thumbnail"> | |||
|             <img src="./assets/screenshots/image10.png" | |||
|                  class="img-thumbnail"> | |||
|             <img src="./assets/screenshots/image12.png" | |||
|                  class="img-thumbnail"> | |||
|         </div> | |||
| 
 | |||
|         <div style="display: block; margin: 30px auto;"> | |||
|             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | |||
|                 Upload you csv/xlsx file to create/update the product with | |||
|                 variants.</h3> | |||
|             <img src="./assets/screenshots/image4.png" | |||
|                  class="img-thumbnail"> | |||
|         </div> | |||
| 
 | |||
|         <div style="display: block; margin: 30px auto;"> | |||
|             <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> | |||
|                 Imported product with image.</h3> | |||
|             <img src="./assets/screenshots/image5.png" | |||
|                  class="img-thumbnail"> | |||
|         </div> | |||
|     </div> | |||
| </div> | |||
| <!-- END OF SCREENSHOTS SECTION --> | |||
| 
 | |||
|     <!-- SUGGESTED PRODUCTS --> | |||
|     <div class="row"> | |||
|         <div class="col-lg-12 d-flex flex-column justify-content-center" | |||
|             style="text-align: center; padding: 2.5rem 1rem !important;"> | |||
|             <h2 style="color: #212529 !important;">Suggested Products</h2> | |||
|             <hr | |||
|                 style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 80px !important; margin-bottom: 2rem !important;" /> | |||
| 
 | |||
|             <div id="demo1" class="row carousel slide" data-ride="carousel"> | |||
|                 <!-- The slideshow --> | |||
|                 <div class="carousel-inner"> | |||
|                     <div class="carousel-item active" style="min-height:0px"> | |||
|                         <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | |||
|                             <a href="https://apps.odoo.com/apps/modules/15.0/export_stockinfo_xls/" target="_blank"> | |||
|                                 <div style="border-radius:10px"> | |||
|                                     <img class="img img-responsive center-block" | |||
|                                         style="border-top-left-radius:10px; border-top-right-radius:10px" | |||
|                                         src="./assets/modules/export_image.png"> | |||
|                                 </div> | |||
|                             </a> | |||
|                         </div> | |||
|                         <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | |||
|                             <a href="https://apps.odoo.com/apps/modules/15.0/custom_gantt_view/" target="_blank"> | |||
|                                 <div style="border-radius:10px"> | |||
|                                     <img class="img img-responsive center-block" | |||
|                                         style="border-top-left-radius:10px; border-top-right-radius:10px" | |||
|                                         src="./assets/modules/gantt_image.png"> | |||
|                                 </div> | |||
|                             </a> | |||
|                         </div> | |||
|                         <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | |||
|                             <a href="https://apps.odoo.com/apps/modules/15.0/sales_credit_limit/" target="_blank"> | |||
|                                 <div style="border-radius:10px"> | |||
|                                     <img class="img img-responsive center-block" | |||
|                                         style="border-top-left-radius:10px; border-top-right-radius:10px" | |||
|                                         src="./assets/modules/credit_image.png"> | |||
|                                 </div> | |||
|                             </a> | |||
|                         </div> | |||
|                     </div> | |||
|                     <div class="carousel-item" style="min-height:0px"> | |||
|                         <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | |||
|                             <a href="https://apps.odoo.com/apps/modules/15.0/base_account_budget/" target="_blank"> | |||
|                                 <div style="border-radius:10px"> | |||
|                                     <img class="img img-responsive center-block" | |||
|                                         style="border-top-left-radius:10px; border-top-right-radius:10px" | |||
|                                         src="./assets/modules/budget_image.png"> | |||
|                                 </div> | |||
|                             </a> | |||
|                         </div> | |||
|                         <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | |||
|                             <a href="https://apps.odoo.com/apps/modules/15.0/product_to_quotation/" target="_blank"> | |||
|                                 <div style="border-radius:10px"> | |||
|                                     <img class="img img-responsive center-block" | |||
|                                         style="border-top-left-radius:10px; border-top-right-radius:10px" | |||
|                                         src="./assets/modules/quotation_image.png"> | |||
|                                 </div> | |||
|                             </a> | |||
|                         </div> | |||
|                         <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> | |||
|                             <a href="https://apps.odoo.com/apps/modules/15.0/employee_documents_expiry/" | |||
|                                 target="_blank"> | |||
|                                 <div style="border-radius:10px"> | |||
|                                     <img class="img img-responsive center-block" | |||
|                                         style="border-top-left-radius:10px; border-top-right-radius:10px" | |||
|                                         src="./assets/modules/employee_image.png"> | |||
|                                 </div> | |||
|                             </a> | |||
|                         </div> | |||
|                     </div> | |||
|                 </div> | |||
|                 <!-- Left and right controls --> | |||
|                 <a class="carousel-control-prev" href="#demo1" data-slide="prev" | |||
|                     style="left:-25px;width: 35px;color: #000;"> <span class="carousel-control-prev-icon"><i | |||
|                             class="fa fa-chevron-left" style="font-size:24px"></i></span> </a> <a | |||
|                     class="carousel-control-next" href="#demo1" data-slide="next" | |||
|                     style="right:-25px;width: 35px;color: #000;"> | |||
|                     <span class="carousel-control-next-icon"><i class="fa fa-chevron-right" | |||
|                             style="font-size:24px"></i></span> | |||
|                 </a> | |||
|             </div> | |||
|         </div> | |||
|     </div> | |||
|     <!-- END OF SUGGESTED PRODUCTS --> | |||
| 
 | |||
|     <!-- OUR SERVICES --> | |||
|     <section class="container" style="margin-top: 6rem !important;"> | |||
|         <div class="row"> | |||
|             <div class="col-lg-12 d-flex flex-column justify-content-center align-items-center"> | |||
|                 <h2 style="color: #212529 !important;">Our Services</h2> | |||
|                 <hr | |||
|                     style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 80px !important; margin-bottom: 2rem !important;" /> | |||
|             </div> | |||
| 
 | |||
|             <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | |||
|                 <div class="d-flex justify-content-center align-items-center mx-3 my-3" | |||
|                     style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | |||
|                     <img src="assets/icons/cogs.png" class="img-responsive" height="48px" width="48px"> | |||
|                 </div> | |||
|                 <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | |||
|                     Odoo | |||
|                     Customization</h6> | |||
|             </div> | |||
| 
 | |||
|             <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | |||
|                 <div class="d-flex justify-content-center align-items-center mx-3 my-3" | |||
|                     style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;"> | |||
|                     <img src="assets/icons/wrench.png" class="img-responsive" height="48px" width="48px"> | |||
|                 </div> | |||
|                 <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | |||
|                     Odoo | |||
|                     Implementation</h6> | |||
|             </div> | |||
| 
 | |||
|             <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | |||
|                 <div class="d-flex justify-content-center align-items-center mx-3 my-3" | |||
|                     style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;"> | |||
|                     <img src="assets/icons/lifebuoy.png" class="img-responsive" height="48px" width="48px"> | |||
|                 </div> | |||
|                 <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | |||
|                     Odoo | |||
|                     Support</h6> | |||
|             </div> | |||
| 
 | |||
| 
 | |||
|             <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | |||
|                 <div class="d-flex justify-content-center align-items-center mx-3 my-3" | |||
|                     style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | |||
|                     <img src="assets/icons/user.png" class="img-responsive" height="48px" width="48px"> | |||
|                 </div> | |||
|                 <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | |||
|                     Hire | |||
|                     Odoo | |||
|                     Developer</h6> | |||
|             </div> | |||
| 
 | |||
|             <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | |||
|                 <div class="d-flex justify-content-center align-items-center mx-3 my-3" | |||
|                     style="background-color: #54a0ff  !important; border-radius: 15px !important; height: 80px; width: 80px;"> | |||
|                     <img src="assets/icons/puzzle.png" class="img-responsive" height="48px" width="48px"> | |||
|                 </div> | |||
|                 <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | |||
|                     Odoo | |||
|                     Integration</h6> | |||
|             </div> | |||
| 
 | |||
|             <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | |||
|                 <div class="d-flex justify-content-center align-items-center mx-3 my-3" | |||
|                     style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | |||
|                     <img src="assets/icons/update.png" class="img-responsive" height="48px" width="48px"> | |||
|                 </div> | |||
|                 <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | |||
|                     Odoo | |||
|                     Migration</h6> | |||
|             </div> | |||
| 
 | |||
| 
 | |||
|             <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | |||
|                 <div class="d-flex justify-content-center align-items-center mx-3 my-3" | |||
|                     style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | |||
|                     <img src="assets/icons/consultation.png" class="img-responsive" height="48px" width="48px"> | |||
|                 </div> | |||
|                 <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | |||
|                     Odoo | |||
|                     Consultancy</h6> | |||
|             </div> | |||
| 
 | |||
|             <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | |||
|                 <div class="d-flex justify-content-center align-items-center mx-3 my-3" | |||
|                     style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | |||
|                     <img src="assets/icons/training.png" class="img-responsive" height="48px" width="48px"> | |||
|                 </div> | |||
|                 <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | |||
|                     Odoo | |||
|                     Implementation</h6> | |||
|             </div> | |||
| 
 | |||
|             <div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> | |||
|                 <div class="d-flex justify-content-center align-items-center mx-3 my-3" | |||
|                     style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;"> | |||
|                     <img src="assets/icons/license.png" class="img-responsive" height="48px" width="48px"> | |||
|                 </div> | |||
|                 <h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> | |||
|                     Odoo | |||
|                     Licensing Consultancy</h6> | |||
|             </div> | |||
|         </div> | |||
|     </section> | |||
|     <!-- END OF OUR SERVICES --> | |||
| 
 | |||
|     <!-- OUR INDUSTRIES --> | |||
|     <section class="container" style="margin-top: 6rem !important;"> | |||
|         <div class="row"> | |||
|             <div class="col-lg-12 d-flex flex-column justify-content-center align-items-center"> | |||
|                 <h2 style="color: #212529 !important;">Our Industries</h2> | |||
|                 <hr | |||
|                     style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 80px !important; margin-bottom: 2rem !important;" /> | |||
|             </div> | |||
| 
 | |||
|             <div class="col-lg-3"> | |||
|                 <div class="my-4 d-flex flex-column justify-content-center" | |||
|                     style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | |||
|                     <img src="./assets/icons/trading-black.png" class="img-responsive mb-3" height="48px" width="48px"> | |||
|                     <h5 | |||
|                         style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | |||
|                         Trading | |||
|                     </h5> | |||
|                     <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | |||
|                         Easily procure | |||
|                         and | |||
|                         sell your products</p> | |||
|                 </div> | |||
|             </div> | |||
| 
 | |||
|             <div class="col-lg-3"> | |||
|                 <div class="my-4 d-flex flex-column justify-content-center" | |||
|                     style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | |||
|                     <img src="./assets/icons/pos-black.png" class="img-responsive mb-3" height="48px" width="48px"> | |||
|                     <h5 | |||
|                         style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | |||
|                         POS | |||
|                     </h5> | |||
|                     <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | |||
|                         Easy | |||
|                         configuration | |||
|                         and convivial experience</p> | |||
|                 </div> | |||
|             </div> | |||
| 
 | |||
|             <div class="col-lg-3"> | |||
|                 <div class="my-4 d-flex flex-column justify-content-center" | |||
|                     style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | |||
|                     <img src="./assets/icons/education-black.png" class="img-responsive mb-3" height="48px" | |||
|                         width="48px"> | |||
|                     <h5 | |||
|                         style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | |||
|                         Education | |||
|                     </h5> | |||
|                     <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | |||
|                         A platform for | |||
|                         educational management</p> | |||
|                 </div> | |||
|             </div> | |||
| 
 | |||
|             <div class="col-lg-3"> | |||
|                 <div class="my-4 d-flex flex-column justify-content-center" | |||
|                     style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | |||
|                     <img src="./assets/icons/manufacturing-black.png" class="img-responsive mb-3" height="48px" | |||
|                         width="48px"> | |||
|                     <h5 | |||
|                         style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | |||
|                         Manufacturing | |||
|                     </h5> | |||
|                     <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | |||
|                         Plan, track and | |||
|                         schedule your operations</p> | |||
|                 </div> | |||
|             </div> | |||
| 
 | |||
|             <div class="col-lg-3"> | |||
|                 <div class="my-4 d-flex flex-column justify-content-center" | |||
|                     style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | |||
|                     <img src="./assets/icons/ecom-black.png" class="img-responsive mb-3" height="48px" width="48px"> | |||
|                     <h5 | |||
|                         style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | |||
|                         E-commerce & Website | |||
|                     </h5> | |||
|                     <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | |||
|                         Mobile | |||
|                         friendly, | |||
|                         awe-inspiring product pages</p> | |||
|                 </div> | |||
|             </div> | |||
| 
 | |||
|             <div class="col-lg-3"> | |||
|                 <div class="my-4 d-flex flex-column justify-content-center" | |||
|                     style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | |||
|                     <img src="./assets/icons/service-black.png" class="img-responsive mb-3" height="48px" width="48px"> | |||
|                     <h5 | |||
|                         style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | |||
|                         Service Management | |||
|                     </h5> | |||
|                     <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | |||
|                         Keep track of | |||
|                         services and invoice</p> | |||
|                 </div> | |||
|             </div> | |||
| 
 | |||
|             <div class="col-lg-3"> | |||
|                 <div class="my-4 d-flex flex-column justify-content-center" | |||
|                     style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | |||
|                     <img src="./assets/icons/restaurant-black.png" class="img-responsive mb-3" height="48px" | |||
|                         width="48px"> | |||
|                     <h5 | |||
|                         style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | |||
|                         Restaurant | |||
|                     </h5> | |||
|                     <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | |||
|                         Run your bar or | |||
|                         restaurant methodically</p> | |||
|                 </div> | |||
|             </div> | |||
| 
 | |||
|             <div class="col-lg-3"> | |||
|                 <div class="my-4 d-flex flex-column justify-content-center" | |||
|                     style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;"> | |||
|                     <img src="./assets/icons/hotel-black.png" class="img-responsive mb-3" height="48px" width="48px"> | |||
|                     <h5 | |||
|                         style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> | |||
|                         Hotel Management | |||
|                     </h5> | |||
|                     <p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> | |||
|                         An | |||
|                         all-inclusive | |||
|                         hotel management application</p> | |||
|                 </div> | |||
|             </div> | |||
| 
 | |||
|         </div> | |||
|     </section> | |||
| 
 | |||
|     <!-- END OF OUR INDUSTRIES --> | |||
| 
 | |||
|     <!-- FOOTER --> | |||
|     <!-- Footer Section --> | |||
|     <section class="container" style="margin: 5rem auto 2rem;"> | |||
|         <div class="row" style="max-width:1540px;"> | |||
|             <div class="col-lg-12 d-flex flex-column justify-content-center align-items-center"> | |||
|                 <h2 style="color: #212529 !important;">Need Help?</h2> | |||
|                 <hr | |||
|                     style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 80px !important; margin-bottom: 2rem !important;" /> | |||
|             </div> | |||
|         </div> | |||
| 
 | |||
|         <!-- Contact Cards --> | |||
|         <div class="row d-flex justify-content-center align-items-center" | |||
|             style="max-width:1540px; margin: 0 auto 2rem auto;"> | |||
| 
 | |||
|             <div class="col-lg-12" style="padding: 0rem 3rem 2rem; border-radius: 10px; margin-right: 3rem; "> | |||
| 
 | |||
|                 <div class="row mt-4"> | |||
|                     <div class="col-lg-6"> | |||
|                         <a href="mailto:odoo@cybrosys.com" target="_blank" class="btn btn-block mb-2 deep_hover" | |||
|                             style="text-decoration: none;  background-color: #4d4d4d; color: #FFF;  border-radius: 4px;"><i | |||
|                                 class="fa fa-envelope mr-2"></i>odoo@cybrosys.com</a> | |||
|                     </div> | |||
|                     <div class="col-lg-6"> | |||
|                         <a href="https://api.whatsapp.com/send?phone=918606827707" target="_blank" | |||
|                             class="btn btn-block mb-2 deep_hover" | |||
|                             style="text-decoration: none;  background-color: #25D366; color: #FFF;  border-radius: 4px;"><i | |||
|                                 class="fa fa-whatsapp mr-2"></i>+91 86068 27707</a> | |||
|                     </div> | |||
|                 </div> | |||
|             </div> | |||
| 
 | |||
|         </div> | |||
|         <!-- End of Contact Cards --> | |||
|     </section> | |||
|     <!-- Footer --> | |||
|     <section class="oe_container" style="padding: 2rem 3rem 1rem;"> | |||
|         <div class="row" style="max-width:1540px; margin: 0 auto; margin-right: 3rem; "> | |||
|             <!-- Logo --> | |||
|             <div class="col-lg-12 d-flex justify-content-center align-items-center" style="margin-top: 3rem;"> | |||
|                 <img src="https://www.cybrosys.com/images/logo.png" width="200px" height="auto" /> | |||
|             </div> | |||
|             <!-- End of Logo --> | |||
|             <div class="col-lg-12"> | |||
|                 <hr | |||
|                     style="margin-top: 3rem;background: linear-gradient(90deg, rgba(2,0,36,0) 0%, rgba(229,229,229,1) 33%, rgba(229,229,229,1) 58%, rgba(0,212,255,0) 100%); height: 2px; border-style: none;"> | |||
|                 <!-- End of Footer Section --> | |||
|             </div> | |||
|         </div> | |||
|     </section> | |||
|     <!-- END OF FOOTER --> | |||
| 
 | |||
| </div> | |||
| @ -0,0 +1,23 @@ | |||
| """Import product variant""" | |||
| # -*- coding: utf-8 -*- | |||
| ############################################################################# | |||
| # | |||
| #    Cybrosys Technologies Pvt. Ltd. | |||
| # | |||
| #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | |||
| #    Author: Cybrosys Techno Solutions(<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 import_product_variant | |||
| @ -0,0 +1,632 @@ | |||
| """"Import product variant""" | |||
| # -*- coding: utf-8 -*- | |||
| ############################################################################# | |||
| # | |||
| #    Cybrosys Technologies Pvt. Ltd. | |||
| # | |||
| #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | |||
| #    Author: Cybrosys Techno Solutions(<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 os | |||
| import base64, binascii, csv, io, tempfile, requests, xlrd | |||
| from odoo import fields, models, _ | |||
| from odoo.exceptions import UserError | |||
| 
 | |||
| 
 | |||
| class ImportVariant(models.TransientModel): | |||
|     """Wizard for selecting the imported Files""" | |||
|     _name = 'import.product.variant' | |||
|     _description = "Import Product Variants" | |||
| 
 | |||
|     import_file = fields.Selection( | |||
|         [('csv', 'CSV File'), ('excel', 'Excel File')], required=True, | |||
|         string="Import FIle", help="Import the files") | |||
|     method = fields.Selection([('create', 'Create Product'), | |||
|                                ('update', 'Update Product'), ( | |||
|                                    'update_product', | |||
|                                    'Update Product Variant'), ], | |||
|                               string="Method", required=True, | |||
|                               help="Method for importing/Exporting") | |||
|     file = fields.Binary(string="File", required=True, | |||
|                          help="The file to upload") | |||
| 
 | |||
|     def action_import_product_variant(self): | |||
|         """This is used to import/export the product """ | |||
|         try: | |||
|             global list, detailed, invoicing_type | |||
|             link = False | |||
|             if self.import_file == 'excel': | |||
|                 try: | |||
|                     file_pointer = tempfile.NamedTemporaryFile(delete=False, | |||
|                                                                suffix=".xlsx") | |||
|                     file_pointer.write(binascii.a2b_base64(self.file)) | |||
|                     file_pointer.seek(0) | |||
|                     workbook = xlrd.open_workbook(file_pointer.name) | |||
|                     sheet = workbook.sheet_by_index(0) | |||
|                 except: | |||
|                     raise UserError(_("File not Valid")) | |||
|                 for rec in range(sheet.nrows): | |||
|                     if rec >= 1: | |||
|                         row_vals = sheet.row_values(rec) | |||
|                         if len(row_vals) < int(24): | |||
|                             raise UserError( | |||
|                                 _("Please ensure that you selected " | |||
|                                   "the correct file")) | |||
|                         product_category = self.env['product.category'].search( | |||
|                             [('complete_name', '=', row_vals[6])]).id | |||
|                         if product_category: | |||
|                             category = product_category | |||
|                         else: | |||
|                             category = self.env['product.category'].create({ | |||
|                                 'name': row_vals[6].split('/')[0], | |||
|                                 'complete_name': row_vals[6] | |||
|                             }) | |||
|                             category = category.id | |||
|                         product_uom = self.env['uom.uom'].search( | |||
|                             [('name', '=', row_vals[7])]).id | |||
|                         if product_uom: | |||
|                             uom = product_uom | |||
|                         else: | |||
|                             raise UserError(_("Invalid uom")) | |||
|                         pro_uom = self.env['uom.uom'].search( | |||
|                             [('name', '=', row_vals[8])]).id | |||
|                         if pro_uom: | |||
|                             po_uom = pro_uom | |||
|                         else: | |||
|                             raise UserError(_("Invalid Purchase uom")) | |||
|                         account_tax = self.env['account.tax'].search( | |||
|                             [('name', '=', row_vals[9])]).id | |||
|                         supp_tax = self.env['account.tax'].search( | |||
|                             [('name', '=', row_vals[10])]).id | |||
|                         if account_tax: | |||
|                             tax = account_tax | |||
|                         else: | |||
|                             account = self.env['account.tax'].create({ | |||
|                                 'name': row_vals[9].split(' ')[0], | |||
|                                 'amount': row_vals[9].split(' ')[1], | |||
|                             }) | |||
|                             tax = account.id | |||
|                         if supp_tax: | |||
|                             supplier_tax = supp_tax | |||
|                         else: | |||
|                             supplier_account_tax = self.env[ | |||
|                                 'account.tax'].create({ | |||
|                                 'name': row_vals[10].split(' ')[0], | |||
|                                 'amount': row_vals[10].split(' ')[1], | |||
|                             }) | |||
|                             supplier_tax = supplier_account_tax.id | |||
|                         kay_val_dict = dict( | |||
|                             self.env['product.template']._fields[ | |||
|                                 'detailed_type'].selection) | |||
|                         # here 'type' is field name | |||
|                         for key, val in kay_val_dict.items(): | |||
|                             if val == row_vals[5]: | |||
|                                 detailed = key | |||
|                         kay_val_dict = dict( | |||
|                             self.env['product.template']._fields[ | |||
|                                 'invoice_policy'].selection) | |||
|                         # here 'type' is field name | |||
|                         for key, val in kay_val_dict.items(): | |||
|                             if val == row_vals[12]: | |||
|                                 invoicing_type = key | |||
|                         if "http://" in row_vals[23] or "https://" in row_vals[ | |||
|                             23]: | |||
|                             link = base64.b64encode( | |||
|                                 requests.get( | |||
|                                     row_vals[23].strip()).content).replace( | |||
|                                 b"\n", b"") | |||
|                         elif "/home" in row_vals[23]: | |||
|                             if os.path.exists(row_vals[23]): | |||
|                                 with open(row_vals[23], 'rb') as image_file: | |||
|                                     link = base64.b64encode(image_file.read()) | |||
|                         if not row_vals[2] or not row_vals[18]: | |||
|                             raise UserError(_("File Must  Contain Internal " | |||
|                                               "Reference or Barcode of the " | |||
|                                               "Product")) | |||
|                         if self.method == 'update': | |||
|                             vals = { | |||
|                                 'default_code': row_vals[2], | |||
|                                 'name': row_vals[1], | |||
|                                 'image_1920': link, | |||
|                                 'sale_ok': row_vals[3], | |||
|                                 'purchase_ok': row_vals[4], | |||
|                                 'detailed_type': detailed, | |||
|                                 'categ_id': category, | |||
|                                 'uom_id': uom, | |||
|                                 'uom_po_id': po_uom, | |||
|                                 'taxes_id': [tax], | |||
|                                 'supplier_taxes_id': [supplier_tax], | |||
|                                 'description_sale': row_vals[11], | |||
|                                 'invoice_policy': invoicing_type, | |||
|                                 'list_price': row_vals[13], | |||
|                                 'standard_price': row_vals[14], | |||
|                                 'weight': row_vals[19], | |||
|                                 'volume': row_vals[20], | |||
|                             } | |||
|                             if link: | |||
|                                 vals.update({'image_1920': link}) | |||
|                             product = self.env['product.template'].search( | |||
|                                 [('barcode', '=', row_vals[18])]) | |||
|                             if product: | |||
|                                 product.write(vals) | |||
|                             else: | |||
|                                 product = self.env['product.template'].search( | |||
|                                     [('default_code', '=', row_vals[2])]) | |||
|                                 if product: | |||
|                                     product.write(vals) | |||
|                                 else: | |||
|                                     raise UserError( | |||
|                                         _("Please ensure that product " | |||
|                                               "having the" | |||
|                                               "contains Internal reference or " | |||
|                                               "Barcode to with your file")) | |||
|                         else: | |||
|                             if self.method == 'update_product': | |||
|                                 vals = { | |||
|                                     'default_code': row_vals[2], | |||
|                                     'name': row_vals[1], | |||
|                                     'image_1920': link, | |||
|                                     'sale_ok': row_vals[3], | |||
|                                     'purchase_ok': row_vals[4], | |||
|                                     'detailed_type': detailed, | |||
|                                     'categ_id': category, | |||
|                                     'uom_id': uom, | |||
|                                     'uom_po_id': po_uom, | |||
|                                     'taxes_id': [tax], | |||
|                                     'supplier_taxes_id': [supplier_tax], | |||
|                                     'description_sale': row_vals[11], | |||
|                                     'invoice_policy': invoicing_type, | |||
|                                     'lst_price': row_vals[13], | |||
|                                     'standard_price': row_vals[14], | |||
|                                     'weight': row_vals[19], | |||
|                                     'volume': row_vals[20], | |||
|                                 } | |||
|                                 if link: | |||
|                                     vals.update({'image_1920': link}) | |||
|                                 product = self.env['product.product'].search( | |||
|                                     [('barcode', '=', row_vals[18])]) | |||
|                                 if product: | |||
|                                     product.write(vals) | |||
|                                 else: | |||
|                                     product = self.env[ | |||
|                                         'product.product'].search( | |||
|                                         [('default_code', '=', row_vals[2])]) | |||
|                                     if product: | |||
|                                         product.write(vals) | |||
|                                     else: | |||
|                                         raise UserError( | |||
|                                             _("Please ensure that product " | |||
|                                               "having the" | |||
|                                               "contains Internal reference or " | |||
|                                               "Barcode to with your file.")) | |||
|                             else: | |||
|                                 vals = { | |||
|                                     'default_code': row_vals[2], | |||
|                                     'name': row_vals[1], | |||
|                                     'image_1920': link, | |||
|                                     'sale_ok': row_vals[3], | |||
|                                     'purchase_ok': row_vals[4], | |||
|                                     'detailed_type': detailed, | |||
|                                     'categ_id': category, | |||
|                                     'uom_id': uom, | |||
|                                     'uom_po_id': po_uom, | |||
|                                     'taxes_id': [tax], | |||
|                                     'supplier_taxes_id': [supplier_tax], | |||
|                                     'description_sale': row_vals[11], | |||
|                                     'invoice_policy': invoicing_type, | |||
|                                     'list_price': row_vals[13], | |||
|                                     'standard_price': row_vals[14], | |||
|                                     'weight': row_vals[19], | |||
|                                     'volume': row_vals[20], | |||
| 
 | |||
|                                 } | |||
|                                 product = self.env['product.template'].create( | |||
|                                     vals) | |||
|                         values = [] | |||
|                         for row_val in row_vals[15].split(','): | |||
|                             pr_attribute = self.env['product.attribute'].search( | |||
|                                 [('name', '=', row_val)]).id | |||
|                             if pr_attribute: | |||
|                                 attribute = pr_attribute | |||
|                             else: | |||
|                                 raise UserError( | |||
|                                     _("Please update a valid attribute and " | |||
|                                       "values")) | |||
|                             values.append({'attribute': attribute}) | |||
|                             for row in row_vals[16].split(','): | |||
|                                 attri_values = self.env[ | |||
|                                     'product.attribute.value'].search( | |||
|                                     [('attribute_id', '=', attribute), | |||
|                                      ('name', '=', row)]).ids | |||
|                                 if len(attri_values) != 0: | |||
|                                     values.extend({attri_values[0]}) | |||
|                         variant = {} | |||
|                         mylist = [] | |||
|                         for val in values: | |||
|                             if isinstance(val, dict): | |||
|                                 variant = val | |||
|                                 variant['attribut_value'] = [] | |||
|                             else: | |||
|                                 variant['attribut_value'].extend([val]) | |||
|                             if variant in mylist: | |||
|                                 pass | |||
|                             else: | |||
|                                 mylist.append(variant) | |||
|                         for lst in mylist: | |||
|                             val = { | |||
|                                 'product_tmpl_id': product.id, | |||
|                                 'attribute_id': lst['attribute'], | |||
|                                 'value_ids': lst['attribut_value'], | |||
|                             } | |||
|                             self.env['product.template.attribute.line'].create( | |||
|                                 val) | |||
|             elif self.import_file == 'csv': | |||
|                 keys = ['Unique Identifier', 'Name', 'Internal Reference', | |||
|                         'Can be sold', 'Can be Purchased', 'Product Type', | |||
|                         'Category', 'Unit of Measure', | |||
|                         'Purchase Unit of Measure', | |||
|                         'Customer Taxes', 'Vendor Taxes', | |||
|                         'Description for customers', 'Invoicing Policy', | |||
|                         'Sales Price', 'Cost', 'Variant Attributes', | |||
|                         'Attribute Values', 'Internal Reference', 'Barcode', | |||
|                         'Weight', 'Volume', 'Qty On hand', | |||
|                         'Responsible', 'image', 'Char', 'Many2many', 'Many2one', | |||
|                         'Integer'] | |||
|                 try: | |||
|                     files = base64.b64decode(self.file) | |||
|                     data = io.StringIO(files.decode("utf-8")) | |||
|                     data.seek(0) | |||
|                     file_reader = [] | |||
|                     csv_reader = csv.reader(data, delimiter=',') | |||
|                     file_reader.extend(csv_reader) | |||
|                 except: | |||
|                     raise UserError(_("File not Valid")) | |||
|                 for file in range(len(file_reader)): | |||
|                     field = list(map(str, file_reader[file])) | |||
|                     values = dict(zip(keys, field)) | |||
|                     if file >= 1: | |||
|                         pro_categ = self.env['product.category'].search( | |||
|                             [('complete_name', '=', values['Category'])]).id | |||
|                         if pro_categ: | |||
|                             pro_category = pro_categ | |||
|                         else: | |||
|                             category = self.env['product.category'].create({ | |||
|                                 'name': values['Category'] | |||
|                             }) | |||
|                             pro_category = category.id | |||
|                         unit_uom = self.env['uom.uom'].search( | |||
|                             [('name', '=', values['Unit of Measure'])]).id | |||
|                         if unit_uom: | |||
|                             uom = unit_uom | |||
|                         else: | |||
|                             raise UserError(_("Invalid uom")) | |||
|                         po_uoms = self.env['uom.uom'].search( | |||
|                             [('name', '=', | |||
|                               values['Purchase Unit of Measure'])]).id | |||
|                         if po_uoms: | |||
|                             po_uom = po_uoms | |||
|                         else: | |||
|                             raise UserError(_("Invalid Product Uom")) | |||
|                         account_taxs = self.env['account.tax'].search( | |||
|                             [('name', '=', values['Customer Taxes'])]).id | |||
|                         supp_tax = self.env['account.tax'].search( | |||
|                             [('name', '=', values['Vendor Taxes'])]).id | |||
|                         if account_taxs: | |||
|                             tax = account_taxs | |||
|                         else: | |||
|                             account_tax = self.env['account.tax'].create({ | |||
|                                 'name': values['Customer Taxes'].split(' ')[0], | |||
|                                 'amount': values['Customer Taxes'].split(' ')[ | |||
|                                     1], | |||
|                             }) | |||
|                             tax = account_tax.id | |||
|                         if supp_tax: | |||
|                             supplier_tax = supp_tax | |||
|                         else: | |||
|                             supplier_account_tax = self.env[ | |||
|                                 'account.tax'].create({ | |||
|                                 'name': values['Vendor Taxes'].split(' ')[0], | |||
|                                 'amount': values['Vendor Taxes'].split(' ')[1], | |||
|                             }) | |||
|                             supplier_tax = supplier_account_tax.id | |||
|                         kay_val_dict = dict( | |||
|                             self.env['product.template']._fields[ | |||
|                                 'detailed_type'].selection)  # here 'type' is field name | |||
|                         for key, val in kay_val_dict.items(): | |||
|                             if val == values['Product Type']: | |||
|                                 detailed = key | |||
|                         kay_val_dict = dict( | |||
|                             self.env['product.template']._fields[ | |||
|                                 'invoice_policy'].selection)  # here 'type' is field name | |||
|                         for key, val in kay_val_dict.items(): | |||
|                             if val == values['Invoicing Policy']: | |||
|                                 invoicing_type = key | |||
|                         if "http://" in values['image'] or "https://" in values[ | |||
|                             'image']: | |||
|                             link = base64.b64encode(requests.get( | |||
|                                 values['image'].strip()).content).replace(b"\n", | |||
|                                                                           b"") | |||
|                         elif "/home" in values['image']: | |||
|                             if os.path.exists(values['image']): | |||
|                                 with open(values['image'], 'rb') as file_image: | |||
|                                     link = base64.b64encode(file_image.read()) | |||
|                         if file_reader[0][24] or file_reader[0][25] or \ | |||
|                                 file_reader[0][26]: | |||
|                             model = self.env['ir.model']._get_id( | |||
|                                 'product.template') | |||
|                             self.env['ir.model.fields'].create({ | |||
|                                 'model_id': model, | |||
|                                 'name': file_reader[0][24], | |||
|                                 'field_description': | |||
|                                     file_reader[0][24].split('_')[ | |||
|                                         2].upper(), | |||
|                                 'ttype': file_reader[0][24].split('_')[1], | |||
|                             }) | |||
|                             inherit_id = self.env.ref( | |||
|                                 'product.product_template_only_form_view') | |||
|                             arch_base = _('<?xml version="1.0"?>' | |||
|                                           '<data>' | |||
|                                           '<field name="%s" position="%s">' | |||
|                                           '<field name="%s"/>' | |||
|                                           '</field>' | |||
|                                           '</data>') % ( | |||
|                                             'detailed_type', 'after', | |||
|                                             file_reader[0][24]) | |||
|                             self.env['ir.ui.view'].sudo().create( | |||
|                                 {'name': 'product.dynamic.fields', | |||
|                                  'type': 'form', | |||
|                                  'model': 'product.template', | |||
|                                  'mode': 'extension', | |||
|                                  'inherit_id': inherit_id.id, | |||
|                                  'arch_base': arch_base, | |||
|                                  'active': True}) | |||
|                             self.env['ir.model.fields'].create({ | |||
|                                 'model_id': model, | |||
|                                 'name': file_reader[0][25], | |||
|                                 'field_description': | |||
|                                     file_reader[0][25].split('_')[ | |||
|                                         2].upper(), | |||
|                                 'relation': values['Many2many'].split(':')[0], | |||
|                                 'ttype': file_reader[0][25].split('_')[1], | |||
|                             }) | |||
|                             inherit_id = self.env.ref( | |||
|                                 'product.product_template_only_form_view') | |||
|                             arch_base = _('<?xml version="1.0"?>' | |||
|                                           '<data>' | |||
|                                           '<field name="%s" position="%s">' | |||
|                                           '<field name="%s" widget="%s"/>' | |||
|                                           '</field>' | |||
|                                           '</data>') % ( | |||
|                                             'list_price', 'after', | |||
|                                             file_reader[0][25], | |||
|                                             'many2many_tags') | |||
|                             self.env['ir.ui.view'].sudo().create( | |||
|                                 {'name': 'product.many2many.fields', | |||
|                                  'type': 'form', | |||
|                                  'model': 'product.template', | |||
|                                  'mode': 'extension', | |||
|                                  'inherit_id': inherit_id.id, | |||
|                                  'arch_base': arch_base, | |||
|                                  'active': True}) | |||
|                             val = values['Many2many'].split(':')[0] | |||
|                             partner = [ | |||
|                                 values['Many2many'].split(':')[1].split(',')] | |||
|                             vals_many = [] | |||
|                             for part in partner[0]: | |||
|                                 many2many = self.env[val].search( | |||
|                                     [('name', '=', part)]).id | |||
|                                 if many2many: | |||
|                                     vals_many.append(many2many) | |||
|                                 else: | |||
|                                     partner = self.env[val].create({ | |||
|                                         'name': part, | |||
|                                     }) | |||
|                                     vals_many.append(partner) | |||
|                             self.env['ir.model.fields'].create({ | |||
|                                 'model_id': model, | |||
|                                 'name': file_reader[0][26], | |||
|                                 'field_description': | |||
|                                     file_reader[0][26].split('_')[ | |||
|                                         2].upper(), | |||
|                                 'relation': values['Many2one'].split(':')[0], | |||
|                                 'ttype': file_reader[0][26].split('_')[1], | |||
|                             }) | |||
|                             inherit_id = self.env.ref( | |||
|                                 'product.product_template_only_form_view') | |||
|                             arch_base = _('<?xml version="1.0"?>' | |||
|                                           '<data>' | |||
|                                           '<field name="%s" position="%s">' | |||
|                                           '<field name="%s" widget="%s"/>' | |||
|                                           '</field>' | |||
|                                           '</data>') % ( | |||
|                                             'standard_price', 'after', | |||
|                                             file_reader[0][26], | |||
|                                             'many2one_tags') | |||
|                             self.env['ir.ui.view'].sudo().create( | |||
|                                 {'name': 'product.many2one.fields', | |||
|                                  'type': 'form', | |||
|                                  'model': 'product.template', | |||
|                                  'mode': 'extension', | |||
|                                  'inherit_id': inherit_id.id, | |||
|                                  'arch_base': arch_base, | |||
|                                  'active': True}) | |||
|                             many2one = values['Many2one'].split(':')[0] | |||
|                             value = [values['Many2one'].split(':')[1]] | |||
|                             vals_one = [] | |||
|                             for vals in value: | |||
|                                 many2one_value = self.env[many2one].search( | |||
|                                     [('name', '=', vals)]).id | |||
|                                 if many2one_value: | |||
|                                     vals_one.append(many2one_value) | |||
|                                 else: | |||
|                                     value = self.env[many2one].create({ | |||
|                                         'name': vals, | |||
|                                     }) | |||
|                                     vals_one.append(value) | |||
|                             if not values['Internal Reference'] or not values[ | |||
|                                 'Barcode']: | |||
|                                 raise UserError( | |||
|                                     _("File Must  Contain Internal Reference " | |||
|                                       "or Barcode of the Product")) | |||
|                             if self.method == 'update': | |||
|                                 vals = { | |||
|                                     'default_code': values[ | |||
|                                         'Internal Reference'] if | |||
|                                     values['Internal Reference'] else False, | |||
|                                     'name': values['Name'], | |||
|                                     'image_1920': link, | |||
|                                     'sale_ok': values['Can be sold'], | |||
|                                     'purchase_ok': values['Can be Purchased'], | |||
|                                     'detailed_type': detailed, | |||
|                                     'categ_id': pro_category, | |||
|                                     'uom_id': uom, | |||
|                                     'uom_po_id': po_uom, | |||
|                                     'barcode': values['Barcode'] if values[ | |||
|                                         'Barcode'] else False, | |||
|                                     'taxes_id': [tax], | |||
|                                     'supplier_taxes_id': [supplier_tax], | |||
|                                     'description_sale': values[ | |||
|                                         'Description for customers'], | |||
|                                     'invoice_policy': invoicing_type, | |||
|                                     'list_price': values['Sales Price'], | |||
|                                     'standard_price': values['Cost'], | |||
|                                     'weight': values['Weight'], | |||
|                                     'volume': values['Volume'], | |||
|                                 } | |||
|                                 if link: | |||
|                                     vals.update({'image_1920': link}) | |||
|                                 product = self.env[ | |||
|                                     'product.template'].search( | |||
|                                     [('barcode', '=', values['Barcode'])]) | |||
|                                 if len(product): | |||
|                                     product.write(vals) | |||
|                                 else: | |||
|                                     product = self.env[ | |||
|                                         'product.template'].search( | |||
|                                         [('default_code', '=', | |||
|                                           values['Internal Reference'])]) | |||
|                                     if product: | |||
|                                         product.write(vals) | |||
|                                     else: | |||
|                                         raise UserError( | |||
|                                             _("Please ensure that product " | |||
|                                               "having the" | |||
|                                               "contains Internal reference or " | |||
|                                               "Barcode to with your file.")) | |||
|                             elif self.method == 'update_product': | |||
|                                 vals = { | |||
|                                     'default_code': values[ | |||
|                                         'Internal Reference'] if | |||
|                                     values['Internal Reference'] else False, | |||
|                                     'name': values['Name'], | |||
|                                     'image_1920': link, | |||
|                                     'sale_ok': values['Can be sold'], | |||
|                                     'purchase_ok': values['Can be Purchased'], | |||
|                                     'detailed_type': detailed, | |||
|                                     'categ_id': pro_category, | |||
|                                     'uom_id': uom, | |||
|                                     'uom_po_id': po_uom, | |||
|                                     'barcode': values['Barcode'] if values[ | |||
|                                         'Barcode'] else False, | |||
|                                     'taxes_id': [tax], | |||
|                                     'supplier_taxes_id': [supplier_tax], | |||
|                                     'description_sale': values[ | |||
|                                         'Description for customers'], | |||
|                                     'invoice_policy': invoicing_type, | |||
|                                     'lst_price': values['Sales Price'], | |||
|                                     'standard_price': values['Cost'], | |||
|                                     'weight': values['Weight'], | |||
|                                     'volume': values['Volume'], | |||
|                                 } | |||
|                                 if link: | |||
|                                     vals.update({'image_1920': link}) | |||
|                                 product = self.env[ | |||
|                                     'product.product'].search( | |||
|                                     [('barcode', '=', values['Barcode'])]) | |||
|                                 if len(product): | |||
|                                     product.write(vals) | |||
|                                 else: | |||
|                                     product = self.env[ | |||
|                                         'product.product'].search( | |||
|                                         [('default_code', '=', | |||
|                                           values['Internal Reference'])]) | |||
|                                     if product: | |||
|                                         product.write(vals) | |||
|                                     else: | |||
|                                         raise UserError( | |||
|                                             _("Please ensure that product " | |||
|                                               "having the" | |||
|                                               "contains Internal reference or " | |||
|                                               "Barcode to with your file.")) | |||
|                             else: | |||
|                                 product = self.env['product.template'].create( | |||
|                                     vals) | |||
|                                 product.write({ | |||
|                                     file_reader[0][24]: values['Char'], | |||
|                                     file_reader[0][25]: vals_many, | |||
|                                     file_reader[0][26]: vals_one[0], | |||
|                                 }) | |||
|                             attribute_values = [] | |||
|                             for val_attribute in values[ | |||
|                                 'Variant Attributes'].split(','): | |||
|                                 attributes = self.env[ | |||
|                                     'product.attribute'].search( | |||
|                                     [('name', '=', val_attribute)]).id | |||
|                                 if attributes: | |||
|                                     attribute = attributes | |||
|                                 else: | |||
|                                     raise UserError( | |||
|                                         _("Please add a valid attribute and " | |||
|                                           "their values")) | |||
|                                 attribute_values.append( | |||
|                                     {'attribute': attribute}) | |||
|                                 for value in values['Attribute Values'].split( | |||
|                                         ','): | |||
|                                     attri_values = self.env[ | |||
|                                         'product.attribute.value'].search( | |||
|                                         [('attribute_id', '=', attribute), | |||
|                                          ('name', '=', value)]).ids | |||
|                                     if len(attri_values) != 0: | |||
|                                         attribute_values.extend( | |||
|                                             {attri_values[0]}) | |||
|                             variant = {} | |||
|                             mylist = [] | |||
|                             for attribute in attribute_values: | |||
|                                 if isinstance(attribute, dict): | |||
|                                     variant = attribute | |||
|                                     variant['attribut_value'] = [] | |||
|                                 else: | |||
|                                     variant['attribut_value'].extend( | |||
|                                         [attribute]) | |||
|                                 if variant in mylist: | |||
|                                     pass | |||
|                                 else: | |||
|                                     mylist.append(variant) | |||
|                             for list in mylist: | |||
|                                 val = { | |||
|                                     'product_tmpl_id': product.id, | |||
|                                     'attribute_id': list['attribute'], | |||
|                                     'value_ids': list['attribut_value'], | |||
|                                 } | |||
|                                 self.env[ | |||
|                                     'product.template.attribute.line'].create( | |||
|                                     val) | |||
|                             return { | |||
|                                 'type': 'ir.actions.client', | |||
|                                 'tag': 'reload', | |||
|                             } | |||
|         except UserError as e: | |||
|             raise UserError(str(e)) | |||
| @ -0,0 +1,43 @@ | |||
| <?xml version="1.0" encoding="UTF-8" ?> | |||
| <odoo> | |||
|     <!-- This is used to import the /export the product--> | |||
|     <record id="import_product_variant_action" model="ir.actions.act_window"> | |||
|         <field name="name">Product Variant</field> | |||
|         <field name="type">ir.actions.act_window</field> | |||
|         <field name="res_model">import.product.variant</field> | |||
|         <field name="view_mode">form</field> | |||
|         <field name="target">new</field> | |||
|     </record> | |||
| 
 | |||
|     <record id="import_product_variant_view_form" model="ir.ui.view"> | |||
|         <field name="name">import.product.variant.view.form</field> | |||
|         <field name="model">import.product.variant</field> | |||
|         <field name="type">form</field> | |||
|         <field name="arch" type="xml"> | |||
|             <form> | |||
|                 <sheet> | |||
|                     <group> | |||
|                         <field name="import_file" widget="radio"/> | |||
|                         <field name="method" widget="radio"/> | |||
|                         <field name="file"/> | |||
|                     </group> | |||
|                 </sheet> | |||
|                 <footer> | |||
|                     <button string="Import" type="object" | |||
|                             name="action_import_product_variant" class="btn-primary"/> | |||
|                     <button string="Cancel" special="cancel" | |||
|                             class="btn-secondary"/> | |||
|                 </footer> | |||
|             </form> | |||
|         </field> | |||
|     </record> | |||
| 
 | |||
|     <!--Import/export wizard menu--> | |||
|     <menuitem id="import_product_variant_menu_action" | |||
|               name="Import Product Variant" | |||
|               parent="stock.menu_stock_inventory_control" | |||
|               action="import_product_variant_action" | |||
|               groups="product_variant_import.product_variant_access" | |||
|               sequence="3"> | |||
|     </menuitem> | |||
| </odoo> | |||