diff options
| author | Mqdd <ahmadmiqdad27@gmail.com> | 2025-12-08 15:19:36 +0700 |
|---|---|---|
| committer | Mqdd <ahmadmiqdad27@gmail.com> | 2025-12-08 15:19:36 +0700 |
| commit | f71156bc5e0ce9ceb22215a4345518b02f5250ed (patch) | |
| tree | 54c535169ce3433fe8bab4da96eb14858f3a776c | |
| parent | e27101a407ad9df9b341149b2b5ff5120062a464 (diff) | |
<Miqdad> solr
| -rw-r--r-- | indoteknik_custom/models/keywords.py | 76 | ||||
| -rw-r--r-- | indoteknik_custom/views/keywords.xml | 15 |
2 files changed, 82 insertions, 9 deletions
diff --git a/indoteknik_custom/models/keywords.py b/indoteknik_custom/models/keywords.py index 6e34642a..b1f2642d 100644 --- a/indoteknik_custom/models/keywords.py +++ b/indoteknik_custom/models/keywords.py @@ -7,9 +7,12 @@ from odoo.exceptions import UserError import base64 import xlrd, xlwt import io +from bs4 import BeautifulSoup _logger = logging.getLogger(__name__) +# solr = pysolr.Solr('http://10.148.0.5:8983/solr/keywords/', always_commit=True, timeout=30) +solr = pysolr.Solr('http://127.0.0.1:8983/solr/keywords/', always_commit=True, timeout=30) class Keywords(models.Model): _name = 'keywords' @@ -24,18 +27,22 @@ class Keywords(models.Model): 'product_id', string='Products' ) + name = fields.Char('Name', compute="_compute_name") skip = fields.Boolean('Skip Generate Product', default=False) + def _compute_name(self): + for record in self: + if not record.name: + record.name = record.keywords + def generate_products(self): - """Generate product_ids menggunakan SQL mentah (super cepat).""" for record in self: if not record.keywords: continue keyword = "%" + record.keywords.strip() + "%" - # Query dasar sql = """ SELECT pp.id FROM product_product pp @@ -52,28 +59,81 @@ class Keywords(models.Model): params = [keyword, keyword] - # Filter kategori kalau ada if record.category_id: sql += " AND rel.product_public_category_id = %s" params.append(record.category_id.id) - # Eksekusi SQL - self.env.cr.execute(sql, params) + # Exec query rows = self.env.cr.fetchall() product_ids = [r[0] for r in rows] - # Update Many2many record.with_context(skip_generate=True).write({ 'product_ids': [(6, 0, product_ids)] }) _logger.info( - "SQL FAST MODE: Found %s products for keyword '%s'", + "SQL : Found %s products for keyword '%s'", len(product_ids), record.keywords ) + + def sync_solr(self): + solr = self.env['apache.solr'] # pastikan ini model Solr sudah ada + documents = [] + + # Sync Keywords + for keyword in self.search([]): + doc = { + 'id': f'keyword_{keyword.id}', # prefix biar unik di Solr + 'type_s': 'keyword', + 'name_s': keyword.keywords, + 'category_id_i': keyword.category_id.id if keyword.category_id else 0, + 'product_ids_ii': keyword.product_ids.ids, + } + documents.append(doc) + _logger.info('Prepared Solr document for keyword %s', keyword.keywords) + + # Sync Products + products = self.env['product.product'].search([]) + for product in products: + category_ids = [c.id for c in product.public_categ_ids] + doc = { + 'id': f'product_{product.id}', + 'type_s': 'product', + 'name_s': product.name, + 'default_code_s': product.default_code or '', + 'category_ids_ii': category_ids, + 'website_description_t': product.website_description or '', + 'product_rating_f': getattr(product, 'virtual_rating', 0), + 'active_b': product.active, + } + documents.append(doc) + _logger.info('Prepared Solr document for product %s', product.name) + + # Sync Categories + categories = self.env['product.public.category'].search([]) + for cat in categories: + doc = { + 'id': f'category_{cat.id}', + 'type_s': 'category', + 'name_s': cat.name, + 'parent_id_i': cat.parent_id.id if cat.parent_id else 0, + } + documents.append(doc) + _logger.info('Prepared Solr document for category %s', cat.name) + + # Kirim ke Solr + if documents: + try: + solr.add(documents, softCommit=True) + _logger.info('Synced %d documents to Solr', len(documents)) + except Exception as e: + _logger.error('Failed to sync documents to Solr: %s', e) + else: + _logger.warning('No documents to sync to Solr') + @api.model def create(self, vals): record = super().create(vals) @@ -82,6 +142,6 @@ class Keywords(models.Model): def write(self, vals): result = super().write(vals) - if not self.env.context.get("skip_generate") and self.skip == False: + if not self.env.context.get("skip_generate") and not self.skip: self.generate_products() return result diff --git a/indoteknik_custom/views/keywords.xml b/indoteknik_custom/views/keywords.xml index 77bb8036..2fc44ced 100644 --- a/indoteknik_custom/views/keywords.xml +++ b/indoteknik_custom/views/keywords.xml @@ -18,6 +18,11 @@ <field name="arch" type="xml"> <form> <sheet> + <div class="oe_title"> + <h1> + <field name="name" readonly="1" class="oe_inline"/> + </h1> + </div> <group> <field name="category_id" /> <field name="keywords" /> @@ -41,13 +46,21 @@ </search> </field> </record> -<record id="action_keywords" model="ir.actions.act_window"> + <record id="action_keywords" model="ir.actions.act_window"> <field name="name">Keywords</field> <field name="type">ir.actions.act_window</field> <field name="res_model">keywords</field> <field name="search_view_id" ref="view_keywords_filter"/> <field name="view_mode">tree,form</field> </record> + + <record id="ir_actions_server_keywords_sync_to_solr" model="ir.actions.server"> + <field name="name">Sync to solr</field> + <field name="model_id" ref="indoteknik_custom.model_keywords"/> + <field name="binding_model_id" ref="indoteknik_custom.model_keywords"/> + <field name="state">code</field> + <field name="code">model.sync_solr()</field> + </record> <menuitem id="menu_keywords" name="Keywords" parent="website_sale.menu_orders" |
