[IMP]: base_calendar: Removing event or its recurrence should remove all the recurren...
authorrpa (Open ERP) <rpa@tinyerp.com>
Fri, 20 Aug 2010 11:20:13 +0000 (16:50 +0530)
committerrpa (Open ERP) <rpa@tinyerp.com>
Fri, 20 Aug 2010 11:20:13 +0000 (16:50 +0530)
bzr revid: rpa@tinyerp.com-20100820112013-bt1pkub8irxro3hx

addons/base_calendar/base_calendar.py

index 3577d98..1beb7e9 100644 (file)
@@ -962,6 +962,19 @@ class calendar_event(osv.osv):
 
         return {'value': value}
 
+    def unlink_events(self, cr, uid, ids, context=None):
+        """
+        This function deletes event which are linked with the event with recurrent_uid
+                (Removes the events which refers to the same UID value)
+        """
+        if not context:
+            context = {}
+        for event_id in ids:
+            cr.execute('select id from %s  where recurrent_uid=%s' % (self._table, event_id))
+            r_ids = map(lambda x: x[0], cr.fetchall())
+            self.unlink(cr, uid, r_ids, context=context)
+        return True
+
     def _set_rrulestring(self, cr, uid, id, name, value, arg, context=None):
         """
         Sets values of fields that defines event recurrence from the value of rrule string
@@ -1074,6 +1087,10 @@ class calendar_event(osv.osv):
                 else:
                     result[event] = self.compute_rule_string(cr, uid, {'freq': datas.get('rrule_type').upper(), 'interval': 1}, context=context)
 
+        for id, myrule in result.items():
+            #Remove the events generated from recurrent event
+            if not myrule:
+                self.unlink_events(cr, uid, [id], context=context)
         return result
 
     _columns = {
@@ -1546,21 +1563,24 @@ true, it will allow you to hide the event alarm information without removing it.
         """
         res = False
         for event_datas in self.read(cr, uid, ids, ['date', 'rrule', 'exdate'], context=context):
-            if isinstance(event_datas['id'], (int, long)):
-                res = super(calendar_event, self).unlink(cr, uid, event_datas['id'])
+            event_id = event_datas['id']
+            if isinstance(event_id, (int, long)):
+                res = super(calendar_event, self).unlink(cr, uid, event_id, context=context)
                 self.pool.get('res.alarm').do_alarm_unlink(cr, uid, [event_id], self._name)
+                self.unlink_events(cr, uid, [event_id], context=context)
             else:
-                event_id, date_new = event_datas['id'].split('-')
-                event_id = [int(event_id)]
+                str_event, date_new = event_id.split('-')
+                event_id = int(str_event)
                 if event_datas['rrule']:
                     # Remove one of the recurrent event
                     date_new = time.strftime("%Y%m%dT%H%M%S", \
                                  time.strptime(date_new, "%Y%m%d%H%M%S"))
                     exdate = (event_datas['exdate'] and (event_datas['exdate'] + ',')  or '') + date_new
-                    res = self.write(cr, uid, event_id, {'exdate': exdate})
+                    res = self.write(cr, uid, [event_id], {'exdate': exdate})
                 else:
-                    res = super(calendar_event, self).unlink(cr, uid, event_id)
-                    self.pool.get('res.alarm').do_alarm_unlink(cr, uid, event_id, self._name)
+                    res = super(calendar_event, self).unlink(cr, uid, [event_id], context=context)
+                    self.pool.get('res.alarm').do_alarm_unlink(cr, uid, [event_id], self._name)
+                    self.unlink_events(cr, uid, [event_id], context=context)
         return res
 
     def create(self, cr, uid, vals, context=None):