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;
}
if (!$event['id']) // some defaults for new entries
{
// if no owner given, set user to owner
@ -138,6 +139,7 @@ class bocalupdate extends bocal
}
return false;
}
// 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']))
{
@ -258,6 +260,7 @@ class bocalupdate extends bocal
return $conflicts;
}
}
// save the event to the database
if ($touch_modified)
{
@ -278,6 +281,7 @@ class bocalupdate extends bocal
{
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
//echo "new $cal_id="; _debug_array($event);
@ -293,6 +297,7 @@ class bocalupdate extends bocal
else // update existing event
{
$this->check4update($event,$old_event);
}
// notify the link-class about the update, as other apps may be subscribt to it
$this->link->notify_update('calendar',$cal_id,$event);
@ -693,6 +698,7 @@ class bocalupdate extends bocal
{
return false;
}
// 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();
@ -704,10 +710,8 @@ class bocalupdate extends bocal
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
$check_etag = $event['etag'];
if (!$check_etag){
$check_etag=$check_etag+1;
}
$check_etag = ($event['etag'] ? $event['etag']:1);
// same with the recur exceptions
if (isset($event['recur_exception']) && is_array($event['recur_exception']))
{
@ -1118,7 +1122,7 @@ class bocalupdate extends bocal
*/
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);
}
}

View File

@ -499,7 +499,6 @@ ORDER BY cal_user_type, cal_usre_id
$cal_id = (int) $event['id'];
unset($event['id']);
$set_recurrences = !$cal_id && $event['recur_type'] != MCAL_RECUR_NONE;
// 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']);
// 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)
{
$event['cal_etag']=$check_etag+1;
$event['cal_edit_user']=NULL;
$event['cal_edit_time']=NULL;
$where = array('cal_id' => $cal_id);
if ($check_etag) $where['cal_etag'] = $check_etag;
// cal_etag will be set on first save (if not set)
$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__))
{
//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
}
} else {
$event['cal_etag']=$check_modified;
}
if ($cal_id)
@ -1152,6 +1154,15 @@ ORDER BY cal_user_type, cal_usre_id
$cal_id = (int) $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'])
{

View File

@ -416,7 +416,7 @@ class uiforms extends uical
$event['button_was'] = $button; // remember for ignore
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 />'.
lang('Copy your changes to the clipboard, %1reload the entry%2 and merge them.','<a href="'.
@ -871,23 +871,23 @@ class uiforms extends uical
// time locking for entries
$locktime = $GLOBALS['egw_info']['server']['Lock_Time_Calender'];
if ($locktime == '') {
//default Lock Time
$locktime=$GLOBALS['egw_info']['server']['Lock_Time_Calender']=$this->locktime_default;
}
if ($locktime) {
// the warning and the saving of edit_user and time will only be performed, if there is a lock time set
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
$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 {
}
// non_interactive==true from $_GET calls immediate save action without displaying the edit form
if(isset($_GET['non_interactive']) && (bool)$_GET['non_interactive'] === true)
{