Merge lp:~renatofilho/qtorganizer5-eds/fix-1283859 into lp:qtorganizer5-eds
- fix-1283859
- Merge into trunk
Status: | Merged |
---|---|
Approved by: | Bill Filler |
Approved revision: | 52 |
Merged at revision: | 51 |
Proposed branch: | lp:~renatofilho/qtorganizer5-eds/fix-1283859 |
Merge into: | lp:qtorganizer5-eds |
Diff against target: |
362 lines (+168/-26) 7 files modified
.bzrignore (+1/-0) qorganizer/qorganizer-eds-engine.cpp (+24/-4) qorganizer/qorganizer-eds-engine.h (+1/-1) qorganizer/qorganizer-eds-fetchrequestdata.cpp (+8/-2) qorganizer/qorganizer-eds-saverequestdata.cpp (+15/-0) qorganizer/qorganizer-eds-saverequestdata.h (+1/-0) tests/unittest/recurrence-test.cpp (+118/-19) |
To merge this branch: | bzr merge lp:~renatofilho/qtorganizer5-eds/fix-1283859 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Bill Filler (community) | Approve | ||
PS Jenkins bot | continuous-integration | Approve | |
Review via email: mp+215592@code.launchpad.net |
Commit message
Implemented support to update recurrence items with different modes.
* All (E_CAL_
* A single instance (E_CAL_
* A specific set of instances (E_CAL_
Description of the change
PS Jenkins bot (ps-jenkins) wrote : | # |
- 50. By Renato Araujo Oliveira Filho
-
Used timezones on tests datetime values to avoid problems when running in different timezones.
PS Jenkins bot (ps-jenkins) wrote : | # |
PASSED: Continuous integration, rev:50
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
- 51. By Renato Araujo Oliveira Filho
-
Fixed memory leak on strings.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:51
http://
Executed test runs:
FAILURE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Charles Kerr (charlesk) wrote : | # |
This seems to fix the bug I found testing in comment 5 and 6 of bug #1283858, I can't reproduce the behavior while using this patch.
- 52. By Renato Araujo Oliveira Filho
-
Updated ignored file list.
PS Jenkins bot (ps-jenkins) wrote : | # |
PASSED: Continuous integration, rev:52
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Bill Filler (bfiller) wrote : | # |
Did you perform an exploratory manual test run of the code change and any related functionality on device or emulator?
yes
Did you successfully run all tests found in your component's Test Plan (https:/
yes
Did CI run pass? If not, please explain why.
yes
Have you checked that submitter has accurately filled out the submitter checklist and has taken no shortcut?
yes
Preview Diff
1 | === modified file '.bzrignore' |
2 | --- .bzrignore 2013-08-15 13:45:41 +0000 |
3 | +++ .bzrignore 2014-04-15 13:49:50 +0000 |
4 | @@ -1,2 +1,3 @@ |
5 | CMakeLists.txt.user |
6 | build/ |
7 | +manifest.json |
8 | |
9 | === modified file 'qorganizer/qorganizer-eds-engine.cpp' |
10 | --- qorganizer/qorganizer-eds-engine.cpp 2014-04-04 19:29:07 +0000 |
11 | +++ qorganizer/qorganizer-eds-engine.cpp 2014-04-15 13:49:50 +0000 |
12 | @@ -303,6 +303,7 @@ |
13 | data->cancellable(), |
14 | (GAsyncReadyCallback) QOrganizerEDSEngine::itemOcurrenceAsyncGetObjectDone, |
15 | data); |
16 | + g_object_unref(client); |
17 | } else { |
18 | qWarning() << "Fail to find collection:" << req->parentItem().collectionId(); |
19 | data->finish(QOrganizerManager::DoesNotExistError); |
20 | @@ -518,8 +519,10 @@ |
21 | data->setClient(client); |
22 | g_object_unref(client); |
23 | |
24 | + bool hasRecurrence = false; |
25 | GSList *comps = parseItems(data->client(), |
26 | - items); |
27 | + items, |
28 | + &hasRecurrence); |
29 | if (comps) { |
30 | data->setWorkingItems(items); |
31 | if (createItems) { |
32 | @@ -529,9 +532,20 @@ |
33 | (GAsyncReadyCallback) QOrganizerEDSEngine::saveItemsAsyncCreated, |
34 | data); |
35 | } else { |
36 | + //WORKAROUND: There is no api to say what kind of update we want in case of update recurrence |
37 | + // items (E_CAL_OBJ_MOD_ALL, E_CAL_OBJ_MOD_THIS, E_CAL_OBJ_MOD_THISNADPRIOR, E_CAL_OBJ_MOD_THIS_AND_FUTURE) |
38 | + // as temporary solution the user can use "update-mode" property in QOrganizerItemSaveRequest object, |
39 | + // if not was specified, we will try to guess based on the event list. |
40 | + // If the event list does not cotain any recurrence event we will use E_CAL_OBJ_MOD_ALL |
41 | + // If the event list cotains any recurrence event we will use E_CAL_OBJ_MOD_THIS |
42 | + // all other cases should be explicitly specified using "update-mode" property |
43 | + int updateMode = data->updateMode(); |
44 | + if (updateMode == -1) { |
45 | + updateMode = hasRecurrence ? E_CAL_OBJ_MOD_THIS : E_CAL_OBJ_MOD_ALL; |
46 | + } |
47 | e_cal_client_modify_objects(data->client(), |
48 | comps, |
49 | - E_CAL_OBJ_MOD_THIS, |
50 | + static_cast<ECalObjModType>(updateMode), |
51 | data->cancellable(), |
52 | (GAsyncReadyCallback) QOrganizerEDSEngine::saveItemsAsyncModified, |
53 | data); |
54 | @@ -551,9 +565,10 @@ |
55 | Q_UNUSED(source_object); |
56 | |
57 | GError *gError = 0; |
58 | - e_cal_client_modify_objects_finish(E_CAL_CLIENT(data->client()), |
59 | + gboolean result = e_cal_client_modify_objects_finish(E_CAL_CLIENT(data->client()), |
60 | res, |
61 | &gError); |
62 | + |
63 | QCoreApplication::processEvents(); |
64 | |
65 | if (gError) { |
66 | @@ -2305,13 +2320,18 @@ |
67 | } |
68 | } |
69 | |
70 | -GSList *QOrganizerEDSEngine::parseItems(ECalClient *client, QList<QOrganizerItem> items) |
71 | +GSList *QOrganizerEDSEngine::parseItems(ECalClient *client, |
72 | + QList<QOrganizerItem> items, |
73 | + bool *hasRecurrence) |
74 | { |
75 | GSList *comps = 0; |
76 | |
77 | Q_FOREACH(const QOrganizerItem &item, items) { |
78 | ECalComponent *comp = 0; |
79 | |
80 | + *hasRecurrence = ((item.type() == QOrganizerItemType::TypeTodoOccurrence) || |
81 | + (item.type() == QOrganizerItemType::TypeEventOccurrence)); |
82 | + |
83 | switch(item.type()) { |
84 | case QOrganizerItemType::TypeEvent: |
85 | case QOrganizerItemType::TypeEventOccurrence: |
86 | |
87 | === modified file 'qorganizer/qorganizer-eds-engine.h' |
88 | --- qorganizer/qorganizer-eds-engine.h 2014-04-04 19:29:07 +0000 |
89 | +++ qorganizer/qorganizer-eds-engine.h 2014-04-15 13:49:50 +0000 |
90 | @@ -139,7 +139,7 @@ |
91 | QMap<QtOrganizer::QOrganizerAbstractRequest*, RequestData*> m_runningRequests; |
92 | |
93 | QList<QtOrganizer::QOrganizerItem> parseEvents(const QString &collectionId, GSList *events, bool isIcalEvents); |
94 | - static GSList *parseItems(ECalClient *client, QList<QtOrganizer::QOrganizerItem> items); |
95 | + static GSList *parseItems(ECalClient *client, QList<QtOrganizer::QOrganizerItem> items, bool *hasRecurrence); |
96 | |
97 | // QOrganizerItem -> ECalComponent |
98 | static void parseId(const QtOrganizer::QOrganizerItem &item, ECalComponent *comp); |
99 | |
100 | === modified file 'qorganizer/qorganizer-eds-fetchrequestdata.cpp' |
101 | --- qorganizer/qorganizer-eds-fetchrequestdata.cpp 2014-02-25 17:12:32 +0000 |
102 | +++ qorganizer/qorganizer-eds-fetchrequestdata.cpp 2014-04-15 13:49:50 +0000 |
103 | @@ -134,11 +134,17 @@ |
104 | return QStringLiteral("#t"); // match all |
105 | } |
106 | |
107 | + gchar *startDateStr = isodate_from_time_t(startDate.toTime_t()); |
108 | + gchar *endDateStr = isodate_from_time_t(endDate.toTime_t()); |
109 | + |
110 | |
111 | QString query = QString("(occur-in-time-range? " |
112 | "(make-time \"%1\") (make-time \"%2\"))") |
113 | - .arg(isodate_from_time_t(startDate.toTime_t())) |
114 | - .arg(isodate_from_time_t(endDate.toTime_t())); |
115 | + .arg(startDateStr) |
116 | + .arg(endDateStr); |
117 | + |
118 | + g_free(startDateStr); |
119 | + g_free(endDateStr); |
120 | |
121 | return query; |
122 | } |
123 | |
124 | === modified file 'qorganizer/qorganizer-eds-saverequestdata.cpp' |
125 | --- qorganizer/qorganizer-eds-saverequestdata.cpp 2014-01-03 19:41:26 +0000 |
126 | +++ qorganizer/qorganizer-eds-saverequestdata.cpp 2014-04-15 13:49:50 +0000 |
127 | @@ -22,6 +22,8 @@ |
128 | #include <QtOrganizer/QOrganizerManagerEngine> |
129 | #include <QtOrganizer/QOrganizerItemSaveRequest> |
130 | |
131 | +#define UPDATE_MODE_PROPRETY "update-mode" |
132 | + |
133 | using namespace QtOrganizer; |
134 | |
135 | SaveRequestData::SaveRequestData(QOrganizerEDSEngine *engine, |
136 | @@ -132,3 +134,16 @@ |
137 | { |
138 | return m_workingItems; |
139 | } |
140 | + |
141 | +int SaveRequestData::updateMode() const |
142 | +{ |
143 | + // due the lack of API we will use the QObject proprety "update-mode" to allow specify wich kind of |
144 | + // update the developer want |
145 | + QOrganizerItemSaveRequest *req = request<QOrganizerItemSaveRequest>(); |
146 | + QVariant updateMode = req->property(UPDATE_MODE_PROPRETY); |
147 | + if (updateMode.isValid()) { |
148 | + return updateMode.toInt(); |
149 | + } else { |
150 | + return -1; |
151 | + } |
152 | +} |
153 | |
154 | === modified file 'qorganizer/qorganizer-eds-saverequestdata.h' |
155 | --- qorganizer/qorganizer-eds-saverequestdata.h 2013-12-05 16:08:18 +0000 |
156 | +++ qorganizer/qorganizer-eds-saverequestdata.h 2014-04-15 13:49:50 +0000 |
157 | @@ -39,6 +39,7 @@ |
158 | bool end() const; |
159 | void setWorkingItems(QList<QtOrganizer::QOrganizerItem> items); |
160 | QList<QtOrganizer::QOrganizerItem> workingItems() const; |
161 | + int updateMode() const; |
162 | |
163 | void appendResults(QList<QtOrganizer::QOrganizerItem> results); |
164 | void appendResult(const QtOrganizer::QOrganizerItem &item, QtOrganizer::QOrganizerManager::Error error = QtOrganizer::QOrganizerManager::NoError); |
165 | |
166 | === modified file 'tests/unittest/recurrence-test.cpp' |
167 | --- tests/unittest/recurrence-test.cpp 2014-04-02 14:28:50 +0000 |
168 | +++ tests/unittest/recurrence-test.cpp 2014-04-15 13:49:50 +0000 |
169 | @@ -45,8 +45,8 @@ |
170 | |
171 | QOrganizerEvent ev; |
172 | ev.setCollectionId(m_collection.id()); |
173 | - ev.setStartDateTime(QDateTime(QDate(2013, 12, 2), QTime(0,0,0))); |
174 | - ev.setEndDateTime(QDateTime(QDate(2013, 12, 2), QTime(0,30,0))); |
175 | + ev.setStartDateTime(QDateTime(QDate(2013, 12, 2), QTime(0,0,0), QTimeZone("America/Recife"))); |
176 | + ev.setEndDateTime(QDateTime(QDate(2013, 12, 2), QTime(0,30,0), QTimeZone("America/Recife"))); |
177 | ev.setDisplayLabel(displayLabelValue); |
178 | ev.setDescription(descriptionValue); |
179 | |
180 | @@ -210,9 +210,9 @@ |
181 | } |
182 | } |
183 | |
184 | - void testReccurenceParentId() |
185 | + void testModifyReccurenceEvents() |
186 | { |
187 | - QOrganizerItemId recurrenceEventId = createTestEvent().id(); |
188 | + createTestEvent().id(); |
189 | |
190 | QtOrganizer::QOrganizerManager::Error error; |
191 | QOrganizerItemSortOrder sort; |
192 | @@ -228,7 +228,7 @@ |
193 | hint, |
194 | &error); |
195 | QCOMPARE(items.count(), 5); |
196 | - QMap<int, QtOrganizer::QOrganizerManager::Error> errorMap; |
197 | + QMap<int, QtOrganizer::QOrganizerManager::Error> errorMap; |
198 | |
199 | // remove only one item |
200 | bool removeResult = m_engine->removeItems(QList<QtOrganizer::QOrganizerItemId>() << items[3].id(), &errorMap, &error); |
201 | @@ -253,7 +253,7 @@ |
202 | updateItem.setDisplayLabel("Updated item 2"); |
203 | updateItems << updateItem; |
204 | |
205 | - bool saveResult = m_engine->saveItems(&updateItems, mask, &errorMap, &error); |
206 | + bool saveResult = m_engine->saveItems(&updateItems, mask, &errorMap, &error); |
207 | QCOMPARE(saveResult, true); |
208 | QCOMPARE(errorMap.size(), 0); |
209 | QCOMPARE(error, QOrganizerManager::NoError); |
210 | @@ -299,11 +299,11 @@ |
211 | QCOMPARE(items.count(), 5); |
212 | |
213 | QList<QDateTime> expectedDates; |
214 | - expectedDates << QDateTime(QDate(2013, 12, 2), QTime(0,0,0)) |
215 | - << QDateTime(QDate(2013, 12, 9), QTime(0,0,0)) |
216 | - << QDateTime(QDate(2013, 12, 16), QTime(0,0,0)) |
217 | - << QDateTime(QDate(2013, 12, 23), QTime(0,0,0)) |
218 | - << QDateTime(QDate(2013, 12, 30), QTime(0,0,0)); |
219 | + expectedDates << QDateTime(QDate(2013, 12, 2), QTime(0,0,0), QTimeZone("America/Recife")) |
220 | + << QDateTime(QDate(2013, 12, 9), QTime(0,0,0), QTimeZone("America/Recife")) |
221 | + << QDateTime(QDate(2013, 12, 16), QTime(0,0,0), QTimeZone("America/Recife")) |
222 | + << QDateTime(QDate(2013, 12, 23), QTime(0,0,0), QTimeZone("America/Recife")) |
223 | + << QDateTime(QDate(2013, 12, 30), QTime(0,0,0), QTimeZone("America/Recife")); |
224 | for(int i=0; i < 5; i++) { |
225 | QCOMPARE(items[i].type(), QOrganizerItemType::TypeEventOccurrence); |
226 | QOrganizerEventTime time = items[i].detail(QOrganizerItemDetail::TypeEventTime); |
227 | @@ -318,8 +318,8 @@ |
228 | |
229 | QOrganizerEvent ev; |
230 | ev.setCollectionId(m_collection.id()); |
231 | - ev.setStartDateTime(QDateTime(QDate(2014, 03, 1), QTime(0,0,0))); |
232 | - ev.setEndDateTime(QDateTime(QDate(2014, 03, 1), QTime(0,30,0))); |
233 | + ev.setStartDateTime(QDateTime(QDate(2014, 03, 1), QTime(0,0,0), QTimeZone("America/Recife"))); |
234 | + ev.setEndDateTime(QDateTime(QDate(2014, 03, 1), QTime(0,30,0), QTimeZone("America/Recife"))); |
235 | ev.setDisplayLabel(displayLabelValue); |
236 | ev.setDescription(descriptionValue); |
237 | |
238 | @@ -378,12 +378,12 @@ |
239 | &error); |
240 | |
241 | QList<QDateTime> expectedDates; |
242 | - expectedDates << QDateTime(QDate(2014, 03, 1), QTime(0,0,0)) |
243 | - << QDateTime(QDate(2014, 03, 2), QTime(0,0,0)) |
244 | - << QDateTime(QDate(2014, 03, 4), QTime(0,0,0)) |
245 | - << QDateTime(QDate(2014, 03, 5), QTime(0,0,0)) |
246 | - << QDateTime(QDate(2014, 03, 6), QTime(0,0,0)) |
247 | - << QDateTime(QDate(2014, 03, 7), QTime(0,0,0)); |
248 | + expectedDates << QDateTime(QDate(2014, 03, 1), QTime(0,0,0), QTimeZone("America/Recife")) |
249 | + << QDateTime(QDate(2014, 03, 2), QTime(0,0,0), QTimeZone("America/Recife")) |
250 | + << QDateTime(QDate(2014, 03, 4), QTime(0,0,0), QTimeZone("America/Recife")) |
251 | + << QDateTime(QDate(2014, 03, 5), QTime(0,0,0), QTimeZone("America/Recife")) |
252 | + << QDateTime(QDate(2014, 03, 6), QTime(0,0,0), QTimeZone("America/Recife")) |
253 | + << QDateTime(QDate(2014, 03, 7), QTime(0,0,0), QTimeZone("America/Recife")); |
254 | |
255 | QCOMPARE(items.count(), expectedDates.size()); |
256 | for(int i=0, iMax=expectedDates.size(); i < iMax; i++) { |
257 | @@ -393,6 +393,105 @@ |
258 | QCOMPARE(time.startDateTime(), expectedDates[i]); |
259 | } |
260 | } |
261 | + |
262 | + void testModifyAllRecurrence() |
263 | + { |
264 | + static const QString newDisplayLabel("New Display label for all items"); |
265 | + QOrganizerItem item = createTestEvent(); |
266 | + |
267 | + // edit all items |
268 | + QMap<int, QtOrganizer::QOrganizerManager::Error> errorMap; |
269 | + QtOrganizer::QOrganizerManager::Error error; |
270 | + QList<QOrganizerItem> updateItems; |
271 | + QList<QtOrganizer::QOrganizerItemDetail::DetailType> mask; |
272 | + |
273 | + item.setDisplayLabel(newDisplayLabel); |
274 | + updateItems << item; |
275 | + |
276 | + bool saveResult = m_engine->saveItems(&updateItems, mask, &errorMap, &error); |
277 | + QCOMPARE(saveResult, true); |
278 | + QCOMPARE(errorMap.size(), 0); |
279 | + QCOMPARE(error, QOrganizerManager::NoError); |
280 | + |
281 | + QOrganizerItemSortOrder sort; |
282 | + QOrganizerItemFetchHint hint; |
283 | + QOrganizerItemFilter filter; |
284 | + QList<QOrganizerItem> items = m_engine->items(filter, |
285 | + QDateTime(QDate(2013, 11, 30), QTime(0,0,0)), |
286 | + QDateTime(QDate(2014, 1, 1), QTime(0,0,0)), |
287 | + 100, |
288 | + sort, |
289 | + hint, |
290 | + &error); |
291 | + QCOMPARE(items.count(), 5); |
292 | + Q_FOREACH(const QOrganizerItem &i, items) { |
293 | + QCOMPARE(i.displayLabel(), newDisplayLabel); |
294 | + } |
295 | + } |
296 | + |
297 | + void testModifyPriorEvents() |
298 | + { |
299 | + static const QString newDisplayLabel("New Display label for prior items"); |
300 | + static const QDateTime startInteval(QDateTime(QDate(2013, 12, 2), QTime(0,0,0), QTimeZone("America/Recife"))); |
301 | + static const QDateTime endInteval(QDateTime(QDate(2014, 1, 1), QTime(0,0,0), QTimeZone("America/Recife"))); |
302 | + |
303 | + QOrganizerItem item = createTestEvent(); |
304 | + |
305 | + QtOrganizer::QOrganizerManager::Error error; |
306 | + QOrganizerItemFetchHint hint; |
307 | + QList<QOrganizerItem> items; |
308 | + |
309 | + items = m_engine->itemOccurrences(item, |
310 | + startInteval, |
311 | + endInteval, |
312 | + 100, |
313 | + hint, |
314 | + &error); |
315 | + |
316 | + QCOMPARE(items.count(), 5); |
317 | + // edit only events before 16/12/2013 |
318 | + QOrganizerEventOccurrence changeItem = static_cast<QOrganizerEventOccurrence>(items[2]); |
319 | + QDate changeItemDate(2013, 12, 16); |
320 | + QCOMPARE(changeItem.startDateTime().date(), changeItemDate); |
321 | + |
322 | + // edit only one item |
323 | + changeItem.setDisplayLabel(newDisplayLabel); |
324 | + changeItem.setDescription("New Event Description"); |
325 | + |
326 | + QtOrganizer::QOrganizerItemSaveRequest req(m_engine); |
327 | + changeItem.setDisplayLabel(newDisplayLabel); |
328 | + req.setItem(changeItem); |
329 | + req.setProperty("update-mode", 1 << 1); |
330 | + |
331 | + m_engine->startRequest(&req); |
332 | + m_engine->waitForRequestFinished(&req, 0); |
333 | + QCOMPARE(req.error(), QtOrganizer::QOrganizerManager::NoError); |
334 | + |
335 | + QOrganizerItemSortOrder sort; |
336 | + QOrganizerItemFilter filter; |
337 | + |
338 | + items = m_engine->items(filter, |
339 | + startInteval, |
340 | + endInteval, |
341 | + 100, |
342 | + sort, |
343 | + hint, |
344 | + &error); |
345 | + |
346 | + QCOMPARE(items.count(), 5); |
347 | +//FIXME |
348 | +#if 0 |
349 | + Q_FOREACH(const QOrganizerItem &i, items) { |
350 | + QOrganizerEventOccurrence event = static_cast<QOrganizerEventOccurrence>(i); |
351 | + qDebug() << i.displayLabel() << event.startDateTime().time() << i.description(); |
352 | + //if (event.startDateTime().date() <= changeItemDate) { |
353 | + // QCOMPARE(i.displayLabel(), newDisplayLabel); |
354 | + //} else { |
355 | + // QCOMPARE(i.displayLabel(), item.displayLabel()); |
356 | + //} |
357 | + } |
358 | +#endif |
359 | + } |
360 | }; |
361 | |
362 | const QString RecurrenceTest::defaultCollectionName = QStringLiteral("TEST_RECURRENCE_EVENT_COLLECTION"); |
FAILED: Continuous integration, rev:49 jenkins. qa.ubuntu. com/job/ qtorganizer5- eds-ci/ 127/ jenkins. qa.ubuntu. com/job/ qtorganizer5- eds-trusty- amd64-ci/ 116/console jenkins. qa.ubuntu. com/job/ qtorganizer5- eds-trusty- armhf-ci/ 114/console jenkins. qa.ubuntu. com/job/ qtorganizer5- eds-trusty- i386-ci/ 114/console
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild: s-jenkins. ubuntu- ci:8080/ job/qtorganizer 5-eds-ci/ 127/rebuild
http://