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.

85 lines
3.7 KiB

  1. # -*- coding: utf-8 -*-
  2. from odoo import api, fields, models, tools, SUPERUSER_ID, _
  3. from odoo.exceptions import UserError
  4. class SearchLine(models.Model):
  5. _name = "search.line"
  6. name = fields.Char(string="Model Name")
  7. field_list = fields.Char(string="Fields Name")
  8. model_id = fields.Many2one('ir.model',string="Found in Model")
  9. record_id = fields.Integer(string="Record ID")
  10. search_id = fields.Many2one("dpo.view",string="Search Terms")
  11. record_name = fields.Char(string="Record Name", compute="_compute_record_name")
  12. @api.multi
  13. def open_record(self):
  14. return {
  15. 'name': _('Found record'),
  16. 'view_type': 'form',
  17. 'view_mode': 'form',
  18. 'res_model': self.model_id.model,
  19. 'type': 'ir.actions.act_window',
  20. 'res_id': self.record_id,
  21. 'target': 'new'
  22. }
  23. @api.one
  24. def _compute_record_name(self):
  25. for record in self:
  26. record_object = self.env[self.model_id.model].search([('id', '=', int(self.record_id))])
  27. record.record_name = record_object.name
  28. class ItisDpoView(models.Model):
  29. _name = "dpo.view"
  30. name = fields.Char(string="Search Term")
  31. model_ids = fields.Many2many('ir.model','dpo_view_ir_model_rel',string="Search in Model")
  32. search_lines = fields.One2many('search.line', 'search_id', string='Search Result')
  33. @api.multi
  34. def search_string(self):
  35. search_line_ids = self.env['search.line'].search([('search_id', '=', self.id)])
  36. search_line_ids.unlink()
  37. self._cr.commit()
  38. found = False
  39. for model in self.model_ids:
  40. table_name = model.model.replace(".","_")
  41. query = '''select * from '''+table_name+''' where '''
  42. field_list = self.env['ir.model.fields'].search([('model_id.id', '=', model.id),('ttype', 'in', ['char','html','text']),('store', '=', True)])
  43. for field in field_list:
  44. query = query +table_name+'''."'''+ field.name +'''" like '%'''+self.name+'''%' or '''
  45. query = query[:-3]
  46. query = query+''';'''
  47. self._cr.execute(query)
  48. colnames = [desc[0] for desc in self._cr.description]
  49. id_index = colnames.index("id")
  50. rec_id = 0
  51. rows = self._cr.fetchall()
  52. if rows:
  53. for rec in rows:
  54. ind = 0
  55. rec_id = rec[id_index]
  56. founded_col = []
  57. for row in rec:
  58. if str(row).find(self.name) >= 0:
  59. founded_col.append(colnames[ind])
  60. found = True
  61. ind = ind + 1
  62. fields_data = self.env['ir.model.fields'].search([('name', 'in', founded_col),('model_id', '=', model.id)])
  63. field_desc = []
  64. for field in fields_data:
  65. field_desc.append(field.field_description)
  66. create_id = self.env['search.line'].create({"field_list":str(field_desc),"name":model.name,"model_id":int(model.id),"search_id":int(self.id),"record_id":int(rec_id)})
  67. if not found:
  68. raise UserError(_("No record found with "+self.name+"."))
  69. # def _search_tables(self):
  70. # user_id = self.env['res.users'].browse('email', '=', self.email)
  71. # # field user_info could be an array containg the fields we want to display...
  72. # partner_id = self.env['res.partner'].browse('email', '=', self.email)
  73. # crm_id = self.env['crm.lead'].browse('email', '=', self.email)
  74. # mm_id = self.env['mail.mass_mailing'].browse('email', '=', self.email)