diff options
| author | FIN-IT_AndriFP <andrifebriyadiputra@gmail.com> | 2025-12-12 13:46:01 +0700 |
|---|---|---|
| committer | FIN-IT_AndriFP <andrifebriyadiputra@gmail.com> | 2025-12-12 13:46:01 +0700 |
| commit | b615e3bc69910a6a495a72dc49309a80295486a0 (patch) | |
| tree | aa82539ebda1f138381b8496d0c39604fbb4adc2 /indoteknik_custom/models/keywords.py | |
| parent | 8c0acd970dfdb463717ae6c4a2bc67a7b32238ab (diff) | |
| parent | 097f53b8cb0b2c39fb14f5f3a665410df2c7ebf3 (diff) | |
Merge branch 'cr_renca_find' of https://bitbucket.org/altafixco/indoteknik-addons into cr_renca_find
Diffstat (limited to 'indoteknik_custom/models/keywords.py')
| -rw-r--r-- | indoteknik_custom/models/keywords.py | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/indoteknik_custom/models/keywords.py b/indoteknik_custom/models/keywords.py new file mode 100644 index 00000000..5faa94a6 --- /dev/null +++ b/indoteknik_custom/models/keywords.py @@ -0,0 +1,151 @@ +from itertools import product +from odoo import fields, models, api, tools, _ +import logging +import re +import pysolr +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/searchkey/', always_commit=True, timeout=30) +solr = pysolr.Solr('http://127.0.0.1:8983/solr/searchkey/', always_commit=True, timeout=30) + +class Keywords(models.Model): + _name = 'keywords' + _order= 'id desc' + + 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' + ) + name = fields.Char('Name', compute="_compute_name") + skip = fields.Boolean('Skip Generate Product', default=False) + url = fields.Char('Website URL', compute="_compute_url") + sum = fields.Integer('Total Product', compute="_compute_total_product", readonly=True) + + @api.depends('product_ids') + def _compute_total_product(self): + for record in self: + record.sum = len(record.product_ids) + + @api.depends('keywords') + def _compute_url(self): + prefix = "https://indoteknik.com/searchkey/" + for record in self: + if record.keywords: + slug = re.sub(r'[^a-zA-Z0-9]+', '-', record.keywords.strip().lower()) + slug = slug.strip('-') + record.url = prefix + slug + else: + record.url = False + + def _compute_name(self): + for record in self: + if not record.name: + record.name = record.keywords + + # @api.constrains('keywords') + # def check_already_exist(self): + # model = self.env['keywords'] + # for record in self: + # match = model.search([ + # ('name', 'ilike', record.name) + # ]) + # if match: + # raise UserError("Tidak bisa create/write/duplicate karena keywords sudah dipakai") + + + def generate_products(self): + for record in self: + if not record.keywords: + continue + + 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 ke child + if record.category_id: + child_categs = self.env['product.public.category'].search([ + ('id', 'child_of', record.category_id.id) + ]) + sql += " AND rel.product_public_category_id = ANY(%s)" + params.append(child_categs.ids) + + # Exec SQL + self.env.cr.execute(sql, params) + rows = self.env.cr.fetchall() + + product_ids = [r[0] for r in rows] + + if not product_ids: + raise UserError("Tidak berhasil menemukan barang") + + record.with_context(skip_generate=True).write({ + 'product_ids': [(6, 0, product_ids)] + }) + + _logger.info( + "Product Found: Found %s products for keyword '%s'", + len(product_ids), + record.keywords + ) + + def sync_solr(self): + # solr_model = self.env['apache.solr'] + documents = [] + data = {} + for keyword in self.search([]): + searchkey = (keyword.keywords or '').strip().lower().replace(' ', '-') + try: + doc = { + 'id': keyword.id, + 'category_id_i': keyword.category_id.id, + 'keywords_s': searchkey, + # 'searchkey_t': searchkey, + 'url_s': keyword.url, + 'product_ids_is': [p.product_tmpl_id.id for p in keyword.product_ids] + } + documents.append(doc) + data = doc + except Exception as e: + _logger.error('failed %s', e) + _logger.error('doc data: %s', data) + solr.add(documents) + return True + + @api.model + def create(self, vals): + record = super().create(vals) + record.generate_products() + return record + + def write(self, vals): + result = super().write(vals) + # if not self.env.context.get("skip_generate") and not self.skip: + # self.generate_products() + return result |
