summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/solr
diff options
context:
space:
mode:
authorit-fixcomart <it@fixcomart.co.id>2024-09-20 15:06:17 +0700
committerit-fixcomart <it@fixcomart.co.id>2024-09-20 15:06:17 +0700
commit79bf9729d10c8fb37ef9071ab6df2b6644ddea49 (patch)
tree6226da5e38ad44673a1bb5d7d4e2b0fd5df1fada /indoteknik_custom/models/solr
parenteb7661705303a64c97e84061b53d48d5c46f6293 (diff)
parentd2bb21ae878db2a3b77dbb3341046c9d12ba1de5 (diff)
Merge branch 'production' into iman/new-register
# Conflicts: # indoteknik_custom/models/res_users.py
Diffstat (limited to 'indoteknik_custom/models/solr')
-rw-r--r--indoteknik_custom/models/solr/__init__.py3
-rw-r--r--indoteknik_custom/models/solr/product_template.py36
-rw-r--r--indoteknik_custom/models/solr/promotion_program_line.py7
-rw-r--r--indoteknik_custom/models/solr/website_categories_management.py114
4 files changed, 158 insertions, 2 deletions
diff --git a/indoteknik_custom/models/solr/__init__.py b/indoteknik_custom/models/solr/__init__.py
index 606c0035..dafd5a1e 100644
--- a/indoteknik_custom/models/solr/__init__.py
+++ b/indoteknik_custom/models/solr/__init__.py
@@ -10,4 +10,5 @@ from . import x_banner_banner
from . import product_public_category
from . import x_banner_category
from . import promotion_program
-from . import promotion_program_line \ No newline at end of file
+from . import promotion_program_line
+from . import website_categories_management \ No newline at end of file
diff --git a/indoteknik_custom/models/solr/product_template.py b/indoteknik_custom/models/solr/product_template.py
index 6f76c529..d8dec47c 100644
--- a/indoteknik_custom/models/solr/product_template.py
+++ b/indoteknik_custom/models/solr/product_template.py
@@ -1,4 +1,5 @@
from datetime import datetime
+from bs4 import BeautifulSoup
from odoo import api, fields, models
@@ -78,6 +79,9 @@ class ProductTemplate(models.Model):
is_in_bu = bool(stock_quant)
+ cleaned_desc = BeautifulSoup(template.website_description or '', "html.parser").get_text()
+ website_description = template.website_description if cleaned_desc else ''
+
document = solr_model.get_doc('product', template.id)
document.update({
"id": template.id,
@@ -101,9 +105,11 @@ class ProductTemplate(models.Model):
"search_rank_i": template.search_rank,
"search_rank_weekly_i": template.search_rank_weekly,
"category_id_ids": category_ids, # ID kategori sebagai string yang dipisahkan koma
+ "category_parent_ids": self.get_category_hierarchy_ids(category_ids), # ID kategori sebagai string yang dipisahkan koma
"category_name_s": ', '.join(category_names), # Nama kategori sebagai string yang dipisahkan koma
"category_name": category_names, # Nama kategori sebagai list
"description_t": template.website_description or '',
+ "description_clean_t": cleaned_desc or '',
'has_product_info_b': True,
'publish_b': not template.unpublished,
'sni_b': template.unpublished,
@@ -127,6 +133,36 @@ class ProductTemplate(models.Model):
if not document.get('has_price_info_b'):
template._sync_price_to_solr()
+ def get_category_hierarchy_ids(self, category_id):
+ """
+ Function to get category hierarchy IDs including the category itself and its parents.
+
+ Args:
+ category_id (int): The ID of the category you want to retrieve.
+ env (Environment): The Odoo environment.
+
+ Returns:
+ list: A list of IDs for the category and its parents.
+ """
+ category_ids = []
+
+ def traverse_category(cat_id):
+ # Retrieve category object based on ID
+ category = self.env['product.public.category'].browse(cat_id)
+
+ # Add the current category ID to the list
+ category_ids.append(category.id)
+
+ # If there is a parent category, traverse upwards
+ if category.parent_id:
+ traverse_category(category.parent_id.id)
+
+ # Start traversal from the initial category
+ traverse_category(category_id)
+
+ # Reverse the list to get the hierarchy from top level to the current level
+ return list(reversed(category_ids))
+
def _sync_price_to_solr(self):
solr_model = self.env['apache.solr']
TIER_NUMBERS = ['1_v2', '2_v2', '3_v2', '4_v2', '5_v2']
diff --git a/indoteknik_custom/models/solr/promotion_program_line.py b/indoteknik_custom/models/solr/promotion_program_line.py
index 4b0e67f6..3e3a2a28 100644
--- a/indoteknik_custom/models/solr/promotion_program_line.py
+++ b/indoteknik_custom/models/solr/promotion_program_line.py
@@ -37,6 +37,9 @@ class PromotionProgramLine(models.Model):
promotion_type = rec._res_promotion_type()
+ # Gathering all categories
+ category_names = [category.name for category in rec.product_ids.product_id.public_categ_ids]
+
# Set sequence_i to None if rec.sequence is 0
sequence_value = None if rec.sequence == 0 else rec.sequence
@@ -57,7 +60,9 @@ class PromotionProgramLine(models.Model):
'free_products_s': json.dumps(free_products),
'total_qty_i': sum([x.qty for x in rec.product_ids] + [x.qty for x in rec.free_product_ids]),
'total_qty_sold_f': [x.product_id.qty_sold for x in rec.product_ids],
- 'active_b': rec.active
+ 'active_b': rec.active,
+ "manufacture_name_s": rec.product_ids.product_id.x_manufacture.x_name or '',
+ "category_name": category_names,
})
self.solr().add([document])
diff --git a/indoteknik_custom/models/solr/website_categories_management.py b/indoteknik_custom/models/solr/website_categories_management.py
new file mode 100644
index 00000000..0a40a356
--- /dev/null
+++ b/indoteknik_custom/models/solr/website_categories_management.py
@@ -0,0 +1,114 @@
+from odoo import models, fields, api
+from datetime import datetime
+import json
+
+class WebsiteCategoriesHomepage(models.Model):
+ _inherit = 'website.categories.management'
+
+ last_update_solr = fields.Datetime('Last Update Solr')
+
+ def solr(self):
+ """Returns the Solr connection object."""
+ return self.env['apache.solr'].connect('category_management')
+
+ def update_last_update_solr(self):
+ """Updates the last sync time for the record."""
+ self.last_update_solr = datetime.utcnow()
+
+ def _create_solr_queue(self, function_name):
+ """Creates unique Solr queue for each record."""
+ for rec in self:
+ self.env['apache.solr.queue'].create_unique({
+ 'res_model': self._name,
+ 'res_id': rec.id,
+ 'function_name': function_name
+ })
+
+ @api.constrains('status')
+ def _create_solr_queue_sync_status(self):
+ """Triggers Solr sync when the status changes."""
+ self._create_solr_queue('_sync_status_category_homepage_solr')
+
+ @api.constrains('category_id', 'category_id2', 'sequence')
+ def _create_solr_queue_sync_category_homepage(self):
+ """Triggers Solr sync when categories or sequence change."""
+ self._create_solr_queue('_sync_category_management_to_solr')
+
+ def action_sync_to_solr(self):
+ """Manual action to sync selected categories to Solr."""
+ category_ids = self.env.context.get('active_ids', [])
+ categories = self.search([('id', 'in', category_ids)])
+ categories._create_solr_queue('_sync_category_management_to_solr')
+
+ def unlink(self):
+ """Overrides unlink method to remove records from Solr."""
+ for rec in self:
+ self.solr().delete(rec.id)
+ self.solr().optimize()
+ self.solr().commit()
+ return super(WebsiteCategoriesHomepage, self).unlink()
+
+ def _sync_status_category_homepage_solr(self):
+ """Syncs status to Solr or deletes if not active."""
+ for rec in self:
+ if rec.status == 'tayang':
+ rec._sync_category_management_to_solr()
+ else:
+ rec.unlink()
+
+ def _sync_category_management_to_solr(self):
+ """Syncs categories (Level 1, 2, and 3) to Solr."""
+ solr_model = self.env['apache.solr']
+
+ for category in self:
+ if category.status != 'tayang':
+ continue
+
+ # Prepare Level 1 document
+ document = {
+ 'id': category.id,
+ 'sequence_i': category.sequence or '',
+ 'category_id_i': category.category_id.id,
+ 'name_s': category.category_id.name,
+ 'numFound_i': len(category.category_id.product_tmpl_ids),
+ 'image_s': self.env['ir.attachment'].api_image(
+ 'product.public.category', 'image_1920', category.category_id.id
+ ),
+ 'categories': []
+ }
+
+ # Prepare Level 2 documents
+ for category_level_2 in category.line_ids.mapped('category_id2'):
+ level_2_doc = {
+ 'id_level_2': category_level_2.id,
+ 'name': category_level_2.name,
+ 'numFound': len(category_level_2.product_tmpl_ids),
+ 'image': self.env['ir.attachment'].api_image(
+ 'product.public.category', 'image_1920', category_level_2.id
+ ),
+ 'child_frontend_id_i': []
+ }
+
+ # Prepare Level 3 documents
+ for category_level_3 in category_level_2.child_frontend_id2:
+ level_3_doc = {
+ 'id_level_3': category_level_3.id,
+ 'name': category_level_3.name,
+ 'numFound': len(category_level_3.product_tmpl_ids),
+ 'image': self.env['ir.attachment'].api_image(
+ 'product.public.category', 'image_1920', category_level_3.id
+ ),
+ }
+ level_2_doc['child_frontend_id_i'].append(json.dumps(level_3_doc))
+
+ # Add Level 2 document to Level 1
+ document['categories'].append(json.dumps(level_2_doc))
+
+ # Sync document with Solr
+ self.solr().add([document])
+ category.update_last_update_solr()
+
+ # Commit and optimize Solr changes
+ self.solr().commit()
+ self.solr().optimize()
+