summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMqdd <ahmadmiqdad27@gmail.com>2025-12-08 13:03:38 +0700
committerMqdd <ahmadmiqdad27@gmail.com>2025-12-08 13:03:38 +0700
commite27101a407ad9df9b341149b2b5ff5120062a464 (patch)
tree72a245c9c8cebb7e70d3392992f020fda99ae72c
parent813a29fdcd7d95e6fcac6d4445b4683a2bea4def (diff)
<MIqdad> done temp
-rw-r--r--indoteknik_custom/models/keywords.py69
-rw-r--r--indoteknik_custom/views/keywords.xml1
2 files changed, 53 insertions, 17 deletions
diff --git a/indoteknik_custom/models/keywords.py b/indoteknik_custom/models/keywords.py
index 38b6e2fe..6e34642a 100644
--- a/indoteknik_custom/models/keywords.py
+++ b/indoteknik_custom/models/keywords.py
@@ -15,38 +15,73 @@ class Keywords(models.Model):
_name = 'keywords'
_order= 'id desc'
- category_id = fields.Many2one('product.public.category', string='Category')
- keywords = fields.Char('Keywords')
- product_ids = fields.One2many('product.product', 'keyword_id', string='Products')
+ category_id = fields.Many2one('product.public.category', string='Category', required=True)
+ keywords = fields.Char('Keywords', required=True)
+ product_ids = fields.Many2many(
+ 'product.product',
+ 'keywords_product_rel',
+ 'keyword_id',
+ 'product_id',
+ string='Products'
+ )
+ skip = fields.Boolean('Skip Generate Product', default=False)
- @api.constrains('product_ids', 'keywords', 'category_id')
- def action_generate_products(self):
+
+ def generate_products(self):
+ """Generate product_ids menggunakan SQL mentah (super cepat)."""
for record in self:
if not record.keywords:
continue
- domain = [
- ('name', 'ilike', record.keywords),
- ('product_rating', '>=', 8),
- ('unpublish', '=', False)
- ]
+ keyword = "%" + record.keywords.strip() + "%"
+
+ # Query dasar
+ sql = """
+ SELECT pp.id
+ FROM product_product pp
+ JOIN product_template pt ON pt.id = pp.product_tmpl_id
+ LEFT JOIN product_public_category_product_template_rel rel
+ ON rel.product_template_id = pt.id
+ WHERE (
+ pt.name ILIKE %s
+ OR pt.website_description ILIKE %s
+ AND pt.unpublished = False
+ AND pt.product_rating >= 8
+ )
+ """
+
+ 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)
- # if record.category_id:
- # domain += [(record.product_ids.id, 'in', record.category_id.id)]
+ # Eksekusi SQL
+ self.env.cr.execute(sql, params)
+ rows = self.env.cr.fetchall()
- matched_products = self.env['product.product'].search(domain)
+ product_ids = [r[0] for r in rows]
- record.product_ids = [(6, 0, matched_products.ids)]
+ # Update Many2many
+ record.with_context(skip_generate=True).write({
+ 'product_ids': [(6, 0, product_ids)]
+ })
- _logger.info('Generated %s products for keyword "%s"', len(matched_products), record.keywords)
+ _logger.info(
+ "SQL FAST MODE: Found %s products for keyword '%s'",
+ len(product_ids),
+ record.keywords
+ )
@api.model
def create(self, vals):
record = super().create(vals)
- record.action_generate_products()
+ record.generate_products()
return record
def write(self, vals):
result = super().write(vals)
- self.action_generate_products()
+ if not self.env.context.get("skip_generate") and self.skip == False:
+ self.generate_products()
return result
diff --git a/indoteknik_custom/views/keywords.xml b/indoteknik_custom/views/keywords.xml
index 872887a7..77bb8036 100644
--- a/indoteknik_custom/views/keywords.xml
+++ b/indoteknik_custom/views/keywords.xml
@@ -22,6 +22,7 @@
<field name="category_id" />
<field name="keywords" />
<field name="product_ids" widget="many2many_tags" />
+ <field name="skip" />
</group>
</sheet>
</form>