You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
2.8 KiB

  1. from odoo import api, fields, models, _
  2. from odoo.exceptions import UserError
  3. class SearchLine(models.Model):
  4. _name = "search.line"
  5. name = fields.Char(string="Model Name")
  6. field_list = fields.Char(string="Fields Name")
  7. model_id = fields.Many2one('ir.model', string="Found in Model")
  8. record_id = fields.Integer(string="Record ID")
  9. search_id = fields.Many2one("dpo.view", string="Search Terms")
  10. record_name = fields.Char(string="Record Name", compute="_compute_record_name")
  11. @api.multi
  12. def open_record(self):
  13. return {
  14. 'name': _('Found record'),
  15. 'view_type': 'form',
  16. 'view_mode': 'form',
  17. 'res_model': self.model_id.model,
  18. 'type': 'ir.actions.act_window',
  19. 'res_id': self.record_id,
  20. 'target': 'new'
  21. }
  22. @api.one
  23. def _compute_record_name(self):
  24. for record in self:
  25. record_object = self.env[self.model_id.model].search([('id', '=', int(self.record_id))])
  26. try:
  27. record.record_name = record_object.name
  28. except:
  29. record.record_name = "Name"
  30. class ItisDpoView(models.Model):
  31. _name = "dpo.view"
  32. name = fields.Char(string="Search Term")
  33. model_ids = fields.Many2many('ir.model', 'dpo_view_ir_model_rel', string="Search in Model")
  34. search_lines = fields.One2many('search.line', 'search_id', string='Search Result')
  35. @api.multi
  36. def search_string(self):
  37. search_line_ids = self.env['search.line'].search([('search_id', '=', self.id)])
  38. search_line_ids.unlink()
  39. final_list = []
  40. for model_id in self.model_ids:
  41. field_list = []
  42. found_match = {}
  43. for field_id in model_id.field_id:
  44. if field_id.ttype in ['char', 'html', 'text'] and field_id.store:
  45. field_list.append(field_id.name)
  46. for field in field_list:
  47. records = self.env[model_id.model].search([(field, 'ilike', self.name), (field, '!=', '')])
  48. for rec in records:
  49. temp_list = found_match.get(rec.id, False)
  50. if temp_list:
  51. temp_list.append(field)
  52. found_match[rec.id] = temp_list
  53. else:
  54. found_match[rec.id] = [field]
  55. for key, value in found_match.items():
  56. founded_json = {}
  57. founded_json["field_list"] = str(list(set(value)))
  58. founded_json["name"] = str(model_id.name)
  59. founded_json["model_id"] = model_id.id
  60. founded_json["search_id"] = self.id
  61. founded_json["record_id"] = key
  62. final_list.append(founded_json)
  63. if final_list:
  64. for vals in final_list:
  65. create_id = self.env['search.line'].create(vals)