changeset 2044:4802fd983c71

Fix bug #45786: Party search doesn't work when a last name is the same of another party's name. Use update search_rec_name with multiple fields to the Tryton way
author Luis Falcon <falcon@gnu.org>
date Fri, 21 Aug 2015 12:35:33 +0100
parents 9d96cf96c5fc
children 1e4f0372b743
files tryton/health/health.py
diffstat 1 files changed, 43 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- a/tryton/health/health.py
+++ b/tryton/health/health.py
@@ -410,14 +410,16 @@
     @classmethod
     def search_rec_name(cls, name, clause):
         """ Search for the name, lastname, PUID and any alternative IDs"""
-        field = None
-        for field in ('name', 'lastname', 'ref', 'alternative_ids.code'):
-            parties = cls.search([(field,) + tuple(clause[1:])], limit=1)
-            if parties:
-                break
-        if parties:
-            return [(field,) + tuple(clause[1:])]
-        return [(cls._rec_name,) + tuple(clause[1:])]
+        if clause[1].startswith('!') or clause[1].startswith('not '):
+            bool_op = 'AND'
+        else:
+            bool_op = 'OR'
+        return [bool_op,
+            ('ref',) + tuple(clause[1:]),
+            ('alternative_ids.code',) + tuple(clause[1:]),
+            ('name',) + tuple(clause[1:]),
+            ('lastname',) + tuple(clause[1:]),
+            ]
 
     @fields.depends('is_person', 'is_patient', 'is_healthprof')
     def on_change_with_is_person(self):
@@ -1799,22 +1801,21 @@
     name = fields.Char('Code', required=True)
     description = fields.Char('Long Text', translate=True)
 
+    # Include code + description in result
+    def get_rec_name(self, name):
+        return (self.name + ' : ' + self.description)
+
     # Search by the Procedure code or the description
     @classmethod
     def search_rec_name(cls, name, clause):
-        field = None
-        for field in ('name', 'description'):
-            procedures = cls.search([(field,) + tuple(clause[1:])], limit=1)
-            if procedures:
-                break
-        if procedures:
-            return [(field,) + tuple(clause[1:])]
-        return [(cls._rec_name,) + tuple(clause[1:])]
-
-    # Include code + description in result
-    def get_rec_name(self, name):
-        return (self.name + ' : ' + self.description)
-
+        if clause[1].startswith('!') or clause[1].startswith('not '):
+            bool_op = 'AND'
+        else:
+            bool_op = 'OR'
+        return [bool_op,
+            ('name',) + tuple(clause[1:]),
+            ('description',) + tuple(clause[1:]),
+            ]
 
 # Add institution attribute AFTER registering the Health Institution
 # Health Professionals and underlying conditions
@@ -2649,25 +2650,26 @@
         res.append(('name.lastname', clause[1], value))
         return res
 
-    # Search by the patient name, lastname or PUID
-
-    @classmethod
-    def search_rec_name(cls, name, clause):
-        field = None
-        for field in ('name', 'lastname', 'puid'):
-            patients = cls.search([(field,) + tuple(clause[1:])], limit=1)
-            if patients:
-                break
-        if patients:
-            return [(field,) + tuple(clause[1:])]
-        return [(cls._rec_name,) + tuple(clause[1:])]
-
     def get_rec_name(self, name):
         if self.name.lastname:
             return self.name.lastname + ', ' + self.name.name
         else:
             return self.name.name
 
+    # Search by the patient name, lastname or PUID
+
+    @classmethod
+    def search_rec_name(cls, name, clause):
+        if clause[1].startswith('!') or clause[1].startswith('not '):
+            bool_op = 'AND'
+        else:
+            bool_op = 'OR'
+        return [bool_op,
+            ('puid',) + tuple(clause[1:]),
+            ('name',) + tuple(clause[1:]),
+            ('lastname',) + tuple(clause[1:]),
+            ]
+
     @classmethod
     # Update to version 2.0
     def __register__(cls, module_name):
@@ -2884,11 +2886,13 @@
         super(PatientDiseaseInfo, cls).__register__(module_name)
 
 
-    @classmethod
-    def view_attributes(cls):
-        return [('/tree', 'colors',
-                If(Bool(Eval('is_infectious')),'orange','black'))]
-
+    # Show warning on infectious disease
+    infectious_disease_icon = \
+        fields.Function(fields.Char('Infect'), 'get_infect_disease_icon')
+    
+    def get_infect_disease_icon(self, name):
+        if (self.is_infectious):
+            return 'gnuhealth-warning'
 
 # PATIENT APPOINTMENT
 class Appointment(ModelSQL, ModelView):