Update a re-imported event rather than skipping it
Contacts and calendars disagreed on a re-import: a vCard or LDIF entry whose identity a book already held overwrote the card there (#242, #274), while an event whose UID a calendar held was counted and thrown away (#222). The asymmetry was never decided -- it was where each half stopped. Decided on #279: calendars update too, with two properties held back. `participants` carries every attendee's accepted/declined and `recurrenceOverrides` holds every "just this Wednesday" edit made here. Both are decisions taken after the file was written, and a file that mentions them at all describes them as they were at export, so writing either one over would destroy work silently and return no error. A corrected export now fixes the time, the title and the location, and leaves who said yes alone. `uid` is held back with them: it is what the two were matched on, so it is already equal. The scan returns uid -> id rather than a set of UIDs, since updating needs something to address, and creates and updates now share one `maxObjectsInSet` budget the way contacts' `writeCards` does -- 300 new and 300 changed batched separately would be two calls of 300, neither over a ceiling of 500 and both refused. Counts become created/updated, reported as the contacts import reports them. Still no scheduling messages, on an update as much as on a create. That is a real cost -- an event a re-import moves is moved here and nowhere else -- and it is the lesser one: an import is not the place to start mailing a room full of people who never asked for it. Driven against the mock end to end: a second file with the same UID updated the event in place, took the file's title, start and location, and left an accepted RSVP and a per-occurrence override untouched even though the file carried participants of its own.
This commit is contained in:
@@ -1407,8 +1407,7 @@ export const catalog: Catalog = {
|
||||
"Your administrator changed {n} settings": { one: "Ihre Administration hat {n} Einstellung geändert", other: "Ihre Administration hat {n} Einstellungen geändert" },
|
||||
"Exported {n} events": { one: "{n} Termin exportiert", other: "{n} Termine exportiert" },
|
||||
"Imported {n} events": { one: "{n} Termin importiert", other: "{n} Termine importiert" },
|
||||
"Already here: {n} events, nothing imported": { one: "Bereits vorhanden: {n} Termin, nichts importiert", other: "Bereits vorhanden: {n} Termine, nichts importiert" },
|
||||
"{n} were already here": { one: "{n} war bereits vorhanden", other: "{n} waren bereits vorhanden" },
|
||||
"Updated {n} events, nothing new": { one: "{n} Termin aktualisiert, nichts Neues", other: "{n} Termine aktualisiert, nichts Neues" },
|
||||
"{n} messages": { one: "{n} Nachricht", other: "{n} Nachrichten" },
|
||||
"{n} selected": { one: "{n} ausgewählt", other: "{n} ausgewählt" },
|
||||
"{n} conversations": { one: "{n} Konversation", other: "{n} Konversationen" },
|
||||
|
||||
@@ -1380,8 +1380,7 @@ export const catalog: Catalog = {
|
||||
"Your administrator changed {n} settings": { one: "Tu administración cambió {n} ajuste", other: "Tu administración cambió {n} ajustes" },
|
||||
"Exported {n} events": { one: "{n} evento exportado", other: "{n} eventos exportados" },
|
||||
"Imported {n} events": { one: "{n} evento importado", other: "{n} eventos importados" },
|
||||
"Already here: {n} events, nothing imported": { one: "Ya estaba aquí: {n} evento, no se importó nada", other: "Ya estaban aquí: {n} eventos, no se importó nada" },
|
||||
"{n} were already here": { one: "{n} ya estaba aquí", other: "{n} ya estaban aquí" },
|
||||
"Updated {n} events, nothing new": { one: "{n} evento actualizado, nada nuevo", other: "{n} eventos actualizados, nada nuevo" },
|
||||
"{n} messages": { one: "{n} mensaje", other: "{n} mensajes" },
|
||||
"{n} selected": { one: "{n} seleccionado", other: "{n} seleccionados" },
|
||||
"{n} conversations": { one: "{n} conversación", other: "{n} conversaciones" },
|
||||
|
||||
@@ -1385,8 +1385,7 @@ export const catalog: Catalog = {
|
||||
"Your administrator changed {n} settings": { one: "Votre administration a modifié {n} paramètre", other: "Votre administration a modifié {n} paramètres" },
|
||||
"Exported {n} events": { one: "{n} événement exporté", other: "{n} événements exportés" },
|
||||
"Imported {n} events": { one: "{n} événement importé", other: "{n} événements importés" },
|
||||
"Already here: {n} events, nothing imported": { one: "Déjà présent : {n} événement, rien d’importé", other: "Déjà présents : {n} événements, rien d’importé" },
|
||||
"{n} were already here": { one: "{n} était déjà présent", other: "{n} étaient déjà présents" },
|
||||
"Updated {n} events, nothing new": { one: "{n} événement mis à jour, rien de nouveau", other: "{n} événements mis à jour, rien de nouveau" },
|
||||
"{n} messages": { one: "{n} message", other: "{n} messages" },
|
||||
"{n} selected": { one: "{n} sélectionné", other: "{n} sélectionnés" },
|
||||
"{n} conversations": { one: "{n} conversation", other: "{n} conversations" },
|
||||
|
||||
@@ -1388,8 +1388,7 @@ export const catalog: Catalog = {
|
||||
"Your administrator changed {n} settings": { other: "管理者が {n} 件の設定を変更しました" },
|
||||
"Exported {n} events": { other: "{n} 件の予定をエクスポートしました" },
|
||||
"Imported {n} events": { other: "{n} 件の予定をインポートしました" },
|
||||
"Already here: {n} events, nothing imported": { other: "すでに存在: {n} 件、インポートなし" },
|
||||
"{n} were already here": { other: "{n} 件はすでに存在していました" },
|
||||
"Updated {n} events, nothing new": { other: "{n} 件の予定を更新しました。新規はありません" },
|
||||
/*
|
||||
* One form each, because Japanese has one. Intl.PluralRules returns
|
||||
* `other` for every number, so `one`, `few` and `many` would never be
|
||||
|
||||
@@ -1376,8 +1376,7 @@ export const catalog: Catalog = {
|
||||
"Your administrator changed {n} settings": { one: "Uw beheerder heeft {n} instelling gewijzigd", other: "Uw beheerder heeft {n} instellingen gewijzigd" },
|
||||
"Exported {n} events": { one: "{n} afspraak geëxporteerd", other: "{n} afspraken geëxporteerd" },
|
||||
"Imported {n} events": { one: "{n} afspraak geïmporteerd", other: "{n} afspraken geïmporteerd" },
|
||||
"Already here: {n} events, nothing imported": { one: "Al aanwezig: {n} afspraak, niets geïmporteerd", other: "Al aanwezig: {n} afspraken, niets geïmporteerd" },
|
||||
"{n} were already here": { one: "{n} was er al", other: "{n} waren er al" },
|
||||
"Updated {n} events, nothing new": { one: "{n} afspraak bijgewerkt, niets nieuws", other: "{n} afspraken bijgewerkt, niets nieuws" },
|
||||
"{n} messages": { one: "{n} bericht", other: "{n} berichten" },
|
||||
"{n} selected": { one: "{n} geselecteerd", other: "{n} geselecteerd" },
|
||||
"{n} conversations": { one: "{n} gesprek", other: "{n} gesprekken" },
|
||||
|
||||
@@ -1383,8 +1383,7 @@ export const catalog: Catalog = {
|
||||
"Your administrator changed {n} settings": { one: "Sua administração alterou {n} configuração", other: "Sua administração alterou {n} configurações" },
|
||||
"Exported {n} events": { one: "{n} evento exportado", other: "{n} eventos exportados" },
|
||||
"Imported {n} events": { one: "{n} evento importado", other: "{n} eventos importados" },
|
||||
"Already here: {n} events, nothing imported": { one: "Já estava aqui: {n} evento, nada importado", other: "Já estavam aqui: {n} eventos, nada importado" },
|
||||
"{n} were already here": { one: "{n} já estava aqui", other: "{n} já estavam aqui" },
|
||||
"Updated {n} events, nothing new": { one: "{n} evento atualizado, nada novo", other: "{n} eventos atualizados, nada novo" },
|
||||
"{n} messages": { one: "{n} mensagem", other: "{n} mensagens" },
|
||||
"{n} selected": { one: "{n} selecionada", other: "{n} selecionadas" },
|
||||
"{n} conversations": { one: "{n} conversa", other: "{n} conversas" },
|
||||
|
||||
@@ -1382,8 +1382,7 @@ export const catalog: Catalog = {
|
||||
"Your administrator changed {n} settings": { one: "Администратор изменил {n} настройку", few: "Администратор изменил {n} настройки", many: "Администратор изменил {n} настроек", other: "Администратор изменил {n} настройки" },
|
||||
"Exported {n} events": { one: "Экспортировано {n} событие", few: "Экспортировано {n} события", many: "Экспортировано {n} событий", other: "Экспортировано {n} события" },
|
||||
"Imported {n} events": { one: "Импортировано {n} событие", few: "Импортировано {n} события", many: "Импортировано {n} событий", other: "Импортировано {n} события" },
|
||||
"Already here: {n} events, nothing imported": { one: "Уже есть: {n} событие, ничего не импортировано", few: "Уже есть: {n} события, ничего не импортировано", many: "Уже есть: {n} событий, ничего не импортировано", other: "Уже есть: {n} события, ничего не импортировано" },
|
||||
"{n} were already here": { one: "{n} уже было здесь", few: "{n} уже были здесь", many: "{n} уже были здесь", other: "{n} уже были здесь" },
|
||||
"Updated {n} events, nothing new": { one: "Обновлено {n} событие, новых нет", few: "Обновлено {n} события, новых нет", many: "Обновлено {n} событий, новых нет", other: "Обновлено {n} события, новых нет" },
|
||||
/*
|
||||
* Three forms, which is the whole reason plural() takes a map rather than
|
||||
* (one, other). Intl.PluralRules picks: 1 is `one`, 2-4 are `few`, 5-20
|
||||
|
||||
@@ -1376,8 +1376,7 @@ export const catalog: Catalog = {
|
||||
"Your administrator changed {n} settings": { one: "Адміністратор змінив {n} налаштування", few: "Адміністратор змінив {n} налаштування", many: "Адміністратор змінив {n} налаштувань", other: "Адміністратор змінив {n} налаштування" },
|
||||
"Exported {n} events": { one: "Експортовано {n} подію", few: "Експортовано {n} події", many: "Експортовано {n} подій", other: "Експортовано {n} події" },
|
||||
"Imported {n} events": { one: "Імпортовано {n} подію", few: "Імпортовано {n} події", many: "Імпортовано {n} подій", other: "Імпортовано {n} події" },
|
||||
"Already here: {n} events, nothing imported": { one: "Уже є: {n} подія, нічого не імпортовано", few: "Уже є: {n} події, нічого не імпортовано", many: "Уже є: {n} подій, нічого не імпортовано", other: "Уже є: {n} події, нічого не імпортовано" },
|
||||
"{n} were already here": { one: "{n} уже була тут", few: "{n} уже були тут", many: "{n} уже були тут", other: "{n} уже були тут" },
|
||||
"Updated {n} events, nothing new": { one: "Оновлено {n} подію, нових немає", few: "Оновлено {n} події, нових немає", many: "Оновлено {n} подій, нових немає", other: "Оновлено {n} події, нових немає" },
|
||||
/*
|
||||
* Ukrainian takes the same three forms as Russian and the same rule, but
|
||||
* not the same words. Sharing a plural structure is not sharing a
|
||||
|
||||
@@ -1387,8 +1387,7 @@ export const catalog: Catalog = {
|
||||
"Your administrator changed {n} settings": { other: "管理员更改了 {n} 项设置" },
|
||||
"Exported {n} events": { other: "已导出 {n} 个日程" },
|
||||
"Imported {n} events": { other: "已导入 {n} 个日程" },
|
||||
"Already here: {n} events, nothing imported": { other: "已存在 {n} 个,未导入" },
|
||||
"{n} were already here": { other: "{n} 个已存在" },
|
||||
"Updated {n} events, nothing new": { other: "已更新 {n} 个日程,无新增" },
|
||||
/*
|
||||
* One form each, because Chinese has one. Intl.PluralRules returns `other`
|
||||
* for every number, so `one`, `few` and `many` would never be selected —
|
||||
|
||||
Reference in New Issue
Block a user