rework, for the handling of new events, and events that get deleted while opened by another user

This commit is contained in:
Klaus Leithoff 2008-01-17 15:39:22 +00:00
parent cc499eeb7b
commit 3f5045485a
3 changed files with 41 additions and 26 deletions

View File

@ -101,6 +101,7 @@ class bocalupdate extends bocal
{ {
return false; return false;
} }
if (!$event['id']) // some defaults for new entries if (!$event['id']) // some defaults for new entries
{ {
// if no owner given, set user to owner // if no owner given, set user to owner
@ -138,6 +139,7 @@ class bocalupdate extends bocal
} }
return false; return false;
} }
// check for conflicts only happens !$ignore_conflicts AND if start + end date are given // check for conflicts only happens !$ignore_conflicts AND if start + end date are given
if (!$ignore_conflicts && !$event['non_blocking'] && isset($event['start']) && isset($event['end'])) if (!$ignore_conflicts && !$event['non_blocking'] && isset($event['start']) && isset($event['end']))
{ {
@ -258,6 +260,7 @@ class bocalupdate extends bocal
return $conflicts; return $conflicts;
} }
} }
// save the event to the database // save the event to the database
if ($touch_modified) if ($touch_modified)
{ {
@ -278,6 +281,7 @@ class bocalupdate extends bocal
{ {
return $cal_id; return $cal_id;
} }
$event = $this->read($cal_id); // we re-read the event, in case only partial information was update and we need the full info for the notifies $event = $this->read($cal_id); // we re-read the event, in case only partial information was update and we need the full info for the notifies
//echo "new $cal_id="; _debug_array($event); //echo "new $cal_id="; _debug_array($event);
@ -293,6 +297,7 @@ class bocalupdate extends bocal
else // update existing event else // update existing event
{ {
$this->check4update($event,$old_event); $this->check4update($event,$old_event);
} }
// notify the link-class about the update, as other apps may be subscribt to it // notify the link-class about the update, as other apps may be subscribt to it
$this->link->notify_update('calendar',$cal_id,$event); $this->link->notify_update('calendar',$cal_id,$event);
@ -693,6 +698,7 @@ class bocalupdate extends bocal
{ {
return false; return false;
} }
// invalidate the read-cache if it contains the event we store now // invalidate the read-cache if it contains the event we store now
if ($event['id'] && $event['id'] == $this->cached_event['id']) $this->cached_event = array(); if ($event['id'] && $event['id'] == $this->cached_event['id']) $this->cached_event = array();
@ -704,10 +710,8 @@ class bocalupdate extends bocal
if (isset($event[$ts])) $event[$ts] = $event[$ts] ? $this->date2ts($event[$ts],true) : 0; if (isset($event[$ts])) $event[$ts] = $event[$ts] ? $this->date2ts($event[$ts],true) : 0;
} }
// Lock realized with a counter, that is checked and incremented as we save the entry // Lock realized with a counter, that is checked and incremented as we save the entry
$check_etag = $event['etag']; $check_etag = ($event['etag'] ? $event['etag']:1);
if (!$check_etag){
$check_etag=$check_etag+1;
}
// same with the recur exceptions // same with the recur exceptions
if (isset($event['recur_exception']) && is_array($event['recur_exception'])) if (isset($event['recur_exception']) && is_array($event['recur_exception']))
{ {
@ -1118,7 +1122,7 @@ class bocalupdate extends bocal
*/ */
function update_edit_user(&$event2update) function update_edit_user(&$event2update)
{ {
$event2update['cal_edit_time']=$this->now_su; $event2update['edit_time']=$this->now_su;
return $this->so->save_edit_user($event2update); return $this->so->save_edit_user($event2update);
} }
} }

View File

@ -499,7 +499,6 @@ ORDER BY cal_user_type, cal_usre_id
$cal_id = (int) $event['id']; $cal_id = (int) $event['id'];
unset($event['id']); unset($event['id']);
$set_recurrences = !$cal_id && $event['recur_type'] != MCAL_RECUR_NONE; $set_recurrences = !$cal_id && $event['recur_type'] != MCAL_RECUR_NONE;
// add colum prefix 'cal_' if there's not already a 'recur_' prefix // add colum prefix 'cal_' if there's not already a 'recur_' prefix
@ -514,15 +513,16 @@ ORDER BY cal_user_type, cal_usre_id
if (is_array($event['cal_category'])) $event['cal_category'] = implode(',',$event['cal_category']); if (is_array($event['cal_category'])) $event['cal_category'] = implode(',',$event['cal_category']);
// while saving handle the etag as condition for the update, to check if an entry was saved before this action occured // while saving handle the etag as condition for the update, to check if an entry was saved before this action occured
$check_etag = $event['cal_etag']; $check_etag = ($check_modified ? $check_modified : $event['cal_etag']);
if ($cal_id) if ($cal_id)
{ {
$event['cal_etag']=$check_etag+1; $event['cal_etag']=$check_etag+1;
$event['cal_edit_user']=NULL; $event['cal_edit_user']=NULL;
$event['cal_edit_time']=NULL; $event['cal_edit_time']=NULL;
$where = array('cal_id' => $cal_id); // cal_etag will be set on first save (if not set)
if ($check_etag) $where['cal_etag'] = $check_etag; $where = array('cal_id' => $cal_id,'cal_etag'=>$check_etag);
#if ($check_etag) $where['cal_etag'] = $check_etag;
if (!$this->db->update($this->cal_table,$event,$where,__LINE__,__FILE__)) if (!$this->db->update($this->cal_table,$event,$where,__LINE__,__FILE__))
{ {
//error_log("### socal::write(".print_r($event,true).") where=".print_r($where,true)." returning false"); //error_log("### socal::write(".print_r($event,true).") where=".print_r($where,true)." returning false");
@ -535,6 +535,8 @@ ORDER BY cal_user_type, cal_usre_id
return 0; // someone else updated the modtime or deleted the entry return 0; // someone else updated the modtime or deleted the entry
} }
} else {
$event['cal_etag']=$check_modified;
} }
if ($cal_id) if ($cal_id)
@ -1152,6 +1154,15 @@ ORDER BY cal_user_type, cal_usre_id
$cal_id = (int) $event2update['id']; $cal_id = (int) $event2update['id'];
//unset($event2update['id']); //unset($event2update['id']);
// add colum prefix 'cal_' if there's not already a 'recur_' prefix
foreach($event2update as $col => $val)
{
if ($col{0} != '#' && substr($col,0,6) != 'recur_' && $col != 'alarm')
{
$event2update['cal_'.$col] = $val;
unset($event2update[$col]);
}
}
if ($cal_id && $event2update['cal_edit_user'] && $event2update['cal_edit_time']) if ($cal_id && $event2update['cal_edit_user'] && $event2update['cal_edit_time'])
{ {

View File

@ -416,7 +416,7 @@ class uiforms extends uical
$event['button_was'] = $button; // remember for ignore $event['button_was'] = $button; // remember for ignore
return $this->conflicts($event,$conflicts,$preserv); return $this->conflicts($event,$conflicts,$preserv);
} }
elseif ($conflicts ==0) elseif ($conflicts ===0)
{ {
$msg .= ($msg ? ', ' : '') .lang('Error: the entry has been updated since you opened it for editing!').'<br />'. $msg .= ($msg ? ', ' : '') .lang('Error: the entry has been updated since you opened it for editing!').'<br />'.
lang('Copy your changes to the clipboard, %1reload the entry%2 and merge them.','<a href="'. lang('Copy your changes to the clipboard, %1reload the entry%2 and merge them.','<a href="'.
@ -871,22 +871,22 @@ class uiforms extends uical
// time locking for entries // time locking for entries
$locktime = $GLOBALS['egw_info']['server']['Lock_Time_Calender']; $locktime = $GLOBALS['egw_info']['server']['Lock_Time_Calender'];
if ($locktime == '') { if ($locktime) {
//default Lock Time // the warning and the saving of edit_user and time will only be performed, if there is a lock time set
$locktime=$GLOBALS['egw_info']['server']['Lock_Time_Calender']=$this->locktime_default; if (($this->bo->now_su>($event['edit_time']+$locktime)) || ($event['edit_time']==''))
} {
//echo "write Lock!!->DB";
$event2update['id']=$event['id'];
$event2update['edit_user']=$this->user;
$event2update['edit_time']=''; // this is set in bo->update_edit_user
$this->bo->update_edit_user($event2update);
}
else
{
if ($event['edit_user'] && $event['edit_user']!=$this->user) $content['msg'].=" ".lang('This entry is opened by user: ').$GLOBALS['egw']->accounts->id2name($event['edit_user']);
}
} else {
if (($this->bo->now_su>($event['edit_time']+$locktime)) || ($event['edit_time']==''))
{
//echo "write Lock!!->DB";
$event2update['id']=$event['id'];
$event2update['cal_edit_user']=$this->user;
$event2update['cal_edit_time']=''; // this is set in bo->update_edit_user
$this->bo->update_edit_user($event2update);
}
else
{
if ($event['edit_user'] && $event['edit_user']!=$this->user) $content['msg'].=" ".lang('This entry is opened by user: ').$GLOBALS['egw']->accounts->id2name($event['edit_user']);
} }
// non_interactive==true from $_GET calls immediate save action without displaying the edit form // non_interactive==true from $_GET calls immediate save action without displaying the edit form
if(isset($_GET['non_interactive']) && (bool)$_GET['non_interactive'] === true) if(isset($_GET['non_interactive']) && (bool)$_GET['non_interactive'] === true)