summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/solr/product_template.py
diff options
context:
space:
mode:
authorRafi Zadanly <zadanlyr@gmail.com>2023-08-25 15:11:00 +0700
committerRafi Zadanly <zadanlyr@gmail.com>2023-08-25 15:11:00 +0700
commita9a3c3e8945dd11a0d81f64a5629876397a1e51d (patch)
treee7d8850e7868b3f83e29f19bc37bcc9730922a4e /indoteknik_custom/models/solr/product_template.py
parent8424fbdfd66c6eca58d546c256d57a61e258e930 (diff)
Update sync solr function
Diffstat (limited to 'indoteknik_custom/models/solr/product_template.py')
-rw-r--r--indoteknik_custom/models/solr/product_template.py158
1 files changed, 158 insertions, 0 deletions
diff --git a/indoteknik_custom/models/solr/product_template.py b/indoteknik_custom/models/solr/product_template.py
new file mode 100644
index 00000000..6089adda
--- /dev/null
+++ b/indoteknik_custom/models/solr/product_template.py
@@ -0,0 +1,158 @@
+from odoo import models, fields, api
+from datetime import datetime
+
+
+class ProductTemplate(models.Model):
+ _inherit = "product.template"
+
+ last_update_solr = fields.Datetime(string='Last Update Solr')
+ desc_update_solr = fields.Char(string='Desc Update Solr')
+
+ def change_solr_data(self, desc):
+ self.desc_update_solr = desc
+ self.last_update_solr = datetime.utcnow()
+
+ def solr(self):
+ return self.env['apache.solr'].connect('product')
+
+ @api.constrains('active')
+ def _sync_active_template_solr(self):
+ for template in self:
+ if not template.active or template.type != 'product':
+ self.solr().delete(template.id)
+
+ variant_ids = [x.id for x in template.product_variant_ids]
+ template.product_variant_ids.solr().delete(variant_ids)
+
+ self.solr().commit()
+ else:
+ template._sync_product_template_to_solr()
+ template._sync_price_to_solr()
+
+ products = self.env['product.product'].search([('product_tmpl_id', '=', template.id), ('active', 'in', [True, False])])
+ products._sync_variants_to_solr()
+
+ @api.constrains(
+ 'name',
+ 'default_code',
+ 'weight',
+ 'x_manufacture',
+ 'public_categ_ids',
+ 'search_rank',
+ 'search_rank_weekly',
+ 'image_1920'
+ )
+ def _sync_product_template_to_solr(self):
+ solr_model = self.env['apache.solr']
+
+ for template in self:
+ if not template.active or template.type != 'product':
+ continue
+
+ variant_names = ', '.join([x.display_name or '' for x in template.product_variant_ids])
+ variant_codes = ', '.join([x.default_code or '' for x in template.product_variant_ids])
+
+ category_id = 0
+ category_name = ''
+ for category in template.public_categ_ids:
+ category_id, category_name = category.id, category.name
+ break
+
+ document = solr_model.get_single_doc('product', 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': variant_names,
+ 'variants_code_t': variant_codes,
+ 'search_rank_i': template.search_rank,
+ 'search_rank_weekly_i': template.search_rank_weekly,
+ 'category_id_i': category_id,
+ 'category_name_s': category_name,
+ 'category_name': category_name,
+ 'has_product_info_b': True
+ })
+ self.solr().add([document])
+ template.product_variant_ids._sync_variants_to_solr()
+ self.change_solr_data('Perubahan pada data product')
+
+ if not document.get('has_price_info_b'):
+ template._sync_price_to_solr()
+
+ self.solr().commit()
+
+ def _sync_price_to_solr(self):
+ solr_model = self.env['apache.solr']
+ solr = self.solr()
+
+ for template in self:
+ price_excl_after_disc = price_excl = discount = tax = 0
+ flashsale_data = tier1 = tier2 = tier3 = {}
+
+ 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()
+
+ if template.product_variant_count == 1:
+ 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()
+
+ document = solr_model.get_single_doc('product', template.id)
+ document.update({
+ 'id': template.id,
+ 'flashsale_id_i': flashsale_data.get('flashsale_id', 0),
+ 'flashsale_tag_s': flashsale_data.get('flashsale_tag', ''),
+ 'flashsale_name_s': flashsale_data.get('flashsale_name', ''),
+ 'flashsale_base_price_f': flashsale_data.get('flashsale_base_price', 0),
+ 'flashsale_discount_f': flashsale_data.get('flashsale_discount', 0),
+ 'flashsale_price_f': flashsale_data.get('flashsale_price', 0),
+ 'price_f': price_excl,
+ 'discount_f': discount,
+ 'price_discount_f': price_excl_after_disc,
+ 'tax_f': tax,
+ 'discount_tier1_f': tier1.get('discount_tier1', 0),
+ 'price_tier1_f': tier1.get('price_tier1', 0),
+ 'discount_tier2_f': tier2.get('discount_tier2', 0),
+ 'price_tier2_f': tier2.get('price_tier2', 0),
+ 'discount_tier3_f': tier3.get('discount_tier3', 0),
+ 'price_tier3_f': tier3.get('price_tier3', 0),
+ 'has_price_info_b':True
+ })
+ self.solr().add([document])
+ template.change_solr_data('Ada perubahan pada harga product')
+
+ if not document.get('has_product_info_b'):
+ template._sync_product_template_to_solr()
+
+ self.solr().commit()
+
+ def sync_to_solr(self):
+ template_ids = self.env.context.get('active_ids', [])
+ templates = self.search([('id', 'in', template_ids)])
+ templates._sync_product_template_to_solr() \ No newline at end of file