Hello,
@paranoid-android said in Synching and deleting single events from recurrent / repeating events:
[…] whenever I delete a single event from a series of events within Thunderbird, it does get deleted, and not just marked as canceled. If Thunderbird (SoGO connector) would do this wrong, that would already make two applications that handle deleted events incorrect. And the same goes for other calendar applications, like KOrganize or Evolution: they all would do it wrong.
If you do it in Thunderbird, it probably makes an EXDATE. I can’t say that because I haven’t checked it, and I have never said anything about Thunderbird.
What I said is that on Android, most calendar apps don’t set the deleted instance as EXDATE
(which would remove the instance), but let the instance active and mark it as status: cancelled.
Proof:
- Create a recurring event in Nextcloud and sync it with DAVdroid:
V/davdroid(32418): BEGIN:VEVENT
V/davdroid(32418): CREATED:20161019T131131
V/davdroid(32418): DTSTAMP:20161019T131131
V/davdroid(32418): LAST-MODIFIED:20161019T131131
V/davdroid(32418): UID:1hfhkjybp8u
V/davdroid(32418): SUMMARY:Recur1
V/davdroid(32418): CLASS:PUBLIC
V/davdroid(32418): STATUS:CONFIRMED
V/davdroid(32418): DTSTART;TZID=Europe/Berlin:20161019T091500
V/davdroid(32418): DTEND;TZID=Europe/Berlin:20161019T101500
V/davdroid(32418): RRULE:FREQ=DAILY;COUNT=3
V/davdroid(32418): END:VEVENT
After synchronizing, it shows up in the calendar as recurring event with 3 instances. If you have a look at the Android calendar database, you can find those entries:
sqlite> select * from events;
_id = 117
_sync_id = ownCloud-fcewuc3fetwce9zoqv3br.ics
dirty = 0
mutators =
lastSynced = 0
calendar_id = 1
title = Recur1
eventLocation =
description =
eventColor =
eventColor_index =
eventStatus = 1
selfAttendeeStatus = 0
dtstart = 1476861300000
dtend =
eventTimezone = Europe/Berlin
duration = PT1H
allDay = 0
accessLevel = 3
availability = 0
hasAlarm = 0
hasExtendedProperties = 0
rrule = FREQ=DAILY;COUNT=3
rdate =
exrule =
exdate =
original_id =
original_sync_id =
originalInstanceTime =
originalAllDay =
lastDate = 1477037700000
hasAttendeeData = 1
guestsCanModify = 0
guestsCanInviteOthers = 1
guestsCanSeeGuests = 1
organizer = <account name>
isOrganizer =
deleted = 0
eventEndTimezone =
customAppPackage =
customAppUri =
uid2445 = 1hfhkjybp8u
sync_data1 = dff8e0844b01409cc9c33741a3d9f633
sync_data2 =
sync_data3 = 0
sync_data4 =
sync_data5 =
sync_data6 =
sync_data7 =
sync_data8 =
sync_data9 =
sync_data10 =
sqlite> select * from Instances;
_id = 1
event_id = 117
begin = 1476861300000
end = 1476864900000
startDay = 2457681
endDay = 2457681
startMinute = 555
endMinute = 615
_id = 2
event_id = 117
begin = 1476947700000
end = 1476951300000
startDay = 2457682
endDay = 2457682
startMinute = 555
endMinute = 615
_id = 3
event_id = 117
begin = 1477034100000
end = 1477037700000
startDay = 2457683
endDay = 2457683
startMinute = 555
endMinute = 615
- Open the default CM13 calendar app, choose the event on 20 Oct 2016, Delete, “Only this event”.
Now look at the database again:
sqlite> select * from events;
_id = 117
_sync_id = ownCloud-fcewuc3fetwce9zoqv3br.ics
dirty = 0
mutators =
lastSynced = 0
calendar_id = 1
title = Recur1
eventLocation =
description =
eventColor =
eventColor_index =
eventStatus = 1
selfAttendeeStatus = 0
dtstart = 1476861300000
dtend =
eventTimezone = Europe/Berlin
duration = PT1H
allDay = 0
accessLevel = 3
availability = 0
hasAlarm = 0
hasExtendedProperties = 0
rrule = FREQ=DAILY;COUNT=3
rdate =
exrule =
exdate =
original_id =
original_sync_id =
originalInstanceTime =
originalAllDay =
lastDate = 1477037700000
hasAttendeeData = 1
guestsCanModify = 0
guestsCanInviteOthers = 1
guestsCanSeeGuests = 1
organizer = <account name>
isOrganizer =
deleted = 0
eventEndTimezone =
customAppPackage =
customAppUri =
uid2445 = 1hfhkjybp8u
sync_data1 = dff8e0844b01409cc9c33741a3d9f633
sync_data2 =
sync_data3 = 0
sync_data4 =
sync_data5 =
sync_data6 =
sync_data7 =
sync_data8 =
sync_data9 =
sync_data10 =
_id = 118
_sync_id =
dirty = 1
mutators = com.android.calendar
lastSynced = 0
calendar_id = 1
title = Recur1
eventLocation =
description =
eventColor =
eventColor_index =
eventStatus = 2
selfAttendeeStatus = 0
dtstart = 1476947700000
dtend = 1476951300000
eventTimezone = Europe/Berlin
duration =
allDay = 0
accessLevel = 0
availability = 0
hasAlarm = 0
hasExtendedProperties = 0
rrule =
rdate =
exrule =
exdate =
original_id = 117
original_sync_id = ownCloud-fcewuc3fetwce9zoqv3br.ics
originalInstanceTime = 1476947700000
originalAllDay = 0
lastDate = 1476951300000
hasAttendeeData = 0
guestsCanModify = 0
guestsCanInviteOthers = 1
guestsCanSeeGuests = 1
organizer = <account name>
isOrganizer =
deleted = 0
eventEndTimezone =
customAppPackage =
customAppUri =
uid2445 =
sync_data1 =
sync_data2 =
sync_data3 =
sync_data4 =
sync_data5 =
sync_data6 =
sync_data7 =
sync_data8 =
sync_data9 =
sync_data10 =
As you can see, the original event (_id
117) is the same and no exdate
(or exrule
) has been set. Instead, an exception event has been created (_id
118, referring to original_id
117) on 20 Oct 2016 (originalInstanceTime = 1476947700000
= Thu Oct 20 07:15:00 2016 UTC). This exception on 20 Oct has eventStatus=2
, which is STATUS_CANCELED
and means that this instance has been cancelled.
Until now, DAVdroid hasn’t even been involved – it’s just the calendar app which creates an exception for the instance and sets it to cancelled (instead of setting it as an EXDATE
).
- DAVdroid synchronizes this event:
V/davdroid(32418): BEGIN:VEVENT
V/davdroid(32418): DTSTAMP:20161019T112935Z
V/davdroid(32418): UID:1hfhkjybp8u
V/davdroid(32418): SEQUENCE:1
V/davdroid(32418): DTSTART;TZID=Europe/Berlin:20161019T091500
V/davdroid(32418): DURATION:PT1H
V/davdroid(32418): RRULE:FREQ=DAILY;COUNT=3
V/davdroid(32418): SUMMARY:Recur1
V/davdroid(32418): STATUS:CONFIRMED
V/davdroid(32418): CLASS:PUBLIC
V/davdroid(32418): CREATED:20161019T131131
V/davdroid(32418): END:VEVENT
V/davdroid(32418): BEGIN:VEVENT
V/davdroid(32418): DTSTAMP:20161019T112935Z
V/davdroid(32418): UID:1hfhkjybp8u
V/davdroid(32418): RECURRENCE-ID:20161020T071500Z
V/davdroid(32418): SEQUENCE:1
V/davdroid(32418): DTSTART;TZID=Europe/Berlin:20161020T091500
V/davdroid(32418): DTEND;TZID=Europe/Berlin:20161020T101500
V/davdroid(32418): SUMMARY:Recur1
V/davdroid(32418): STATUS:CANCELLED
V/davdroid(32418): END:VEVENT
That’s exactly what’s DAVdroid has queried from the database (using the calendar provider): a recurring event, where the instance on RECURRENCE-ID:20161020T071500Z
is marked as STATUS:CANCELLED
.
I don’t see any room for interpretation here or where you see a problem. Maybe I have overseen something, but in this case, I would need a specific report on what’s wrong.
PS: My name is Ricki (with i) and I’m not a he.