summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMqdd <ahmadmiqdad27@gmail.com>2025-12-08 15:19:36 +0700
committerMqdd <ahmadmiqdad27@gmail.com>2025-12-08 15:19:36 +0700
commitf71156bc5e0ce9ceb22215a4345518b02f5250ed (patch)
tree54c535169ce3433fe8bab4da96eb14858f3a776c
parente27101a407ad9df9b341149b2b5ff5120062a464 (diff)
<Miqdad> solr
-rw-r--r--indoteknik_custom/models/keywords.py76
-rw-r--r--indoteknik_custom/views/keywords.xml15
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"