You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
7.5 KiB
137 lines
7.5 KiB
# -*- coding: utf-8 -*-
|
|
#############################################################################
|
|
#
|
|
# Cybrosys Technologies Pvt. Ltd.
|
|
#
|
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
|
|
# Author: Syamili K(<https://www.cybrosys.com>)
|
|
#
|
|
# You can modify it under the terms of the GNU LESSER
|
|
# GENERAL PUBLIC LICENSE (AGPL 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 (AGPL v3) for more details.
|
|
#
|
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
|
|
# (AGPL v3) along with this program.
|
|
# If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
#############################################################################
|
|
import base64
|
|
import re
|
|
import requests
|
|
from odoo import api, models, _
|
|
from odoo.exceptions import ValidationError
|
|
|
|
|
|
class ProductTemplate(models.Model):
|
|
"""Inherited the module for to add function for create new product."""
|
|
_inherit = "product.template"
|
|
|
|
@api.onchange('barcode')
|
|
def _onchange_barcode(self):
|
|
"""Onchange function for create new product by passing UPC code given
|
|
in barcode field, the given barcode pass to url and get the response
|
|
at the endpoint. Using the response we create new product details.."""
|
|
if self.barcode and ((len(str(self.barcode)) == 13) or (
|
|
len(str(self.barcode)) == 12)):
|
|
product = self.search([('barcode', '=', self.barcode)], limit=1)
|
|
if product:
|
|
raise ValidationError(
|
|
_("Barcode already exist"))
|
|
else:
|
|
url = f'https://api.upcitemdb.com/prod/trial/lookup?upc=' \
|
|
f'{self.barcode}'
|
|
response = requests.get(url)
|
|
if "code" in response.json():
|
|
if response.json()['code'] == 'OK' and \
|
|
"items" in response.json():
|
|
self.name = response.json()['items'][0].get('title')
|
|
self.description_sale = response.json()['items'][0]. \
|
|
get('description')
|
|
self.list_price = response.json()['items'][0]. \
|
|
get('highest_recorded_price')
|
|
self.default_code = response.json()['items'][0]. \
|
|
get('model')
|
|
if "category" in response.json()['items'][0]:
|
|
if not response.json()['items'][0]['category']:
|
|
self.categ_id = self.env[
|
|
'product.category'].search(
|
|
[('name', '=', 'All')], limit=1).id
|
|
else:
|
|
last_elements = [categ.name for categ in
|
|
self.env['product.category'].
|
|
search([])]
|
|
categories = []
|
|
category = 'category'
|
|
for categ in response.json()['items'][0][
|
|
'category'].split(">"):
|
|
if categ not in last_elements:
|
|
category = self.env[
|
|
'product.category'].create({
|
|
'name': categ,
|
|
'parent_id': categories[
|
|
-1].id if categories else False,
|
|
})
|
|
categories.append(category)
|
|
category = categories[-1]
|
|
else:
|
|
category = self.env[
|
|
'product.category'].search(
|
|
[('name', '=', categ)], limit=1).id
|
|
self.categ_id = category
|
|
if "weight" in response.json()['items'][0]:
|
|
if not response.json()['items'][0]['weight']:
|
|
self.weight = 0
|
|
else:
|
|
matches = re.findall(r"(\d+(?:\.\d+)?)\s*(\w+)",
|
|
response.json()['items'][
|
|
0]['weight'])
|
|
conversion_factors = {
|
|
'kg': 1, 'g': 0.001, 'mg': 0.000001,
|
|
'lb': 0.453592, 'lbs': 0.453592,
|
|
'pound': 0.453592, 'pounds': 0.453592,
|
|
'oz': 0.0283495, 'ounce': 0.0283495,
|
|
}
|
|
product_weight_in_lbs_param = self.env[
|
|
'ir.config_parameter'].sudo().get_param(
|
|
'product.weight_in_lbs')
|
|
if product_weight_in_lbs_param == '1':
|
|
conversion_factors.update({
|
|
'lb': 1, 'lbs': 1, 'pound': 1,
|
|
'pounds': 1, 'oz': 16, 'ounce': 16,
|
|
'kg': 0.45359237, 'g': 453.59237,
|
|
'mg': 453592.37,
|
|
})
|
|
if matches[0][1].lower() in conversion_factors:
|
|
self.weight = float(matches[0][0]) * \
|
|
conversion_factors[
|
|
matches[0][1].lower()]
|
|
else:
|
|
raise ValidationError(
|
|
_("Invalid Unit"))
|
|
if "currency" in response.json()['items'][0]:
|
|
if not response.json()['items'][0]['currency']:
|
|
self.currency_id = self.env[
|
|
'res.currency'].search(
|
|
[('name', '=', 'USD')], limit=1).id
|
|
else:
|
|
self.currency_id = self.env[
|
|
'res.currency'].search([('name', '=',
|
|
response.json()[
|
|
'items'][0][
|
|
'currency'])],
|
|
limit=1).id
|
|
if "images" in response.json()['items'][0]:
|
|
if response.json()['items'][0]['images']:
|
|
url = response.json()['items'][0]['images'][0]
|
|
response = requests.get(url)
|
|
image_content = base64.b64encode(
|
|
response.content)
|
|
self.image_1920 = image_content.decode(
|
|
'utf-8')
|
|
else:
|
|
raise ValidationError(
|
|
_("Invalid UPC"))
|
|
|