summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAzka Nathan <darizkyfaz@gmail.com>2023-08-22 11:22:52 +0700
committerAzka Nathan <darizkyfaz@gmail.com>2023-08-22 11:22:52 +0700
commitf6876ff69e37169909a40059d2945e1d84be0db3 (patch)
tree7674dcb239efe8350fed2a5a8786b1ed4d89a830
parent40b3ae941bce5c822d7297c8ccfc1c752409e21c (diff)
auto sync solr
-rw-r--r--indoteknik_custom/models/apache_solr.py119
-rw-r--r--indoteknik_custom/models/product_pricelist.py128
-rwxr-xr-xindoteknik_custom/models/product_template.py148
-rwxr-xr-xindoteknik_custom/views/product_template.xml2
4 files changed, 351 insertions, 46 deletions
diff --git a/indoteknik_custom/models/apache_solr.py b/indoteknik_custom/models/apache_solr.py
index 086fb6d0..8dc5dfbe 100644
--- a/indoteknik_custom/models/apache_solr.py
+++ b/indoteknik_custom/models/apache_solr.py
@@ -6,15 +6,30 @@ import pysolr
import time
_logger = logging.getLogger(__name__)
-_solr = pysolr.Solr('http://10.148.0.5:8983/solr/product/', always_commit=True, timeout=30)
-_variants_solr = pysolr.Solr('http://10.148.0.5:8983/solr/variants/', always_commit=True, timeout=30)
+_solr = pysolr.Solr('http://192.168.23.5:8983/solr/product/', always_commit=True, timeout=30)
+_variants_solr = pysolr.Solr('http://192.168.23.5:8983/solr/variants/', always_commit=True, timeout=30)
# _solr = pysolr.Solr('http://34.101.189.218:8983/solr/product/', always_commit=True, timeout=30) # for development only
class ApacheSolr(models.Model):
- _name = 'apache.solr'
+ _name = 'apache.solr'
_order = 'id desc'
+ def get_single_doc(self, solr, id):
+ try:
+ return solr.search(f'id:{id}').docs[0]
+ except:
+ return {}
+ def connect(self, env):
+ if env == 'production_template':
+ return pysolr.Solr('http://192.168.23.5:8983/solr/product/', always_commit=True, timeout=30)
+ elif env == 'production_variant':
+ return pysolr.Solr('http://192.168.23.5:8983/solr/variants/', always_commit=True, timeout=30)
+ elif env == 'local_template':
+ return pysolr.Solr('http://192.168.23.5:8983/solr/product/', always_commit=True, timeout=30)
+ elif env == 'local_variant':
+ return pysolr.Solr('http://192.168.23.5:8983/solr/variants/', always_commit=True, timeout=30)
+
def _update_stock_product_to_solr(self, limit=10000):
current_time = datetime.now()
delta_time = current_time - timedelta(days=3)
@@ -67,11 +82,67 @@ class ApacheSolr(models.Model):
_logger.info(documents)
_solr.add(documents, fieldUpdates={'product_rating_f':'set'})
- def _sync_product_to_solr(self, limit=500):
+ def _sync_product_template_to_solr(self, limit=500):
+ start_time = time.time()
+ _logger.info('run sync to solr...')
+ query = ["&","&",("type","=","product"),("active","=",True),"|",("solr_flag","=",0),("solr_flag","=",2)]
+
+ templates = self.env['product.template'].search(query, limit=limit)
+ documents = []
+ counter = 0
+ for template in templates:
+ template_time = time.time()
+ counter += 1
+ variants_name = variants_code = ''
+ if template.product_variant_count > 1:
+ for variant in template.product_variant_ids:
+ variants_name += variant.display_name or ''+', '
+ variants_code += variant.default_code or ''+', '
+
+ category_id = ''
+ category_name = ''
+ for category in template.public_categ_ids:
+ category_id = category.id
+ category_name = category.name
+
+ document = {
+ # Start Product Template
+ 'id': template.id,
+ 'display_name_s': template.display_name,
+ 'name_s': template.name,
+ 'default_code_s': template.default_code or '',
+ 'product_rating_f': template.virtual_rating,
+ 'product_id_i': template.id,
+ 'image_s': self.env['ir.attachment'].api_image('product.template', 'image_512', template.id),
+ 'variant_total_i': template.product_variant_count,
+ 'stock_total_f': template.qty_stock_vendor,
+ 'weight_f': template.weight,
+ 'manufacture_id_i': template.x_manufacture.id or 0,
+ 'manufacture_name_s': template.x_manufacture.x_name or '',
+ 'manufacture_name': template.x_manufacture.x_name or '',
+ 'image_promotion_1_s': self.env['ir.attachment'].api_image('x_manufactures', 'image_promotion_1', template.x_manufacture.id),
+ 'image_promotion_2_s': self.env['ir.attachment'].api_image('x_manufactures', 'image_promotion_2', template.x_manufacture.id),
+ 'variants_name_t': variants_name,
+ 'variants_code_t': variants_code,
+ 'search_rank_i': template.search_rank,
+ 'search_rank_weekly_i': template.search_rank_weekly,
+ 'category_id_i': category_id or 0,
+ 'category_name_s': category_name or '',
+ 'category_name': category_name or '',
+ # End Product Template
+ }
+ documents.append(document)
+ template.solr_flag = 1
+ _logger.info('[SYNC_PRODUCT_TO_SOLR] {}/{} {:.6f}'.format(counter, limit, time.time() - template_time))
+ _logger.info('[SYNC_PRODUCT_TO_SOLR] Success add to solr product %s' % template.id)
+ _solr.add(documents)
+ end_time = time.time()
+ _logger.info("[SYNC_PRODUCT_TO_SOLR] Finish task add to solr. Time taken: {:.6f} seconds".format(end_time - start_time))
+
+ def _sync_product_pricelist_to_solr(self, limit=500):
start_time = time.time()
_logger.info('run sync to solr...')
query = ["&","&",("type","=","product"),("active","=",True),"|",("solr_flag","=",0),("solr_flag","=",2)]
- # query = [('id', '=', 97942)]
templates = self.env['product.template'].search(query, limit=limit)
documents = []
@@ -116,51 +187,25 @@ class ApacheSolr(models.Model):
tier2 = template.product_variant_id._get_pricelist_tier2()
tier3 = template.product_variant_id._get_pricelist_tier3()
- category_id = ''
- category_name = ''
- for category in template.public_categ_ids:
- category_id = category.id
- category_name = category.name
-
document = {
- 'id': template.id,
- 'display_name_s': template.display_name,
- 'name_s': template.name,
- 'default_code_s': template.default_code or '',
- 'product_rating_f': template.virtual_rating,
- 'product_id_i': template.id,
- 'image_s': self.env['ir.attachment'].api_image('product.template', 'image_512', template.id),
- 'price_f': price_excl,
- 'discount_f': discount,
- 'price_discount_f': price_excl_after_disc,
- 'tax_f': tax,
- 'variant_total_i': template.product_variant_count,
- 'stock_total_f': template.qty_stock_vendor,
- 'weight_f': template.weight,
- 'manufacture_id_i': template.x_manufacture.id or 0,
- 'manufacture_name_s': template.x_manufacture.x_name or '',
- 'manufacture_name': template.x_manufacture.x_name or '',
- 'image_promotion_1_s': self.env['ir.attachment'].api_image('x_manufactures', 'image_promotion_1', template.x_manufacture.id),
- 'image_promotion_2_s': self.env['ir.attachment'].api_image('x_manufactures', 'image_promotion_2', template.x_manufacture.id),
- 'category_id_i': category_id or 0,
- 'category_name_s': category_name or '',
- 'category_name': category_name or '',
- 'variants_name_t': variants_name,
- 'variants_code_t': variants_code,
- 'search_rank_i': template.search_rank,
- 'search_rank_weekly_i': template.search_rank_weekly,
+ # Start Product Pricelist
'flashsale_id_i': flashsale_data['flashsale_id'] or 0,
'flashsale_tag_s': flashsale_data['flashsale_tag'] or '',
'flashsale_name_s': flashsale_data['flashsale_name'] or '',
'flashsale_base_price_f': flashsale_data['flashsale_base_price'] or 0,
'flashsale_discount_f': flashsale_data['flashsale_discount'] or 0,
'flashsale_price_f': flashsale_data['flashsale_price'] or 0,
+ 'price_f': price_excl,
+ 'discount_f': discount,
+ 'price_discount_f': price_excl_after_disc,
+ 'tax_f': tax,
'discount_tier1_f': tier1['discount_tier1'] or 0,
'price_tier1_f': tier1['price_tier1'] or 0,
'discount_tier2_f': tier2['discount_tier2'] or 0,
'price_tier2_f': tier2['price_tier2'] or 0,
'discount_tier3_f': tier3['discount_tier3'] or 0,
'price_tier3_f': tier3['price_tier3'] or 0
+ # End Product Pricelist
}
documents.append(document)
template.solr_flag = 1
diff --git a/indoteknik_custom/models/product_pricelist.py b/indoteknik_custom/models/product_pricelist.py
index 2053accc..477f6645 100644
--- a/indoteknik_custom/models/product_pricelist.py
+++ b/indoteknik_custom/models/product_pricelist.py
@@ -1,8 +1,10 @@
from odoo import models, fields, api
from odoo.exceptions import UserError
from datetime import datetime
+import logging
+import time
-
+_logger = logging.getLogger(__name__)
class ProductPricelist(models.Model):
_inherit = 'product.pricelist'
@@ -39,7 +41,123 @@ class ProductPricelistItem(models.Model):
manufacture_id = fields.Many2one('x_manufactures', string='Manufacture')
- @api.constrains('fixed_price','price_discount')
- def update_product_solr_flag(self):
- for item in self:
- item.product_id.product_tmpl_id.solr_flag = 2 \ No newline at end of file
+ @api.constrains('applied_on','product_id','base','base_pricelist_id','price_discount')
+ def update_template_solr(self):
+ price_excl_after_disc = price_excl = discount = tax = 0
+ variants_name = variants_code = ''
+ flashsale_data = tier1 = tier2 = tier3 = {}
+
+ template = self.product_id.product_tmpl_id
+ if template.product_variant_count > 1:
+ for variant in template.product_variant_ids:
+ if price_excl_after_disc == 0 or variant._get_website_price_after_disc_and_tax() < price_excl_after_disc:
+ price_excl = variant._get_website_price_exclude_tax()
+ price_excl_after_disc = variant._get_website_price_after_disc_and_tax()
+ discount = variant._get_website_disc(0)
+ tax = variant._get_website_tax()
+ flashsale_data = variant._get_flashsale_price()
+ # add price tiering for base price, discount, and price after discount (tier 1 - 3)
+ tier1 = variant._get_pricelist_tier1()
+ tier2 = variant._get_pricelist_tier2()
+ tier3 = variant._get_pricelist_tier3()
+ else:
+ price_excl_after_disc = price_excl_after_disc
+ price_excl = price_excl
+ discount = discount
+ tax = tax
+ flashsale_data = flashsale_data
+ tier1 = tier1
+ tier2 = tier2
+ tier3 = tier3
+ variants_name += variant.display_name or ''+', '
+ variants_code += variant.default_code or ''+', '
+ else:
+ variants_name = template.display_name
+ price_excl = template.product_variant_id._get_website_price_exclude_tax()
+ discount = template.product_variant_id._get_website_disc(0)
+ price_excl_after_disc = template.product_variant_id._get_website_price_after_disc_and_tax()
+ tax = template.product_variant_id._get_website_tax()
+ flashsale_data = template.product_variant_id._get_flashsale_price()
+ tier1 = template.product_variant_id._get_pricelist_tier1()
+ tier2 = template.product_variant_id._get_pricelist_tier2()
+ tier3 = template.product_variant_id._get_pricelist_tier3()
+
+ solr_model = self.env['apache.solr']
+ solr = solr_model.connect('local_template')
+ document = solr_model.get_single_doc(solr, template.id)
+ document.update({
+ 'id': template.id,
+ 'flashsale_id_i': flashsale_data['flashsale_id'] or 0,
+ 'flashsale_tag_s': flashsale_data['flashsale_tag'] or '',
+ 'flashsale_name_s': flashsale_data['flashsale_name'] or '',
+ 'flashsale_base_price_f': flashsale_data['flashsale_base_price'] or 0,
+ 'flashsale_discount_f': flashsale_data['flashsale_discount'] or 0,
+ 'flashsale_price_f': flashsale_data['flashsale_price'] or 0,
+ 'price_f': price_excl,
+ 'discount_f': discount,
+ 'price_discount_f': price_excl_after_disc,
+ 'tax_f': tax,
+ 'discount_tier1_f': tier1['discount_tier1'] or 0,
+ 'price_tier1_f': tier1['price_tier1'] or 0,
+ 'discount_tier2_f': tier2['discount_tier2'] or 0,
+ 'price_tier2_f': tier2['price_tier2'] or 0,
+ 'discount_tier3_f': tier3['discount_tier3'] or 0,
+ 'price_tier3_f': tier3['price_tier3'] or 0
+ })
+ solr.add([document])
+ template.change_solr_data('Ada perubahan pada harga product')
+
+ @api.constrains('applied_on','product_id','base','base_pricelist_id','price_discount')
+ def update_variant_solr(self):
+ price_excl_after_disc = price_excl = discount = tax = 0
+ variants_name = variants_code = ''
+ flashsale_data = tier1 = tier2 = tier3 = {}
+
+ product = self.product_id
+ for variant in product:
+ if price_excl_after_disc == 0 or variant._get_website_price_after_disc_and_tax() < price_excl_after_disc:
+ price_excl = variant._get_website_price_exclude_tax()
+ price_excl_after_disc = variant._get_website_price_after_disc_and_tax()
+ discount = variant._get_website_disc(0)
+ tax = variant._get_website_tax()
+ flashsale_data = variant._get_flashsale_price()
+ # add price tiering for base price, discount, and price after discount (tier 1 - 3)
+ tier1 = variant._get_pricelist_tier1()
+ tier2 = variant._get_pricelist_tier2()
+ tier3 = variant._get_pricelist_tier3()
+ else:
+ price_excl_after_disc = price_excl_after_disc
+ price_excl = price_excl
+ discount = discount
+ tax = tax
+ flashsale_data = flashsale_data
+ tier1 = tier1
+ tier2 = tier2
+ tier3 = tier3
+ variants_name += variant.display_name or ''+', '
+ variants_code += variant.default_code or ''+', '
+
+ solr_model = self.env['apache.solr']
+ solr = solr_model.connect('local_variant')
+ document = solr_model.get_single_doc(solr, product.id)
+ document.update({
+ 'id': product.id,
+ 'flashsale_id_i': flashsale_data['flashsale_id'] or 0,
+ 'flashsale_tag_s': flashsale_data['flashsale_tag'] or '',
+ 'flashsale_name_s': flashsale_data['flashsale_name'] or '',
+ 'flashsale_base_price_f': flashsale_data['flashsale_base_price'] or 0,
+ 'flashsale_discount_f': flashsale_data['flashsale_discount'] or 0,
+ 'flashsale_price_f': flashsale_data['flashsale_price'] or 0,
+ 'price_f': price_excl,
+ 'discount_f': discount,
+ 'price_discount_f': price_excl_after_disc,
+ 'tax_f': tax,
+ 'discount_tier1_f': tier1['discount_tier1'] or 0,
+ 'price_tier1_f': tier1['price_tier1'] or 0,
+ 'discount_tier2_f': tier2['discount_tier2'] or 0,
+ 'price_tier2_f': tier2['price_tier2'] or 0,
+ 'discount_tier3_f': tier3['discount_tier3'] or 0,
+ 'price_tier3_f': tier3['price_tier3'] or 0
+ })
+ solr.add([document])
+ product.change_solr_data('Ada perubahan pada harga product') \ No newline at end of file
diff --git a/indoteknik_custom/models/product_template.py b/indoteknik_custom/models/product_template.py
index bc54b703..128297f1 100755
--- a/indoteknik_custom/models/product_template.py
+++ b/indoteknik_custom/models/product_template.py
@@ -1,5 +1,5 @@
from odoo import fields, models, api
-from datetime import datetime, timedelta
+from datetime import datetime, timedelta, timezone
from odoo.exceptions import AccessError, UserError, ValidationError
import logging
import requests
@@ -50,7 +50,14 @@ class ProductTemplate(models.Model):
is_new_product = fields.Boolean(string='Produk Baru',
help='Centang jika ingin ditammpilkan di website sebagai segment Produk Baru')
seq_new_product = fields.Integer(string='Seq New Product', help='Urutan Sequence New Product')
-
+ last_update_solr = fields.Datetime(string='Last Update Solr')
+ desc_update_solr = fields.Char(string='Desc Update Solr')
+
+ def change_solr_data(self, desc):
+ current_time = datetime.utcnow()
+ self.desc_update_solr = desc
+ self.last_update_solr = current_time
+
# def write(self, vals):
# if 'solr_flag' not in vals and self.solr_flag == 1:
# vals['solr_flag'] = 2
@@ -256,7 +263,66 @@ class ProductTemplate(models.Model):
self.env['token.storage'].create([values])
return values
-
+ @api.constrains(
+ 'name',
+ 'default_code',
+ 'virtual_rating',
+ 'product_variant_count',
+ 'weight',
+ 'x_manufacture',
+ 'public_categ_ids',
+ 'product_variant_ids.display_name',
+ 'product_variant_ids.default_code',
+ 'search_rank',
+ 'search_rank_weekly',
+ 'image_1920'
+ )
+ def _sync_product_template_to_solr(self, limit=500):
+ template = self
+ if not template.active or template.type != 'product':
+ return
+
+ variants_name = variants_code = ''
+ if template.product_variant_count > 1:
+ for variant in template.product_variant_ids:
+ variants_name += variant.display_name or ''+', '
+ variants_code += variant.default_code or ''+', '
+
+ category_id = ''
+ category_name = ''
+ for category in template.public_categ_ids:
+ category_id = category.id
+ category_name = category.name
+ solr_model = self.env['apache.solr']
+ solr = solr_model.connect('local_template')
+ document = solr_model.get_single_doc(solr, template.id)
+ document.update({
+ 'id': template.id,
+ 'display_name_s': template.display_name,
+ 'name_s': template.name,
+ 'default_code_s': template.default_code or '',
+ 'product_rating_f': template.virtual_rating,
+ 'product_id_i': template.id,
+ 'image_s': self.env['ir.attachment'].api_image('product.template', 'image_512', template.id),
+ 'variant_total_i': template.product_variant_count,
+ 'stock_total_f': template.qty_stock_vendor,
+ 'weight_f': template.weight,
+ 'manufacture_id_i': template.x_manufacture.id or 0,
+ 'manufacture_name_s': template.x_manufacture.x_name or '',
+ 'manufacture_name': template.x_manufacture.x_name or '',
+ 'image_promotion_1_s': self.env['ir.attachment'].api_image('x_manufactures', 'image_promotion_1', template.x_manufacture.id),
+ 'image_promotion_2_s': self.env['ir.attachment'].api_image('x_manufactures', 'image_promotion_2', template.x_manufacture.id),
+ 'variants_name_t': variants_name,
+ 'variants_code_t': variants_code,
+ 'search_rank_i': template.search_rank,
+ 'search_rank_weekly_i': template.search_rank_weekly,
+ 'category_id_i': category_id or 0,
+ 'category_name_s': category_name or '',
+ 'category_name': category_name or '',
+ })
+ solr.add([document])
+ self.change_solr_data('Perubahan pada data product')
+
class ProductProduct(models.Model):
_inherit = "product.product"
web_price = fields.Float(
@@ -278,6 +344,13 @@ class ProductProduct(models.Model):
qty_onhand_bandengan = fields.Float(string='Qty Incoming Bandengan', compute='_get_qty_onhand_bandengan')
qty_incoming_bandengan = fields.Float(string='Qty Incoming Bandengan', compute='_get_qty_incoming_bandengan')
sla_version = fields.Integer(string="SLA Version", default=0)
+ last_update_solr = fields.Datetime(string='Last Update Solr')
+ desc_update_solr = fields.Char(string='Desc Update Solr')
+
+ def change_solr_data(self, desc):
+ current_time = datetime.now()
+ self.desc_update_solr = desc
+ self.last_update_solr = current_time
def _get_qty_incoming_bandengan(self):
for product in self:
@@ -329,4 +402,71 @@ class ProductProduct(models.Model):
('start_date', '<=', current_time),
('end_date', '>=', current_time)
], limit=1)
- return pricelist \ No newline at end of file
+ return pricelist
+
+ @api.constrains(
+ 'name',
+ 'default_code',
+ 'virtual_rating',
+ 'weight',
+ 'x_manufacture',
+ 'public_categ_ids',
+ 'product_tmpl_id.default_code',
+ 'product_tmpl_id.image_1920',
+ 'search_rank',
+ 'search_rank_weekly',
+ 'image_1920'
+ )
+ def _sync_variants_to_solr(self):
+ variant = self
+ if not variant.product_tmpl_id.active and variant.product_tmpl_id.type != 'product':
+ return
+
+ price_excl_after_disc = price_excl = discount = tax = 0
+ price_excl = variant._get_website_price_exclude_tax()
+ price_excl_after_disc = variant._get_website_price_after_disc_and_tax()
+ discount = variant._get_website_disc(0)
+ tax = variant._get_website_tax()
+ flashsale_data = variant._get_flashsale_price()
+
+ category_id = ''
+ category_name = ''
+ for category in variant.product_tmpl_id.public_categ_ids:
+ category_id = category.id
+ category_name = category.name
+ solr_model = self.env['apache.solr']
+ solr = solr_model.connect('local_variant')
+ document = solr_model.get_single_doc(solr, variant.id)
+ document.update({
+ 'id': variant.id,
+ 'display_name_s': variant.display_name,
+ 'name_s': variant.name,
+ 'default_code_s': variant.default_code or '',
+ 'product_rating_f': variant.product_tmpl_id.virtual_rating,
+ 'product_id_i': variant.id,
+ 'template_id_i': variant.product_tmpl_id.id,
+ 'image_s': self.env['ir.attachment'].api_image('product.template', 'image_512', variant.product_tmpl_id.id),
+ 'price_f': price_excl,
+ 'discount_f': discount,
+ 'price_discount_f': price_excl_after_disc,
+ 'tax_f': tax,
+ 'stock_total_f': variant.qty_stock_vendor,
+ 'weight_f': variant.product_tmpl_id.weight,
+ 'manufacture_id_i': variant.product_tmpl_id.x_manufacture.id or 0,
+ 'manufacture_name_s': variant.product_tmpl_id.x_manufacture.x_name or '',
+ 'manufacture_name': variant.product_tmpl_id.x_manufacture.x_name or '',
+ 'image_promotion_1_s': self.env['ir.attachment'].api_image('x_manufactures', 'image_promotion_1', variant.product_tmpl_id.x_manufacture.id),
+ 'image_promotion_2_s': self.env['ir.attachment'].api_image('x_manufactures', 'image_promotion_2', variant.product_tmpl_id.x_manufacture.id),
+ 'category_id_i': category_id or 0,
+ 'category_name_s': category_name or '',
+ 'category_name': category_name or '',
+ 'search_rank_i': variant.product_tmpl_id.search_rank,
+ 'search_rank_weekly_i': variant.product_tmpl_id.search_rank_weekly,
+ 'flashsale_id_i': flashsale_data['flashsale_id'] or 0,
+ 'flashsale_name_s': flashsale_data['flashsale_name'] or '',
+ 'flashsale_base_price_f': flashsale_data['flashsale_base_price'] or 0,
+ 'flashsale_discount_f': flashsale_data['flashsale_discount'] or 0,
+ 'flashsale_price_f': flashsale_data['flashsale_price'] or 0,
+ })
+ solr.add([document])
+ self.change_solr_data('Perubahan pada data product') \ No newline at end of file
diff --git a/indoteknik_custom/views/product_template.xml b/indoteknik_custom/views/product_template.xml
index 558805b1..82b7ce4d 100755
--- a/indoteknik_custom/views/product_template.xml
+++ b/indoteknik_custom/views/product_template.xml
@@ -9,6 +9,8 @@
<field name="categ_id" position="after">
<field name="web_tax_id"/>
<field name="x_manufacture"/>
+ <field name="desc_update_solr"/>
+ <field name="last_update_solr"/>
<field name="x_model_product"/>
<field name="x_studio_field_tGhJR" widget="many2many_tags"/>
</field>