diff options
| author | Mqdd <ahmadmiqdad27@gmail.com> | 2025-12-08 13:03:38 +0700 |
|---|---|---|
| committer | Mqdd <ahmadmiqdad27@gmail.com> | 2025-12-08 13:03:38 +0700 |
| commit | e27101a407ad9df9b341149b2b5ff5120062a464 (patch) | |
| tree | 72a245c9c8cebb7e70d3392992f020fda99ae72c | |
| parent | 813a29fdcd7d95e6fcac6d4445b4683a2bea4def (diff) | |
<MIqdad> done temp
| -rw-r--r-- | indoteknik_custom/models/keywords.py | 69 | ||||
| -rw-r--r-- | indoteknik_custom/views/keywords.xml | 1 |
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> |
