From 643b93d9b57df8916714d898ba6457282d6756c2 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Tue, 3 Sep 2024 08:56:07 +0700 Subject: trying to add category parent to solr product template --- indoteknik_custom/models/solr/product_template.py | 31 +++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'indoteknik_custom/models/solr') diff --git a/indoteknik_custom/models/solr/product_template.py b/indoteknik_custom/models/solr/product_template.py index 6f76c529..2e34befe 100644 --- a/indoteknik_custom/models/solr/product_template.py +++ b/indoteknik_custom/models/solr/product_template.py @@ -101,6 +101,7 @@ 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 '', @@ -127,6 +128,36 @@ class ProductTemplate(models.Model): if not document.get('has_price_info_b'): template._sync_price_to_solr() + def get_category_hierarchy_ids(category_id, env): + """ + 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 = env['product.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'] -- cgit v1.2.3 From c9621e309e9b9db20ac01359b9369fa2d2a32024 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Tue, 3 Sep 2024 09:03:29 +0700 Subject: cr solr --- indoteknik_custom/models/solr/product_template.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'indoteknik_custom/models/solr') diff --git a/indoteknik_custom/models/solr/product_template.py b/indoteknik_custom/models/solr/product_template.py index 2e34befe..9c5dc73e 100644 --- a/indoteknik_custom/models/solr/product_template.py +++ b/indoteknik_custom/models/solr/product_template.py @@ -128,7 +128,7 @@ class ProductTemplate(models.Model): if not document.get('has_price_info_b'): template._sync_price_to_solr() - def get_category_hierarchy_ids(category_id, env): + def get_category_hierarchy_ids(self, category_id): """ Function to get category hierarchy IDs including the category itself and its parents. @@ -143,7 +143,7 @@ class ProductTemplate(models.Model): def traverse_category(cat_id): # Retrieve category object based on ID - category = env['product.category'].browse(cat_id) + category = self.env['product.public.category'].browse(cat_id) # Add the current category ID to the list category_ids.append(category.id) -- cgit v1.2.3 From 3d70fa89180cd3318b0f952c0f628d3bb1313340 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Tue, 3 Sep 2024 09:24:33 +0700 Subject: add description_clean to solr --- indoteknik_custom/models/solr/product_template.py | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'indoteknik_custom/models/solr') diff --git a/indoteknik_custom/models/solr/product_template.py b/indoteknik_custom/models/solr/product_template.py index 9c5dc73e..b5fed4fa 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, @@ -105,6 +109,7 @@ class ProductTemplate(models.Model): "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": website_description or '', 'has_product_info_b': True, 'publish_b': not template.unpublished, 'sni_b': template.unpublished, -- cgit v1.2.3 From 5372bb907b3ed65f5f4de1c8f9202eb1bcb1f93e Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Tue, 3 Sep 2024 09:33:24 +0700 Subject: add field promotion program line --- indoteknik_custom/models/solr/promotion_program_line.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'indoteknik_custom/models/solr') diff --git a/indoteknik_custom/models/solr/promotion_program_line.py b/indoteknik_custom/models/solr/promotion_program_line.py index 4b0e67f6..c6dbf213 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.display_name, + "category_name": category_names, }) self.solr().add([document]) -- cgit v1.2.3 From c617ed4000d1683a5ca9bdcf88b8ec6da6d9f8f0 Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Tue, 3 Sep 2024 09:35:11 +0700 Subject: fix bug description --- indoteknik_custom/models/solr/product_template.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_custom/models/solr') diff --git a/indoteknik_custom/models/solr/product_template.py b/indoteknik_custom/models/solr/product_template.py index b5fed4fa..d8dec47c 100644 --- a/indoteknik_custom/models/solr/product_template.py +++ b/indoteknik_custom/models/solr/product_template.py @@ -109,7 +109,7 @@ class ProductTemplate(models.Model): "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": website_description or '', + "description_clean_t": cleaned_desc or '', 'has_product_info_b': True, 'publish_b': not template.unpublished, 'sni_b': template.unpublished, -- cgit v1.2.3 From 51face2a473c347e338650d059445dc4f085d96e Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Tue, 3 Sep 2024 13:19:42 +0700 Subject: update field --- indoteknik_custom/models/solr/promotion_program_line.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_custom/models/solr') diff --git a/indoteknik_custom/models/solr/promotion_program_line.py b/indoteknik_custom/models/solr/promotion_program_line.py index c6dbf213..3e3a2a28 100644 --- a/indoteknik_custom/models/solr/promotion_program_line.py +++ b/indoteknik_custom/models/solr/promotion_program_line.py @@ -61,7 +61,7 @@ class PromotionProgramLine(models.Model): '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, - "manufacture_name_s": rec.product_ids.product_id.x_manufacture.display_name, + "manufacture_name_s": rec.product_ids.product_id.x_manufacture.x_name or '', "category_name": category_names, }) -- cgit v1.2.3 From 013a3e4d73327c138ede6f224b32969dc8f85c1f Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Wed, 4 Sep 2024 17:18:02 +0700 Subject: solr category management --- indoteknik_custom/models/solr/__init__.py | 3 +- .../models/solr/website_categories_management.py | 108 +++++++++++++++++++++ 2 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 indoteknik_custom/models/solr/website_categories_management.py (limited to 'indoteknik_custom/models/solr') 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/website_categories_management.py b/indoteknik_custom/models/solr/website_categories_management.py new file mode 100644 index 00000000..c3851f4b --- /dev/null +++ b/indoteknik_custom/models/solr/website_categories_management.py @@ -0,0 +1,108 @@ +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): + return self.env['apache.solr'].connect('category_management') + + def update_last_update_solr(self): + self.last_update_solr = datetime.utcnow() + + def _create_solr_queue(self, function_name): + 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): + self._create_solr_queue('_sync_status_category_homepage_solr') + + @api.constrains('category_id', 'category_id2', 'sequence') + def _create_solr_queue_sync_category_homepage(self): + self._create_solr_queue('_sync_category_management_to_solr') + + def action_sync_to_solr(self): + 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): + res = super(WebsiteCategoriesHomepage, self).unlink() + for rec in self: + self.solr().delete(rec.id) + self.solr().optimize() + self.solr().commit() + return res + + def _sync_status_category_homepage_solr(self): + for rec in self: + if rec.status == 'tayang': + rec._sync_category_management_to_solr() + else: + rec.unlink() + + def _sync_category_management_to_solr(self): + solr_model = self.env['apache.solr'] + + for category in self: + if category.status != 'tayang': + continue + + # Level 1 Document + document = solr_model.get_doc('category_management', category.id) + document.update({ + 'id': category.id, + 'category_id_i': category.category_id.id, + 'name_s': category.category_id.name, + 'image_s': self.env['ir.attachment'].api_image('product.public.category', 'image_1920', category.category_id.id), + 'sequence_i': category.sequence or '', + 'numFound_i': len(category.category_id.product_tmpl_ids.ids), + }) + + # Level 2 and Level 3 Documents + level_2_docs = [] + for x in category.category_id2: + level_2_doc = { + 'id_level_2': x.id, + 'name_level_2': x.name, + 'numFound_level_2': len(x.product_tmpl_ids.ids), + 'image_level_2': self.env['ir.attachment'].api_image('product.public.category', 'image_1920', x.id), + 'categories_level_3': [] + } + + # Level 3 Data + for child in x.child_frontend_id2: + level_3_doc = { + 'id_level_3': child.id, + 'name_level_3': child.name, + 'numFound_level_3': len(child.product_tmpl_ids.ids), + 'image_level_3': self.env['ir.attachment'].api_image('product.public.category', 'image_1920', child.id), + } + level_2_doc['categories_level_3'].append(level_3_doc) + + level_2_docs.append(level_2_doc) + + # Add level 2 documents to level 1 document + document['categories_level_2'] = level_2_docs + + # Add document to Solr + self.solr().add([document]) + category.update_last_update_solr() + + self.solr().commit() + + + # def _sync_delete_solr(self): + # for rec in self: + # self.solr().delete(rec.id) + # self.solr().optimize() + # self.solr().commit() \ No newline at end of file -- cgit v1.2.3 From 1b55d65464b9789164ba45bdef03c56428e026f2 Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Thu, 5 Sep 2024 17:49:30 +0700 Subject: update category management --- .../models/solr/website_categories_management.py | 54 +++++++++++----------- 1 file changed, 28 insertions(+), 26 deletions(-) (limited to 'indoteknik_custom/models/solr') diff --git a/indoteknik_custom/models/solr/website_categories_management.py b/indoteknik_custom/models/solr/website_categories_management.py index c3851f4b..fe85f8e7 100644 --- a/indoteknik_custom/models/solr/website_categories_management.py +++ b/indoteknik_custom/models/solr/website_categories_management.py @@ -2,19 +2,21 @@ 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, @@ -24,26 +26,30 @@ class WebsiteCategoriesHomepage(models.Model): @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): - res = super(WebsiteCategoriesHomepage, self).unlink() + """Overrides unlink method to remove records from Solr.""" for rec in self: self.solr().delete(rec.id) self.solr().optimize() self.solr().commit() - return res + 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() @@ -51,13 +57,14 @@ class WebsiteCategoriesHomepage(models.Model): 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 - # Level 1 Document + # Prepare Level 1 document document = solr_model.get_doc('category_management', category.id) document.update({ 'id': category.id, @@ -65,44 +72,39 @@ class WebsiteCategoriesHomepage(models.Model): 'name_s': category.category_id.name, 'image_s': self.env['ir.attachment'].api_image('product.public.category', 'image_1920', category.category_id.id), 'sequence_i': category.sequence or '', - 'numFound_i': len(category.category_id.product_tmpl_ids.ids), + 'numFound_i': len(category.category_id.product_tmpl_ids), }) - # Level 2 and Level 3 Documents + # Prepare Level 2 documents level_2_docs = [] - for x in category.category_id2: + for category_level_2 in category.line_ids.mapped('category_id2'): level_2_doc = { - 'id_level_2': x.id, - 'name_level_2': x.name, - 'numFound_level_2': len(x.product_tmpl_ids.ids), - 'image_level_2': self.env['ir.attachment'].api_image('product.public.category', 'image_1920', x.id), + 'id_level_2': category_level_2.id, + 'name_level_2': category_level_2.name, + 'numFound_level_2': len(category_level_2.product_tmpl_ids), + 'image_level_2': self.env['ir.attachment'].api_image('product.public.category', 'image_1920', category_level_2.id), 'categories_level_3': [] } - # Level 3 Data - for child in x.child_frontend_id2: + # Prepare Level 3 documents + for category_level_3 in category_level_2.child_frontend_id2: level_3_doc = { - 'id_level_3': child.id, - 'name_level_3': child.name, - 'numFound_level_3': len(child.product_tmpl_ids.ids), - 'image_level_3': self.env['ir.attachment'].api_image('product.public.category', 'image_1920', child.id), + 'id_level_3': category_level_3.id, + 'name_level_3': category_level_3.name, + 'numFound_level_3': len(category_level_3.product_tmpl_ids), + 'image_level_3': self.env['ir.attachment'].api_image('product.public.category', 'image_1920', category_level_3.id), } level_2_doc['categories_level_3'].append(level_3_doc) level_2_docs.append(level_2_doc) - # Add level 2 documents to level 1 document + # Add Level 2 documents to Level 1 document document['categories_level_2'] = level_2_docs - # Add document to Solr + # Sync document with Solr self.solr().add([document]) category.update_last_update_solr() + # Commit and optimize Solr changes self.solr().commit() - - - # def _sync_delete_solr(self): - # for rec in self: - # self.solr().delete(rec.id) - # self.solr().optimize() - # self.solr().commit() \ No newline at end of file + self.solr().optimize() -- cgit v1.2.3 From 94be2756aa2ab4c5a403877e9085eab344468f1a Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Fri, 6 Sep 2024 09:31:28 +0700 Subject: update category management --- .../models/solr/website_categories_management.py | 44 ++++++++++++---------- 1 file changed, 24 insertions(+), 20 deletions(-) (limited to 'indoteknik_custom/models/solr') diff --git a/indoteknik_custom/models/solr/website_categories_management.py b/indoteknik_custom/models/solr/website_categories_management.py index fe85f8e7..1f4caac3 100644 --- a/indoteknik_custom/models/solr/website_categories_management.py +++ b/indoteknik_custom/models/solr/website_categories_management.py @@ -65,41 +65,44 @@ class WebsiteCategoriesHomepage(models.Model): continue # Prepare Level 1 document - document = solr_model.get_doc('category_management', category.id) - document.update({ + document = { 'id': category.id, + 'sequence': category.sequence or '', 'category_id_i': category.category_id.id, - 'name_s': category.category_id.name, - 'image_s': self.env['ir.attachment'].api_image('product.public.category', 'image_1920', category.category_id.id), - 'sequence_i': category.sequence or '', - 'numFound_i': len(category.category_id.product_tmpl_ids), - }) + 'name': category.category_id.name, + 'numFound': len(category.category_id.product_tmpl_ids), + 'image': self.env['ir.attachment'].api_image( + 'product.public.category', 'image_1920', category.category_id.id + ), + 'categories': [] + } # Prepare Level 2 documents - level_2_docs = [] for category_level_2 in category.line_ids.mapped('category_id2'): level_2_doc = { 'id_level_2': category_level_2.id, - 'name_level_2': category_level_2.name, - 'numFound_level_2': len(category_level_2.product_tmpl_ids), - 'image_level_2': self.env['ir.attachment'].api_image('product.public.category', 'image_1920', category_level_2.id), - 'categories_level_3': [] + '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_level_3': category_level_3.name, - 'numFound_level_3': len(category_level_3.product_tmpl_ids), - 'image_level_3': self.env['ir.attachment'].api_image('product.public.category', 'image_1920', 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['categories_level_3'].append(level_3_doc) - - level_2_docs.append(level_2_doc) + level_2_doc['child_frontend_id_i'].append(level_3_doc) - # Add Level 2 documents to Level 1 document - document['categories_level_2'] = level_2_docs + # Add Level 2 document to Level 1 + document['categories'].append(level_2_doc) # Sync document with Solr self.solr().add([document]) @@ -108,3 +111,4 @@ class WebsiteCategoriesHomepage(models.Model): # Commit and optimize Solr changes self.solr().commit() self.solr().optimize() + -- cgit v1.2.3 From f6a26ebaa1b960b0ad5de8f6f28238c1e31cd621 Mon Sep 17 00:00:00 2001 From: it-fixcomart Date: Fri, 6 Sep 2024 14:32:39 +0700 Subject: upadate category management sync to solr --- .../models/solr/website_categories_management.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'indoteknik_custom/models/solr') diff --git a/indoteknik_custom/models/solr/website_categories_management.py b/indoteknik_custom/models/solr/website_categories_management.py index 1f4caac3..0a40a356 100644 --- a/indoteknik_custom/models/solr/website_categories_management.py +++ b/indoteknik_custom/models/solr/website_categories_management.py @@ -67,11 +67,11 @@ class WebsiteCategoriesHomepage(models.Model): # Prepare Level 1 document document = { 'id': category.id, - 'sequence': category.sequence or '', + 'sequence_i': category.sequence or '', 'category_id_i': category.category_id.id, - 'name': category.category_id.name, - 'numFound': len(category.category_id.product_tmpl_ids), - 'image': self.env['ir.attachment'].api_image( + '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': [] @@ -99,10 +99,10 @@ class WebsiteCategoriesHomepage(models.Model): 'product.public.category', 'image_1920', category_level_3.id ), } - level_2_doc['child_frontend_id_i'].append(level_3_doc) + level_2_doc['child_frontend_id_i'].append(json.dumps(level_3_doc)) # Add Level 2 document to Level 1 - document['categories'].append(level_2_doc) + document['categories'].append(json.dumps(level_2_doc)) # Sync document with Solr self.solr().add([document]) -- cgit v1.2.3