[tryton-debian-vcs] tryton-modules-calendar-todo branch debian created. a9a600a85fe1dc3e863056e3922bcd37bd66eb06
Mathias Behrle
tryton-debian-vcs at alioth.debian.org
Wed Nov 27 17:00:14 UTC 2013
The following commit has been merged in the debian branch:
https://alioth.debian.org/plugins/scmgit/cgi-bin/gitweb.cgi/?p=tryton/tryton-modules-calendar-todo.git;a=commitdiff;h=a9a600a85fe1dc3e863056e3922bcd37bd66eb06
commit a9a600a85fe1dc3e863056e3922bcd37bd66eb06
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Mon Nov 25 20:30:09 2013 +0100
Releasing debian version 3.0.0-1.
diff --git a/debian/changelog b/debian/changelog
index 0b0ed95..64fb83e 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+tryton-modules-calendar-todo (3.0.0-1) unstable; urgency=low
+
+ * Merging upstream version 3.0.0.
+ * Updating to standards version 3.9.5, no changes needed.
+ * Changing to buildsystem pybuild.
+ * Adding python-sql to Depends.
+
+ -- Mathias Behrle <mathiasb at m9s.biz> Mon, 25 Nov 2013 17:53:45 +0100
+
tryton-modules-calendar-todo (2.8.0-3) unstable; urgency=low
* Removing pydist-overrides, it is no more needed.
commit f215d10e191683f7b800767cee734f918f1f0165
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Mon Nov 25 17:42:26 2013 +0100
Adding python-sql to Depends.
diff --git a/debian/control b/debian/control
index 3ebdd16..4cf02e8 100644
--- a/debian/control
+++ b/debian/control
@@ -16,7 +16,7 @@ Architecture: all
Depends:
${misc:Depends}, ${python:Depends}, tryton-server (>= ${version:major}),
tryton-modules-calendar (>= ${version:major}), python-dateutil, python-tz,
- python-vobject, python-webdav, python-pkg-resources
+ python-vobject, python-webdav, python-sql, python-pkg-resources
Description: Tryton Application Platform (Calendar Todo Module)
Tryton is a high-level general purpose application platform written in Python
and using PostgreSQL as database engine. It is the core base of a complete
commit 803a5659dbe27b7457dc05814ba6cc3c47d12043
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Sun Nov 24 19:51:51 2013 +0100
Changing to buildsystem pybuild.
diff --git a/debian/control b/debian/control
index cdd70a1..3ebdd16 100644
--- a/debian/control
+++ b/debian/control
@@ -3,7 +3,8 @@ Section: python
Priority: optional
Maintainer: Debian Tryton Maintainers <maintainers at debian.tryton.org>
Uploaders: Mathias Behrle <mathiasb at m9s.biz>
-Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools
+Build-Depends:
+ debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools, dh-python
Standards-Version: 3.9.5
Homepage: http://www.tryton.org/
Vcs-Browser: http://debian.tryton.org/gitweb/?p=packages/tryton-modules-calendar-todo.git
diff --git a/debian/rules b/debian/rules
index 30074ad..5b8c326 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,24 +1,17 @@
#!/usr/bin/make -f
-MAJOR := $(shell python setup.py --version | awk -F "." '{print $$1 "." $$2}')
-PACKAGE_NAME := $(shell python setup.py --name)
-
-%:
- dh ${@} --with python2
+# needed for pbuilder
+export LC_ALL=C.UTF-8
-override_dh_auto_clean:
- dh_auto_clean
+MAJOR := $(shell python setup.py --version | awk -F "." '{print $$1 "." $$2}')
+PACKAGE_NAME := tryton-modules-$(shell python setup.py --name | sed s/^trytond_// | sed s/_/-/g)
+export PYBUILD_DESTDIR_python2=debian/${PACKAGE_NAME}
-override_dh_auto_build:
- mv $(PACKAGE_NAME).egg-info $(PACKAGE_NAME).hen-info
- mv PKG-INFO PKG-INFO.hen
- dh_auto_build
+# Don't run tests for Tryton modules, they try to download dependencies from pypi
+export PYBUILD_DISABLE_python2.7=test
-override_dh_auto_install:
- dh_auto_install
- rm -rf *.egg-info
- mv $(PACKAGE_NAME).hen-info $(PACKAGE_NAME).egg-info
- mv PKG-INFO.hen PKG-INFO
+%:
+ dh ${@} --with python2 --buildsystem=pybuild
override_dh_gencontrol:
dh_gencontrol -- -Vversion:major="$(MAJOR)"
commit 7a9592bf59eab2870c35e9a9e8562138547efe43
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Sun Nov 24 19:14:21 2013 +0100
Updating to standards version 3.9.5, no changes needed.
diff --git a/debian/control b/debian/control
index 1a9ad57..cdd70a1 100644
--- a/debian/control
+++ b/debian/control
@@ -4,7 +4,7 @@ Priority: optional
Maintainer: Debian Tryton Maintainers <maintainers at debian.tryton.org>
Uploaders: Mathias Behrle <mathiasb at m9s.biz>
Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools
-Standards-Version: 3.9.4
+Standards-Version: 3.9.5
Homepage: http://www.tryton.org/
Vcs-Browser: http://debian.tryton.org/gitweb/?p=packages/tryton-modules-calendar-todo.git
Vcs-Git: git://debian.tryton.org/packages/tryton-modules-calendar-todo.git
commit 8b84bcaf6b984ad7f677dd22ada92d70eabe2cc7
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Sun Nov 24 17:26:49 2013 +0100
Merging upstream version 3.0.0.
diff --git a/CHANGELOG b/CHANGELOG
index 9735814..ad7e2ac 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 3.0.0 - 2013-10-21
+* Bug fixes (see mercurial logs for details)
+
Version 2.8.0 - 2013-04-22
* Bug fixes (see mercurial logs for details)
diff --git a/INSTALL b/INSTALL
index bbf874a..e0e91e4 100644
--- a/INSTALL
+++ b/INSTALL
@@ -10,6 +10,7 @@ Prerequisites
* pywebdav 0.9.8 or later (http://sourceforge.net/projects/pywebdav/)
* python-dateutil (http://labix.org/python-dateutil)
* pytz (http://pytz.sourceforge.net/)
+ * python-sql (http://code.google.com/p/python-sql/)
* trytond_calendar (http://www.tryton.org/)
Installation
diff --git a/PKG-INFO b/PKG-INFO
index d954667..fca3e1f 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.1
Name: trytond_calendar_todo
-Version: 2.8.0
+Version: 3.0.0
Summary: Tryton module to add TODO on CalDAV
Home-page: http://www.tryton.org/
Author: Tryton
Author-email: UNKNOWN
License: GPL-3
-Download-URL: http://downloads.tryton.org/2.8/
+Download-URL: http://downloads.tryton.org/3.0/
Description: trytond_calendar_todo
=====================
@@ -61,6 +61,7 @@ Classifier: Natural Language :: English
Classifier: Natural Language :: French
Classifier: Natural Language :: German
Classifier: Natural Language :: Russian
+Classifier: Natural Language :: Slovenian
Classifier: Natural Language :: Spanish
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 2.6
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index b35f41f..9ce1266 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -666,7 +666,7 @@ msgstr "Públic"
msgctxt "selection:calendar.todo,status:"
msgid ""
-msgstr " "
+msgstr ""
msgctxt "selection:calendar.todo,status:"
msgid "Cancelled"
@@ -686,7 +686,7 @@ msgstr "Necessitat-Acció"
msgctxt "selection:calendar.todo.attendee,status:"
msgid ""
-msgstr " "
+msgstr ""
msgctxt "selection:calendar.todo.attendee,status:"
msgid "Accepted"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index 806d017..5c5b929 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -658,10 +658,9 @@ msgctxt "selection:calendar.todo,classification:"
msgid "Public"
msgstr "Público"
-#, fuzzy
msgctxt "selection:calendar.todo,status:"
msgid ""
-msgstr "Punto de Orden"
+msgstr ""
msgctxt "selection:calendar.todo,status:"
msgid "Cancelled"
@@ -679,10 +678,9 @@ msgctxt "selection:calendar.todo,status:"
msgid "Needs-Action"
msgstr "Necesita una Acción"
-#, fuzzy
msgctxt "selection:calendar.todo.attendee,status:"
msgid ""
-msgstr "Punto de Orden"
+msgstr ""
msgctxt "selection:calendar.todo.attendee,status:"
msgid "Accepted"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index eed9e6b..4b70f1f 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -4,7 +4,7 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:calendar.todo.exrule:"
msgid "Invalid \"By Day\" in recurrence rule \"%s\""
-msgstr "El campo \"por dia\" de la regla de recurrencia \"%s\" no es correcto."
+msgstr "El campo \"por día\" de la regla de recurrencia \"%s\" no es correcto."
msgctxt "error:calendar.todo.exrule:"
msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
@@ -46,7 +46,7 @@ msgstr ""
msgctxt "error:calendar.todo.exrule:"
msgid "Only one of \"until\" and \"count\" can be set."
-msgstr "Define un \"hasta\" y un \"contador\"."
+msgstr "Puede establecer \"hasta\" o bien \"nº de veces\", no ambos."
msgctxt "error:calendar.todo.rrule:"
msgid "Invalid \"By Day\" in recurrence rule \"%s\""
@@ -92,7 +92,7 @@ msgstr ""
msgctxt "error:calendar.todo.rrule:"
msgid "Only one of \"until\" and \"count\" can be set."
-msgstr "Define un \"hasta\" y un \"contador\"."
+msgstr "Puede establecer \"hasta\" o bien \"nº de veces\", no ambos."
msgctxt "error:calendar.todo:"
msgid "Todo \"%s\" can not be recurrent."
@@ -292,7 +292,7 @@ msgstr "Tarea"
msgctxt "field:calendar.todo.alarm,valarm:"
msgid "valarm"
-msgstr "valarm"
+msgstr "Alarma"
msgctxt "field:calendar.todo.alarm,write_date:"
msgid "Write Date"
@@ -416,7 +416,7 @@ msgstr "Por día del año"
msgctxt "field:calendar.todo.exrule,count:"
msgid "Count"
-msgstr "Contador"
+msgstr "Nº de veces"
msgctxt "field:calendar.todo.exrule,create_date:"
msgid "Create Date"
@@ -540,7 +540,7 @@ msgstr "Por día del año"
msgctxt "field:calendar.todo.rrule,count:"
msgid "Count"
-msgstr "Contador"
+msgstr "Nº de veces"
msgctxt "field:calendar.todo.rrule,create_date:"
msgid "Create Date"
@@ -596,19 +596,19 @@ msgstr "Identificador universal único."
msgctxt "help:calendar.todo.exdate,date:"
msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr "Ingnora la hora del campo \"Fecha\", pero usar como única fecha."
+msgstr "Ingnorar la hora del campo \"Fecha\" y usar sólo el día."
msgctxt "help:calendar.todo.exrule,until_date:"
msgid "Ignore time of field \"Until Date\", but handle as date only."
-msgstr "Ingnora la hora del campo \"Hasta la fecha\", pero usar como única fecha."
+msgstr "Ingnorar la hora del campo \"Hasta la fecha\" y usar sólo el día."
msgctxt "help:calendar.todo.rdate,date:"
msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr "Ingnora la hora del campo \"Fecha\", pero usar como única fecha."
+msgstr "Ingnorar la hora del campo \"Fecha\" y usar sólo el día."
msgctxt "help:calendar.todo.rrule,until_date:"
msgid "Ignore time of field \"Until Date\", but handle as date only."
-msgstr "Ingnora la hora del campo \"Hasta la fecha\", pero usar como única fecha."
+msgstr "Ingnora la hora del campo \"Hasta la fecha\" y usar sólo el día."
msgctxt "model:calendar.todo,name:"
msgid "Todo"
@@ -684,7 +684,7 @@ msgstr "En proceso"
msgctxt "selection:calendar.todo,status:"
msgid "Needs-Action"
-msgstr "Necesidad-Acción"
+msgstr "Requiere acción"
msgctxt "selection:calendar.todo.attendee,status:"
msgid ""
@@ -696,15 +696,15 @@ msgstr "Acceptado"
msgctxt "selection:calendar.todo.attendee,status:"
msgid "Declined"
-msgstr "Rechazar"
+msgstr "Rechazado"
msgctxt "selection:calendar.todo.attendee,status:"
msgid "Delegated"
-msgstr "Delegar"
+msgstr "Delegado"
msgctxt "selection:calendar.todo.attendee,status:"
msgid "Needs Action"
-msgstr "Necesidad Acción"
+msgstr "Requiere acción"
msgctxt "selection:calendar.todo.attendee,status:"
msgid "Tentative"
@@ -844,7 +844,7 @@ msgstr "Regla de excepción"
msgctxt "view:calendar.todo.exrule:"
msgid "Exception Rules"
-msgstr "Reglas de excepciones"
+msgstr "Reglas de excepción"
msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Date"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index efb455f..2f604a4 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -604,7 +604,7 @@ msgstr "Tâche"
msgctxt "model:calendar.todo-calendar.category,name:"
msgid "Todo - Category"
-msgstr "Todo - Catégorie"
+msgstr "Tâche - Catégorie"
msgctxt "model:calendar.todo.alarm,name:"
msgid "Alarm"
@@ -624,7 +624,7 @@ msgstr "Règle d'exception"
msgctxt "model:calendar.todo.rdate,name:"
msgid "Todo Recurrence Date"
-msgstr "Date de récurrence"
+msgstr "Date de récurrence de tâche"
msgctxt "model:calendar.todo.rrule,name:"
msgid "Recurrence Rule"
@@ -647,22 +647,10 @@ msgid "Confidential"
msgstr "Confidentiel"
msgctxt "selection:calendar.todo,classification:"
-msgid "Confidential"
-msgstr "Confidentiel"
-
-msgctxt "selection:calendar.todo,classification:"
msgid "Private"
msgstr "Privé"
msgctxt "selection:calendar.todo,classification:"
-msgid "Private"
-msgstr "Privé"
-
-msgctxt "selection:calendar.todo,classification:"
-msgid "Public"
-msgstr "Publique"
-
-msgctxt "selection:calendar.todo,classification:"
msgid "Public"
msgstr "Publique"
@@ -671,14 +659,6 @@ msgid ""
msgstr ""
msgctxt "selection:calendar.todo,status:"
-msgid ""
-msgstr ""
-
-msgctxt "selection:calendar.todo,status:"
-msgid "Cancelled"
-msgstr "Annulé"
-
-msgctxt "selection:calendar.todo,status:"
msgid "Cancelled"
msgstr "Annulé"
@@ -687,22 +667,10 @@ msgid "Completed"
msgstr "Complété"
msgctxt "selection:calendar.todo,status:"
-msgid "Completed"
-msgstr "Complété"
-
-msgctxt "selection:calendar.todo,status:"
msgid "In-Process"
msgstr "En court"
msgctxt "selection:calendar.todo,status:"
-msgid "In-Process"
-msgstr "En court"
-
-msgctxt "selection:calendar.todo,status:"
-msgid "Needs-Action"
-msgstr "Nécessite une action"
-
-msgctxt "selection:calendar.todo,status:"
msgid "Needs-Action"
msgstr "Nécessite une action"
@@ -847,21 +815,9 @@ msgid "Attendee"
msgstr "Participant"
msgctxt "view:calendar.todo.attendee:"
-msgid "Attendee"
-msgstr "Participant"
-
-msgctxt "view:calendar.todo.attendee:"
msgid "Attendees"
msgstr "Participants"
-msgctxt "view:calendar.todo.attendee:"
-msgid "Attendees"
-msgstr "Participants"
-
-msgctxt "view:calendar.todo.exdate:"
-msgid "Exception Date"
-msgstr "Date d'exception"
-
msgctxt "view:calendar.todo.exdate:"
msgid "Exception Date"
msgstr "Date d'exception"
@@ -870,23 +826,11 @@ msgctxt "view:calendar.todo.exdate:"
msgid "Exception Dates"
msgstr "Dates d'exception"
-msgctxt "view:calendar.todo.exdate:"
-msgid "Exception Dates"
-msgstr "Dates d'exception"
-
msgctxt "view:calendar.todo.exrule:"
msgid "Exception Rule"
msgstr "Règle d'exception"
msgctxt "view:calendar.todo.exrule:"
-msgid "Exception Rule"
-msgstr "Règle d'exception"
-
-msgctxt "view:calendar.todo.exrule:"
-msgid "Exception Rules"
-msgstr "Règles d'exception"
-
-msgctxt "view:calendar.todo.exrule:"
msgid "Exception Rules"
msgstr "Règles d'exception"
@@ -895,21 +839,9 @@ msgid "Recurrence Date"
msgstr "Date de récurrence"
msgctxt "view:calendar.todo.rdate:"
-msgid "Recurrence Date"
-msgstr "Date de récurrence"
-
-msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Dates"
msgstr "Dates de récurrence"
-msgctxt "view:calendar.todo.rdate:"
-msgid "Recurrence Dates"
-msgstr "Dates de récurrence"
-
-msgctxt "view:calendar.todo.rrule:"
-msgid "Recurrence Rule"
-msgstr "Règle de récurrence"
-
msgctxt "view:calendar.todo.rrule:"
msgid "Recurrence Rule"
msgstr "Règle de récurrence"
@@ -918,23 +850,11 @@ msgctxt "view:calendar.todo.rrule:"
msgid "Recurrence Rules"
msgstr "Règles de récurrence"
-msgctxt "view:calendar.todo.rrule:"
-msgid "Recurrence Rules"
-msgstr "Règles de récurrence"
-
msgctxt "view:calendar.todo:"
msgid "Attendees"
msgstr "Participants"
msgctxt "view:calendar.todo:"
-msgid "Attendees"
-msgstr "Participants"
-
-msgctxt "view:calendar.todo:"
-msgid "Categories"
-msgstr "Catégories"
-
-msgctxt "view:calendar.todo:"
msgid "Categories"
msgstr "Catégories"
@@ -943,29 +863,13 @@ msgid "General"
msgstr "Général"
msgctxt "view:calendar.todo:"
-msgid "General"
-msgstr "Général"
-
-msgctxt "view:calendar.todo:"
msgid "Occurences"
msgstr "Occurrences"
msgctxt "view:calendar.todo:"
-msgid "Occurences"
-msgstr "Occurrences"
-
-msgctxt "view:calendar.todo:"
-msgid "Todo"
-msgstr "Tâche"
-
-msgctxt "view:calendar.todo:"
msgid "Todo"
msgstr "Tâche"
msgctxt "view:calendar.todo:"
msgid "Todos"
msgstr "Tâches"
-
-msgctxt "view:calendar.todo:"
-msgid "Todos"
-msgstr "Tâches"
diff --git a/locale/es_CO.po b/locale/sl_SI.po
similarity index 71%
copy from locale/es_CO.po
copy to locale/sl_SI.po
index 806d017..5e59a73 100644
--- a/locale/es_CO.po
+++ b/locale/sl_SI.po
@@ -4,155 +4,155 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:calendar.todo.exrule:"
msgid "Invalid \"By Day\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Día\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na dan\" v ponovitvenem pravilu \"%s\""
msgctxt "error:calendar.todo.exrule:"
msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Hora\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na uro\" v ponovitvenem pravilu \"%s\""
msgctxt "error:calendar.todo.exrule:"
msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Minuto\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na minuto\" v ponovitvenem pravilu \"%s\""
msgctxt "error:calendar.todo.exrule:"
msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Día del Mes\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na dan v mesecu\" v ponovitvenem pravilu \"%s\""
msgctxt "error:calendar.todo.exrule:"
msgid "Invalid \"By Month\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Mes\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na mesec\" v ponovitvenem pravilu \"%s\""
msgctxt "error:calendar.todo.exrule:"
msgid "Invalid \"By Position\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Position\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na pozicijo\" v ponovitvenem pravilu \"%s\""
msgctxt "error:calendar.todo.exrule:"
msgid "Invalid \"By Second\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Segundo\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na sekundo\" v ponovitvenem pravilu \"%s\""
msgctxt "error:calendar.todo.exrule:"
msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Número de la Semana\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na teden v letu\" v ponovitvenem pravilu \"%s\""
msgctxt "error:calendar.todo.exrule:"
msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Día del Año\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na dan v letu\" v ponovitvenem pravilu \"%s\""
msgctxt "error:calendar.todo.exrule:"
msgid "Only one of \"until\" and \"count\" can be set."
-msgstr "Solo un \"hasta\" y \"contar\" pude ser establecido!"
+msgstr "Nastavi se lahko samo \"do\" ali \"število\"."
msgctxt "error:calendar.todo.rrule:"
msgid "Invalid \"By Day\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Día\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na dan\" v ponovitvenem pravilu \"%s\""
msgctxt "error:calendar.todo.rrule:"
msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Hora\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na uro\" v ponovitvenem pravilu \"%s\""
msgctxt "error:calendar.todo.rrule:"
msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Minuto\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na minuto\" v ponovitvenem pravilu \"%s\""
msgctxt "error:calendar.todo.rrule:"
msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Día del Mes\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na dan v mesecu\" v ponovitvenem pravilu \"%s\""
msgctxt "error:calendar.todo.rrule:"
msgid "Invalid \"By Month\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Mes\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na mesec\" v ponovitvenem pravilu \"%s\""
msgctxt "error:calendar.todo.rrule:"
msgid "Invalid \"By Position\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Position\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na pozicijo\" v ponovitvenem pravilu \"%s\""
msgctxt "error:calendar.todo.rrule:"
msgid "Invalid \"By Second\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Segundo\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na sekundo\" v ponovitvenem pravilu \"%s\""
msgctxt "error:calendar.todo.rrule:"
msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Número de la Semana\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na teden v letu\" v ponovitvenem pravilu \"%s\""
msgctxt "error:calendar.todo.rrule:"
msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Día del Año\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na dan v letu\" v ponovitvenem pravilu \"%s\""
msgctxt "error:calendar.todo.rrule:"
msgid "Only one of \"until\" and \"count\" can be set."
-msgstr "Solo un \"hasta\" y \"contar\" pude ser establecido!"
+msgstr "Nastavi se lahko samo \"do\" ali \"število\"."
msgctxt "error:calendar.todo:"
msgid "Todo \"%s\" can not be recurrent."
-msgstr "Tareas por Hacer \"%s\" no puede ser recurrente."
+msgstr "Todo \"%s\" se ne more ponavljati."
msgctxt "error:calendar.todo:"
msgid "UUID and recurrence must be unique in a calendar."
-msgstr "UUID y recurrencia debe ser única en un calendario."
+msgstr "UUID in ponovitev morata biti v koledarju edinstvena."
msgctxt "field:calendar.todo,alarms:"
msgid "Alarms"
-msgstr "Alarmas"
+msgstr "Alarmi"
msgctxt "field:calendar.todo,attendees:"
msgid "Attendees"
-msgstr "Asistentes"
+msgstr "Navzoči"
msgctxt "field:calendar.todo,calendar:"
msgid "Calendar"
-msgstr "Calendario"
+msgstr "Koledar"
msgctxt "field:calendar.todo,calendar_owner:"
msgid "Owner"
-msgstr "Propietario"
+msgstr "Imetnik"
msgctxt "field:calendar.todo,calendar_read_users:"
msgid "Read Users"
-msgstr "Leer Usuarios"
+msgstr "Bralci"
msgctxt "field:calendar.todo,calendar_write_users:"
msgid "Write Users"
-msgstr "Modificado por Usuario"
+msgstr "Zapisovalci"
msgctxt "field:calendar.todo,categories:"
msgid "Categories"
-msgstr "Categorías"
+msgstr "Kategorije"
msgctxt "field:calendar.todo,classification:"
msgid "Classification"
-msgstr "Clasificación"
+msgstr "Klasifikacija"
msgctxt "field:calendar.todo,completed:"
msgid "Completed"
-msgstr "Completado"
+msgstr "Zaključeno"
msgctxt "field:calendar.todo,create_date:"
msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
msgctxt "field:calendar.todo,create_uid:"
msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
msgctxt "field:calendar.todo,description:"
msgid "Description"
-msgstr "Descripción"
+msgstr "Opis"
msgctxt "field:calendar.todo,dtstart:"
msgid "Start Date"
-msgstr "Fecha Inicio"
+msgstr "Začetni datum"
msgctxt "field:calendar.todo,due:"
msgid "Due Date"
-msgstr "Fecha Debida"
+msgstr "Zapadlost"
msgctxt "field:calendar.todo,exdates:"
msgid "Exception Dates"
-msgstr "Fechas de Excepción"
+msgstr "Izjemni datumi"
msgctxt "field:calendar.todo,exrules:"
msgid "Exception Rules"
-msgstr "Reglas de Excepción"
+msgstr "Izjemna pravila"
msgctxt "field:calendar.todo,id:"
msgid "ID"
@@ -160,55 +160,55 @@ msgstr "ID"
msgctxt "field:calendar.todo,location:"
msgid "Location"
-msgstr "Lugar"
+msgstr "Lokacija"
msgctxt "field:calendar.todo,occurences:"
msgid "Occurences"
-msgstr "Ocurrencias"
+msgstr "Pojavljanje"
msgctxt "field:calendar.todo,organizer:"
msgid "Organizer"
-msgstr "Organizador"
+msgstr "Organizator"
msgctxt "field:calendar.todo,parent:"
msgid "Parent"
-msgstr "Padre"
+msgstr "Prednik"
msgctxt "field:calendar.todo,percent_complete:"
msgid "Percent complete"
-msgstr "Porcentaje completo"
+msgstr "Odstotek zaključenega"
msgctxt "field:calendar.todo,rdates:"
msgid "Recurrence Dates"
-msgstr "Fechas de Repetición"
+msgstr "Datumi ponovitev"
msgctxt "field:calendar.todo,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:calendar.todo,recurrence:"
msgid "Recurrence"
-msgstr "Repetición"
+msgstr "Ponovitev"
msgctxt "field:calendar.todo,rrules:"
msgid "Recurrence Rules"
-msgstr "Reglas de Repetición"
+msgstr "Pravila ponovitev"
msgctxt "field:calendar.todo,sequence:"
msgid "Sequence"
-msgstr "Secuencia"
+msgstr "Zap.št."
msgctxt "field:calendar.todo,status:"
msgid "Status"
-msgstr "Estado"
+msgstr "Status"
msgctxt "field:calendar.todo,summary:"
msgid "Summary"
-msgstr "Resumen"
+msgstr "Povzetek"
msgctxt "field:calendar.todo,timezone:"
msgid "Timezone"
-msgstr "Zona horaria"
+msgstr "Časovni pas"
msgctxt "field:calendar.todo,uuid:"
msgid "UUID"
@@ -216,27 +216,27 @@ msgstr "UUID"
msgctxt "field:calendar.todo,vtodo:"
msgid "vtodo"
-msgstr "v- por hacer"
+msgstr "vtodo"
msgctxt "field:calendar.todo,write_date:"
msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
msgctxt "field:calendar.todo,write_uid:"
msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
msgctxt "field:calendar.todo-calendar.category,category:"
msgid "Category"
-msgstr "Categoría"
+msgstr "Kategorija"
msgctxt "field:calendar.todo-calendar.category,create_date:"
msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
msgctxt "field:calendar.todo-calendar.category,create_uid:"
msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
msgctxt "field:calendar.todo-calendar.category,id:"
msgid "ID"
@@ -244,27 +244,27 @@ msgstr "ID"
msgctxt "field:calendar.todo-calendar.category,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:calendar.todo-calendar.category,todo:"
msgid "To-Do"
-msgstr "Por Hacer"
+msgstr "To-Do"
msgctxt "field:calendar.todo-calendar.category,write_date:"
msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
msgctxt "field:calendar.todo-calendar.category,write_uid:"
msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
msgctxt "field:calendar.todo.alarm,create_date:"
msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
msgctxt "field:calendar.todo.alarm,create_uid:"
msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
msgctxt "field:calendar.todo.alarm,id:"
msgid "ID"
@@ -272,39 +272,39 @@ msgstr "ID"
msgctxt "field:calendar.todo.alarm,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:calendar.todo.alarm,todo:"
msgid "Todo"
-msgstr "Por Hacer"
+msgstr "Todo"
msgctxt "field:calendar.todo.alarm,valarm:"
msgid "valarm"
-msgstr "valarma"
+msgstr "valarm"
msgctxt "field:calendar.todo.alarm,write_date:"
msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
msgctxt "field:calendar.todo.alarm,write_uid:"
msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
msgctxt "field:calendar.todo.attendee,attendee:"
msgid "attendee"
-msgstr "Asistente"
+msgstr "Navzoči"
msgctxt "field:calendar.todo.attendee,create_date:"
msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
msgctxt "field:calendar.todo.attendee,create_uid:"
msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
msgctxt "field:calendar.todo.attendee,email:"
msgid "Email"
-msgstr "Correo Electrónico"
+msgstr "E-pošta"
msgctxt "field:calendar.todo.attendee,id:"
msgid "ID"
@@ -312,39 +312,39 @@ msgstr "ID"
msgctxt "field:calendar.todo.attendee,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:calendar.todo.attendee,status:"
msgid "Participation Status"
-msgstr "Estado de Participación"
+msgstr "Status udeleženca"
msgctxt "field:calendar.todo.attendee,todo:"
msgid "Todo"
-msgstr "Por Hacer"
+msgstr "Todo"
msgctxt "field:calendar.todo.attendee,write_date:"
msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
msgctxt "field:calendar.todo.attendee,write_uid:"
msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
msgctxt "field:calendar.todo.exdate,create_date:"
msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
msgctxt "field:calendar.todo.exdate,create_uid:"
msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
msgctxt "field:calendar.todo.exdate,date:"
msgid "Is Date"
-msgstr "Esta Fecha"
+msgstr "Je datum"
msgctxt "field:calendar.todo.exdate,datetime:"
msgid "Date"
-msgstr "Fecha"
+msgstr "Datum"
msgctxt "field:calendar.todo.exdate,id:"
msgid "ID"
@@ -352,71 +352,71 @@ msgstr "ID"
msgctxt "field:calendar.todo.exdate,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:calendar.todo.exdate,todo:"
msgid "Todo"
-msgstr "Por Hacer"
+msgstr "Todo"
msgctxt "field:calendar.todo.exdate,write_date:"
msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
msgctxt "field:calendar.todo.exdate,write_uid:"
msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
msgctxt "field:calendar.todo.exrule,byday:"
msgid "By Day"
-msgstr "Por Día"
+msgstr "Na dan"
msgctxt "field:calendar.todo.exrule,byhour:"
msgid "By Hour"
-msgstr "Por Hora"
+msgstr "Na uro"
msgctxt "field:calendar.todo.exrule,byminute:"
msgid "By Minute"
-msgstr "Por Minuto"
+msgstr "Na minuto"
msgctxt "field:calendar.todo.exrule,bymonth:"
msgid "By Month"
-msgstr "Por Mes"
+msgstr "Na mesec"
msgctxt "field:calendar.todo.exrule,bymonthday:"
msgid "By Month Day"
-msgstr "Por Día del Mes"
+msgstr "Na dan v mesecu"
msgctxt "field:calendar.todo.exrule,bysecond:"
msgid "By Second"
-msgstr "Por Segundo"
+msgstr "Na sekundo"
msgctxt "field:calendar.todo.exrule,bysetpos:"
msgid "By Position"
-msgstr "Por Posición"
+msgstr "Na pozicijo"
msgctxt "field:calendar.todo.exrule,byweekno:"
msgid "By Week Number"
-msgstr "Por Número de la Semana"
+msgstr "Na teden v letu"
msgctxt "field:calendar.todo.exrule,byyearday:"
msgid "By Year Day"
-msgstr "Por Día del Año"
+msgstr "Na dan v letu"
msgctxt "field:calendar.todo.exrule,count:"
msgid "Count"
-msgstr "Contar"
+msgstr "Število"
msgctxt "field:calendar.todo.exrule,create_date:"
msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
msgctxt "field:calendar.todo.exrule,create_uid:"
msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
msgctxt "field:calendar.todo.exrule,freq:"
msgid "Frequency"
-msgstr "Frecuencia"
+msgstr "Frekvenca"
msgctxt "field:calendar.todo.exrule,id:"
msgid "ID"
@@ -424,51 +424,51 @@ msgstr "ID"
msgctxt "field:calendar.todo.exrule,interval:"
msgid "Interval"
-msgstr "Intervalo"
+msgstr "Interval"
msgctxt "field:calendar.todo.exrule,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:calendar.todo.exrule,todo:"
msgid "Todo"
-msgstr "Por Hacer"
+msgstr "Todo"
msgctxt "field:calendar.todo.exrule,until:"
msgid "Until Date"
-msgstr "Hasta la Fecha"
+msgstr "Do dne"
msgctxt "field:calendar.todo.exrule,until_date:"
msgid "Is Date"
-msgstr "Esta Fecha"
+msgstr "Je datum"
msgctxt "field:calendar.todo.exrule,wkst:"
msgid "Week Day"
-msgstr "Día de la Semana"
+msgstr "Dan v tednu"
msgctxt "field:calendar.todo.exrule,write_date:"
msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
msgctxt "field:calendar.todo.exrule,write_uid:"
msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
msgctxt "field:calendar.todo.rdate,create_date:"
msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
msgctxt "field:calendar.todo.rdate,create_uid:"
msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
msgctxt "field:calendar.todo.rdate,date:"
msgid "Is Date"
-msgstr "Esta Fecha"
+msgstr "Je datum"
msgctxt "field:calendar.todo.rdate,datetime:"
msgid "Date"
-msgstr "Fecha"
+msgstr "Datum"
msgctxt "field:calendar.todo.rdate,id:"
msgid "ID"
@@ -476,71 +476,71 @@ msgstr "ID"
msgctxt "field:calendar.todo.rdate,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:calendar.todo.rdate,todo:"
msgid "Todo"
-msgstr "Por Hacer"
+msgstr "Todo"
msgctxt "field:calendar.todo.rdate,write_date:"
msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
msgctxt "field:calendar.todo.rdate,write_uid:"
msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
msgctxt "field:calendar.todo.rrule,byday:"
msgid "By Day"
-msgstr "Por Día"
+msgstr "Na dan"
msgctxt "field:calendar.todo.rrule,byhour:"
msgid "By Hour"
-msgstr "Por Hora"
+msgstr "Na uro"
msgctxt "field:calendar.todo.rrule,byminute:"
msgid "By Minute"
-msgstr "Por Minuto"
+msgstr "Na minuto"
msgctxt "field:calendar.todo.rrule,bymonth:"
msgid "By Month"
-msgstr "Por Mes"
+msgstr "Na mesec"
msgctxt "field:calendar.todo.rrule,bymonthday:"
msgid "By Month Day"
-msgstr "Por Día del Mes"
+msgstr "Na dan v mesecu"
msgctxt "field:calendar.todo.rrule,bysecond:"
msgid "By Second"
-msgstr "Por Segundo"
+msgstr "Na sekundo"
msgctxt "field:calendar.todo.rrule,bysetpos:"
msgid "By Position"
-msgstr "Por Posición"
+msgstr "Na pozicijo"
msgctxt "field:calendar.todo.rrule,byweekno:"
msgid "By Week Number"
-msgstr "Por Número de la Semana"
+msgstr "Na teden v letu"
msgctxt "field:calendar.todo.rrule,byyearday:"
msgid "By Year Day"
-msgstr "Por Día del Año"
+msgstr "Na dan v letu"
msgctxt "field:calendar.todo.rrule,count:"
msgid "Count"
-msgstr "Contar"
+msgstr "Število"
msgctxt "field:calendar.todo.rrule,create_date:"
msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
msgctxt "field:calendar.todo.rrule,create_uid:"
msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
msgctxt "field:calendar.todo.rrule,freq:"
msgid "Frequency"
-msgstr "Frecuencia"
+msgstr "Frekvenca"
msgctxt "field:calendar.todo.rrule,id:"
msgid "ID"
@@ -548,334 +548,328 @@ msgstr "ID"
msgctxt "field:calendar.todo.rrule,interval:"
msgid "Interval"
-msgstr "Intervalo"
+msgstr "Interval"
msgctxt "field:calendar.todo.rrule,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:calendar.todo.rrule,todo:"
msgid "Todo"
-msgstr "Por Hacer"
+msgstr "Todo"
msgctxt "field:calendar.todo.rrule,until:"
msgid "Until Date"
-msgstr "Hasta la Fecha"
+msgstr "Do dne"
msgctxt "field:calendar.todo.rrule,until_date:"
msgid "Is Date"
-msgstr "Esta Fecha"
+msgstr "Je datum"
msgctxt "field:calendar.todo.rrule,wkst:"
msgid "Week Day"
-msgstr "Día de la Semana"
+msgstr "Dan v tednu"
msgctxt "field:calendar.todo.rrule,write_date:"
msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
msgctxt "field:calendar.todo.rrule,write_uid:"
msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
msgctxt "help:calendar.todo,uuid:"
msgid "Universally Unique Identifier"
-msgstr "Identificador Único Universal"
+msgstr "Vsesplošno edinstven identifikator"
msgctxt "help:calendar.todo.exdate,date:"
msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr "Ignore tiempo del campo \"Fecha\", pero manejelo como fecha solamente."
+msgstr "Prezri čas v polju \"Datum\" in ga samo obravnavaj kot datum."
msgctxt "help:calendar.todo.exrule,until_date:"
msgid "Ignore time of field \"Until Date\", but handle as date only."
-msgstr ""
-"Ignore tiempo del campo \"Hasta la Fecha\", pero manejelo como fecha "
-"solamente."
+msgstr "Prezri čas v polju \"Do dne\" in ga samo obravnavaj kot datum."
msgctxt "help:calendar.todo.rdate,date:"
msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr "Ignore tiempo del campo \"Fecha\", pero manejelo como fecha solamente."
+msgstr "Prezri čas v polju \"Datum\" in ga samo obravnavaj kot datum."
msgctxt "help:calendar.todo.rrule,until_date:"
msgid "Ignore time of field \"Until Date\", but handle as date only."
-msgstr ""
-"Ignore tiempo del campo \"Hasta la Fecha\", pero manejelo como fecha "
-"solamente."
+msgstr "Prezri čas v polju \"Do dne\" in ga samo obravnavaj kot datum."
msgctxt "model:calendar.todo,name:"
msgid "Todo"
-msgstr "Por Hacer"
+msgstr "Todo"
msgctxt "model:calendar.todo-calendar.category,name:"
msgid "Todo - Category"
-msgstr "Por Hacer - Categoria"
+msgstr "Todo - Kategorija"
msgctxt "model:calendar.todo.alarm,name:"
msgid "Alarm"
-msgstr "Alarma"
+msgstr "Alarm"
msgctxt "model:calendar.todo.attendee,name:"
msgid "Attendee"
-msgstr "Asistente"
+msgstr "Navzoči"
msgctxt "model:calendar.todo.exdate,name:"
msgid "Exception Date"
-msgstr "Fecha de Excepción"
+msgstr "Izjemni datum"
msgctxt "model:calendar.todo.exrule,name:"
msgid "Exception Rule"
-msgstr "Regla de Excepción"
+msgstr "Izjemno pravilo"
msgctxt "model:calendar.todo.rdate,name:"
msgid "Todo Recurrence Date"
-msgstr "Fecha de Repetición"
+msgstr "Todo datum ponovitve"
msgctxt "model:calendar.todo.rrule,name:"
msgid "Recurrence Rule"
-msgstr "Regla de Repetición"
+msgstr "Pravilo ponovitve"
msgctxt "model:ir.action,name:act_todo_form"
msgid "Todos"
-msgstr "Por hacer"
+msgstr "Todoji"
msgctxt "model:ir.action,name:act_todo_form3"
msgid "Todos"
-msgstr "Por hacer"
+msgstr "Todoji"
msgctxt "model:ir.ui.menu,name:menu_todo_form"
msgid "Todos"
-msgstr "Por hacer"
+msgstr "Todoji"
msgctxt "selection:calendar.todo,classification:"
msgid "Confidential"
-msgstr "Confidencial"
+msgstr "Zaupno"
msgctxt "selection:calendar.todo,classification:"
msgid "Private"
-msgstr "Privado"
+msgstr "Zasebno"
msgctxt "selection:calendar.todo,classification:"
msgid "Public"
-msgstr "Público"
+msgstr "Javno"
-#, fuzzy
msgctxt "selection:calendar.todo,status:"
msgid ""
-msgstr "Punto de Orden"
+msgstr ""
msgctxt "selection:calendar.todo,status:"
msgid "Cancelled"
-msgstr "Cancelado"
+msgstr "Preklicano"
msgctxt "selection:calendar.todo,status:"
msgid "Completed"
-msgstr "Completado"
+msgstr "Zaključeno"
msgctxt "selection:calendar.todo,status:"
msgid "In-Process"
-msgstr "En-Proceso"
+msgstr "V teku"
msgctxt "selection:calendar.todo,status:"
msgid "Needs-Action"
-msgstr "Necesita una Acción"
+msgstr "Potreben ukrep"
-#, fuzzy
msgctxt "selection:calendar.todo.attendee,status:"
msgid ""
-msgstr "Punto de Orden"
+msgstr ""
msgctxt "selection:calendar.todo.attendee,status:"
msgid "Accepted"
-msgstr "Aceptado"
+msgstr "Sprejeto"
msgctxt "selection:calendar.todo.attendee,status:"
msgid "Declined"
-msgstr "Declinado"
+msgstr "Zavrnjeno"
msgctxt "selection:calendar.todo.attendee,status:"
msgid "Delegated"
-msgstr "Delegado"
+msgstr "Delegirano"
msgctxt "selection:calendar.todo.attendee,status:"
msgid "Needs Action"
-msgstr "Necesita una Acción"
+msgstr "Potreben ukrep"
msgctxt "selection:calendar.todo.attendee,status:"
msgid "Tentative"
-msgstr "Tentativa"
+msgstr "Negotovo"
msgctxt "selection:calendar.todo.exrule,freq:"
msgid "Daily"
-msgstr "Diario"
+msgstr "Dnevno"
msgctxt "selection:calendar.todo.exrule,freq:"
msgid "Hourly"
-msgstr "Cada Hora"
+msgstr "Na uro"
msgctxt "selection:calendar.todo.exrule,freq:"
msgid "Minutely"
-msgstr "Cada Minuto"
+msgstr "Na minuto"
msgctxt "selection:calendar.todo.exrule,freq:"
msgid "Monthly"
-msgstr "Mensualmente"
+msgstr "Mesečno"
msgctxt "selection:calendar.todo.exrule,freq:"
msgid "Secondly"
-msgstr "En segundo lugar"
+msgstr "Na sekundo"
msgctxt "selection:calendar.todo.exrule,freq:"
msgid "Weekly"
-msgstr "Semanalmente"
+msgstr "Tedensko"
msgctxt "selection:calendar.todo.exrule,freq:"
msgid "Yearly"
-msgstr "Anualmente"
+msgstr "Letno"
msgctxt "selection:calendar.todo.exrule,wkst:"
msgid "Friday"
-msgstr "Viernes"
+msgstr "Petek"
msgctxt "selection:calendar.todo.exrule,wkst:"
msgid "Monday"
-msgstr "Lunes"
+msgstr "Ponedeljek"
msgctxt "selection:calendar.todo.exrule,wkst:"
msgid "Saturday"
-msgstr "Sábado"
+msgstr "Sobota"
msgctxt "selection:calendar.todo.exrule,wkst:"
msgid "Sunday"
-msgstr "Domingo"
+msgstr "Nedelja"
msgctxt "selection:calendar.todo.exrule,wkst:"
msgid "Thursday"
-msgstr "Jueves"
+msgstr "Četrtek"
msgctxt "selection:calendar.todo.exrule,wkst:"
msgid "Tuesday"
-msgstr "Martes"
+msgstr "Torek"
msgctxt "selection:calendar.todo.exrule,wkst:"
msgid "Wednesday"
-msgstr "Miércoles"
+msgstr "Sreda"
msgctxt "selection:calendar.todo.rrule,freq:"
msgid "Daily"
-msgstr "Diario"
+msgstr "Dnevno"
msgctxt "selection:calendar.todo.rrule,freq:"
msgid "Hourly"
-msgstr "Cada Hora"
+msgstr "Na uro"
msgctxt "selection:calendar.todo.rrule,freq:"
msgid "Minutely"
-msgstr "Cada Minuto"
+msgstr "Na minuto"
msgctxt "selection:calendar.todo.rrule,freq:"
msgid "Monthly"
-msgstr "Mensualmente"
+msgstr "Mesečno"
msgctxt "selection:calendar.todo.rrule,freq:"
msgid "Secondly"
-msgstr "En segundo lugar"
+msgstr "Na sekundo"
msgctxt "selection:calendar.todo.rrule,freq:"
msgid "Weekly"
-msgstr "Semanalmente"
+msgstr "Tedensko"
msgctxt "selection:calendar.todo.rrule,freq:"
msgid "Yearly"
-msgstr "Anualmente"
+msgstr "Letno"
msgctxt "selection:calendar.todo.rrule,wkst:"
msgid "Friday"
-msgstr "Viernes"
+msgstr "Petek"
msgctxt "selection:calendar.todo.rrule,wkst:"
msgid "Monday"
-msgstr "Lunes"
+msgstr "Ponedeljek"
msgctxt "selection:calendar.todo.rrule,wkst:"
msgid "Saturday"
-msgstr "Sábado"
+msgstr "Sobota"
msgctxt "selection:calendar.todo.rrule,wkst:"
msgid "Sunday"
-msgstr "Domingo"
+msgstr "Nedelja"
msgctxt "selection:calendar.todo.rrule,wkst:"
msgid "Thursday"
-msgstr "Jueves"
+msgstr "Četrtek"
msgctxt "selection:calendar.todo.rrule,wkst:"
msgid "Tuesday"
-msgstr "Martes"
+msgstr "Torek"
msgctxt "selection:calendar.todo.rrule,wkst:"
msgid "Wednesday"
-msgstr "Miércoles"
+msgstr "Sreda"
msgctxt "view:calendar.todo.attendee:"
msgid "Attendee"
-msgstr "Asistente"
+msgstr "Navzoči"
msgctxt "view:calendar.todo.attendee:"
msgid "Attendees"
-msgstr "Asistentes"
+msgstr "Navzoči"
msgctxt "view:calendar.todo.exdate:"
msgid "Exception Date"
-msgstr "Fecha de Excepción"
+msgstr "Izjemni datum"
msgctxt "view:calendar.todo.exdate:"
msgid "Exception Dates"
-msgstr "Fechas de Excepción"
+msgstr "Izjemni datumi"
msgctxt "view:calendar.todo.exrule:"
msgid "Exception Rule"
-msgstr "Regla de Excepción"
+msgstr "Izjemno pravilo"
msgctxt "view:calendar.todo.exrule:"
msgid "Exception Rules"
-msgstr "Reglas de Excepción"
+msgstr "Izjemna pravila"
msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Date"
-msgstr "Fecha de Repetición"
+msgstr "Datum ponovitve"
msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Dates"
-msgstr "Fechas de Repetición"
+msgstr "Datumi ponovitev"
msgctxt "view:calendar.todo.rrule:"
msgid "Recurrence Rule"
-msgstr "Regla de Repetición"
+msgstr "Pravilo ponovitve"
msgctxt "view:calendar.todo.rrule:"
msgid "Recurrence Rules"
-msgstr "Reglas de Repetición"
+msgstr "Pravila ponovitev"
msgctxt "view:calendar.todo:"
msgid "Attendees"
-msgstr "Asistentes"
+msgstr "Navzoči"
msgctxt "view:calendar.todo:"
msgid "Categories"
-msgstr "Categorías"
+msgstr "Kategorije"
msgctxt "view:calendar.todo:"
msgid "General"
-msgstr "General"
+msgstr "Splošno"
msgctxt "view:calendar.todo:"
msgid "Occurences"
-msgstr "Ocurrencias"
+msgstr "Pojavljanje"
msgctxt "view:calendar.todo:"
msgid "Todo"
-msgstr "Por Hacer"
+msgstr "Todo"
msgctxt "view:calendar.todo:"
msgid "Todos"
-msgstr "Por hacer"
+msgstr "Todoji"
diff --git a/setup.py b/setup.py
index c64c9d6..60eaaa3 100644
--- a/setup.py
+++ b/setup.py
@@ -21,7 +21,8 @@ major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
major_version = int(major_version)
minor_version = int(minor_version)
-requires = ['vobject >= 0.8.0', 'PyWebDAV >= 0.9.8', 'python-dateutil', 'pytz']
+requires = ['vobject >= 0.8.0', 'PyWebDAV >= 0.9.8', 'python-dateutil', 'pytz',
+ 'python-sql']
for dep in info.get('depends', []):
if not re.match(r'(ir|res|webdav)(\W|$)', dep):
requires.append('trytond_%s >= %s.%s, < %s.%s' %
@@ -64,6 +65,7 @@ setup(name='trytond_calendar_todo',
'Natural Language :: French',
'Natural Language :: German',
'Natural Language :: Russian',
+ 'Natural Language :: Slovenian',
'Natural Language :: Spanish',
'Operating System :: OS Independent',
'Programming Language :: Python :: 2.6',
diff --git a/tests/__init__.py b/tests/__init__.py
index 62e4f36..7593e9a 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -2,3 +2,5 @@
#this repository contains the full copyright notices and license terms.
from .test_calendar_todo import suite
+
+__all__ = ['suite']
diff --git a/todo.py b/todo.py
index 1a81bbc..fd41a04 100644
--- a/todo.py
+++ b/todo.py
@@ -6,9 +6,11 @@ import dateutil.tz
import pytz
import datetime
import xml.dom.minidom
+from sql import Table, Column
+
from trytond.model import ModelSQL, ModelView, fields
from trytond.tools import reduce_ids
-from trytond.backend import TableHandler
+from trytond import backend
from trytond.pyson import Eval, If, Bool
from trytond.transaction import Transaction
from trytond.pool import Pool
@@ -191,7 +193,7 @@ class Todo(ModelSQL, ModelView):
@classmethod
def validate(cls, todos):
- super(todos, cls).validate(todos)
+ super(Todo, cls).validate(todos)
for todo in todos:
todo.check_recurrence()
@@ -298,6 +300,7 @@ class Todo(ModelSQL, ModelView):
pool = Pool()
Calendar = pool.get('calendar.calendar')
Collection = pool.get('webdav.collection')
+ table = cls.__table__()
cursor = Transaction().cursor
@@ -310,10 +313,11 @@ class Todo(ModelSQL, ModelView):
ids = [t.id for t in todos]
for i in range(0, len(ids), cursor.IN_MAX):
sub_ids = ids[i:i + cursor.IN_MAX]
- red_sql, red_ids = reduce_ids('id', sub_ids)
- cursor.execute('UPDATE "' + cls._table + '" '
- 'SET sequence = sequence + 1 '
- 'WHERE ' + red_sql, red_ids)
+ red_sql = reduce_ids(table.id, sub_ids)
+ cursor.execute(*table.update(
+ columns=[table.sequence],
+ values=[table.sequence + 1],
+ where=red_sql))
for todo in todos:
if (todo.calendar.owner
@@ -879,7 +883,9 @@ class TodoRDate(DateMixin, ModelSQL, ModelView):
@classmethod
def __register__(cls, module_name):
+ TableHandler = backend.get('TableHandler')
cursor = Transaction().cursor
+ sql_table = cls.__table__()
# Migration from 1.4: calendar_rdate renamed to calendar_date
table = TableHandler(cursor, cls, module_name)
old_column = 'calendar_rdate'
@@ -892,13 +898,13 @@ class TodoRDate(DateMixin, ModelSQL, ModelView):
# Migration from 2.6: Remove inherits calendar.date
if table.column_exist('calendar_date'):
- cursor.execute('UPDATE "' + cls._table + '" AS e '
- 'SET date = (SELECT a.date '
- 'FROM calendar_date AS a '
- 'WHERE a.id = e.calendar_date), '
- 'datetime = (SELECT a.datetime '
- 'FROM calendar_date AS a '
- 'WHERE a.id = e.calendar_date)')
+ date = Table('calendar_date')
+ cursor.execute(*sql_table.update(
+ columns=[sql_table.date, sql_table.datetime],
+ values=[date.select(date.date,
+ where=date.id == sql_table.calendar_date),
+ date.select(date.datetime,
+ where=date.id == sql_table.calendar_date)]))
table.drop_column('calendar_date', True)
@classmethod
@@ -944,7 +950,9 @@ class TodoRRule(RRuleMixin, ModelSQL, ModelView):
@classmethod
def __register__(cls, module_name):
+ TableHandler = backend.get('TableHandler')
cursor = Transaction().cursor
+ sql_table = cls.__table__()
super(TodoRRule, cls).__register__(module_name)
@@ -952,13 +960,13 @@ class TodoRRule(RRuleMixin, ModelSQL, ModelView):
# Migration from 2.6: Remove inherits calendar.rrule
if table.column_exist('calendar_rrule'):
+ rrule = Table('calendar_rrule')
for field in (f for f in dir(RRuleMixin)
if isinstance(f, fields.Field)):
- cursor.execute(('UPDATE "' + cls._table + '" AS e '
- 'SET "%(field)s" = (SELECT a."%(field)s" '
- 'FROM calendar_rrule AS r '
- 'WHERE r.id = e.calendar_rrule)')
- % {'field': field})
+ cursor.execute(*sql_table.update(
+ columns=[Column(sql_table, field)],
+ values=[rrule.select(Column(rrule, field),
+ where=rrule.id == sql_table.calendar_rrule)]))
table.drop_column('calendar_rrule', True)
@classmethod
@@ -1015,7 +1023,9 @@ class TodoAttendee(AttendeeMixin, ModelSQL, ModelView):
@classmethod
def __register__(cls, module_name):
+ TableHandler = backend.get('TableHandler')
cursor = Transaction().cursor
+ sql_table = cls.__table__()
super(TodoAttendee, cls).__register__(module_name)
@@ -1023,13 +1033,14 @@ class TodoAttendee(AttendeeMixin, ModelSQL, ModelView):
# Migration from 2.6: Remove inherits calendar.attendee
if table.column_exist('calendar_attendee'):
- cursor.execute('UPDATE "' + cls._table + '" AS e '
- 'SET email = (SELECT a.email '
- 'FROM calendar_attendee AS a '
- 'WHERE a.id = e.calendar_attendee), '
- 'status = (SELECT a.status '
- 'FROM calendar_attendee AS a '
- 'WHERE a.id = e.calendar_attendee)')
+ attendee = Table('calendar_attendee')
+ cursor.execute(*sql_table.update(
+ columns=[sql_table.email, sql_table.status],
+ values=[attendee.select(attendee.email,
+ where=attendee.id == sql_table.calendar_attendee),
+ attendee.select(attendee.status,
+ where=
+ attendee.id == sql_table.calendar_attendee)]))
table.drop_column('calendar_attendee', True)
@classmethod
@@ -1177,7 +1188,9 @@ class TodoAlarm(AlarmMixin, ModelSQL, ModelView):
@classmethod
def __register__(cls, module_name):
+ TableHandler = backend.get('TableHandler')
cursor = Transaction().cursor
+ sql_table = cls.__table__()
super(TodoAlarm, cls).__register__(module_name)
@@ -1185,10 +1198,11 @@ class TodoAlarm(AlarmMixin, ModelSQL, ModelView):
# Migration from 2.6: Remove inherits calendar.alarm
if table.column_exist('calendar_alarm'):
- cursor.execute('UPDATE "' + cls._table + '" AS t '
- 'SET valarm = (SELECT a.valarm '
- 'FROM calendar_alarm AS a '
- 'WHERE a.id = t.calendar_alarm)')
+ alarm = Table('calendar_alarm')
+ cursor.execute(*sql_table.update(
+ columns=[sql_table.valarm],
+ values=[alarm.select(alarm.valarm,
+ where=alarm.id == sql_table.calendar_alarm)]))
table.drop_column('calendar_alarm', True)
@classmethod
diff --git a/todo.xml b/todo.xml
index 23e37d0..b0d1bfa 100644
--- a/todo.xml
+++ b/todo.xml
@@ -27,7 +27,7 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_todo_form">
<field name="name">Todos</field>
<field name="res_model">calendar.todo</field>
- <field name="domain">[('parent', '=', False)]</field>
+ <field name="domain">[('parent', '=', None)]</field>
</record>
<record model="ir.action.act_window.view" id="act_todo_form_view1">
<field name="sequence" eval="10"/>
@@ -45,7 +45,7 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_todo_form3">
<field name="name">Todos</field>
<field name="res_model">calendar.todo</field>
- <field name="domain">[('parent', '=', False), ('calendar', '=', Eval('active_id'))]</field>
+ <field name="domain">[('parent', '=', None), ('calendar', '=', Eval('active_id'))]</field>
</record>
<record model="ir.action.act_window.view" id="act_todo_form3_view1">
<field name="sequence" eval="10"/>
diff --git a/tryton.cfg b/tryton.cfg
index aae9557..3141578 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
[tryton]
-version=2.8.0
+version=3.0.0
depends:
calendar
ir
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index fa2a896..3a42499 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.1
Name: trytond-calendar-todo
-Version: 2.8.0
+Version: 3.0.0
Summary: Tryton module to add TODO on CalDAV
Home-page: http://www.tryton.org/
Author: Tryton
Author-email: UNKNOWN
License: GPL-3
-Download-URL: http://downloads.tryton.org/2.8/
+Download-URL: http://downloads.tryton.org/3.0/
Description: trytond_calendar_todo
=====================
@@ -61,6 +61,7 @@ Classifier: Natural Language :: English
Classifier: Natural Language :: French
Classifier: Natural Language :: German
Classifier: Natural Language :: Russian
+Classifier: Natural Language :: Slovenian
Classifier: Natural Language :: Spanish
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 2.6
diff --git a/trytond_calendar_todo.egg-info/SOURCES.txt b/trytond_calendar_todo.egg-info/SOURCES.txt
index 35807aa..7eab3a2 100644
--- a/trytond_calendar_todo.egg-info/SOURCES.txt
+++ b/trytond_calendar_todo.egg-info/SOURCES.txt
@@ -23,6 +23,7 @@ locale/es_ES.po
locale/fr_FR.po
locale/nl_NL.po
locale/ru_RU.po
+locale/sl_SI.po
trytond_calendar_todo.egg-info/PKG-INFO
trytond_calendar_todo.egg-info/SOURCES.txt
trytond_calendar_todo.egg-info/dependency_links.txt
diff --git a/trytond_calendar_todo.egg-info/requires.txt b/trytond_calendar_todo.egg-info/requires.txt
index d08f9d2..4636bab 100644
--- a/trytond_calendar_todo.egg-info/requires.txt
+++ b/trytond_calendar_todo.egg-info/requires.txt
@@ -2,5 +2,6 @@ vobject >= 0.8.0
PyWebDAV >= 0.9.8
python-dateutil
pytz
-trytond_calendar >= 2.8, < 2.9
-trytond >= 2.8, < 2.9
\ No newline at end of file
+python-sql
+trytond_calendar >= 3.0, < 3.1
+trytond >= 3.0, < 3.1
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index 4fab749..5093fe3 100644
--- a/webdav.py
+++ b/webdav.py
@@ -3,6 +3,10 @@
import vobject
import urllib
from pywebdav.lib.errors import DAV_NotFound, DAV_Forbidden
+from sql.functions import Extract
+from sql.conditionals import Coalesce
+from sql.aggregate import Max
+
from trytond.tools import reduce_ids
from trytond.transaction import Transaction
from trytond.cache import Cache
@@ -149,6 +153,7 @@ class Collection:
@classmethod
def get_creationdate(cls, uri, cache=None):
Todo = Pool().get('calendar.todo')
+ todo = Todo.__table__()
cursor = Transaction().cursor
@@ -174,11 +179,10 @@ class Collection:
res = None
for i in range(0, len(ids), cursor.IN_MAX):
sub_ids = ids[i:i + cursor.IN_MAX]
- red_sql, red_ids = reduce_ids('id', sub_ids)
- cursor.execute('SELECT id, '
- 'EXTRACT(epoch FROM create_date) '
- 'FROM "' + Todo.__table__ + '" '
- 'WHERE ' + red_sql, red_ids)
+ red_sql = reduce_ids(todo.id, sub_ids)
+ cursor.execute(*todo.select(todo.id,
+ Extract('EPOCH', todo.create_date),
+ where=red_sql))
for todo_id2, date in cursor.fetchall():
if todo_id2 == todo_id:
res = date
@@ -195,6 +199,7 @@ class Collection:
@classmethod
def get_lastmodified(cls, uri, cache=None):
Todo = Pool().get('calendar.todo')
+ todo = Todo.__table__()
cursor = Transaction().cursor
@@ -217,16 +222,13 @@ class Collection:
res = None
for i in range(0, len(ids), cursor.IN_MAX / 2):
sub_ids = ids[i:i + cursor.IN_MAX / 2]
- red_id_sql, red_id_ids = reduce_ids('id', sub_ids)
- red_parent_sql, red_parent_ids = reduce_ids('parent',
- sub_ids)
- cursor.execute('SELECT COALESCE(parent, id), '
- 'MAX(EXTRACT(epoch FROM '
- 'COALESCE(write_date, create_date))) '
- 'FROM "' + Todo.__table__ + '" '
- 'WHERE ' + red_id_sql + ' '
- 'OR ' + red_parent_sql + ' '
- 'GROUP BY parent, id', red_id_ids + red_parent_ids)
+ red_id_sql = reduce_ids(todo.id, sub_ids)
+ red_parent_sql = reduce_ids(todo.parent, sub_ids)
+ cursor.execute(*todo.select(Coalesce(todo.parent, todo.id),
+ Max(Extract('EPOCH', Coalesce(todo.write_date,
+ todo.create_date))),
+ where=red_id_sql | red_parent_sql,
+ group_by=(todo.parent, todo.id)))
for todo_id2, date in cursor.fetchall():
if todo_id2 == todo_id:
res = date
commit 1616067e83538a6f5ff5684cd21ad574af1e44c2
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Aug 6 16:20:48 2013 +0200
Releasing debian version 2.8.0-3.
diff --git a/debian/changelog b/debian/changelog
index da02604..0b0ed95 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+tryton-modules-calendar-todo (2.8.0-3) unstable; urgency=low
+
+ * Removing pydist-overrides, it is no more needed.
+ * Adapting the rules file to work also with git-buildpackage.
+
+ -- Mathias Behrle <mathiasb at m9s.biz> Tue, 06 Aug 2013 13:32:36 +0200
+
tryton-modules-calendar-todo (2.8.0-2) unstable; urgency=low
* Removing needless empty line in rules.
commit ce015ab495f01042542cdec083f2ba398ad0af84
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Mon Aug 5 18:06:36 2013 +0200
Adapting the rules file to work also with git-buildpackage.
diff --git a/debian/rules b/debian/rules
index a6a1fb8..30074ad 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,13 +1,24 @@
#!/usr/bin/make -f
MAJOR := $(shell python setup.py --version | awk -F "." '{print $$1 "." $$2}')
+PACKAGE_NAME := $(shell python setup.py --name)
%:
dh ${@} --with python2
override_dh_auto_clean:
dh_auto_clean
+
+override_dh_auto_build:
+ mv $(PACKAGE_NAME).egg-info $(PACKAGE_NAME).hen-info
+ mv PKG-INFO PKG-INFO.hen
+ dh_auto_build
+
+override_dh_auto_install:
+ dh_auto_install
rm -rf *.egg-info
+ mv $(PACKAGE_NAME).hen-info $(PACKAGE_NAME).egg-info
+ mv PKG-INFO.hen PKG-INFO
override_dh_gencontrol:
dh_gencontrol -- -Vversion:major="$(MAJOR)"
commit 5dea0b0442b838007074502149ef3ec15627a815
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Mon Aug 5 14:04:41 2013 +0200
Removing pydist-overrides, it is no more needed.
diff --git a/debian/pydist-overrides b/debian/pydist-overrides
deleted file mode 100644
index 9aad9d3..0000000
--- a/debian/pydist-overrides
+++ /dev/null
@@ -1,5 +0,0 @@
-python_dateutil python-dateutil
-vobject python-vobject
-PyWebDAV python-webdav
-pytz python-tz
-
commit 387a02ec1659681857a0f33d628748dfac27506b
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Fri May 31 19:57:27 2013 +0200
Releasing debian version 2.8.0-2.
diff --git a/debian/changelog b/debian/changelog
index 80a5ffc..da02604 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+tryton-modules-calendar-todo (2.8.0-2) unstable; urgency=low
+
+ * Removing needless empty line in rules.
+
+ -- Mathias Behrle <mathiasb at m9s.biz> Fri, 31 May 2013 17:26:20 +0200
+
tryton-modules-calendar-todo (2.8.0-1) experimental; urgency=low
* Merging upstream version 2.8.0.
commit 411cef67e056f58bf48923f2665513bcab5023c5
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Wed May 29 17:19:29 2013 +0200
Removing needless empty line in rules.
diff --git a/debian/rules b/debian/rules
index 0f63ab4..a6a1fb8 100755
--- a/debian/rules
+++ b/debian/rules
@@ -7,7 +7,6 @@ MAJOR := $(shell python setup.py --version | awk -F "." '{print $$1 "." $$2}')
override_dh_auto_clean:
dh_auto_clean
-
rm -rf *.egg-info
override_dh_gencontrol:
commit 07215abaa2f804349cb4a4f727cbc9a888623a06
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Thu May 2 17:27:03 2013 +0200
Releasing debian version 2.8.0-1.
diff --git a/debian/changelog b/debian/changelog
index cb1bc13..80a5ffc 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+tryton-modules-calendar-todo (2.8.0-1) experimental; urgency=low
+
+ * Merging upstream version 2.8.0.
+ * Updating copyright.
+
+ -- Mathias Behrle <mathiasb at m9s.biz> Thu, 02 May 2013 15:19:54 +0200
+
tryton-modules-calendar-todo (2.6.1-3) experimental; urgency=low
* Removing Daniel from Uploaders. Thanks for your work! (Closes: #704376).
commit bc0743c6d830168f878742fc3d9eabc07579f41f
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Thu May 2 14:13:10 2013 +0200
Updating copyright.
diff --git a/debian/copyright b/debian/copyright
index cbad1dd..c27df9a 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -1,9 +1,9 @@
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Files: *
-Copyright: 2009-2012 Cédric Krier
- 2009-2012 Bertrand Chenal
- 2009-2012 B2CK SPRL
+Copyright: 2009-2013 Cédric Krier
+ 2009-2013 Bertrand Chenal
+ 2009-2013 B2CK SPRL
License: GPL-3+
Files: debian/*
commit 85bfb20db0328d90e8f5abd2c7f17ae3b2d721a1
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Thu May 2 00:35:40 2013 +0200
Merging upstream version 2.8.0.
diff --git a/CHANGELOG b/CHANGELOG
index 1766455..9735814 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,4 +1,4 @@
-Version 2.6.1 - 2012-12-23
+Version 2.8.0 - 2013-04-22
* Bug fixes (see mercurial logs for details)
Version 2.6.0 - 2012-10-22
diff --git a/COPYRIGHT b/COPYRIGHT
index 8ad4b79..a005001 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,6 +1,6 @@
-Copyright (C) 2009-2012 Cédric Krier.
-Copyright (C) 2009-2012 Bertrand Chenal.
-Copyright (C) 2009-2012 B2CK SPRL.
+Copyright (C) 2009-2013 Cédric Krier.
+Copyright (C) 2009-2013 Bertrand Chenal.
+Copyright (C) 2009-2013 B2CK SPRL.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
diff --git a/MANIFEST.in b/MANIFEST.in
index 44969c7..18ce53c 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -6,5 +6,6 @@ include CHANGELOG
include LICENSE
include tryton.cfg
include *.xml
+include view/*.xml
include *.odt
include locale/*.po
diff --git a/PKG-INFO b/PKG-INFO
index d03b3f6..d954667 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.1
Name: trytond_calendar_todo
-Version: 2.6.1
+Version: 2.8.0
Summary: Tryton module to add TODO on CalDAV
Home-page: http://www.tryton.org/
Author: Tryton
Author-email: UNKNOWN
License: GPL-3
-Download-URL: http://downloads.tryton.org/2.6/
+Download-URL: http://downloads.tryton.org/2.8/
Description: trytond_calendar_todo
=====================
@@ -54,6 +54,7 @@ Classifier: Intended Audience :: Legal Industry
Classifier: Intended Audience :: Manufacturing
Classifier: License :: OSI Approved :: GNU General Public License (GPL)
Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Catalan
Classifier: Natural Language :: Czech
Classifier: Natural Language :: Dutch
Classifier: Natural Language :: English
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
index e234518..5300c26 100644
--- a/locale/bg_BG.po
+++ b/locale/bg_BG.po
@@ -2,13 +2,93 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr ""
+
msgctxt "error:calendar.todo:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Повторението не може да е периодично!"
+msgid "Todo \"%s\" can not be recurrent."
+msgstr ""
msgctxt "error:calendar.todo:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "UUID и взаимна вложеност трябва да са уникални в календар!"
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr ""
msgctxt "field:calendar.todo,alarms:"
msgid "Alarms"
@@ -178,10 +258,6 @@ msgctxt "field:calendar.todo-calendar.category,write_uid:"
msgid "Write User"
msgstr "Променено от"
-msgctxt "field:calendar.todo.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Аларма на календар"
-
msgctxt "field:calendar.todo.alarm,create_date:"
msgid "Create Date"
msgstr "Създадено на"
@@ -202,6 +278,10 @@ msgctxt "field:calendar.todo.alarm,todo:"
msgid "Todo"
msgstr "Задача"
+msgctxt "field:calendar.todo.alarm,valarm:"
+msgid "valarm"
+msgstr ""
+
msgctxt "field:calendar.todo.alarm,write_date:"
msgid "Write Date"
msgstr "Променено на"
@@ -210,9 +290,9 @@ msgctxt "field:calendar.todo.alarm,write_uid:"
msgid "Write User"
msgstr "Променено от"
-msgctxt "field:calendar.todo.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Присъстващ на календар"
+msgctxt "field:calendar.todo.attendee,attendee:"
+msgid "attendee"
+msgstr ""
msgctxt "field:calendar.todo.attendee,create_date:"
msgid "Create Date"
@@ -222,6 +302,11 @@ msgctxt "field:calendar.todo.attendee,create_uid:"
msgid "Create User"
msgstr "Създадено от"
+#, fuzzy
+msgctxt "field:calendar.todo.attendee,email:"
+msgid "Email"
+msgstr "Email"
+
msgctxt "field:calendar.todo.attendee,id:"
msgid "ID"
msgstr "ID"
@@ -230,6 +315,10 @@ msgctxt "field:calendar.todo.attendee,rec_name:"
msgid "Name"
msgstr "Име"
+msgctxt "field:calendar.todo.attendee,status:"
+msgid "Participation Status"
+msgstr ""
+
msgctxt "field:calendar.todo.attendee,todo:"
msgid "Todo"
msgstr "Задача"
@@ -242,10 +331,6 @@ msgctxt "field:calendar.todo.attendee,write_uid:"
msgid "Write User"
msgstr "Променено от"
-msgctxt "field:calendar.todo.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Дата от календар"
-
msgctxt "field:calendar.todo.exdate,create_date:"
msgid "Create Date"
msgstr "Създадено на"
@@ -254,6 +339,15 @@ msgctxt "field:calendar.todo.exdate,create_uid:"
msgid "Create User"
msgstr "Създадено от"
+msgctxt "field:calendar.todo.exdate,date:"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.exdate,datetime:"
+msgid "Date"
+msgstr "Дата"
+
msgctxt "field:calendar.todo.exdate,id:"
msgid "ID"
msgstr "ID"
@@ -274,8 +368,44 @@ msgctxt "field:calendar.todo.exdate,write_uid:"
msgid "Write User"
msgstr "Променено от"
-msgctxt "field:calendar.todo.exrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.todo.exrule,byday:"
+msgid "By Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byhour:"
+msgid "By Hour"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byminute:"
+msgid "By Minute"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bysecond:"
+msgid "By Second"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,count:"
+msgid "Count"
msgstr ""
msgctxt "field:calendar.todo.exrule,create_date:"
@@ -286,10 +416,18 @@ msgctxt "field:calendar.todo.exrule,create_uid:"
msgid "Create User"
msgstr "Създадено от"
+msgctxt "field:calendar.todo.exrule,freq:"
+msgid "Frequency"
+msgstr ""
+
msgctxt "field:calendar.todo.exrule,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:calendar.todo.exrule,interval:"
+msgid "Interval"
+msgstr ""
+
msgctxt "field:calendar.todo.exrule,rec_name:"
msgid "Name"
msgstr "Име"
@@ -298,6 +436,19 @@ msgctxt "field:calendar.todo.exrule,todo:"
msgid "Todo"
msgstr "Задача"
+msgctxt "field:calendar.todo.exrule,until:"
+msgid "Until Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,until_date:"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.exrule,wkst:"
+msgid "Week Day"
+msgstr "Ден от седмица"
+
msgctxt "field:calendar.todo.exrule,write_date:"
msgid "Write Date"
msgstr "Променено на"
@@ -306,10 +457,6 @@ msgctxt "field:calendar.todo.exrule,write_uid:"
msgid "Write User"
msgstr "Променено от"
-msgctxt "field:calendar.todo.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Дата от календар"
-
msgctxt "field:calendar.todo.rdate,create_date:"
msgid "Create Date"
msgstr "Създадено на"
@@ -318,6 +465,15 @@ msgctxt "field:calendar.todo.rdate,create_uid:"
msgid "Create User"
msgstr "Създадено от"
+msgctxt "field:calendar.todo.rdate,date:"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.rdate,datetime:"
+msgid "Date"
+msgstr "Дата"
+
msgctxt "field:calendar.todo.rdate,id:"
msgid "ID"
msgstr "ID"
@@ -338,8 +494,44 @@ msgctxt "field:calendar.todo.rdate,write_uid:"
msgid "Write User"
msgstr "Променено от"
-msgctxt "field:calendar.todo.rrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.todo.rrule,byday:"
+msgid "By Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byhour:"
+msgid "By Hour"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byminute:"
+msgid "By Minute"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bysecond:"
+msgid "By Second"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,count:"
+msgid "Count"
msgstr ""
msgctxt "field:calendar.todo.rrule,create_date:"
@@ -350,10 +542,18 @@ msgctxt "field:calendar.todo.rrule,create_uid:"
msgid "Create User"
msgstr "Създадено от"
+msgctxt "field:calendar.todo.rrule,freq:"
+msgid "Frequency"
+msgstr ""
+
msgctxt "field:calendar.todo.rrule,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:calendar.todo.rrule,interval:"
+msgid "Interval"
+msgstr ""
+
msgctxt "field:calendar.todo.rrule,rec_name:"
msgid "Name"
msgstr "Име"
@@ -362,6 +562,19 @@ msgctxt "field:calendar.todo.rrule,todo:"
msgid "Todo"
msgstr "Задача"
+msgctxt "field:calendar.todo.rrule,until:"
+msgid "Until Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,until_date:"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.rrule,wkst:"
+msgid "Week Day"
+msgstr "Ден от седмица"
+
msgctxt "field:calendar.todo.rrule,write_date:"
msgid "Write Date"
msgstr "Променено на"
@@ -374,6 +587,22 @@ msgctxt "help:calendar.todo,uuid:"
msgid "Universally Unique Identifier"
msgstr "Универсален иникален идентификатор"
+msgctxt "help:calendar.todo.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.todo.exrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.todo.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.todo.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+
msgctxt "model:calendar.todo,name:"
msgid "Todo"
msgstr "Задача"
@@ -450,6 +679,157 @@ msgctxt "selection:calendar.todo,status:"
msgid "Needs-Action"
msgstr "Необходимо е действие"
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Accepted"
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Declined"
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Delegated"
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Needs Action"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Tentative"
+msgstr "Пробен"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Yearly"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Friday"
+msgstr "Петък"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Monday"
+msgstr "Понеделник"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Saturday"
+msgstr "Събота"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Sunday"
+msgstr "Неделя"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Thursday"
+msgstr "Четвъртък"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Вторник"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Сряда"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Yearly"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Friday"
+msgstr "Петък"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Monday"
+msgstr "Понеделник"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Saturday"
+msgstr "Събота"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Sunday"
+msgstr "Неделя"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Thursday"
+msgstr "Четвъртък"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Вторник"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Сряда"
+
msgctxt "view:calendar.todo.attendee:"
msgid "Attendee"
msgstr "Присъстващ"
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index c363f1b..b35f41f 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -2,13 +2,101 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "El camp \"per dia\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "El camp \"per hora\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "El camp \"per minut\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "El camp \"per dia del mes\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "El camp \"per mes\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "El camp \"per ubicació\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "El camp \"per segon\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+"El camp \"per número de la setmana\" de la regla de recurrència \"%s\" no és"
+" correcte."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+"El camp \"per dia de l'any\" de la regla de recurrència \"%s\" no és "
+"correcte."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Defineix un \"fins\" i un \"comptador\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "El camp \"per dia\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "El camp \"per hora\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "El camp \"per minut\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "El camp \"per dia del mes\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "El camp \"per mes\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "El camp \"per ubicació\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "El camp \"per segon\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+"El camp \"per número de la setmana\" de la regla de recurrència \"%s\" no és"
+" correcte."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+"El camp \"per dia de l'any\" de la regla de recurrència \"%s\" no és "
+"correcte."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Defineix un \"fins\" i un \"comptador\"."
+
msgctxt "error:calendar.todo:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Una recurrencia no pot ser recurrent"
+msgid "Todo \"%s\" can not be recurrent."
+msgstr "La tasca \"%s\" no pot ser recurrent."
msgctxt "error:calendar.todo:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "UUID i recurrencia han de ser únics en un calendari"
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr "UUID i la recurrència han de ser únic en el calendari."
msgctxt "field:calendar.todo,alarms:"
msgid "Alarms"
@@ -178,10 +266,6 @@ msgctxt "field:calendar.todo-calendar.category,write_uid:"
msgid "Write User"
msgstr "Usuari modificació"
-msgctxt "field:calendar.todo.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Alarma del calendari"
-
msgctxt "field:calendar.todo.alarm,create_date:"
msgid "Create Date"
msgstr "Data creació"
@@ -202,6 +286,10 @@ msgctxt "field:calendar.todo.alarm,todo:"
msgid "Todo"
msgstr "Tasca"
+msgctxt "field:calendar.todo.alarm,valarm:"
+msgid "valarm"
+msgstr "valarm"
+
msgctxt "field:calendar.todo.alarm,write_date:"
msgid "Write Date"
msgstr "Data modificació"
@@ -210,9 +298,9 @@ msgctxt "field:calendar.todo.alarm,write_uid:"
msgid "Write User"
msgstr "Usuari modificació"
-msgctxt "field:calendar.todo.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Calendari d'assistents"
+msgctxt "field:calendar.todo.attendee,attendee:"
+msgid "attendee"
+msgstr "assistent"
msgctxt "field:calendar.todo.attendee,create_date:"
msgid "Create Date"
@@ -222,6 +310,10 @@ msgctxt "field:calendar.todo.attendee,create_uid:"
msgid "Create User"
msgstr "Usuari creació"
+msgctxt "field:calendar.todo.attendee,email:"
+msgid "Email"
+msgstr "Email"
+
msgctxt "field:calendar.todo.attendee,id:"
msgid "ID"
msgstr "ID"
@@ -230,6 +322,10 @@ msgctxt "field:calendar.todo.attendee,rec_name:"
msgid "Name"
msgstr "Nom"
+msgctxt "field:calendar.todo.attendee,status:"
+msgid "Participation Status"
+msgstr "Estat de participacions"
+
msgctxt "field:calendar.todo.attendee,todo:"
msgid "Todo"
msgstr "Tasca"
@@ -242,10 +338,6 @@ msgctxt "field:calendar.todo.attendee,write_uid:"
msgid "Write User"
msgstr "Usuari modificació"
-msgctxt "field:calendar.todo.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Data calendari"
-
msgctxt "field:calendar.todo.exdate,create_date:"
msgid "Create Date"
msgstr "Data creació"
@@ -254,6 +346,14 @@ msgctxt "field:calendar.todo.exdate,create_uid:"
msgid "Create User"
msgstr "Usuari creació"
+msgctxt "field:calendar.todo.exdate,date:"
+msgid "Is Date"
+msgstr "Es una data"
+
+msgctxt "field:calendar.todo.exdate,datetime:"
+msgid "Date"
+msgstr "Data"
+
msgctxt "field:calendar.todo.exdate,id:"
msgid "ID"
msgstr "ID"
@@ -274,9 +374,45 @@ msgctxt "field:calendar.todo.exdate,write_uid:"
msgid "Write User"
msgstr "Usuari modificació"
-msgctxt "field:calendar.todo.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrencia"
+msgctxt "field:calendar.todo.exrule,byday:"
+msgid "By Day"
+msgstr "Per dia"
+
+msgctxt "field:calendar.todo.exrule,byhour:"
+msgid "By Hour"
+msgstr "Per hora"
+
+msgctxt "field:calendar.todo.exrule,byminute:"
+msgid "By Minute"
+msgstr "Per minut"
+
+msgctxt "field:calendar.todo.exrule,bymonth:"
+msgid "By Month"
+msgstr "Per mes"
+
+msgctxt "field:calendar.todo.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Per dia del mes"
+
+msgctxt "field:calendar.todo.exrule,bysecond:"
+msgid "By Second"
+msgstr "Per segon"
+
+msgctxt "field:calendar.todo.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Per ubicació"
+
+msgctxt "field:calendar.todo.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Per número de la setmana"
+
+msgctxt "field:calendar.todo.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Per dia de l'any"
+
+msgctxt "field:calendar.todo.exrule,count:"
+msgid "Count"
+msgstr "Contador"
msgctxt "field:calendar.todo.exrule,create_date:"
msgid "Create Date"
@@ -286,10 +422,18 @@ msgctxt "field:calendar.todo.exrule,create_uid:"
msgid "Create User"
msgstr "Usuari creació"
+msgctxt "field:calendar.todo.exrule,freq:"
+msgid "Frequency"
+msgstr "Freqüència"
+
msgctxt "field:calendar.todo.exrule,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:calendar.todo.exrule,interval:"
+msgid "Interval"
+msgstr "Intèrval"
+
msgctxt "field:calendar.todo.exrule,rec_name:"
msgid "Name"
msgstr "Nom"
@@ -298,6 +442,18 @@ msgctxt "field:calendar.todo.exrule,todo:"
msgid "Todo"
msgstr "Tasca"
+msgctxt "field:calendar.todo.exrule,until:"
+msgid "Until Date"
+msgstr "Fins a la data"
+
+msgctxt "field:calendar.todo.exrule,until_date:"
+msgid "Is Date"
+msgstr "Es una data"
+
+msgctxt "field:calendar.todo.exrule,wkst:"
+msgid "Week Day"
+msgstr "Dia de la setmana"
+
msgctxt "field:calendar.todo.exrule,write_date:"
msgid "Write Date"
msgstr "Data modificació"
@@ -306,10 +462,6 @@ msgctxt "field:calendar.todo.exrule,write_uid:"
msgid "Write User"
msgstr "Usuari modificació"
-msgctxt "field:calendar.todo.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Data calendari"
-
msgctxt "field:calendar.todo.rdate,create_date:"
msgid "Create Date"
msgstr "Data creació"
@@ -318,6 +470,14 @@ msgctxt "field:calendar.todo.rdate,create_uid:"
msgid "Create User"
msgstr "Usuari creació"
+msgctxt "field:calendar.todo.rdate,date:"
+msgid "Is Date"
+msgstr "Es una data"
+
+msgctxt "field:calendar.todo.rdate,datetime:"
+msgid "Date"
+msgstr "Data"
+
msgctxt "field:calendar.todo.rdate,id:"
msgid "ID"
msgstr "ID"
@@ -338,9 +498,45 @@ msgctxt "field:calendar.todo.rdate,write_uid:"
msgid "Write User"
msgstr "Usuari modificació"
-msgctxt "field:calendar.todo.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrencia"
+msgctxt "field:calendar.todo.rrule,byday:"
+msgid "By Day"
+msgstr "Per dia"
+
+msgctxt "field:calendar.todo.rrule,byhour:"
+msgid "By Hour"
+msgstr "Per hora"
+
+msgctxt "field:calendar.todo.rrule,byminute:"
+msgid "By Minute"
+msgstr "Per minut"
+
+msgctxt "field:calendar.todo.rrule,bymonth:"
+msgid "By Month"
+msgstr "Per mes"
+
+msgctxt "field:calendar.todo.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Per dia del mes"
+
+msgctxt "field:calendar.todo.rrule,bysecond:"
+msgid "By Second"
+msgstr "Per segon"
+
+msgctxt "field:calendar.todo.rrule,bysetpos:"
+msgid "By Position"
+msgstr "Per ubicació"
+
+msgctxt "field:calendar.todo.rrule,byweekno:"
+msgid "By Week Number"
+msgstr "Per número de la setmana"
+
+msgctxt "field:calendar.todo.rrule,byyearday:"
+msgid "By Year Day"
+msgstr "Per dia de l'any"
+
+msgctxt "field:calendar.todo.rrule,count:"
+msgid "Count"
+msgstr "Contador"
msgctxt "field:calendar.todo.rrule,create_date:"
msgid "Create Date"
@@ -350,10 +546,18 @@ msgctxt "field:calendar.todo.rrule,create_uid:"
msgid "Create User"
msgstr "Usuari creació"
+msgctxt "field:calendar.todo.rrule,freq:"
+msgid "Frequency"
+msgstr "Freqüència"
+
msgctxt "field:calendar.todo.rrule,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:calendar.todo.rrule,interval:"
+msgid "Interval"
+msgstr "Intèrval"
+
msgctxt "field:calendar.todo.rrule,rec_name:"
msgid "Name"
msgstr "Nom"
@@ -362,6 +566,18 @@ msgctxt "field:calendar.todo.rrule,todo:"
msgid "Todo"
msgstr "Tasca"
+msgctxt "field:calendar.todo.rrule,until:"
+msgid "Until Date"
+msgstr "Fins a la data"
+
+msgctxt "field:calendar.todo.rrule,until_date:"
+msgid "Is Date"
+msgstr "Es una data"
+
+msgctxt "field:calendar.todo.rrule,wkst:"
+msgid "Week Day"
+msgstr "Dia de la setmana"
+
msgctxt "field:calendar.todo.rrule,write_date:"
msgid "Write Date"
msgstr "Data modificació"
@@ -374,6 +590,24 @@ msgctxt "help:calendar.todo,uuid:"
msgid "Universally Unique Identifier"
msgstr "Identificador universal únic"
+msgctxt "help:calendar.todo.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Ingnora la hora del camp \"Data\", però utilitza com a única data."
+
+msgctxt "help:calendar.todo.exrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+"Ingnora la hora del camp \"Fins a la data\", però utilitza com a única data."
+
+msgctxt "help:calendar.todo.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Ingnora la hora del camp \"Data\", però utilitza com a única data."
+
+msgctxt "help:calendar.todo.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+"Ingnora la hora del camp \"Fins a la data\", però utilitza com a única data."
+
msgctxt "model:calendar.todo,name:"
msgid "Todo"
msgstr "Tasca"
@@ -430,10 +664,9 @@ msgctxt "selection:calendar.todo,classification:"
msgid "Public"
msgstr "Públic"
-#, fuzzy
msgctxt "selection:calendar.todo,status:"
msgid ""
-msgstr "Servidor"
+msgstr " "
msgctxt "selection:calendar.todo,status:"
msgid "Cancelled"
@@ -449,7 +682,143 @@ msgstr "En procés"
msgctxt "selection:calendar.todo,status:"
msgid "Needs-Action"
-msgstr "Necessita una acció"
+msgstr "Necessitat-Acció"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid ""
+msgstr " "
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Accepted"
+msgstr "Acceptat"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Declined"
+msgstr "Refusar"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Delegated"
+msgstr "Delegar"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Needs Action"
+msgstr "Necessitat Acció"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Tentative"
+msgstr "Temptatiu"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Daily"
+msgstr "Diariament"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Minutely"
+msgstr "Cada minut"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Monthly"
+msgstr "Mensualment"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Secondly"
+msgstr "Cada segon"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Weekly"
+msgstr "Setmanalment"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Yearly"
+msgstr "Anualment"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Friday"
+msgstr "Divendres"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Monday"
+msgstr "Dilluns"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Saturday"
+msgstr "Dissabte"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Sunday"
+msgstr "Diumenge"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Thursday"
+msgstr "Dijous"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Dimarts"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Dimecres"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Daily"
+msgstr "Diariament"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Minutely"
+msgstr "Cada minut"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Monthly"
+msgstr "Mensualment"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Secondly"
+msgstr "Cada segon"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Weekly"
+msgstr "Setmanalment"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Yearly"
+msgstr "Anualment"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Friday"
+msgstr "Divendres"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Monday"
+msgstr "Dilluns"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Saturday"
+msgstr "Dissabte"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Sunday"
+msgstr "Diumenge"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Thursday"
+msgstr "Dijous"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Dimarts"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Dimecres"
msgctxt "view:calendar.todo.attendee:"
msgid "Attendee"
@@ -489,7 +858,7 @@ msgstr "Regla de recurrencia"
msgctxt "view:calendar.todo.rrule:"
msgid "Recurrence Rules"
-msgstr "Regles de recurrencia"
+msgstr "Regles de recurrència"
msgctxt "view:calendar.todo:"
msgid "Attendees"
@@ -508,10 +877,6 @@ msgid "Occurences"
msgstr "Ocurrències"
msgctxt "view:calendar.todo:"
-msgid "Recurrences"
-msgstr "Recurrencies"
-
-msgctxt "view:calendar.todo:"
msgid "Todo"
msgstr "Tasca"
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
index 3b45346..cb26d50 100644
--- a/locale/cs_CZ.po
+++ b/locale/cs_CZ.po
@@ -2,12 +2,92 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr ""
+
msgctxt "error:calendar.todo:"
-msgid "Recurrence can not be recurrent!"
+msgid "Todo \"%s\" can not be recurrent."
msgstr ""
msgctxt "error:calendar.todo:"
-msgid "UUID and recurrence must be unique in a calendar!"
+msgid "UUID and recurrence must be unique in a calendar."
msgstr ""
msgctxt "field:calendar.todo,alarms:"
@@ -178,10 +258,6 @@ msgctxt "field:calendar.todo-calendar.category,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.todo.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr ""
-
msgctxt "field:calendar.todo.alarm,create_date:"
msgid "Create Date"
msgstr ""
@@ -202,6 +278,10 @@ msgctxt "field:calendar.todo.alarm,todo:"
msgid "Todo"
msgstr ""
+msgctxt "field:calendar.todo.alarm,valarm:"
+msgid "valarm"
+msgstr ""
+
msgctxt "field:calendar.todo.alarm,write_date:"
msgid "Write Date"
msgstr ""
@@ -210,8 +290,8 @@ msgctxt "field:calendar.todo.alarm,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.todo.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
+msgctxt "field:calendar.todo.attendee,attendee:"
+msgid "attendee"
msgstr ""
msgctxt "field:calendar.todo.attendee,create_date:"
@@ -222,6 +302,10 @@ msgctxt "field:calendar.todo.attendee,create_uid:"
msgid "Create User"
msgstr ""
+msgctxt "field:calendar.todo.attendee,email:"
+msgid "Email"
+msgstr ""
+
msgctxt "field:calendar.todo.attendee,id:"
msgid "ID"
msgstr ""
@@ -230,6 +314,10 @@ msgctxt "field:calendar.todo.attendee,rec_name:"
msgid "Name"
msgstr ""
+msgctxt "field:calendar.todo.attendee,status:"
+msgid "Participation Status"
+msgstr ""
+
msgctxt "field:calendar.todo.attendee,todo:"
msgid "Todo"
msgstr ""
@@ -242,10 +330,6 @@ msgctxt "field:calendar.todo.attendee,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.todo.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr ""
-
msgctxt "field:calendar.todo.exdate,create_date:"
msgid "Create Date"
msgstr ""
@@ -254,6 +338,14 @@ msgctxt "field:calendar.todo.exdate,create_uid:"
msgid "Create User"
msgstr ""
+msgctxt "field:calendar.todo.exdate,date:"
+msgid "Is Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,datetime:"
+msgid "Date"
+msgstr ""
+
msgctxt "field:calendar.todo.exdate,id:"
msgid "ID"
msgstr ""
@@ -274,8 +366,44 @@ msgctxt "field:calendar.todo.exdate,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.todo.exrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.todo.exrule,byday:"
+msgid "By Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byhour:"
+msgid "By Hour"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byminute:"
+msgid "By Minute"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bysecond:"
+msgid "By Second"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,count:"
+msgid "Count"
msgstr ""
msgctxt "field:calendar.todo.exrule,create_date:"
@@ -286,10 +414,18 @@ msgctxt "field:calendar.todo.exrule,create_uid:"
msgid "Create User"
msgstr ""
+msgctxt "field:calendar.todo.exrule,freq:"
+msgid "Frequency"
+msgstr ""
+
msgctxt "field:calendar.todo.exrule,id:"
msgid "ID"
msgstr ""
+msgctxt "field:calendar.todo.exrule,interval:"
+msgid "Interval"
+msgstr ""
+
msgctxt "field:calendar.todo.exrule,rec_name:"
msgid "Name"
msgstr ""
@@ -298,6 +434,18 @@ msgctxt "field:calendar.todo.exrule,todo:"
msgid "Todo"
msgstr ""
+msgctxt "field:calendar.todo.exrule,until:"
+msgid "Until Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,until_date:"
+msgid "Is Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,wkst:"
+msgid "Week Day"
+msgstr ""
+
msgctxt "field:calendar.todo.exrule,write_date:"
msgid "Write Date"
msgstr ""
@@ -306,10 +454,6 @@ msgctxt "field:calendar.todo.exrule,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.todo.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr ""
-
msgctxt "field:calendar.todo.rdate,create_date:"
msgid "Create Date"
msgstr ""
@@ -318,6 +462,14 @@ msgctxt "field:calendar.todo.rdate,create_uid:"
msgid "Create User"
msgstr ""
+msgctxt "field:calendar.todo.rdate,date:"
+msgid "Is Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,datetime:"
+msgid "Date"
+msgstr ""
+
msgctxt "field:calendar.todo.rdate,id:"
msgid "ID"
msgstr ""
@@ -338,8 +490,44 @@ msgctxt "field:calendar.todo.rdate,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.todo.rrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.todo.rrule,byday:"
+msgid "By Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byhour:"
+msgid "By Hour"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byminute:"
+msgid "By Minute"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bysecond:"
+msgid "By Second"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,count:"
+msgid "Count"
msgstr ""
msgctxt "field:calendar.todo.rrule,create_date:"
@@ -350,10 +538,18 @@ msgctxt "field:calendar.todo.rrule,create_uid:"
msgid "Create User"
msgstr ""
+msgctxt "field:calendar.todo.rrule,freq:"
+msgid "Frequency"
+msgstr ""
+
msgctxt "field:calendar.todo.rrule,id:"
msgid "ID"
msgstr ""
+msgctxt "field:calendar.todo.rrule,interval:"
+msgid "Interval"
+msgstr ""
+
msgctxt "field:calendar.todo.rrule,rec_name:"
msgid "Name"
msgstr ""
@@ -362,6 +558,18 @@ msgctxt "field:calendar.todo.rrule,todo:"
msgid "Todo"
msgstr ""
+msgctxt "field:calendar.todo.rrule,until:"
+msgid "Until Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,until_date:"
+msgid "Is Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,wkst:"
+msgid "Week Day"
+msgstr ""
+
msgctxt "field:calendar.todo.rrule,write_date:"
msgid "Write Date"
msgstr ""
@@ -374,6 +582,22 @@ msgctxt "help:calendar.todo,uuid:"
msgid "Universally Unique Identifier"
msgstr ""
+msgctxt "help:calendar.todo.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.todo.exrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.todo.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.todo.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+
msgctxt "model:calendar.todo,name:"
msgid "Todo"
msgstr ""
@@ -450,6 +674,142 @@ msgctxt "selection:calendar.todo,status:"
msgid "Needs-Action"
msgstr ""
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Accepted"
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Declined"
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Delegated"
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Needs Action"
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Tentative"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Yearly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Friday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Monday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Saturday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Sunday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Thursday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Tuesday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Wednesday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Yearly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Friday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Monday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Saturday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Sunday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Thursday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Tuesday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Wednesday"
+msgstr ""
+
msgctxt "view:calendar.todo.attendee:"
msgid "Attendee"
msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
index 5e40432..6f718d0 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -2,15 +2,94 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Tag\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Stunde\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Minute\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Tag des Monats\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Monat\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Position\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Sekunde\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Wochennummer\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Tag des Jahres\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Es kann nur eine der Optionen \"Bis\" oder \"Anzahl\" gesetzt werden."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Tag\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Stunde\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Minute\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Tag des Monats\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Monat\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Position\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Sekunde\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Wochennummer\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Tag des Jahres\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Es kann nur eine der Optionen \"Bis\" oder \"Anzahl\" gesetzt werden."
+
msgctxt "error:calendar.todo:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Wiederholungen können nicht rekursiv sein!"
+msgid "Todo \"%s\" can not be recurrent."
+msgstr "Aufgabe \"%s\" ist nicht wiederholbar."
msgctxt "error:calendar.todo:"
-msgid "UUID and recurrence must be unique in a calendar!"
+msgid "UUID and recurrence must be unique in a calendar."
msgstr ""
-"UUID und Wiederholung können in einem Kalender nicht mehrfach vergeben "
-"werden!"
+"UUID und Wiederholung können in einem Kalender nur einmal vergeben werden."
msgctxt "field:calendar.todo,alarms:"
msgid "Alarms"
@@ -180,10 +259,6 @@ msgctxt "field:calendar.todo-calendar.category,write_uid:"
msgid "Write User"
msgstr "Letzte Änderung durch"
-msgctxt "field:calendar.todo.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Kalender Alarm"
-
msgctxt "field:calendar.todo.alarm,create_date:"
msgid "Create Date"
msgstr "Erstellungsdatum"
@@ -204,6 +279,10 @@ msgctxt "field:calendar.todo.alarm,todo:"
msgid "Todo"
msgstr "Aufgabe"
+msgctxt "field:calendar.todo.alarm,valarm:"
+msgid "valarm"
+msgstr ""
+
msgctxt "field:calendar.todo.alarm,write_date:"
msgid "Write Date"
msgstr "Zuletzt geändert"
@@ -212,9 +291,9 @@ msgctxt "field:calendar.todo.alarm,write_uid:"
msgid "Write User"
msgstr "Letzte Änderung durch"
-msgctxt "field:calendar.todo.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Kalender Teilnehmer"
+msgctxt "field:calendar.todo.attendee,attendee:"
+msgid "attendee"
+msgstr "Teilnehmer"
msgctxt "field:calendar.todo.attendee,create_date:"
msgid "Create Date"
@@ -224,6 +303,10 @@ msgctxt "field:calendar.todo.attendee,create_uid:"
msgid "Create User"
msgstr "Erstellt durch"
+msgctxt "field:calendar.todo.attendee,email:"
+msgid "Email"
+msgstr "E-Mail"
+
msgctxt "field:calendar.todo.attendee,id:"
msgid "ID"
msgstr "ID"
@@ -232,6 +315,10 @@ msgctxt "field:calendar.todo.attendee,rec_name:"
msgid "Name"
msgstr "Name"
+msgctxt "field:calendar.todo.attendee,status:"
+msgid "Participation Status"
+msgstr "Teilnahmestatus"
+
msgctxt "field:calendar.todo.attendee,todo:"
msgid "Todo"
msgstr "Aufgabe"
@@ -244,10 +331,6 @@ msgctxt "field:calendar.todo.attendee,write_uid:"
msgid "Write User"
msgstr "Letzte Änderung durch"
-msgctxt "field:calendar.todo.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Kalender Datum"
-
msgctxt "field:calendar.todo.exdate,create_date:"
msgid "Create Date"
msgstr "Erstellungsdatum"
@@ -256,6 +339,14 @@ msgctxt "field:calendar.todo.exdate,create_uid:"
msgid "Create User"
msgstr "Erstellt durch"
+msgctxt "field:calendar.todo.exdate,date:"
+msgid "Is Date"
+msgstr "Als Datum"
+
+msgctxt "field:calendar.todo.exdate,datetime:"
+msgid "Date"
+msgstr "Zeitpunkt"
+
msgctxt "field:calendar.todo.exdate,id:"
msgid "ID"
msgstr "ID"
@@ -276,9 +367,45 @@ msgctxt "field:calendar.todo.exdate,write_uid:"
msgid "Write User"
msgstr "Letzte Änderung durch"
-msgctxt "field:calendar.todo.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Kalender WRegel"
+msgctxt "field:calendar.todo.exrule,byday:"
+msgid "By Day"
+msgstr "Für Tag"
+
+msgctxt "field:calendar.todo.exrule,byhour:"
+msgid "By Hour"
+msgstr "Für Stunde"
+
+msgctxt "field:calendar.todo.exrule,byminute:"
+msgid "By Minute"
+msgstr "Für Minute"
+
+msgctxt "field:calendar.todo.exrule,bymonth:"
+msgid "By Month"
+msgstr "Für Monat"
+
+msgctxt "field:calendar.todo.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Für Tag des Monats"
+
+msgctxt "field:calendar.todo.exrule,bysecond:"
+msgid "By Second"
+msgstr "Für Sekunde"
+
+msgctxt "field:calendar.todo.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Für Position"
+
+msgctxt "field:calendar.todo.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Für Wochennummer"
+
+msgctxt "field:calendar.todo.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Für Tag des Jahres"
+
+msgctxt "field:calendar.todo.exrule,count:"
+msgid "Count"
+msgstr "Anzahl"
msgctxt "field:calendar.todo.exrule,create_date:"
msgid "Create Date"
@@ -288,10 +415,18 @@ msgctxt "field:calendar.todo.exrule,create_uid:"
msgid "Create User"
msgstr "Erstellt durch"
+msgctxt "field:calendar.todo.exrule,freq:"
+msgid "Frequency"
+msgstr "Häufigkeit"
+
msgctxt "field:calendar.todo.exrule,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:calendar.todo.exrule,interval:"
+msgid "Interval"
+msgstr "Intervall"
+
msgctxt "field:calendar.todo.exrule,rec_name:"
msgid "Name"
msgstr "Name"
@@ -300,6 +435,18 @@ msgctxt "field:calendar.todo.exrule,todo:"
msgid "Todo"
msgstr "Aufgabe"
+msgctxt "field:calendar.todo.exrule,until:"
+msgid "Until Date"
+msgstr "Bis Datum"
+
+msgctxt "field:calendar.todo.exrule,until_date:"
+msgid "Is Date"
+msgstr "Als Datum"
+
+msgctxt "field:calendar.todo.exrule,wkst:"
+msgid "Week Day"
+msgstr "Wochentag"
+
msgctxt "field:calendar.todo.exrule,write_date:"
msgid "Write Date"
msgstr "Zuletzt geändert"
@@ -308,10 +455,6 @@ msgctxt "field:calendar.todo.exrule,write_uid:"
msgid "Write User"
msgstr "Letzte Änderung durch"
-msgctxt "field:calendar.todo.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Kalender Datum"
-
msgctxt "field:calendar.todo.rdate,create_date:"
msgid "Create Date"
msgstr "Erstellungsdatum"
@@ -320,6 +463,14 @@ msgctxt "field:calendar.todo.rdate,create_uid:"
msgid "Create User"
msgstr "Erstellt durch"
+msgctxt "field:calendar.todo.rdate,date:"
+msgid "Is Date"
+msgstr "Als Datum"
+
+msgctxt "field:calendar.todo.rdate,datetime:"
+msgid "Date"
+msgstr "Zeitpunkt"
+
msgctxt "field:calendar.todo.rdate,id:"
msgid "ID"
msgstr "ID"
@@ -340,9 +491,45 @@ msgctxt "field:calendar.todo.rdate,write_uid:"
msgid "Write User"
msgstr "Letzte Änderung durch"
-msgctxt "field:calendar.todo.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Kalender WRegel"
+msgctxt "field:calendar.todo.rrule,byday:"
+msgid "By Day"
+msgstr "Für Tag"
+
+msgctxt "field:calendar.todo.rrule,byhour:"
+msgid "By Hour"
+msgstr "Für Stunde"
+
+msgctxt "field:calendar.todo.rrule,byminute:"
+msgid "By Minute"
+msgstr "Für Minute"
+
+msgctxt "field:calendar.todo.rrule,bymonth:"
+msgid "By Month"
+msgstr "Für Monat"
+
+msgctxt "field:calendar.todo.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Für Tag des Monats"
+
+msgctxt "field:calendar.todo.rrule,bysecond:"
+msgid "By Second"
+msgstr "Für Sekunde"
+
+msgctxt "field:calendar.todo.rrule,bysetpos:"
+msgid "By Position"
+msgstr "Für Position"
+
+msgctxt "field:calendar.todo.rrule,byweekno:"
+msgid "By Week Number"
+msgstr "Für Wochennummer"
+
+msgctxt "field:calendar.todo.rrule,byyearday:"
+msgid "By Year Day"
+msgstr "Für Tag des Jahres"
+
+msgctxt "field:calendar.todo.rrule,count:"
+msgid "Count"
+msgstr "Anzahl"
msgctxt "field:calendar.todo.rrule,create_date:"
msgid "Create Date"
@@ -352,10 +539,18 @@ msgctxt "field:calendar.todo.rrule,create_uid:"
msgid "Create User"
msgstr "Erstellt durch"
+msgctxt "field:calendar.todo.rrule,freq:"
+msgid "Frequency"
+msgstr "Häufigkeit"
+
msgctxt "field:calendar.todo.rrule,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:calendar.todo.rrule,interval:"
+msgid "Interval"
+msgstr "Intervall"
+
msgctxt "field:calendar.todo.rrule,rec_name:"
msgid "Name"
msgstr "Name"
@@ -364,6 +559,18 @@ msgctxt "field:calendar.todo.rrule,todo:"
msgid "Todo"
msgstr "Aufgabe"
+msgctxt "field:calendar.todo.rrule,until:"
+msgid "Until Date"
+msgstr "Bis Datum"
+
+msgctxt "field:calendar.todo.rrule,until_date:"
+msgid "Is Date"
+msgstr "Als Datum"
+
+msgctxt "field:calendar.todo.rrule,wkst:"
+msgid "Week Day"
+msgstr "Wochentag"
+
msgctxt "field:calendar.todo.rrule,write_date:"
msgid "Write Date"
msgstr "Zuletzt geändert"
@@ -376,6 +583,30 @@ msgctxt "help:calendar.todo,uuid:"
msgid "Universally Unique Identifier"
msgstr "Universally Unique Identifier"
+msgctxt "help:calendar.todo.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+"Zeit von Feld \"Datum\" ignorieren, sondern nur als Datum ohne Zeit "
+"behandeln."
+
+msgctxt "help:calendar.todo.exrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+"Zeit von Feld \"Bis Datum\" ignorieren, sondern nur als Datum ohne Zeit "
+"behandeln."
+
+msgctxt "help:calendar.todo.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+"Zeit von Feld \"Datum\" ignorieren, sondern nur als Datum ohne Zeit "
+"behandeln."
+
+msgctxt "help:calendar.todo.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+"Zeit von Feld \"Bis Datum\" ignorieren, sondern nur als Datum ohne Zeit "
+"behandeln."
+
msgctxt "model:calendar.todo,name:"
msgid "Todo"
msgstr "Aufgabe"
@@ -452,6 +683,142 @@ msgctxt "selection:calendar.todo,status:"
msgid "Needs-Action"
msgstr "Benötigt Eingriff"
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Accepted"
+msgstr "Bestätigt"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Declined"
+msgstr "Abgelehnt"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Delegated"
+msgstr "Delegiert"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Needs Action"
+msgstr "Benötigt Eingriff"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Tentative"
+msgstr "Unter Vorbehalt"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Daily"
+msgstr "Täglich"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Hourly"
+msgstr "Stündlich"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Minutely"
+msgstr "Minütlich"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Monthly"
+msgstr "Monatlich"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Secondly"
+msgstr "Sekündlich"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Weekly"
+msgstr "Wöchentlich"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Yearly"
+msgstr "Jährlich"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Friday"
+msgstr "Freitag"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Monday"
+msgstr "Montag"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Saturday"
+msgstr "Samstag"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Sunday"
+msgstr "Sonntag"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Thursday"
+msgstr "Donnerstag"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Dienstag"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Mittwoch"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Daily"
+msgstr "Täglich"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Hourly"
+msgstr "Stündlich"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Minutely"
+msgstr "Minütlich"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Monthly"
+msgstr "Monatlich"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Secondly"
+msgstr "Sekündlich"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Weekly"
+msgstr "Wöchentlich"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Yearly"
+msgstr "Jährlich"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Friday"
+msgstr "Freitag"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Monday"
+msgstr "Montag"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Saturday"
+msgstr "Samstag"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Sunday"
+msgstr "Sonntag"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Thursday"
+msgstr "Donnerstag"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Dienstag"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Mittwoch"
+
msgctxt "view:calendar.todo.attendee:"
msgid "Attendee"
msgstr "Teilnehmer"
@@ -509,10 +876,6 @@ msgid "Occurences"
msgstr "Ereignisse"
msgctxt "view:calendar.todo:"
-msgid "Recurrences"
-msgstr "Wiederholungen"
-
-msgctxt "view:calendar.todo:"
msgid "Todo"
msgstr "Aufgabe"
diff --git a/locale/es_AR.po b/locale/es_AR.po
index e03cc96..8c96a51 100644
--- a/locale/es_AR.po
+++ b/locale/es_AR.po
@@ -2,13 +2,105 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "El campo «Por día» de la regla de recurrencia «%s» no es correcto."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "El campo «Por hora» de la regla de recurrencia «%s» no es correcto."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "El campo «Por minuto» de la regla de recurrencia «%s» no es correcto."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por día del mes» de la regla de recurrencia «%s» no es correcto."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "El campo «Por mes» de la regla de recurrencia «%s» no es correcto."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por ubicación» de la regla de recurrencia «%s» no es correcto."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por segundo» de la regla de recurrencia «%s» no es correcto."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por número de la semana» de la regla de recurrencia «%s» no es "
+"correcto."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por día del año» de la regla de recurrencia «%s» no es correcto."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Sólo un «hasta» y «contador» puede ser definido."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "El campo «Por día» de la regla de recurrencia «%s» no es correcto."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "El campo «Por hora» de la regla de recurrencia «%s» no es correcto."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "El campo «Por minuto» de la regla de recurrencia «%s» no es correcto."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por día del mes» de la regla de recurrencia «%s» no es correcto."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "El campo «Por mes» de la regla de recurrencia «%s» no es correcto."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por ubicación» de la regla de recurrencia «%s» no es correcto."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por segundo» de la regla de recurrencia «%s» no es correcto."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por número de la semana» de la regla de recurrencia «%s» no es "
+"correcto."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por día del año» de la regla de recurrencia «%s» no es correcto."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Sólo un «hasta» y «contador» puede ser definido."
+
msgctxt "error:calendar.todo:"
-msgid "Recurrence can not be recurrent!"
-msgstr "¡Una recurrencia no puede ser recurrente!"
+msgid "Todo \"%s\" can not be recurrent."
+msgstr "La tarea «%s» no puede ser recurrente."
msgctxt "error:calendar.todo:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "¡UUID y recurrencia deben ser únicos en un calendario!"
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr "UUID y la recurrencia deben ser únicos en el calendario."
msgctxt "field:calendar.todo,alarms:"
msgid "Alarms"
@@ -178,10 +270,6 @@ msgctxt "field:calendar.todo-calendar.category,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.todo.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Alarma del calendario"
-
msgctxt "field:calendar.todo.alarm,create_date:"
msgid "Create Date"
msgstr "Fecha creación"
@@ -202,6 +290,10 @@ msgctxt "field:calendar.todo.alarm,todo:"
msgid "Todo"
msgstr "Tarea"
+msgctxt "field:calendar.todo.alarm,valarm:"
+msgid "valarm"
+msgstr "valarm"
+
msgctxt "field:calendar.todo.alarm,write_date:"
msgid "Write Date"
msgstr "Fecha modificación"
@@ -210,9 +302,9 @@ msgctxt "field:calendar.todo.alarm,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.todo.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Calendario de asistentes"
+msgctxt "field:calendar.todo.attendee,attendee:"
+msgid "attendee"
+msgstr "asistente"
msgctxt "field:calendar.todo.attendee,create_date:"
msgid "Create Date"
@@ -222,6 +314,10 @@ msgctxt "field:calendar.todo.attendee,create_uid:"
msgid "Create User"
msgstr "Usuario creación"
+msgctxt "field:calendar.todo.attendee,email:"
+msgid "Email"
+msgstr "Correo electrónico"
+
msgctxt "field:calendar.todo.attendee,id:"
msgid "ID"
msgstr "ID"
@@ -230,6 +326,10 @@ msgctxt "field:calendar.todo.attendee,rec_name:"
msgid "Name"
msgstr "Nombre"
+msgctxt "field:calendar.todo.attendee,status:"
+msgid "Participation Status"
+msgstr "Estado de participación"
+
msgctxt "field:calendar.todo.attendee,todo:"
msgid "Todo"
msgstr "Tarea"
@@ -242,10 +342,6 @@ msgctxt "field:calendar.todo.attendee,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.todo.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha calendario"
-
msgctxt "field:calendar.todo.exdate,create_date:"
msgid "Create Date"
msgstr "Fecha creación"
@@ -254,6 +350,14 @@ msgctxt "field:calendar.todo.exdate,create_uid:"
msgid "Create User"
msgstr "Usuario creación"
+msgctxt "field:calendar.todo.exdate,date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.todo.exdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
msgctxt "field:calendar.todo.exdate,id:"
msgid "ID"
msgstr "ID"
@@ -274,9 +378,45 @@ msgctxt "field:calendar.todo.exdate,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.todo.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrencia"
+msgctxt "field:calendar.todo.exrule,byday:"
+msgid "By Day"
+msgstr "Por día"
+
+msgctxt "field:calendar.todo.exrule,byhour:"
+msgid "By Hour"
+msgstr "Por hora"
+
+msgctxt "field:calendar.todo.exrule,byminute:"
+msgid "By Minute"
+msgstr "Por minuto"
+
+msgctxt "field:calendar.todo.exrule,bymonth:"
+msgid "By Month"
+msgstr "Por mes"
+
+msgctxt "field:calendar.todo.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Por día del mes"
+
+msgctxt "field:calendar.todo.exrule,bysecond:"
+msgid "By Second"
+msgstr "Por segundo"
+
+msgctxt "field:calendar.todo.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Por ubicación"
+
+msgctxt "field:calendar.todo.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Por número de la semana"
+
+msgctxt "field:calendar.todo.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Por día del año"
+
+msgctxt "field:calendar.todo.exrule,count:"
+msgid "Count"
+msgstr "Contador"
msgctxt "field:calendar.todo.exrule,create_date:"
msgid "Create Date"
@@ -286,10 +426,18 @@ msgctxt "field:calendar.todo.exrule,create_uid:"
msgid "Create User"
msgstr "Usuario creación"
+msgctxt "field:calendar.todo.exrule,freq:"
+msgid "Frequency"
+msgstr "Frecuencia"
+
msgctxt "field:calendar.todo.exrule,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:calendar.todo.exrule,interval:"
+msgid "Interval"
+msgstr "Intervalo"
+
msgctxt "field:calendar.todo.exrule,rec_name:"
msgid "Name"
msgstr "Nombre"
@@ -298,6 +446,18 @@ msgctxt "field:calendar.todo.exrule,todo:"
msgid "Todo"
msgstr "Tarea"
+msgctxt "field:calendar.todo.exrule,until:"
+msgid "Until Date"
+msgstr "Hasta la fecha"
+
+msgctxt "field:calendar.todo.exrule,until_date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.todo.exrule,wkst:"
+msgid "Week Day"
+msgstr "Día de la semana"
+
msgctxt "field:calendar.todo.exrule,write_date:"
msgid "Write Date"
msgstr "Fecha modificación"
@@ -306,10 +466,6 @@ msgctxt "field:calendar.todo.exrule,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.todo.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha calendario"
-
msgctxt "field:calendar.todo.rdate,create_date:"
msgid "Create Date"
msgstr "Fecha creación"
@@ -318,6 +474,14 @@ msgctxt "field:calendar.todo.rdate,create_uid:"
msgid "Create User"
msgstr "Usuario creación"
+msgctxt "field:calendar.todo.rdate,date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.todo.rdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
msgctxt "field:calendar.todo.rdate,id:"
msgid "ID"
msgstr "ID"
@@ -338,9 +502,45 @@ msgctxt "field:calendar.todo.rdate,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.todo.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrencia"
+msgctxt "field:calendar.todo.rrule,byday:"
+msgid "By Day"
+msgstr "Por día"
+
+msgctxt "field:calendar.todo.rrule,byhour:"
+msgid "By Hour"
+msgstr "Por hora"
+
+msgctxt "field:calendar.todo.rrule,byminute:"
+msgid "By Minute"
+msgstr "Por minuto"
+
+msgctxt "field:calendar.todo.rrule,bymonth:"
+msgid "By Month"
+msgstr "Por mes"
+
+msgctxt "field:calendar.todo.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Por día del mes"
+
+msgctxt "field:calendar.todo.rrule,bysecond:"
+msgid "By Second"
+msgstr "Por segundo"
+
+msgctxt "field:calendar.todo.rrule,bysetpos:"
+msgid "By Position"
+msgstr "Por ubicación"
+
+msgctxt "field:calendar.todo.rrule,byweekno:"
+msgid "By Week Number"
+msgstr "Por número de la semana"
+
+msgctxt "field:calendar.todo.rrule,byyearday:"
+msgid "By Year Day"
+msgstr "Por día del año"
+
+msgctxt "field:calendar.todo.rrule,count:"
+msgid "Count"
+msgstr "Contador"
msgctxt "field:calendar.todo.rrule,create_date:"
msgid "Create Date"
@@ -350,10 +550,18 @@ msgctxt "field:calendar.todo.rrule,create_uid:"
msgid "Create User"
msgstr "Usuario creación"
+msgctxt "field:calendar.todo.rrule,freq:"
+msgid "Frequency"
+msgstr "Frecuencia"
+
msgctxt "field:calendar.todo.rrule,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:calendar.todo.rrule,interval:"
+msgid "Interval"
+msgstr "Intervalo"
+
msgctxt "field:calendar.todo.rrule,rec_name:"
msgid "Name"
msgstr "Nombre"
@@ -362,6 +570,18 @@ msgctxt "field:calendar.todo.rrule,todo:"
msgid "Todo"
msgstr "Tarea"
+msgctxt "field:calendar.todo.rrule,until:"
+msgid "Until Date"
+msgstr "Hasta la fecha"
+
+msgctxt "field:calendar.todo.rrule,until_date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.todo.rrule,wkst:"
+msgid "Week Day"
+msgstr "Día de la semana"
+
msgctxt "field:calendar.todo.rrule,write_date:"
msgid "Write Date"
msgstr "Fecha modificación"
@@ -374,6 +594,24 @@ msgctxt "help:calendar.todo,uuid:"
msgid "Universally Unique Identifier"
msgstr "Identificador universal único"
+msgctxt "help:calendar.todo.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Ignora la hora del campo «Fecha», pero usar como única fecha."
+
+msgctxt "help:calendar.todo.exrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+"Ignora la hora del campo «Hasta la fecha», pero usar como única fecha."
+
+msgctxt "help:calendar.todo.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Ignora la hora del campo «Fecha», pero usar como única fecha."
+
+msgctxt "help:calendar.todo.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+"Ignora la hora del campo «Hasta la fecha», pero usar como única fecha."
+
msgctxt "model:calendar.todo,name:"
msgid "Todo"
msgstr "Tarea"
@@ -400,7 +638,7 @@ msgstr "Regla de excepción"
msgctxt "model:calendar.todo.rdate,name:"
msgid "Todo Recurrence Date"
-msgstr "Fecha recurrencia"
+msgstr "Fecha recurrencia de tarea"
msgctxt "model:calendar.todo.rrule,name:"
msgid "Recurrence Rule"
@@ -448,8 +686,144 @@ msgstr "En proceso"
msgctxt "selection:calendar.todo,status:"
msgid "Needs-Action"
+msgstr "Necesita-acción"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Accepted"
+msgstr "Aceptado"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Declined"
+msgstr "Rechazado"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Delegated"
+msgstr "Delegado"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Needs Action"
msgstr "Necesita una acción"
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Tentative"
+msgstr "Tentativo"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Daily"
+msgstr "Diariamente"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Minutely"
+msgstr "Cada minuto"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Monthly"
+msgstr "Mensualmente"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Secondly"
+msgstr "Cada segundo"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Daily"
+msgstr "Diariamente"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Minutely"
+msgstr "Cada minuto"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Monthly"
+msgstr "Mensualmente"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Secondly"
+msgstr "Cada segundo"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Miércoles"
+
msgctxt "view:calendar.todo.attendee:"
msgid "Attendee"
msgstr "Asistentes"
@@ -476,7 +850,7 @@ msgstr "Reglas de excepciones"
msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Date"
-msgstr "Fecha recurrencia"
+msgstr "Fecha de recurrencia"
msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Dates"
@@ -507,10 +881,6 @@ msgid "Occurences"
msgstr "Ocurrencias"
msgctxt "view:calendar.todo:"
-msgid "Recurrences"
-msgstr "Recurrencias"
-
-msgctxt "view:calendar.todo:"
msgid "Todo"
msgstr "Tarea"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index 8c530f2..806d017 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -2,13 +2,93 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Día\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Hora\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Minuto\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Día del Mes\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Mes\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Position\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Segundo\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Número de la Semana\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Día del Año\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Solo un \"hasta\" y \"contar\" pude ser establecido!"
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Día\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Hora\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Minuto\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Día del Mes\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Mes\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Position\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Segundo\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Número de la Semana\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Día del Año\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Solo un \"hasta\" y \"contar\" pude ser establecido!"
+
msgctxt "error:calendar.todo:"
-msgid "Recurrence can not be recurrent!"
-msgstr "¡La repetición no puede repetirse!"
+msgid "Todo \"%s\" can not be recurrent."
+msgstr "Tareas por Hacer \"%s\" no puede ser recurrente."
msgctxt "error:calendar.todo:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "¡El UUID y la recurrencia deben ser únicos por calendario! "
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr "UUID y recurrencia debe ser única en un calendario."
msgctxt "field:calendar.todo,alarms:"
msgid "Alarms"
@@ -178,10 +258,6 @@ msgctxt "field:calendar.todo-calendar.category,write_uid:"
msgid "Write User"
msgstr "Modificado por Usuario"
-msgctxt "field:calendar.todo.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Alarma del Calendario"
-
msgctxt "field:calendar.todo.alarm,create_date:"
msgid "Create Date"
msgstr "Fecha de Creación"
@@ -202,6 +278,10 @@ msgctxt "field:calendar.todo.alarm,todo:"
msgid "Todo"
msgstr "Por Hacer"
+msgctxt "field:calendar.todo.alarm,valarm:"
+msgid "valarm"
+msgstr "valarma"
+
msgctxt "field:calendar.todo.alarm,write_date:"
msgid "Write Date"
msgstr "Fecha de Modificación"
@@ -210,9 +290,9 @@ msgctxt "field:calendar.todo.alarm,write_uid:"
msgid "Write User"
msgstr "Modificado por Usuario"
-msgctxt "field:calendar.todo.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Asistente de Calendario "
+msgctxt "field:calendar.todo.attendee,attendee:"
+msgid "attendee"
+msgstr "Asistente"
msgctxt "field:calendar.todo.attendee,create_date:"
msgid "Create Date"
@@ -222,6 +302,10 @@ msgctxt "field:calendar.todo.attendee,create_uid:"
msgid "Create User"
msgstr "Creado por Usuario"
+msgctxt "field:calendar.todo.attendee,email:"
+msgid "Email"
+msgstr "Correo Electrónico"
+
msgctxt "field:calendar.todo.attendee,id:"
msgid "ID"
msgstr "ID"
@@ -230,6 +314,10 @@ msgctxt "field:calendar.todo.attendee,rec_name:"
msgid "Name"
msgstr "Nombre"
+msgctxt "field:calendar.todo.attendee,status:"
+msgid "Participation Status"
+msgstr "Estado de Participación"
+
msgctxt "field:calendar.todo.attendee,todo:"
msgid "Todo"
msgstr "Por Hacer"
@@ -242,10 +330,6 @@ msgctxt "field:calendar.todo.attendee,write_uid:"
msgid "Write User"
msgstr "Modificado por Usuario"
-msgctxt "field:calendar.todo.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha Calendario"
-
msgctxt "field:calendar.todo.exdate,create_date:"
msgid "Create Date"
msgstr "Fecha de Creación"
@@ -254,6 +338,14 @@ msgctxt "field:calendar.todo.exdate,create_uid:"
msgid "Create User"
msgstr "Creado por Usuario"
+msgctxt "field:calendar.todo.exdate,date:"
+msgid "Is Date"
+msgstr "Esta Fecha"
+
+msgctxt "field:calendar.todo.exdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
msgctxt "field:calendar.todo.exdate,id:"
msgid "ID"
msgstr "ID"
@@ -274,9 +366,45 @@ msgctxt "field:calendar.todo.exdate,write_uid:"
msgid "Write User"
msgstr "Modificado por Usuario"
-msgctxt "field:calendar.todo.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de Calendario"
+msgctxt "field:calendar.todo.exrule,byday:"
+msgid "By Day"
+msgstr "Por Día"
+
+msgctxt "field:calendar.todo.exrule,byhour:"
+msgid "By Hour"
+msgstr "Por Hora"
+
+msgctxt "field:calendar.todo.exrule,byminute:"
+msgid "By Minute"
+msgstr "Por Minuto"
+
+msgctxt "field:calendar.todo.exrule,bymonth:"
+msgid "By Month"
+msgstr "Por Mes"
+
+msgctxt "field:calendar.todo.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Por Día del Mes"
+
+msgctxt "field:calendar.todo.exrule,bysecond:"
+msgid "By Second"
+msgstr "Por Segundo"
+
+msgctxt "field:calendar.todo.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Por Posición"
+
+msgctxt "field:calendar.todo.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Por Número de la Semana"
+
+msgctxt "field:calendar.todo.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Por Día del Año"
+
+msgctxt "field:calendar.todo.exrule,count:"
+msgid "Count"
+msgstr "Contar"
msgctxt "field:calendar.todo.exrule,create_date:"
msgid "Create Date"
@@ -286,10 +414,18 @@ msgctxt "field:calendar.todo.exrule,create_uid:"
msgid "Create User"
msgstr "Creado por Usuario"
+msgctxt "field:calendar.todo.exrule,freq:"
+msgid "Frequency"
+msgstr "Frecuencia"
+
msgctxt "field:calendar.todo.exrule,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:calendar.todo.exrule,interval:"
+msgid "Interval"
+msgstr "Intervalo"
+
msgctxt "field:calendar.todo.exrule,rec_name:"
msgid "Name"
msgstr "Nombre"
@@ -298,6 +434,18 @@ msgctxt "field:calendar.todo.exrule,todo:"
msgid "Todo"
msgstr "Por Hacer"
+msgctxt "field:calendar.todo.exrule,until:"
+msgid "Until Date"
+msgstr "Hasta la Fecha"
+
+msgctxt "field:calendar.todo.exrule,until_date:"
+msgid "Is Date"
+msgstr "Esta Fecha"
+
+msgctxt "field:calendar.todo.exrule,wkst:"
+msgid "Week Day"
+msgstr "Día de la Semana"
+
msgctxt "field:calendar.todo.exrule,write_date:"
msgid "Write Date"
msgstr "Fecha de Modificación"
@@ -306,10 +454,6 @@ msgctxt "field:calendar.todo.exrule,write_uid:"
msgid "Write User"
msgstr "Modificado por Usuario"
-msgctxt "field:calendar.todo.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha Calendario"
-
msgctxt "field:calendar.todo.rdate,create_date:"
msgid "Create Date"
msgstr "Fecha de Creación"
@@ -318,6 +462,14 @@ msgctxt "field:calendar.todo.rdate,create_uid:"
msgid "Create User"
msgstr "Creado por Usuario"
+msgctxt "field:calendar.todo.rdate,date:"
+msgid "Is Date"
+msgstr "Esta Fecha"
+
+msgctxt "field:calendar.todo.rdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
msgctxt "field:calendar.todo.rdate,id:"
msgid "ID"
msgstr "ID"
@@ -338,9 +490,45 @@ msgctxt "field:calendar.todo.rdate,write_uid:"
msgid "Write User"
msgstr "Modificado por Usuario"
-msgctxt "field:calendar.todo.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de Calendario"
+msgctxt "field:calendar.todo.rrule,byday:"
+msgid "By Day"
+msgstr "Por Día"
+
+msgctxt "field:calendar.todo.rrule,byhour:"
+msgid "By Hour"
+msgstr "Por Hora"
+
+msgctxt "field:calendar.todo.rrule,byminute:"
+msgid "By Minute"
+msgstr "Por Minuto"
+
+msgctxt "field:calendar.todo.rrule,bymonth:"
+msgid "By Month"
+msgstr "Por Mes"
+
+msgctxt "field:calendar.todo.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Por Día del Mes"
+
+msgctxt "field:calendar.todo.rrule,bysecond:"
+msgid "By Second"
+msgstr "Por Segundo"
+
+msgctxt "field:calendar.todo.rrule,bysetpos:"
+msgid "By Position"
+msgstr "Por Posición"
+
+msgctxt "field:calendar.todo.rrule,byweekno:"
+msgid "By Week Number"
+msgstr "Por Número de la Semana"
+
+msgctxt "field:calendar.todo.rrule,byyearday:"
+msgid "By Year Day"
+msgstr "Por Día del Año"
+
+msgctxt "field:calendar.todo.rrule,count:"
+msgid "Count"
+msgstr "Contar"
msgctxt "field:calendar.todo.rrule,create_date:"
msgid "Create Date"
@@ -350,10 +538,18 @@ msgctxt "field:calendar.todo.rrule,create_uid:"
msgid "Create User"
msgstr "Creado por Usuario"
+msgctxt "field:calendar.todo.rrule,freq:"
+msgid "Frequency"
+msgstr "Frecuencia"
+
msgctxt "field:calendar.todo.rrule,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:calendar.todo.rrule,interval:"
+msgid "Interval"
+msgstr "Intervalo"
+
msgctxt "field:calendar.todo.rrule,rec_name:"
msgid "Name"
msgstr "Nombre"
@@ -362,6 +558,18 @@ msgctxt "field:calendar.todo.rrule,todo:"
msgid "Todo"
msgstr "Por Hacer"
+msgctxt "field:calendar.todo.rrule,until:"
+msgid "Until Date"
+msgstr "Hasta la Fecha"
+
+msgctxt "field:calendar.todo.rrule,until_date:"
+msgid "Is Date"
+msgstr "Esta Fecha"
+
+msgctxt "field:calendar.todo.rrule,wkst:"
+msgid "Week Day"
+msgstr "Día de la Semana"
+
msgctxt "field:calendar.todo.rrule,write_date:"
msgid "Write Date"
msgstr "Fecha de Modificación"
@@ -374,6 +582,26 @@ msgctxt "help:calendar.todo,uuid:"
msgid "Universally Unique Identifier"
msgstr "Identificador Único Universal"
+msgctxt "help:calendar.todo.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Ignore tiempo del campo \"Fecha\", pero manejelo como fecha solamente."
+
+msgctxt "help:calendar.todo.exrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+"Ignore tiempo del campo \"Hasta la Fecha\", pero manejelo como fecha "
+"solamente."
+
+msgctxt "help:calendar.todo.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Ignore tiempo del campo \"Fecha\", pero manejelo como fecha solamente."
+
+msgctxt "help:calendar.todo.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+"Ignore tiempo del campo \"Hasta la Fecha\", pero manejelo como fecha "
+"solamente."
+
msgctxt "model:calendar.todo,name:"
msgid "Todo"
msgstr "Por Hacer"
@@ -430,6 +658,7 @@ msgctxt "selection:calendar.todo,classification:"
msgid "Public"
msgstr "Público"
+#, fuzzy
msgctxt "selection:calendar.todo,status:"
msgid ""
msgstr "Punto de Orden"
@@ -450,6 +679,143 @@ msgctxt "selection:calendar.todo,status:"
msgid "Needs-Action"
msgstr "Necesita una Acción"
+#, fuzzy
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid ""
+msgstr "Punto de Orden"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Accepted"
+msgstr "Aceptado"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Declined"
+msgstr "Declinado"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Delegated"
+msgstr "Delegado"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Needs Action"
+msgstr "Necesita una Acción"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Tentative"
+msgstr "Tentativa"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Daily"
+msgstr "Diario"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Hourly"
+msgstr "Cada Hora"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Minutely"
+msgstr "Cada Minuto"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Monthly"
+msgstr "Mensualmente"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Secondly"
+msgstr "En segundo lugar"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Daily"
+msgstr "Diario"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Hourly"
+msgstr "Cada Hora"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Minutely"
+msgstr "Cada Minuto"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Monthly"
+msgstr "Mensualmente"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Secondly"
+msgstr "En segundo lugar"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Miércoles"
+
msgctxt "view:calendar.todo.attendee:"
msgid "Attendee"
msgstr "Asistente"
@@ -507,10 +873,6 @@ msgid "Occurences"
msgstr "Ocurrencias"
msgctxt "view:calendar.todo:"
-msgid "Recurrences"
-msgstr "Repeticiones"
-
-msgctxt "view:calendar.todo:"
msgid "Todo"
msgstr "Por Hacer"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index 463df55..eed9e6b 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -2,13 +2,105 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "El campo \"por dia\" de la regla de recurrencia \"%s\" no es correcto."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "El campo \"por hora\" de la regla de recurrencia \"%s\" no es correcto."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "El campo \"por minuto\" de la regla de recurrencia \"%s\" no es correcto."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
+"El campo \"por día del mes\" de la regla de recurrencia \"%s\" no es "
+"correcto."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "El campo \"por mes\" de la regla de recurrencia \"%s\" no es correcto."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "El campo \"por ubicación\" de la regla de recurrencia \"%s\" no es correcto."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "El campo \"por segundo\" de la regla de recurrencia \"%s\" no es correcto."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+"El campo \"por número de la semana\" de la regla de recurrencia \"%s\" no es"
+" correcto."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+"El campo \"por día del año\" de la regla de recurrencia \"%s\" no es "
+"correcto."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Define un \"hasta\" y un \"contador\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "El campo \"por dia\" de la regla de recurrencia \"%s\" no es correcto."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "El campo \"por hora\" de la regla de recurrencia \"%s\" no es correcto."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "El campo \"por minuto\" de la regla de recurrencia \"%s\" no es correcto."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
+"El campo \"por día del mes\" de la regla de recurrencia \"%s\" no es "
+"correcto."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "El campo \"por mes\" de la regla de recurrencia \"%s\" no es correcto."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "El campo \"por ubicación\" de la regla de recurrencia \"%s\" no es correcto."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "El campo \"por segundo\" de la regla de recurrencia \"%s\" no es correcto."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+"El campo \"por número de la semana\" de la regla de recurrencia \"%s\" no es"
+" correcto."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+"El campo \"por día del año\" de la regla de recurrencia \"%s\" no es "
+"correcto."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Define un \"hasta\" y un \"contador\"."
+
msgctxt "error:calendar.todo:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Una recurrencia no puede ser recurrente."
+msgid "Todo \"%s\" can not be recurrent."
+msgstr "La tarea \"%s\" no puede ser recurrente."
msgctxt "error:calendar.todo:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "UUID y recurrencia deben ser únicos en un calendario."
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr "UUID y la recurrencia deber ser únicos en el calendario."
msgctxt "field:calendar.todo,alarms:"
msgid "Alarms"
@@ -178,10 +270,6 @@ msgctxt "field:calendar.todo-calendar.category,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.todo.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Alarma del calendario"
-
msgctxt "field:calendar.todo.alarm,create_date:"
msgid "Create Date"
msgstr "Fecha creación"
@@ -202,6 +290,10 @@ msgctxt "field:calendar.todo.alarm,todo:"
msgid "Todo"
msgstr "Tarea"
+msgctxt "field:calendar.todo.alarm,valarm:"
+msgid "valarm"
+msgstr "valarm"
+
msgctxt "field:calendar.todo.alarm,write_date:"
msgid "Write Date"
msgstr "Fecha modificación"
@@ -210,9 +302,9 @@ msgctxt "field:calendar.todo.alarm,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.todo.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Calendario de asistentes"
+msgctxt "field:calendar.todo.attendee,attendee:"
+msgid "attendee"
+msgstr "asistente"
msgctxt "field:calendar.todo.attendee,create_date:"
msgid "Create Date"
@@ -222,6 +314,10 @@ msgctxt "field:calendar.todo.attendee,create_uid:"
msgid "Create User"
msgstr "Usuario creación"
+msgctxt "field:calendar.todo.attendee,email:"
+msgid "Email"
+msgstr "Email"
+
msgctxt "field:calendar.todo.attendee,id:"
msgid "ID"
msgstr "ID"
@@ -230,6 +326,10 @@ msgctxt "field:calendar.todo.attendee,rec_name:"
msgid "Name"
msgstr "Nombre"
+msgctxt "field:calendar.todo.attendee,status:"
+msgid "Participation Status"
+msgstr "Estat de participacions"
+
msgctxt "field:calendar.todo.attendee,todo:"
msgid "Todo"
msgstr "Tarea"
@@ -242,10 +342,6 @@ msgctxt "field:calendar.todo.attendee,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.todo.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha calendario"
-
msgctxt "field:calendar.todo.exdate,create_date:"
msgid "Create Date"
msgstr "Fecha creación"
@@ -254,6 +350,14 @@ msgctxt "field:calendar.todo.exdate,create_uid:"
msgid "Create User"
msgstr "Usuario creación"
+msgctxt "field:calendar.todo.exdate,date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.todo.exdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
msgctxt "field:calendar.todo.exdate,id:"
msgid "ID"
msgstr "ID"
@@ -274,9 +378,45 @@ msgctxt "field:calendar.todo.exdate,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.todo.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrencia"
+msgctxt "field:calendar.todo.exrule,byday:"
+msgid "By Day"
+msgstr "Por día"
+
+msgctxt "field:calendar.todo.exrule,byhour:"
+msgid "By Hour"
+msgstr "Por hora"
+
+msgctxt "field:calendar.todo.exrule,byminute:"
+msgid "By Minute"
+msgstr "Por minuto"
+
+msgctxt "field:calendar.todo.exrule,bymonth:"
+msgid "By Month"
+msgstr "Por mes"
+
+msgctxt "field:calendar.todo.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Por día del mes"
+
+msgctxt "field:calendar.todo.exrule,bysecond:"
+msgid "By Second"
+msgstr "Por segundo"
+
+msgctxt "field:calendar.todo.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Por ubicación"
+
+msgctxt "field:calendar.todo.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Por número de la semana"
+
+msgctxt "field:calendar.todo.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Por día del año"
+
+msgctxt "field:calendar.todo.exrule,count:"
+msgid "Count"
+msgstr "Contador"
msgctxt "field:calendar.todo.exrule,create_date:"
msgid "Create Date"
@@ -286,10 +426,18 @@ msgctxt "field:calendar.todo.exrule,create_uid:"
msgid "Create User"
msgstr "Usuario creación"
+msgctxt "field:calendar.todo.exrule,freq:"
+msgid "Frequency"
+msgstr "Frecuencia"
+
msgctxt "field:calendar.todo.exrule,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:calendar.todo.exrule,interval:"
+msgid "Interval"
+msgstr "Intérvalo"
+
msgctxt "field:calendar.todo.exrule,rec_name:"
msgid "Name"
msgstr "Nombre"
@@ -298,6 +446,18 @@ msgctxt "field:calendar.todo.exrule,todo:"
msgid "Todo"
msgstr "Tarea"
+msgctxt "field:calendar.todo.exrule,until:"
+msgid "Until Date"
+msgstr "Hasta la fecha"
+
+msgctxt "field:calendar.todo.exrule,until_date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.todo.exrule,wkst:"
+msgid "Week Day"
+msgstr "Día de la semana"
+
msgctxt "field:calendar.todo.exrule,write_date:"
msgid "Write Date"
msgstr "Fecha modificación"
@@ -306,10 +466,6 @@ msgctxt "field:calendar.todo.exrule,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.todo.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha calendario"
-
msgctxt "field:calendar.todo.rdate,create_date:"
msgid "Create Date"
msgstr "Fecha creación"
@@ -318,6 +474,14 @@ msgctxt "field:calendar.todo.rdate,create_uid:"
msgid "Create User"
msgstr "Usuario creación"
+msgctxt "field:calendar.todo.rdate,date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.todo.rdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
msgctxt "field:calendar.todo.rdate,id:"
msgid "ID"
msgstr "ID"
@@ -338,9 +502,45 @@ msgctxt "field:calendar.todo.rdate,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.todo.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrencia"
+msgctxt "field:calendar.todo.rrule,byday:"
+msgid "By Day"
+msgstr "Por día"
+
+msgctxt "field:calendar.todo.rrule,byhour:"
+msgid "By Hour"
+msgstr "Por hora"
+
+msgctxt "field:calendar.todo.rrule,byminute:"
+msgid "By Minute"
+msgstr "Por minuto"
+
+msgctxt "field:calendar.todo.rrule,bymonth:"
+msgid "By Month"
+msgstr "Por mes"
+
+msgctxt "field:calendar.todo.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Por día del mes"
+
+msgctxt "field:calendar.todo.rrule,bysecond:"
+msgid "By Second"
+msgstr "Por segundo"
+
+msgctxt "field:calendar.todo.rrule,bysetpos:"
+msgid "By Position"
+msgstr "Por ubicación"
+
+msgctxt "field:calendar.todo.rrule,byweekno:"
+msgid "By Week Number"
+msgstr "Por número de la semana"
+
+msgctxt "field:calendar.todo.rrule,byyearday:"
+msgid "By Year Day"
+msgstr "Por día del año"
+
+msgctxt "field:calendar.todo.rrule,count:"
+msgid "Count"
+msgstr "Contador"
msgctxt "field:calendar.todo.rrule,create_date:"
msgid "Create Date"
@@ -350,10 +550,18 @@ msgctxt "field:calendar.todo.rrule,create_uid:"
msgid "Create User"
msgstr "Usuario creación"
+msgctxt "field:calendar.todo.rrule,freq:"
+msgid "Frequency"
+msgstr "Frecuencia"
+
msgctxt "field:calendar.todo.rrule,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:calendar.todo.rrule,interval:"
+msgid "Interval"
+msgstr "Intérvalo"
+
msgctxt "field:calendar.todo.rrule,rec_name:"
msgid "Name"
msgstr "Nombre"
@@ -362,6 +570,18 @@ msgctxt "field:calendar.todo.rrule,todo:"
msgid "Todo"
msgstr "Tarea"
+msgctxt "field:calendar.todo.rrule,until:"
+msgid "Until Date"
+msgstr "Hasta la fecha"
+
+msgctxt "field:calendar.todo.rrule,until_date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.todo.rrule,wkst:"
+msgid "Week Day"
+msgstr "Día de la semana"
+
msgctxt "field:calendar.todo.rrule,write_date:"
msgid "Write Date"
msgstr "Fecha modificación"
@@ -374,6 +594,22 @@ msgctxt "help:calendar.todo,uuid:"
msgid "Universally Unique Identifier"
msgstr "Identificador universal único."
+msgctxt "help:calendar.todo.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Ingnora la hora del campo \"Fecha\", pero usar como única fecha."
+
+msgctxt "help:calendar.todo.exrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr "Ingnora la hora del campo \"Hasta la fecha\", pero usar como única fecha."
+
+msgctxt "help:calendar.todo.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Ingnora la hora del campo \"Fecha\", pero usar como única fecha."
+
+msgctxt "help:calendar.todo.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr "Ingnora la hora del campo \"Hasta la fecha\", pero usar como única fecha."
+
msgctxt "model:calendar.todo,name:"
msgid "Todo"
msgstr "Tarea"
@@ -448,7 +684,143 @@ msgstr "En proceso"
msgctxt "selection:calendar.todo,status:"
msgid "Needs-Action"
-msgstr "Necesita acción"
+msgstr "Necesidad-Acción"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Accepted"
+msgstr "Acceptado"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Declined"
+msgstr "Rechazar"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Delegated"
+msgstr "Delegar"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Needs Action"
+msgstr "Necesidad Acción"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Tentative"
+msgstr "Tentativo"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Daily"
+msgstr "Diariamente"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Minutely"
+msgstr "Cada minuto"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Monthly"
+msgstr "Mensualmente"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Secondly"
+msgstr "Cada segundo"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Daily"
+msgstr "Diariamente"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Minutely"
+msgstr "Cada minuto"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Monthly"
+msgstr "Mensualmente"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Secondly"
+msgstr "Cada segundo"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Miércoles"
msgctxt "view:calendar.todo.attendee:"
msgid "Attendee"
@@ -507,10 +879,6 @@ msgid "Occurences"
msgstr "Ocurrencias"
msgctxt "view:calendar.todo:"
-msgid "Recurrences"
-msgstr "Recurrencias"
-
-msgctxt "view:calendar.todo:"
msgid "Todo"
msgstr "Tarea"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index 993dc35..efb455f 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -2,21 +2,93 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:calendar.todo:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Une récurrence ne peut pas être récurrente !"
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "\"Par jour\" invalide dans la règle de récurrence \"%s\"."
-msgctxt "error:calendar.todo:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Une récurrence ne peut pas être récurrente !"
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "\"Par heure\" invalide dans la règle de récurrence \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "\"Par minute\" invalide dans la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "Champ \"Par jour du mois\" invalide pour la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Champ \"Par mois\" invalide pour la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "\"Par position\" invalide dans la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "\"Par seconde\" invalide dans la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "\"Par numéro de semaine\" invalide dans la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "\"Par jour de l'année\" invalide dans la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "\"Date de fin\" et \"Répétitions\" sont mutuellement exclusifs"
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "\"Par jour\" invalide dans la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "\"Par heure\" invalide dans la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "\"Par minute\" invalide dans la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "Champ \"Par jour du mois\" invalide pour la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Champ \"Par mois\" invalide pour la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "\"Par position\" invalide dans la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "\"Par seconde\" invalide dans la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "\"Par numéro de semaine\" invalide dans la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "\"Par jour de l'année\" invalide dans la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "\"Date de fin\" et \"Répétitions\" sont mutuellement exclusifs"
msgctxt "error:calendar.todo:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "UUID et récurrence doivent être uniques sur un calendrier !"
+msgid "Todo \"%s\" can not be recurrent."
+msgstr "La tâche \"%s\" ne peut pas être récurrente."
msgctxt "error:calendar.todo:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "UUID et récurrence doivent être uniques sur un calendrier !"
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr "UUID et récurence doivent être unique dans un calendrier."
msgctxt "field:calendar.todo,alarms:"
msgid "Alarms"
@@ -186,10 +258,6 @@ msgctxt "field:calendar.todo-calendar.category,write_uid:"
msgid "Write User"
msgstr "Mis à jour par"
-msgctxt "field:calendar.todo.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Alarme calendrier"
-
msgctxt "field:calendar.todo.alarm,create_date:"
msgid "Create Date"
msgstr "Date de création"
@@ -210,6 +278,10 @@ msgctxt "field:calendar.todo.alarm,todo:"
msgid "Todo"
msgstr "Tâche"
+msgctxt "field:calendar.todo.alarm,valarm:"
+msgid "valarm"
+msgstr "valarm"
+
msgctxt "field:calendar.todo.alarm,write_date:"
msgid "Write Date"
msgstr "Date de mise à jour"
@@ -218,9 +290,9 @@ msgctxt "field:calendar.todo.alarm,write_uid:"
msgid "Write User"
msgstr "Mis à jour par"
-msgctxt "field:calendar.todo.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Participant calendrier"
+msgctxt "field:calendar.todo.attendee,attendee:"
+msgid "attendee"
+msgstr "participant"
msgctxt "field:calendar.todo.attendee,create_date:"
msgid "Create Date"
@@ -230,6 +302,10 @@ msgctxt "field:calendar.todo.attendee,create_uid:"
msgid "Create User"
msgstr "Créé par"
+msgctxt "field:calendar.todo.attendee,email:"
+msgid "Email"
+msgstr "E-mail"
+
msgctxt "field:calendar.todo.attendee,id:"
msgid "ID"
msgstr "ID"
@@ -238,6 +314,10 @@ msgctxt "field:calendar.todo.attendee,rec_name:"
msgid "Name"
msgstr "Nom"
+msgctxt "field:calendar.todo.attendee,status:"
+msgid "Participation Status"
+msgstr "Statut de participation"
+
msgctxt "field:calendar.todo.attendee,todo:"
msgid "Todo"
msgstr "Tâche"
@@ -250,10 +330,6 @@ msgctxt "field:calendar.todo.attendee,write_uid:"
msgid "Write User"
msgstr "Mis à jour par"
-msgctxt "field:calendar.todo.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Date calendrier"
-
msgctxt "field:calendar.todo.exdate,create_date:"
msgid "Create Date"
msgstr "Date de création"
@@ -262,6 +338,14 @@ msgctxt "field:calendar.todo.exdate,create_uid:"
msgid "Create User"
msgstr "Créé par"
+msgctxt "field:calendar.todo.exdate,date:"
+msgid "Is Date"
+msgstr "Est une date"
+
+msgctxt "field:calendar.todo.exdate,datetime:"
+msgid "Date"
+msgstr "Date"
+
msgctxt "field:calendar.todo.exdate,id:"
msgid "ID"
msgstr "ID"
@@ -282,9 +366,45 @@ msgctxt "field:calendar.todo.exdate,write_uid:"
msgid "Write User"
msgstr "Mis à jour par"
-msgctxt "field:calendar.todo.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Règle de récurrence"
+msgctxt "field:calendar.todo.exrule,byday:"
+msgid "By Day"
+msgstr "Par jour"
+
+msgctxt "field:calendar.todo.exrule,byhour:"
+msgid "By Hour"
+msgstr "Par heure"
+
+msgctxt "field:calendar.todo.exrule,byminute:"
+msgid "By Minute"
+msgstr "Par minute"
+
+msgctxt "field:calendar.todo.exrule,bymonth:"
+msgid "By Month"
+msgstr "Par mois"
+
+msgctxt "field:calendar.todo.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Par jour du mois"
+
+msgctxt "field:calendar.todo.exrule,bysecond:"
+msgid "By Second"
+msgstr "Par seconde"
+
+msgctxt "field:calendar.todo.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Par position"
+
+msgctxt "field:calendar.todo.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Par numéro de semaine"
+
+msgctxt "field:calendar.todo.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Par jour de l'année"
+
+msgctxt "field:calendar.todo.exrule,count:"
+msgid "Count"
+msgstr "Répétitions"
msgctxt "field:calendar.todo.exrule,create_date:"
msgid "Create Date"
@@ -294,10 +414,18 @@ msgctxt "field:calendar.todo.exrule,create_uid:"
msgid "Create User"
msgstr "Créé par"
+msgctxt "field:calendar.todo.exrule,freq:"
+msgid "Frequency"
+msgstr "Fréquence"
+
msgctxt "field:calendar.todo.exrule,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:calendar.todo.exrule,interval:"
+msgid "Interval"
+msgstr "Intervalle"
+
msgctxt "field:calendar.todo.exrule,rec_name:"
msgid "Name"
msgstr "Nom"
@@ -306,6 +434,18 @@ msgctxt "field:calendar.todo.exrule,todo:"
msgid "Todo"
msgstr "Tâche"
+msgctxt "field:calendar.todo.exrule,until:"
+msgid "Until Date"
+msgstr "Date de fin"
+
+msgctxt "field:calendar.todo.exrule,until_date:"
+msgid "Is Date"
+msgstr "Est une date"
+
+msgctxt "field:calendar.todo.exrule,wkst:"
+msgid "Week Day"
+msgstr "Jour de la semaine"
+
msgctxt "field:calendar.todo.exrule,write_date:"
msgid "Write Date"
msgstr "Date de mise à jour"
@@ -314,10 +454,6 @@ msgctxt "field:calendar.todo.exrule,write_uid:"
msgid "Write User"
msgstr "Mis à jour par"
-msgctxt "field:calendar.todo.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Date calendrier"
-
msgctxt "field:calendar.todo.rdate,create_date:"
msgid "Create Date"
msgstr "Date de création"
@@ -326,6 +462,14 @@ msgctxt "field:calendar.todo.rdate,create_uid:"
msgid "Create User"
msgstr "Créé par"
+msgctxt "field:calendar.todo.rdate,date:"
+msgid "Is Date"
+msgstr "Est une date"
+
+msgctxt "field:calendar.todo.rdate,datetime:"
+msgid "Date"
+msgstr "Date"
+
msgctxt "field:calendar.todo.rdate,id:"
msgid "ID"
msgstr "ID"
@@ -346,9 +490,45 @@ msgctxt "field:calendar.todo.rdate,write_uid:"
msgid "Write User"
msgstr "Mis à jour par"
-msgctxt "field:calendar.todo.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Règle de récurrence"
+msgctxt "field:calendar.todo.rrule,byday:"
+msgid "By Day"
+msgstr "Par jour"
+
+msgctxt "field:calendar.todo.rrule,byhour:"
+msgid "By Hour"
+msgstr "Par heure"
+
+msgctxt "field:calendar.todo.rrule,byminute:"
+msgid "By Minute"
+msgstr "Par minute"
+
+msgctxt "field:calendar.todo.rrule,bymonth:"
+msgid "By Month"
+msgstr "Par mois"
+
+msgctxt "field:calendar.todo.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Par jour du mois"
+
+msgctxt "field:calendar.todo.rrule,bysecond:"
+msgid "By Second"
+msgstr "Par seconde"
+
+msgctxt "field:calendar.todo.rrule,bysetpos:"
+msgid "By Position"
+msgstr "Par position"
+
+msgctxt "field:calendar.todo.rrule,byweekno:"
+msgid "By Week Number"
+msgstr "Par numéro de semaine"
+
+msgctxt "field:calendar.todo.rrule,byyearday:"
+msgid "By Year Day"
+msgstr "Par jour de l'année"
+
+msgctxt "field:calendar.todo.rrule,count:"
+msgid "Count"
+msgstr "Répétitions"
msgctxt "field:calendar.todo.rrule,create_date:"
msgid "Create Date"
@@ -358,10 +538,18 @@ msgctxt "field:calendar.todo.rrule,create_uid:"
msgid "Create User"
msgstr "Créé par"
+msgctxt "field:calendar.todo.rrule,freq:"
+msgid "Frequency"
+msgstr "Fréquence"
+
msgctxt "field:calendar.todo.rrule,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:calendar.todo.rrule,interval:"
+msgid "Interval"
+msgstr "Intervalle"
+
msgctxt "field:calendar.todo.rrule,rec_name:"
msgid "Name"
msgstr "Nom"
@@ -370,6 +558,18 @@ msgctxt "field:calendar.todo.rrule,todo:"
msgid "Todo"
msgstr "Tâche"
+msgctxt "field:calendar.todo.rrule,until:"
+msgid "Until Date"
+msgstr "Date de fin"
+
+msgctxt "field:calendar.todo.rrule,until_date:"
+msgid "Is Date"
+msgstr "Est une date"
+
+msgctxt "field:calendar.todo.rrule,wkst:"
+msgid "Week Day"
+msgstr "Jour de la semaine"
+
msgctxt "field:calendar.todo.rrule,write_date:"
msgid "Write Date"
msgstr "Date de mise à jour"
@@ -382,6 +582,22 @@ msgctxt "help:calendar.todo,uuid:"
msgid "Universally Unique Identifier"
msgstr "Identificateur unique universel"
+msgctxt "help:calendar.todo.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Ignorer l'heure du champ \"Date\" et considérer uniquement la date"
+
+msgctxt "help:calendar.todo.exrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr "Ignorer l'heure du champ \"Date de fin\" et considérer uniquement la date"
+
+msgctxt "help:calendar.todo.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Ignorer l'heure du champ \"Date\" et considérer uniquement la date"
+
+msgctxt "help:calendar.todo.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr "Ignorer l'heure du champ \"Date de fin\" et considérer uniquement la date"
+
msgctxt "model:calendar.todo,name:"
msgid "Todo"
msgstr "Tâche"
@@ -490,6 +706,142 @@ msgctxt "selection:calendar.todo,status:"
msgid "Needs-Action"
msgstr "Nécessite une action"
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Accepted"
+msgstr "Accepté"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Declined"
+msgstr "Décliné"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Delegated"
+msgstr "Délégué"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Needs Action"
+msgstr "Nécessite une action"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Tentative"
+msgstr "Tentative"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Daily"
+msgstr "Journalier"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Hourly"
+msgstr "Horaire"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Minutely"
+msgstr "Chaque minute"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Monthly"
+msgstr "Mensuel"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Secondly"
+msgstr "Chaque seconde"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Weekly"
+msgstr "hebdomadaire"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Yearly"
+msgstr "Annuel"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Friday"
+msgstr "Vendredi"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Monday"
+msgstr "Lundi"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Saturday"
+msgstr "Samedi"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Sunday"
+msgstr "Dimanche"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Thursday"
+msgstr "Jeudi"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Mardi"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Mercredi"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Daily"
+msgstr "Journalier"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Hourly"
+msgstr "Horaire"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Minutely"
+msgstr "Chaque minute"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Monthly"
+msgstr "Mensuel"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Secondly"
+msgstr "Chaque seconde"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Weekly"
+msgstr "hebdomadaire"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Yearly"
+msgstr "Annuel"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Friday"
+msgstr "Vendredi"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Monday"
+msgstr "Lundi"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Saturday"
+msgstr "Samedi"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Sunday"
+msgstr "Dimanche"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Thursday"
+msgstr "Jeudi"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Mardi"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Mercredi"
+
msgctxt "view:calendar.todo.attendee:"
msgid "Attendee"
msgstr "Participant"
@@ -603,10 +955,6 @@ msgid "Occurences"
msgstr "Occurrences"
msgctxt "view:calendar.todo:"
-msgid "Recurrences"
-msgstr "Récurrences"
-
-msgctxt "view:calendar.todo:"
msgid "Todo"
msgstr "Tâche"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
index c17980d..fcb4dec 100644
--- a/locale/nl_NL.po
+++ b/locale/nl_NL.po
@@ -2,12 +2,92 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr ""
+
msgctxt "error:calendar.todo:"
-msgid "Recurrence can not be recurrent!"
+msgid "Todo \"%s\" can not be recurrent."
msgstr ""
msgctxt "error:calendar.todo:"
-msgid "UUID and recurrence must be unique in a calendar!"
+msgid "UUID and recurrence must be unique in a calendar."
msgstr ""
msgctxt "field:calendar.todo,alarms:"
@@ -186,10 +266,6 @@ msgctxt "field:calendar.todo-calendar.category,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.todo.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr ""
-
msgctxt "field:calendar.todo.alarm,create_date:"
msgid "Create Date"
msgstr ""
@@ -211,6 +287,10 @@ msgctxt "field:calendar.todo.alarm,todo:"
msgid "Todo"
msgstr ""
+msgctxt "field:calendar.todo.alarm,valarm:"
+msgid "valarm"
+msgstr ""
+
msgctxt "field:calendar.todo.alarm,write_date:"
msgid "Write Date"
msgstr ""
@@ -219,8 +299,8 @@ msgctxt "field:calendar.todo.alarm,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.todo.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
+msgctxt "field:calendar.todo.attendee,attendee:"
+msgid "attendee"
msgstr ""
msgctxt "field:calendar.todo.attendee,create_date:"
@@ -231,6 +311,11 @@ msgctxt "field:calendar.todo.attendee,create_uid:"
msgid "Create User"
msgstr ""
+#, fuzzy
+msgctxt "field:calendar.todo.attendee,email:"
+msgid "Email"
+msgstr "E-mail"
+
msgctxt "field:calendar.todo.attendee,id:"
msgid "ID"
msgstr ""
@@ -240,6 +325,10 @@ msgctxt "field:calendar.todo.attendee,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
+msgctxt "field:calendar.todo.attendee,status:"
+msgid "Participation Status"
+msgstr ""
+
msgctxt "field:calendar.todo.attendee,todo:"
msgid "Todo"
msgstr ""
@@ -252,10 +341,6 @@ msgctxt "field:calendar.todo.attendee,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.todo.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr ""
-
msgctxt "field:calendar.todo.exdate,create_date:"
msgid "Create Date"
msgstr ""
@@ -264,6 +349,15 @@ msgctxt "field:calendar.todo.exdate,create_uid:"
msgid "Create User"
msgstr ""
+msgctxt "field:calendar.todo.exdate,date:"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.exdate,datetime:"
+msgid "Date"
+msgstr "Vervaldatum"
+
msgctxt "field:calendar.todo.exdate,id:"
msgid "ID"
msgstr ""
@@ -285,8 +379,44 @@ msgctxt "field:calendar.todo.exdate,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.todo.exrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.todo.exrule,byday:"
+msgid "By Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byhour:"
+msgid "By Hour"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byminute:"
+msgid "By Minute"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bysecond:"
+msgid "By Second"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,count:"
+msgid "Count"
msgstr ""
msgctxt "field:calendar.todo.exrule,create_date:"
@@ -297,10 +427,18 @@ msgctxt "field:calendar.todo.exrule,create_uid:"
msgid "Create User"
msgstr ""
+msgctxt "field:calendar.todo.exrule,freq:"
+msgid "Frequency"
+msgstr ""
+
msgctxt "field:calendar.todo.exrule,id:"
msgid "ID"
msgstr ""
+msgctxt "field:calendar.todo.exrule,interval:"
+msgid "Interval"
+msgstr ""
+
#, fuzzy
msgctxt "field:calendar.todo.exrule,rec_name:"
msgid "Name"
@@ -310,6 +448,18 @@ msgctxt "field:calendar.todo.exrule,todo:"
msgid "Todo"
msgstr ""
+msgctxt "field:calendar.todo.exrule,until:"
+msgid "Until Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,until_date:"
+msgid "Is Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,wkst:"
+msgid "Week Day"
+msgstr ""
+
msgctxt "field:calendar.todo.exrule,write_date:"
msgid "Write Date"
msgstr ""
@@ -318,10 +468,6 @@ msgctxt "field:calendar.todo.exrule,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.todo.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr ""
-
msgctxt "field:calendar.todo.rdate,create_date:"
msgid "Create Date"
msgstr ""
@@ -330,6 +476,15 @@ msgctxt "field:calendar.todo.rdate,create_uid:"
msgid "Create User"
msgstr ""
+msgctxt "field:calendar.todo.rdate,date:"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.rdate,datetime:"
+msgid "Date"
+msgstr "Vervaldatum"
+
msgctxt "field:calendar.todo.rdate,id:"
msgid "ID"
msgstr ""
@@ -351,8 +506,44 @@ msgctxt "field:calendar.todo.rdate,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.todo.rrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.todo.rrule,byday:"
+msgid "By Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byhour:"
+msgid "By Hour"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byminute:"
+msgid "By Minute"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bysecond:"
+msgid "By Second"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,count:"
+msgid "Count"
msgstr ""
msgctxt "field:calendar.todo.rrule,create_date:"
@@ -363,10 +554,18 @@ msgctxt "field:calendar.todo.rrule,create_uid:"
msgid "Create User"
msgstr ""
+msgctxt "field:calendar.todo.rrule,freq:"
+msgid "Frequency"
+msgstr ""
+
msgctxt "field:calendar.todo.rrule,id:"
msgid "ID"
msgstr ""
+msgctxt "field:calendar.todo.rrule,interval:"
+msgid "Interval"
+msgstr ""
+
#, fuzzy
msgctxt "field:calendar.todo.rrule,rec_name:"
msgid "Name"
@@ -376,6 +575,18 @@ msgctxt "field:calendar.todo.rrule,todo:"
msgid "Todo"
msgstr ""
+msgctxt "field:calendar.todo.rrule,until:"
+msgid "Until Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,until_date:"
+msgid "Is Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,wkst:"
+msgid "Week Day"
+msgstr ""
+
msgctxt "field:calendar.todo.rrule,write_date:"
msgid "Write Date"
msgstr ""
@@ -388,6 +599,22 @@ msgctxt "help:calendar.todo,uuid:"
msgid "Universally Unique Identifier"
msgstr ""
+msgctxt "help:calendar.todo.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.todo.exrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.todo.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.todo.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+
msgctxt "model:calendar.todo,name:"
msgid "Todo"
msgstr ""
@@ -464,6 +691,142 @@ msgctxt "selection:calendar.todo,status:"
msgid "Needs-Action"
msgstr ""
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Accepted"
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Declined"
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Delegated"
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Needs Action"
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Tentative"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Yearly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Friday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Monday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Saturday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Sunday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Thursday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Tuesday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Wednesday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Yearly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Friday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Monday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Saturday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Sunday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Thursday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Tuesday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Wednesday"
+msgstr ""
+
msgctxt "view:calendar.todo.attendee:"
msgid "Attendee"
msgstr ""
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
index 54e0693..98c3d9f 100644
--- a/locale/ru_RU.po
+++ b/locale/ru_RU.po
@@ -2,13 +2,93 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В час\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В минуту\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день месяца\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В месяц\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"По положению\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В секунду\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В неделю номер\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день года\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Может быть задано только одно из полей - \"До даты\" или \"Кол-во\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В час\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В минуту\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день месяца\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В месяц\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"По положению\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В секунду\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В неделю номер\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день года\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Может быть задано только одно из полей - \"До даты\" или \"Кол-во\"."
+
msgctxt "error:calendar.todo:"
-msgid "Recurrence can not be recurrent!"
-msgstr ""
+msgid "Todo \"%s\" can not be recurrent."
+msgstr "Задача \"%s\" не может быть повторяемой."
msgctxt "error:calendar.todo:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr ""
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr "UUID и повторение должны быть уникальными в календаре."
msgctxt "field:calendar.todo,alarms:"
msgid "Alarms"
@@ -48,11 +128,11 @@ msgstr "Выполнен"
msgctxt "field:calendar.todo,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:calendar.todo,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
msgctxt "field:calendar.todo,description:"
msgid "Description"
@@ -76,7 +156,7 @@ msgstr "Правила исключения"
msgctxt "field:calendar.todo,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.todo,location:"
msgid "Location"
@@ -92,7 +172,7 @@ msgstr "Организатор"
msgctxt "field:calendar.todo,parent:"
msgid "Parent"
-msgstr "Основной"
+msgstr "Предок"
msgctxt "field:calendar.todo,percent_complete:"
msgid "Percent complete"
@@ -116,7 +196,7 @@ msgstr "Правила повторения"
msgctxt "field:calendar.todo,sequence:"
msgid "Sequence"
-msgstr "Последовательность"
+msgstr "Нумерация"
msgctxt "field:calendar.todo,status:"
msgid "Status"
@@ -132,7 +212,7 @@ msgstr "Зона времени"
msgctxt "field:calendar.todo,uuid:"
msgid "UUID"
-msgstr ""
+msgstr "UUID"
msgctxt "field:calendar.todo,vtodo:"
msgid "vtodo"
@@ -140,27 +220,27 @@ msgstr ""
msgctxt "field:calendar.todo,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:calendar.todo,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
msgctxt "field:calendar.todo-calendar.category,category:"
msgid "Category"
-msgstr "Категории"
+msgstr "Категория"
msgctxt "field:calendar.todo-calendar.category,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:calendar.todo-calendar.category,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
msgctxt "field:calendar.todo-calendar.category,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.todo-calendar.category,rec_name:"
msgid "Name"
@@ -172,27 +252,23 @@ msgstr "Дела"
msgctxt "field:calendar.todo-calendar.category,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:calendar.todo-calendar.category,write_uid:"
msgid "Write User"
-msgstr ""
-
-msgctxt "field:calendar.todo.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Сигнала календаря"
+msgstr "Изменено пользователем"
msgctxt "field:calendar.todo.alarm,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:calendar.todo.alarm,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
msgctxt "field:calendar.todo.alarm,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.todo.alarm,rec_name:"
msgid "Name"
@@ -202,61 +278,77 @@ msgctxt "field:calendar.todo.alarm,todo:"
msgid "Todo"
msgstr "Дело"
+msgctxt "field:calendar.todo.alarm,valarm:"
+msgid "valarm"
+msgstr ""
+
msgctxt "field:calendar.todo.alarm,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:calendar.todo.alarm,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
-msgctxt "field:calendar.todo.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Календарь участников"
+msgctxt "field:calendar.todo.attendee,attendee:"
+msgid "attendee"
+msgstr "участник"
msgctxt "field:calendar.todo.attendee,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:calendar.todo.attendee,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
+
+msgctxt "field:calendar.todo.attendee,email:"
+msgid "Email"
+msgstr "Эл.почта"
msgctxt "field:calendar.todo.attendee,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.todo.attendee,rec_name:"
msgid "Name"
msgstr "Наименование"
+msgctxt "field:calendar.todo.attendee,status:"
+msgid "Participation Status"
+msgstr "Статус участия"
+
msgctxt "field:calendar.todo.attendee,todo:"
msgid "Todo"
msgstr "Дело"
msgctxt "field:calendar.todo.attendee,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:calendar.todo.attendee,write_uid:"
msgid "Write User"
-msgstr ""
-
-msgctxt "field:calendar.todo.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "День календаря"
+msgstr "Изменено пользователем"
msgctxt "field:calendar.todo.exdate,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:calendar.todo.exdate,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
+
+msgctxt "field:calendar.todo.exdate,date:"
+msgid "Is Date"
+msgstr "Только Дата"
+
+msgctxt "field:calendar.todo.exdate,datetime:"
+msgid "Date"
+msgstr "Дата"
msgctxt "field:calendar.todo.exdate,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.todo.exdate,rec_name:"
msgid "Name"
@@ -268,27 +360,71 @@ msgstr "Дело"
msgctxt "field:calendar.todo.exdate,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:calendar.todo.exdate,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
+
+msgctxt "field:calendar.todo.exrule,byday:"
+msgid "By Day"
+msgstr "В день"
+
+msgctxt "field:calendar.todo.exrule,byhour:"
+msgid "By Hour"
+msgstr "В час"
+
+msgctxt "field:calendar.todo.exrule,byminute:"
+msgid "By Minute"
+msgstr "В минуту"
+
+msgctxt "field:calendar.todo.exrule,bymonth:"
+msgid "By Month"
+msgstr "В месяц"
+
+msgctxt "field:calendar.todo.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "В день месяца"
+
+msgctxt "field:calendar.todo.exrule,bysecond:"
+msgid "By Second"
+msgstr "В секунду"
+
+msgctxt "field:calendar.todo.exrule,bysetpos:"
+msgid "By Position"
+msgstr "По положению"
+
+msgctxt "field:calendar.todo.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "В неделю номер"
-msgctxt "field:calendar.todo.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Правила календаря"
+msgctxt "field:calendar.todo.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "В день года"
+
+msgctxt "field:calendar.todo.exrule,count:"
+msgid "Count"
+msgstr "Кол-во"
msgctxt "field:calendar.todo.exrule,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:calendar.todo.exrule,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
+
+msgctxt "field:calendar.todo.exrule,freq:"
+msgid "Frequency"
+msgstr "Повторение"
msgctxt "field:calendar.todo.exrule,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
+
+msgctxt "field:calendar.todo.exrule,interval:"
+msgid "Interval"
+msgstr "Интервал"
msgctxt "field:calendar.todo.exrule,rec_name:"
msgid "Name"
@@ -298,29 +434,45 @@ msgctxt "field:calendar.todo.exrule,todo:"
msgid "Todo"
msgstr "Дело"
+msgctxt "field:calendar.todo.exrule,until:"
+msgid "Until Date"
+msgstr "До даты"
+
+msgctxt "field:calendar.todo.exrule,until_date:"
+msgid "Is Date"
+msgstr "Только Дата"
+
+msgctxt "field:calendar.todo.exrule,wkst:"
+msgid "Week Day"
+msgstr "День недели"
+
msgctxt "field:calendar.todo.exrule,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:calendar.todo.exrule,write_uid:"
msgid "Write User"
-msgstr ""
-
-msgctxt "field:calendar.todo.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "День календаря"
+msgstr "Изменено пользователем"
msgctxt "field:calendar.todo.rdate,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:calendar.todo.rdate,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
+
+msgctxt "field:calendar.todo.rdate,date:"
+msgid "Is Date"
+msgstr "Только Дата"
+
+msgctxt "field:calendar.todo.rdate,datetime:"
+msgid "Date"
+msgstr "Дата"
msgctxt "field:calendar.todo.rdate,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.todo.rdate,rec_name:"
msgid "Name"
@@ -332,27 +484,71 @@ msgstr "Дело"
msgctxt "field:calendar.todo.rdate,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:calendar.todo.rdate,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
+
+msgctxt "field:calendar.todo.rrule,byday:"
+msgid "By Day"
+msgstr "В день"
+
+msgctxt "field:calendar.todo.rrule,byhour:"
+msgid "By Hour"
+msgstr "В час"
+
+msgctxt "field:calendar.todo.rrule,byminute:"
+msgid "By Minute"
+msgstr "В минуту"
+
+msgctxt "field:calendar.todo.rrule,bymonth:"
+msgid "By Month"
+msgstr "В месяц"
+
+msgctxt "field:calendar.todo.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr "В день месяца"
+
+msgctxt "field:calendar.todo.rrule,bysecond:"
+msgid "By Second"
+msgstr "В секунду"
+
+msgctxt "field:calendar.todo.rrule,bysetpos:"
+msgid "By Position"
+msgstr "По положению"
+
+msgctxt "field:calendar.todo.rrule,byweekno:"
+msgid "By Week Number"
+msgstr "В неделю номер"
-msgctxt "field:calendar.todo.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Правила календаря"
+msgctxt "field:calendar.todo.rrule,byyearday:"
+msgid "By Year Day"
+msgstr "В день года"
+
+msgctxt "field:calendar.todo.rrule,count:"
+msgid "Count"
+msgstr "Кол-во"
msgctxt "field:calendar.todo.rrule,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:calendar.todo.rrule,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
+
+msgctxt "field:calendar.todo.rrule,freq:"
+msgid "Frequency"
+msgstr "Повторение"
msgctxt "field:calendar.todo.rrule,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
+
+msgctxt "field:calendar.todo.rrule,interval:"
+msgid "Interval"
+msgstr "Интервал"
msgctxt "field:calendar.todo.rrule,rec_name:"
msgid "Name"
@@ -362,17 +558,53 @@ msgctxt "field:calendar.todo.rrule,todo:"
msgid "Todo"
msgstr "Дело"
+msgctxt "field:calendar.todo.rrule,until:"
+msgid "Until Date"
+msgstr "До даты"
+
+msgctxt "field:calendar.todo.rrule,until_date:"
+msgid "Is Date"
+msgstr "Только Дата"
+
+msgctxt "field:calendar.todo.rrule,wkst:"
+msgid "Week Day"
+msgstr "День недели"
+
msgctxt "field:calendar.todo.rrule,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:calendar.todo.rrule,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
msgctxt "help:calendar.todo,uuid:"
msgid "Universally Unique Identifier"
-msgstr "Универсальный уникальный идентификатор"
+msgstr "Универсальный уникальный идентификатор (UUID)"
+
+msgctxt "help:calendar.todo.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+"Если включено, то значение времени в поле \"Дата\" будет проигнорировано, "
+"будет использована только дата."
+
+msgctxt "help:calendar.todo.exrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+"Если включено, то значение времени в поле \"До даты\" будет проигнорировано,"
+" будет использована только дата."
+
+msgctxt "help:calendar.todo.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+"Если включено, то значение времени в поле \"Дата\" будет проигнорировано, "
+"будет использована только дата."
+
+msgctxt "help:calendar.todo.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+"Если включено, то значение времени в поле \"До даты\" будет проигнорировано,"
+" будет использована только дата."
msgctxt "model:calendar.todo,name:"
msgid "Todo"
@@ -406,12 +638,10 @@ msgctxt "model:calendar.todo.rrule,name:"
msgid "Recurrence Rule"
msgstr "Правила повторения"
-#, fuzzy
msgctxt "model:ir.action,name:act_todo_form"
msgid "Todos"
msgstr "Задачи"
-#, fuzzy
msgctxt "model:ir.action,name:act_todo_form3"
msgid "Todos"
msgstr "Задачи"
@@ -452,6 +682,142 @@ msgctxt "selection:calendar.todo,status:"
msgid "Needs-Action"
msgstr "Требуется действие"
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Accepted"
+msgstr "Принято"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Declined"
+msgstr "Отклонено"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Delegated"
+msgstr "Поручено"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Needs Action"
+msgstr "Требует вмешательства"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Tentative"
+msgstr "Предварительный"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Daily"
+msgstr "Ежедневно"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Hourly"
+msgstr "Ежечасно"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Minutely"
+msgstr "Ежеминутно"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Monthly"
+msgstr "Ежемесячно"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Secondly"
+msgstr "Ежесекундно"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Weekly"
+msgstr "Еженедельно"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Yearly"
+msgstr "Ежегодно"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Friday"
+msgstr "Пятница"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Monday"
+msgstr "Понедельник"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Saturday"
+msgstr "Суббота"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Sunday"
+msgstr "Воскресенье"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Thursday"
+msgstr "Четверг"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Вторник"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Среда"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Daily"
+msgstr "Ежедневно"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Hourly"
+msgstr "Ежечасно"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Minutely"
+msgstr "Ежеминутно"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Monthly"
+msgstr "Ежемесячно"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Secondly"
+msgstr "Ежесекундно"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Weekly"
+msgstr "Еженедельно"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Yearly"
+msgstr "Ежегодно"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Friday"
+msgstr "Пятница"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Monday"
+msgstr "Понедельник"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Saturday"
+msgstr "Суббота"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Sunday"
+msgstr "Воскресенье"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Thursday"
+msgstr "Четверг"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Вторник"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Среда"
+
msgctxt "view:calendar.todo.attendee:"
msgid "Attendee"
msgstr "Участник"
diff --git a/setup.py b/setup.py
index 9036958..c64c9d6 100644
--- a/setup.py
+++ b/setup.py
@@ -25,10 +25,10 @@ requires = ['vobject >= 0.8.0', 'PyWebDAV >= 0.9.8', 'python-dateutil', 'pytz']
for dep in info.get('depends', []):
if not re.match(r'(ir|res|webdav)(\W|$)', dep):
requires.append('trytond_%s >= %s.%s, < %s.%s' %
- (dep, major_version, minor_version, major_version,
- minor_version + 1))
+ (dep, major_version, minor_version, major_version,
+ minor_version + 1))
requires.append('trytond >= %s.%s, < %s.%s' %
- (major_version, minor_version, major_version, minor_version + 1))
+ (major_version, minor_version, major_version, minor_version + 1))
setup(name='trytond_calendar_todo',
version=info.get('version', '0.0.1'),
@@ -36,16 +36,16 @@ setup(name='trytond_calendar_todo',
long_description=read('README'),
author='Tryton',
url='http://www.tryton.org/',
- download_url="http://downloads.tryton.org/" + \
- info.get('version', '0.0.1').rsplit('.', 1)[0] + '/',
+ download_url=("http://downloads.tryton.org/" +
+ info.get('version', '0.0.1').rsplit('.', 1)[0] + '/'),
package_dir={'trytond.modules.calendar_todo': '.'},
packages=[
'trytond.modules.calendar_todo',
'trytond.modules.calendar_todo.tests',
],
package_data={
- 'trytond.modules.calendar_todo': info.get('xml', []) \
- + ['tryton.cfg', 'locale/*.po'],
+ 'trytond.modules.calendar_todo': (info.get('xml', [])
+ + ['tryton.cfg', 'view/*.xml', 'locale/*.po']),
},
classifiers=[
'Development Status :: 5 - Production/Stable',
@@ -57,6 +57,7 @@ setup(name='trytond_calendar_todo',
'Intended Audience :: Manufacturing',
'License :: OSI Approved :: GNU General Public License (GPL)',
'Natural Language :: Bulgarian',
+ 'Natural Language :: Catalan',
'Natural Language :: Czech',
'Natural Language :: Dutch',
'Natural Language :: English',
diff --git a/todo.py b/todo.py
index dd97700..1a81bbc 100644
--- a/todo.py
+++ b/todo.py
@@ -12,6 +12,8 @@ from trytond.backend import TableHandler
from trytond.pyson import Eval, If, Bool
from trytond.transaction import Transaction
from trytond.pool import Pool
+from trytond.modules.calendar import AlarmMixin, DateMixin, RRuleMixin, \
+ AttendeeMixin
__all__ = ['Todo', 'TodoCategory', 'TodoRDate', 'TodoRRule', 'TodoExDate',
'TodoExRule', 'TodoAttendee', 'TodoAlarm']
@@ -117,13 +119,10 @@ class Todo(ModelSQL, ModelView):
cls._sql_constraints = [
#XXX should be unique across all componenets
('uuid_recurrence_uniq', 'UNIQUE(uuid, calendar, recurrence)',
- 'UUID and recurrence must be unique in a calendar!'),
- ]
- cls._constraints += [
- ('check_recurrence', 'invalid_recurrence'),
+ 'UUID and recurrence must be unique in a calendar.'),
]
cls._error_messages.update({
- 'invalid_recurrence': 'Recurrence can not be recurrent!',
+ 'invalid_recurrence': 'Todo "%s" can not be recurrent.',
})
@classmethod
@@ -136,7 +135,6 @@ class Todo(ModelSQL, ModelView):
models_data = ModelData.search([
('fs_id', '=', 'rule_group_read_todo_line3'),
('module', '=', module_name),
- ('inherit', '=', None),
], limit=1)
if models_data:
model_data, = models_data
@@ -191,6 +189,12 @@ class Todo(ModelSQL, ModelView):
def search_calendar_field(cls, name, clause):
return [('calendar.' + name[9:],) + tuple(clause[1:])]
+ @classmethod
+ def validate(cls, todos):
+ super(todos, cls).validate(todos)
+ for todo in todos:
+ todo.check_recurrence()
+
def check_recurrence(self):
'''
Check the recurrence is not recurrent.
@@ -202,63 +206,64 @@ class Todo(ModelSQL, ModelView):
or self.exdates
or self.exrules
or self.occurences):
- return False
- return True
+ self.raise_user_error('invalid_recurrence', (self.rec_name,))
@classmethod
- def create(cls, values):
+ def create(cls, vlist):
pool = Pool()
Calendar = pool.get('calendar.calendar')
Collection = pool.get('webdav.collection')
- todo = super(Todo, cls).create(values)
- if (todo.calendar.owner
- and (todo.organizer == todo.calendar.owner.email
- or (todo.parent
- and todo.parent.organizer == \
- todo.parent.calendar.owner.email))):
- if todo.organizer == todo.calendar.owner.email:
- attendee_emails = [x.email for x in todo.attendees
- if x.status != 'declined'
- and x.email != todo.organizer]
- else:
- attendee_emails = [x.email for x in todo.parent.attendees
- if x.status != 'declined'
- and x.email != todo.parent.organizer]
- if attendee_emails:
- with Transaction().set_user(0):
- calendars = Calendar.search([
- ('owner.email', 'in', attendee_emails),
- ])
- if not todo.recurrence:
- for calendar in calendars:
- new_todo, = cls.copy([todo], default={
- 'calendar': calendar.id,
- 'occurences': None,
- 'uuid': todo.uuid,
- })
- for occurence in todo.occurences:
- cls.copy([occurence], default={
+ todos = super(Todo, cls).create(vlist)
+ for todo in todos:
+ if (todo.calendar.owner
+ and (todo.organizer == todo.calendar.owner.email
+ or (todo.parent
+ and todo.parent.organizer
+ == todo.parent.calendar.owner.email))):
+ if todo.organizer == todo.calendar.owner.email:
+ attendee_emails = [x.email for x in todo.attendees
+ if x.status != 'declined'
+ and x.email != todo.organizer]
+ else:
+ attendee_emails = [x.email for x in todo.parent.attendees
+ if x.status != 'declined'
+ and x.email != todo.parent.organizer]
+ if attendee_emails:
+ with Transaction().set_user(0):
+ calendars = Calendar.search([
+ ('owner.email', 'in', attendee_emails),
+ ])
+ if not todo.recurrence:
+ for calendar in calendars:
+ new_todo, = cls.copy([todo], default={
'calendar': calendar.id,
- 'parent': new_todo.id,
- 'uuid': occurence.uuid,
+ 'occurences': None,
+ 'uuid': todo.uuid,
+ })
+ for occurence in todo.occurences:
+ cls.copy([occurence], default={
+ 'calendar': calendar.id,
+ 'parent': new_todo.id,
+ 'uuid': occurence.uuid,
+ })
+ else:
+ parents = cls.search([
+ ('uuid', '=', todo.uuid),
+ ('calendar.owner.email', 'in',
+ attendee_emails),
+ ('id', '!=', todo.id),
+ ('recurrence', '=', None),
+ ])
+ for parent in parents:
+ cls.copy([todo], default={
+ 'calendar': parent.calendar.id,
+ 'parent': parent.id,
+ 'uuid': todo.uuid,
})
- else:
- parents = cls.search([
- ('uuid', '=', todo.uuid),
- ('calendar.owner.email', 'in', attendee_emails),
- ('id', '!=', todo.id),
- ('recurrence', '=', None),
- ])
- for parent in parents:
- cls.copy([todo], default={
- 'calendar': parent.calendar.id,
- 'parent': parent.id,
- 'uuid': todo.uuid,
- })
# Restart the cache for todo
Collection._todo_cache.clear()
- return todo
+ return todos
def _todo2update(self):
res = {}
@@ -271,21 +276,21 @@ class Todo(ModelSQL, ModelView):
res['status'] = self.status
res['organizer'] = self.organizer
res['rdates'] = [('delete_all',)]
- for rdate in self.rdates:
- vals = rdate._date2update()
- res['rdates'].append(('create', vals))
+ to_create = [rdate._date2update() for rdate in self.rdates]
+ if to_create:
+ res['rdates'].append(('create', to_create))
res['exdates'] = [('delete_all',)]
- for exdate in self.exdates:
- vals = exdate._date2update()
- res['exdates'].append(('create', vals))
+ to_create = [exdate._date2update() for exdate in self.exdates]
+ if to_create:
+ res['exdates'].append(('create', to_create))
res['rrules'] = [('delete_all',)]
- for rrule in self.rrules:
- vals = rrule._rule2update()
- res['rrules'].append(('create', vals))
+ to_create = [rrule._rule2update() for rrule in self.rrules]
+ if to_create:
+ res['rrules'].append(('create', to_create))
res['exrules'] = [('delete_all',)]
- for exrule in self.exrules:
- vals = exrule._rule2update()
- res['exrules'].append(('create', vals))
+ to_create = [exrule._rule2update() for exrule in self.exrules]
+ if to_create:
+ res['exrules'].append(('create', to_create))
return res
@classmethod
@@ -306,15 +311,16 @@ class Todo(ModelSQL, ModelView):
for i in range(0, len(ids), cursor.IN_MAX):
sub_ids = ids[i:i + cursor.IN_MAX]
red_sql, red_ids = reduce_ids('id', sub_ids)
- cursor.execute('UPDATE "' + cls._table + '" ' \
- 'SET sequence = sequence + 1 ' \
- 'WHERE ' + red_sql, red_ids)
+ cursor.execute('UPDATE "' + cls._table + '" '
+ 'SET sequence = sequence + 1 '
+ 'WHERE ' + red_sql, red_ids)
for todo in todos:
- if todo.calendar.owner \
- and (todo.organizer == todo.calendar.owner.email \
- or (todo.parent \
- and todo.parent.organizer == todo.calendar.owner.email)):
+ if (todo.calendar.owner
+ and (todo.organizer == todo.calendar.owner.email
+ or (todo.parent
+ and todo.parent.organizer
+ == todo.calendar.owner.email))):
if todo.organizer == todo.calendar.owner.email:
attendee_emails = [x.email for x in todo.attendees
if x.status != 'declined'
@@ -378,10 +384,11 @@ class Todo(ModelSQL, ModelView):
Collection = pool.get('webdav.collection')
for todo in todos:
- if todo.calendar.owner \
- and (todo.organizer == todo.calendar.owner.email \
- or (todo.parent \
- and todo.parent.organizer == todo.calendar.owner.email)):
+ if (todo.calendar.owner
+ and (todo.organizer == todo.calendar.owner.email
+ or (todo.parent
+ and todo.parent.organizer
+ == todo.calendar.owner.email))):
if todo.organizer == todo.calendar.owner.email:
attendee_emails = [x.email for x in todo.attendees
if x.email != todo.organizer]
@@ -522,7 +529,7 @@ class Todo(ModelSQL, ModelView):
else:
if vtodo.recurrence_id.value.tzinfo:
res['recurrence'] = \
- vtodo.recurrence_id.value.astimezone(tzlocal)
+ vtodo.recurrence_id.value.astimezone(tzlocal)
else:
res['recurrence'] = vtodo.recurrence_id.value
else:
@@ -538,11 +545,14 @@ class Todo(ModelSQL, ModelView):
category_names2ids = {}
for category in categories:
category_names2ids[category.name] = category.id
+ to_create = []
for category in vtodo.categories.value:
if category not in category_names2ids:
- categories.append(Category.create({
- 'name': category,
- }))
+ to_create.append({
+ 'name': category,
+ })
+ if to_create:
+ categories += Category.create(to_create)
res['categories'] = [('set', [c.id for c in categories])]
else:
res['categories'] = [('unlink_all',)]
@@ -559,9 +569,9 @@ class Todo(ModelSQL, ModelView):
('name', '=', vtodo.location.value),
], limit=1)
if not locations:
- location, = Location.create({
- 'name': vtodo.location.value,
- })
+ location, = Location.create([{
+ 'name': vtodo.location.value,
+ }])
else:
location, = locations
res['location'] = location.id
@@ -584,6 +594,7 @@ class Todo(ModelSQL, ModelView):
attendees_todel[attendee.email] = attendee.id
res['attendees'] = []
if hasattr(vtodo, 'attendee'):
+ to_create = []
while vtodo.attendee_list:
attendee = vtodo.attendee_list.pop()
vals = Attendee.attendee2values(attendee)
@@ -592,56 +603,67 @@ class Todo(ModelSQL, ModelView):
attendees_todel[vals['email']], vals))
del attendees_todel[vals['email']]
else:
- res['attendees'].append(('create', vals))
+ to_create.append(vals)
+ if to_create:
+ res['attendees'].append(('create', to_create))
res['attendees'].append(('delete', attendees_todel.values()))
res['rdates'] = []
if todo:
res['rdates'].append(('delete', [x.id for x in todo.rdates]))
if hasattr(vtodo, 'rdate'):
+ to_create = []
while vtodo.rdate_list:
rdate = vtodo.rdate_list.pop()
- for date in rdate.value:
- vals = Rdate.date2values(date)
- res['rdates'].append(('create', vals))
+ to_create += [Rdate.date2values(date) for date in rdate.value]
+ if to_create:
+ res['rdates'].append(('create', to_create))
res['exdates'] = []
if todo:
res['exdates'].append(('delete', [x.id for x in todo.exdates]))
if hasattr(vtodo, 'exdate'):
+ to_create = []
while vtodo.exdate_list:
exdate = vtodo.exdate_list.pop()
- for date in exdate.value:
- vals = Exdate.date2values(date)
- res['exdates'].append(('create', vals))
+ to_create += [Exdate.date2values(date)
+ for date in exdate.value]
+ if to_create:
+ res['exdates'].append(('create', to_create))
res['rrules'] = []
if todo:
res['rrules'].append(('delete', [x.id for x in todo.rrules]))
if hasattr(vtodo, 'rrule'):
+ to_create = []
while vtodo.rrule_list:
rrule = vtodo.rrule_list.pop()
- vals = Rrule.rule2values(rrule)
- res['rrules'].append(('create', vals))
+ to_create.append(Rrule.rule2values(rrule))
+ if to_create:
+ res['rrules'].append(('create', to_create))
res['exrules'] = []
if todo:
res['exrules'].append(('delete', [x.id for x in todo.exrules]))
if hasattr(vtodo, 'exrule'):
+ to_create = []
while vtodo.exrule_list:
exrule = vtodo.exrule_list.pop()
- vals = Exrule.rule2values(exrule)
- res['exrules'].append(('create', vals))
+ to_create.append(Exrule.rule2values(exrule))
+ if to_create:
+ res['exrules'].append(('create', to_create))
if todo:
res.setdefault('alarms', [])
res['alarms'].append(('delete', [x.id for x in todo.alarms]))
if hasattr(vtodo, 'valarm'):
res.setdefault('alarms', [])
+ to_create = []
while vtodo.valarm_list:
valarm = vtodo.valarm_list.pop()
- vals = Alarm.valarm2values(valarm)
- res['alarms'].append(('create', vals))
+ to_create.append(Alarm.valarm2values(valarm))
+ if to_create:
+ res['alarms'].append(('create', to_create))
if hasattr(ical, 'vtimezone'):
if ical.vtimezone.tzid.value in pytz.common_timezones:
@@ -656,6 +678,7 @@ class Todo(ModelSQL, ModelView):
occurences_todel = []
if todo:
occurences_todel = [x.id for x in todo.occurences]
+ to_create = []
for vtodo in vtodos:
todo_id = None
if todo:
@@ -673,7 +696,9 @@ class Todo(ModelSQL, ModelView):
if todo_id:
res['occurences'].append(('write', todo_id, vals))
else:
- res['occurences'].append(('create', vals))
+ to_create.append(vals)
+ if to_create:
+ res['occurences'].append(('create', to_create))
if occurences_todel:
res.setdefault('occurences', [])
res['occurences'].append(('delete', occurences_todel))
@@ -723,7 +748,7 @@ class Todo(ModelSQL, ModelView):
if not hasattr(vtodo, 'completed'):
vtodo.add('completed')
vtodo.completed.value = self.completed.replace(tzinfo=tzlocal)\
- .astimezone(tzutc)
+ .astimezone(tzutc)
elif hasattr(vtodo, 'completed'):
del vtodo.completed
@@ -731,7 +756,7 @@ class Todo(ModelSQL, ModelView):
if not hasattr(vtodo, 'dtstart'):
vtodo.add('dtstart')
vtodo.dtstart.value = self.dtstart.replace(tzinfo=tzlocal)\
- .astimezone(tztodo)
+ .astimezone(tztodo)
elif hasattr(vtodo, 'dtstart'):
del vtodo.dtstart
@@ -739,7 +764,7 @@ class Todo(ModelSQL, ModelView):
if not hasattr(vtodo, 'due'):
vtodo.add('due')
vtodo.due.value = self.due.replace(tzinfo=tzlocal)\
- .astimezone(tztodo)
+ .astimezone(tztodo)
elif hasattr(vtodo, 'due'):
del vtodo.due
@@ -759,7 +784,7 @@ class Todo(ModelSQL, ModelView):
if not hasattr(vtodo, 'recurrence-id'):
vtodo.add('recurrence-id')
vtodo.recurrence_id.value = self.recurrence\
- .replace(tzinfo=tzlocal).astimezone(tztodo)
+ .replace(tzinfo=tzlocal).astimezone(tztodo)
elif hasattr(vtodo, 'recurrence-id'):
del vtodo.recurrence_id
if self.status:
@@ -845,13 +870,10 @@ class TodoCategory(ModelSQL):
ondelete='CASCADE', required=True, select=True)
-class TodoRDate(ModelSQL, ModelView):
+class TodoRDate(DateMixin, ModelSQL, ModelView):
'Todo Recurrence Date'
__name__ = 'calendar.todo.rdate'
- _inherits = {'calendar.date': 'calendar_date'}
_rec_name = 'datetime'
- calendar_date = fields.Many2One('calendar.date', 'Calendar Date',
- required=True, ondelete='CASCADE', select=True)
todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
select=True, required=True)
@@ -866,13 +888,30 @@ class TodoRDate(ModelSQL, ModelView):
super(TodoRDate, cls).__register__(module_name)
+ table = TableHandler(cursor, cls, module_name)
+
+ # Migration from 2.6: Remove inherits calendar.date
+ if table.column_exist('calendar_date'):
+ cursor.execute('UPDATE "' + cls._table + '" AS e '
+ 'SET date = (SELECT a.date '
+ 'FROM calendar_date AS a '
+ 'WHERE a.id = e.calendar_date), '
+ 'datetime = (SELECT a.datetime '
+ 'FROM calendar_date AS a '
+ 'WHERE a.id = e.calendar_date)')
+ table.drop_column('calendar_date', True)
+
@classmethod
- def create(cls, values):
+ def create(cls, vlist):
Todo = Pool().get('calendar.todo')
- if values.get('todo'):
- # Update write_date of todo
- Todo.write([Todo(values['todo'])], {})
- return super(TodoRDate, cls).create(values)
+ towrite = []
+ for values in vlist:
+ if values.get('todo'):
+ # Update write_date of todo
+ towrite.append(values['todo'])
+ if towrite:
+ Todo.write(Todo.browse(towrite), {})
+ return super(TodoRDate, cls).create(vlist)
@classmethod
def write(cls, rdates, values):
@@ -889,47 +928,50 @@ class TodoRDate(ModelSQL, ModelView):
def delete(cls, todo_rdates):
pool = Pool()
Todo = pool.get('calendar.todo')
- Rdate = pool.get('calendar.date')
- rdates = [a.calendar_date for a in todo_rdates]
todos = [x.todo for x in todo_rdates]
if todos:
# Update write_date of todo
Todo.write(todos, {})
super(TodoRDate, cls).delete(todo_rdates)
- if rdates:
- Rdate.delete(rdates)
- def _date2update(self):
- return self.calendar_date._date2update()
-
- @classmethod
- def date2values(cls, date):
- Date = Pool().get('calendar.date')
- return Date.date2values(date.calendar_date)
-
- @classmethod
- def date2date(cls, date):
- Date = Pool().get('calendar.date')
- return Date.date2date(date.calendar_date)
-
-class TodoRRule(ModelSQL, ModelView):
+class TodoRRule(RRuleMixin, ModelSQL, ModelView):
'Recurrence Rule'
__name__ = 'calendar.todo.rrule'
- _inherits = {'calendar.rrule': 'calendar_rrule'}
_rec_name = 'freq'
- calendar_rrule = fields.Many2One('calendar.rrule', 'Calendar RRule',
- required=True, ondelete='CASCADE', select=True)
todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
select=True, required=True)
@classmethod
- def create(cls, values):
+ def __register__(cls, module_name):
+ cursor = Transaction().cursor
+
+ super(TodoRRule, cls).__register__(module_name)
+
+ table = TableHandler(cursor, cls, module_name)
+
+ # Migration from 2.6: Remove inherits calendar.rrule
+ if table.column_exist('calendar_rrule'):
+ for field in (f for f in dir(RRuleMixin)
+ if isinstance(f, fields.Field)):
+ cursor.execute(('UPDATE "' + cls._table + '" AS e '
+ 'SET "%(field)s" = (SELECT a."%(field)s" '
+ 'FROM calendar_rrule AS r '
+ 'WHERE r.id = e.calendar_rrule)')
+ % {'field': field})
+ table.drop_column('calendar_rrule', True)
+
+ @classmethod
+ def create(cls, vlist):
Todo = Pool().get('calendar.todo')
- if values.get('todo'):
- # Update write_date of todo
- Todo.write([Todo(values['todo'])], {})
- return super(TodoRRule, cls).create(values)
+ towrite = []
+ for values in vlist:
+ if values.get('todo'):
+ # Update write_date of todo
+ towrite.append(values['todo'])
+ if towrite:
+ Todo.write(Todo.browse(towrite), {})
+ return super(TodoRRule, cls).create(vlist)
@classmethod
def write(cls, todo_rrules, values):
@@ -946,28 +988,11 @@ class TodoRRule(ModelSQL, ModelView):
def delete(cls, todo_rrules):
pool = Pool()
Todo = pool.get('calendar.todo')
- Rrule = pool.get('calendar.rrule')
- rrules = [a.calendar_rrule for a in todo_rrules]
todos = [x.todo for x in todo_rrules]
if todos:
# Update write_date of todo
Todo.write(todos, {})
super(TodoRRule, cls).delete(todo_rrules)
- if rrules:
- Rrule.delete(rrules)
-
- def _rule2update(self):
- return self.calendar_rrule._rule2update()
-
- @classmethod
- def rule2values(cls, rule):
- Rule = Pool().get('calendar.rrule')
- return Rule.rule2values(rule.calendar_rrule)
-
- @classmethod
- def rule2rule(cls, rule):
- Rule = Pool().get('calendar.rrule')
- return Rule.rule2rule(rule.calendar_rrule)
class TodoExDate(TodoRDate):
@@ -982,48 +1007,69 @@ class TodoExRule(TodoRRule):
_table = 'calendar_todo_exrule' # Needed to override TodoRRule._table
-class TodoAttendee(ModelSQL, ModelView):
+class TodoAttendee(AttendeeMixin, ModelSQL, ModelView):
'Attendee'
__name__ = 'calendar.todo.attendee'
- _inherits = {'calendar.attendee': 'calendar_attendee'}
- calendar_attendee = fields.Many2One('calendar.attendee',
- 'Calendar Attendee', required=True, ondelete='CASCADE', select=True)
todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
required=True, select=True)
@classmethod
- def create(cls, values):
+ def __register__(cls, module_name):
+ cursor = Transaction().cursor
+
+ super(TodoAttendee, cls).__register__(module_name)
+
+ table = TableHandler(cursor, cls, module_name)
+
+ # Migration from 2.6: Remove inherits calendar.attendee
+ if table.column_exist('calendar_attendee'):
+ cursor.execute('UPDATE "' + cls._table + '" AS e '
+ 'SET email = (SELECT a.email '
+ 'FROM calendar_attendee AS a '
+ 'WHERE a.id = e.calendar_attendee), '
+ 'status = (SELECT a.status '
+ 'FROM calendar_attendee AS a '
+ 'WHERE a.id = e.calendar_attendee)')
+ table.drop_column('calendar_attendee', True)
+
+ @classmethod
+ def create(cls, vlist):
Todo = Pool().get('calendar.todo')
- if values.get('todo'):
- # Update write_date of todo
- Todo.write([Todo(values['todo'])], {})
- attendee = super(TodoAttendee, cls).create(values)
- todo = attendee.todo
- if (todo.calendar.owner
- and (todo.organizer == todo.calendar.owner.email
- or (todo.parent
- and todo.parent.organizer == \
- todo.parent.calendar.owner.email))):
- if todo.organizer == todo.calendar.owner.email:
- attendee_emails = [x.email for x in todo.attendees
- if x.email != todo.organizer]
- else:
- attendee_emails = [x.email for x in todo.parent.attendees
- if x.email != todo.parent.organizer]
- if attendee_emails:
- with Transaction().set_user(0):
- todos = Todo.search([
- ('uuid', '=', todo.uuid),
- ('calendar.owner.email', 'in', attendee_emails),
- ('id', '!=', todo.id),
- ('recurrence', '=', todo.recurrence),
- ])
- for todo in todos:
- cls.copy([attendee], default={
- 'todo': todo.id,
- })
- return attendee
+ towrite = []
+ for values in vlist:
+ if values.get('todo'):
+ # Update write_date of todo
+ towrite.append(values['todo'])
+ if towrite:
+ Todo.write(Todo.browse(towrite), {})
+ attendees = super(TodoAttendee, cls).create(vlist)
+ for attendee in attendees:
+ todo = attendee.todo
+ if (todo.calendar.owner
+ and (todo.organizer == todo.calendar.owner.email
+ or (todo.parent
+ and todo.parent.organizer
+ == todo.parent.calendar.owner.email))):
+ if todo.organizer == todo.calendar.owner.email:
+ attendee_emails = [x.email for x in todo.attendees
+ if x.email != todo.organizer]
+ else:
+ attendee_emails = [x.email for x in todo.parent.attendees
+ if x.email != todo.parent.organizer]
+ if attendee_emails:
+ with Transaction().set_user(0):
+ todos = Todo.search([
+ ('uuid', '=', todo.uuid),
+ ('calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', todo.id),
+ ('recurrence', '=', todo.recurrence),
+ ])
+ for todo in todos:
+ cls.copy([attendee], default={
+ 'todo': todo.id,
+ })
+ return attendees
@classmethod
def write(cls, attendees, values):
@@ -1043,10 +1089,11 @@ class TodoAttendee(ModelSQL, ModelView):
super(TodoAttendee, cls).write(attendees, values)
for attendee in attendees:
todo = attendee.todo
- if todo.calendar.owner \
- and (todo.organizer == todo.calendar.owner.email \
- or (todo.parent \
- and todo.parent.organizer == todo.calendar.owner.email)):
+ if (todo.calendar.owner
+ and (todo.organizer == todo.calendar.owner.email
+ or (todo.parent
+ and todo.parent.organizer
+ == todo.calendar.owner.email))):
if todo.organizer == todo.calendar.owner.email:
attendee_emails = [x.email for x in todo.attendees
if x.email != todo.organizer]
@@ -1056,22 +1103,20 @@ class TodoAttendee(ModelSQL, ModelView):
if attendee_emails:
with Transaction().set_user(0):
attendees2 = cls.search([
- ('todo.uuid', '=', todo.uuid),
- ('todo.calendar.owner.email', 'in',
+ ('todo.uuid', '=', todo.uuid),
+ ('todo.calendar.owner.email', 'in',
attendee_emails),
- ('id', '!=', attendee.id),
- ('todo.recurrence', '=', todo.recurrence),
- ('email', '=', attendee.email),
- ])
+ ('id', '!=', attendee.id),
+ ('todo.recurrence', '=', todo.recurrence),
+ ('email', '=', attendee.email),
+ ])
cls.write(attendees2, attendee._attendee2update())
@classmethod
def delete(cls, todo_attendees):
pool = Pool()
Todo = pool.get('calendar.todo')
- Attendee = pool.get('calendar.attendee')
- calendar_attendees = [a.calendar_attendee for a in todo_attendees]
todos = [x.todo for x in todo_attendees]
if todos:
# Update write_date of todo
@@ -1079,10 +1124,11 @@ class TodoAttendee(ModelSQL, ModelView):
for attendee in todo_attendees:
todo = attendee.todo
- if todo.calendar.owner \
- and (todo.organizer == todo.calendar.owner.email \
- or (todo.parent \
- and todo.parent.organizer == todo.calendar.owner.email)):
+ if (todo.calendar.owner
+ and (todo.organizer == todo.calendar.owner.email
+ or (todo.parent
+ and todo.parent.organizer
+ == todo.calendar.owner.email))):
if todo.organizer == todo.calendar.owner.email:
attendee_emails = [x.email for x in todo.attendees
if x.email != todo.organizer]
@@ -1100,10 +1146,10 @@ class TodoAttendee(ModelSQL, ModelView):
('email', '=', attendee.email),
])
cls.delete(attendees)
- elif todo.calendar.organizer \
- and ((todo.organizer \
- or (todo.parent and todo.parent.organizer)) \
- and attendee.email == todo.calendar.owner.email):
+ elif (todo.calendar.organizer
+ and ((todo.organizer
+ or (todo.parent and todo.parent.organizer))
+ and attendee.email == todo.calendar.owner.email)):
if todo.organizer:
organizer = todo.organizer
else:
@@ -1121,55 +1167,41 @@ class TodoAttendee(ModelSQL, ModelView):
'status': 'declined',
})
super(TodoAttendee, cls).delete(todo_attendees)
- if calendar_attendees:
- Attendee.delete(calendar_attendees)
-
- @classmethod
- def copy(cls, todo_attendees, default=None):
- Attendee = Pool().get('calendar.attendee')
- if default is None:
- default = {}
- default = default.copy()
- new_attendees = []
- for attendee in todo_attendees:
- default['calendar_attendee'], = Attendee.copy(
- [attendee.calendar_attendee])
- new_attendee, = super(TodoAttendee, cls).copy([attendee],
- default=default)
- new_attendees.append(new_attendee)
- return new_attendees
- def _attendee2update(self):
- return self.calendar_attendee._attendee2update()
+class TodoAlarm(AlarmMixin, ModelSQL, ModelView):
+ 'Alarm'
+ __name__ = 'calendar.todo.alarm'
+ todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
+ required=True, select=True)
@classmethod
- def attendee2values(cls, attendee):
- Attendee = Pool().get('calendar.attendee')
- return Attendee.attendee2values(attendee.calendar_attendee)
+ def __register__(cls, module_name):
+ cursor = Transaction().cursor
- @classmethod
- def attendee2attendee(cls, attendee):
- Attendee = Pool().get('calendar.attendee')
- return Attendee.attendee2attendee(attendee.calendar_attendee)
+ super(TodoAlarm, cls).__register__(module_name)
+ table = TableHandler(cursor, cls, module_name)
-class TodoAlarm(ModelSQL):
- 'Alarm'
- __name__ = 'calendar.todo.alarm'
- _inherits = {'calendar.alarm': 'calendar_alarm'}
- calendar_alarm = fields.Many2One('calendar.alarm', 'Calendar Alarm',
- required=True, ondelete='CASCADE', select=True)
- todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
- required=True, select=True)
+ # Migration from 2.6: Remove inherits calendar.alarm
+ if table.column_exist('calendar_alarm'):
+ cursor.execute('UPDATE "' + cls._table + '" AS t '
+ 'SET valarm = (SELECT a.valarm '
+ 'FROM calendar_alarm AS a '
+ 'WHERE a.id = t.calendar_alarm)')
+ table.drop_column('calendar_alarm', True)
@classmethod
- def create(cls, values):
+ def create(cls, vlist):
Todo = Pool().get('calendar.todo')
- if values.get('todo'):
- # Update write_date of todo
- Todo.write([Todo(values['todo'])], {})
- return super(TodoAlarm, cls).create(values)
+ towrite = []
+ for values in vlist:
+ if values.get('todo'):
+ # Update write_date of todo
+ towrite.append(values['todo'])
+ if towrite:
+ Todo.write(Todo.browse(towrite), {})
+ return super(TodoAlarm, cls).create(vlist)
@classmethod
def write(cls, alarms, values):
@@ -1186,21 +1218,8 @@ class TodoAlarm(ModelSQL):
def delete(cls, todo_alarms):
pool = Pool()
Todo = pool.get('calendar.todo')
- Alarm = pool.get('calendar.alarm')
- alarms = [a.calendar_alarm for a in todo_alarms]
todos = [x.todo for x in todo_alarms]
if todos:
# Update write_date of todo
Todo.write(todos, {})
super(TodoAlarm, cls).delete(todo_alarms)
- if alarms:
- Alarm.delete(alarms)
-
- @classmethod
- def valarm2values(cls, alarm):
- Alarm = Pool().get('calendar.alarm')
- return Alarm.valarm2values(alarm.calendar_alarm)
-
- def alarm2valarm(self, alarm):
- Alarm = Pool().get('calendar.alarm')
- return Alarm.alarm2valarm(alarm.calendar_alarm)
diff --git a/todo.xml b/todo.xml
index d8d7e92..23e37d0 100644
--- a/todo.xml
+++ b/todo.xml
@@ -8,90 +8,20 @@ this repository contains the full copyright notices and license terms. -->
<field name="model">calendar.todo</field>
<field name="type">tree</field>
<field name="priority" eval="10"/>
- <field name="arch" type="xml">
- <![CDATA[
- <tree string="Todos">
- <field name="calendar"/>
- <field name="summary"/>
- <field name="dtstart"/>
- <field name="due"/>
- <field name="status"/>
- <field name="percent_complete"/>
- </tree>
- ]]>
- </field>
+ <field name="name">todo_tree</field>
</record>
<record model="ir.ui.view" id="todo_view_tree_occurence">
<field name="model">calendar.todo</field>
<field name="type">tree</field>
<field name="priority" eval="20"/>
- <field name="arch" type="xml">
- <![CDATA[
- <tree string="Todos">
- <field name="summary"/>
- <field name="recurrence"/>
- <field name="dtstart"/>
- <field name="due"/>
- <field name="status"/>
- <field name="percent_complete"/>
- </tree>
- ]]>
- </field>
+ <field name="name">todo_tree_occurence</field>
</record>
<record model="ir.ui.view" id="todo_view_form">
<field name="model">calendar.todo</field>
<field name="type">form</field>
- <field name="arch" type="xml">
- <![CDATA[
- <form string="Todo">
- <label name="summary"/>
- <field name="summary"/>
- <label name="recurrence"/>
- <field name="recurrence"/>
- <notebook colspan="4">
- <page string="General" id="general">
- <label name="location"/>
- <field name="location"/>
- <label name="status"/>
- <field name="status"/>
- <label name="classification"/>
- <field name="classification"/>
- <label name="calendar"/>
- <field name="calendar"/>
- <label name="dtstart"/>
- <field name="dtstart"/>
- <label name="due"/>
- <field name="due"/>
- <label name="percent_complete"/>
- <field name="percent_complete"/>
- <label name="completed"/>
- <field name="completed"/>
- <separator name="description" colspan="4"/>
- <field name="description" colspan="4"/>
- </page>
- <page string="Categories" id="categories">
- <field name="categories" colspan="4"/>
- </page>
- <page string="Attendees" id="attendees">
- <label name="organizer"/>
- <field name="organizer"/>
- <field name="attendees" colspan="4"/>
- </page>
- <page string="Occurences" id="occurences"
- states="{'invisible': Bool(Eval('_parent_parent'))}">
- <field name="rrules" colspan="2"/>
- <field name="rdates" colspan="2"/>
- <field name="exrules" colspan="2"/>
- <field name="exdates" colspan="2"/>
- <field name="occurences" colspan="4"
- view_ids="calendar_todo.todo_view_tree_occurence"/>
- </page>
- </notebook>
- </form>
- ]]>
- </field>
+ <field name="name">todo_form</field>
</record>
<record model="ir.action.act_window" id="act_todo_form">
@@ -144,15 +74,11 @@ this repository contains the full copyright notices and license terms. -->
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.rule" id="rule_group_read_todo_line1">
- <field name="field" search="[('name', '=', 'calendar_owner'), ('model.model', '=', 'calendar.todo')]"/>
- <field name="operator">=</field>
- <field name="operand">User</field>
+ <field name="domain">[('calendar_owner', '=', user.id)]</field>
<field name="rule_group" ref="rule_group_read_todo"/>
</record>
<record model="ir.rule" id="rule_group_read_todo_line2">
- <field name="field" search="[('name', '=', 'calendar_read_users'), ('model.model', '=', 'calendar.todo')]"/>
- <field name="operator">=</field>
- <field name="operand">User</field>
+ <field name="domain">[('calendar_read_users', '=', user.id)]</field>
<field name="rule_group" ref="rule_group_read_todo"/>
</record>
@@ -166,221 +92,72 @@ this repository contains the full copyright notices and license terms. -->
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.rule" id="rule_group_write_todo_line1">
- <field name="field" search="[('name', '=', 'calendar_owner'), ('model.model', '=', 'calendar.todo')]"/>
- <field name="operator">=</field>
- <field name="operand">User</field>
+ <field name="domain">[('calendar_owner', '=', user.id)]</field>
<field name="rule_group" ref="rule_group_write_todo"/>
</record>
<record model="ir.rule" id="rule_group_write_todo_line2">
- <field name="field" search="[('name', '=', 'calendar_write_users'), ('model.model', '=', 'calendar.todo')]"/>
- <field name="operator">=</field>
- <field name="operand">User</field>
+ <field name="domain">[('calendar_write_users', '=', user.id)]</field>
<field name="rule_group" ref="rule_group_write_todo"/>
</record>
<record model="ir.ui.view" id="attendee_view_tree">
<field name="model">calendar.todo.attendee</field>
<field name="type">tree</field>
- <field name="arch" type="xml">
- <![CDATA[
- <tree string="Attendees">
- <field name="todo"/>
- <field name="email"/>
- <field name="status"/>
- </tree>
- ]]>
- </field>
+ <field name="name">attendee_tree</field>
</record>
<record model="ir.ui.view" id="attendee_view_form">
<field name="model">calendar.todo.attendee</field>
<field name="type">form</field>
- <field name="arch" type="xml">
- <![CDATA[
- <form string="Attendee">
- <label name="todo"/>
- <field name="todo" colspan="3"/>
- <label name="email"/>
- <field name="email"/>
- <label name="status"/>
- <field name="status"/>
- </form>
- ]]>
- </field>
+ <field name="name">attendee_form</field>
</record>
<record model="ir.ui.view" id="rdate_view_tree">
<field name="model">calendar.todo.rdate</field>
<field name="type">tree</field>
- <field name="arch" type="xml">
- <![CDATA[
- <tree string="Recurrence Dates">
- <field name="todo"/>
- <field name="datetime"/>
- <field name="date"/>
- </tree>
- ]]>
- </field>
+ <field name="name">rdate_tree</field>
</record>
<record model="ir.ui.view" id="rdate_view_form">
<field name="model">calendar.todo.rdate</field>
<field name="type">form</field>
- <field name="arch" type="xml">
- <![CDATA[
- <form string="Recurrence Date">
- <label name="todo"/>
- <field name="todo" colspan="3"/>
- <label name="datetime"/>
- <field name="datetime"/>
- <label name="date"/>
- <field name="date"/>
- </form>
- ]]>
- </field>
+ <field name="name">rdate_form</field>
</record>
<record model="ir.ui.view" id="exdate_view_tree">
<field name="model">calendar.todo.exdate</field>
<field name="type">tree</field>
- <field name="arch" type="xml">
- <![CDATA[
- <tree string="Exception Dates">
- <field name="todo"/>
- <field name="datetime"/>
- <field name="date"/>
- </tree>
- ]]>
- </field>
+ <field name="name">exdate_tree</field>
</record>
<record model="ir.ui.view" id="exdate_view_form">
<field name="model">calendar.todo.exdate</field>
<field name="type">form</field>
- <field name="arch" type="xml">
- <![CDATA[
- <form string="Exception Date">
- <label name="todo"/>
- <field name="todo" colspan="3"/>
- <label name="datetime"/>
- <field name="datetime"/>
- <label name="date"/>
- <field name="date"/>
- </form>
- ]]>
- </field>
+ <field name="name">exdate_form</field>
</record>
<record model="ir.ui.view" id="rrule_view_tree">
<field name="model">calendar.todo.rrule</field>
<field name="type">tree</field>
- <field name="arch" type="xml">
- <![CDATA[
- <tree string="Recurrence Rules">
- <field name="todo"/>
- <field name="freq"/>
- </tree>
- ]]>
- </field>
+ <field name="name">rrule_tree</field>
</record>
<record model="ir.ui.view" id="rrule_view_form">
<field name="model">calendar.todo.rrule</field>
<field name="type">form</field>
- <field name="arch" type="xml">
- <![CDATA[
- <form string="Recurrence Rule">
- <label name="todo"/>
- <field name="todo" colspan="3"/>
- <label name="freq"/>
- <field name="freq" colspan="3"/>
- <label name="until"/>
- <field name="until"/>
- <label name="until_date"/>
- <field name="until_date"/>
- <label name="count"/>
- <field name="count" colspan="3"/>
- <label name="interval"/>
- <field name="interval" colspan="3"/>
- <label name="bysecond"/>
- <field name="bysecond" colspan="3"/>
- <label name="byminute"/>
- <field name="byminute" colspan="3"/>
- <label name="byhour"/>
- <field name="byhour" colspan="3"/>
- <label name="byday"/>
- <field name="byday" colspan="3"/>
- <label name="bymonthday"/>
- <field name="bymonthday" colspan="3"/>
- <label name="byyearday"/>
- <field name="byyearday" colspan="3"/>
- <label name="byweekno"/>
- <field name="byweekno" colspan="3"/>
- <label name="bymonth"/>
- <field name="bymonth" colspan="3"/>
- <label name="bysetpos"/>
- <field name="bysetpos" colspan="3"/>
- <label name="wkst"/>
- <field name="wkst" colspan="3"/>
- </form>
- ]]>
- </field>
+ <field name="name">rrule_form</field>
</record>
<record model="ir.ui.view" id="exrule_view_tree">
<field name="model">calendar.todo.exrule</field>
<field name="type">tree</field>
- <field name="arch" type="xml">
- <![CDATA[
- <tree string="Exception Rules">
- <field name="todo"/>
- <field name="freq"/>
- </tree>
- ]]>
- </field>
+ <field name="name">exrule_tree</field>
</record>
<record model="ir.ui.view" id="exrule_view_form">
<field name="model">calendar.todo.exrule</field>
<field name="type">form</field>
- <field name="arch" type="xml">
- <![CDATA[
- <form string="Exception Rule">
- <label name="todo"/>
- <field name="todo" colspan="3"/>
- <label name="freq"/>
- <field name="freq" colspan="3"/>
- <label name="until"/>
- <field name="until"/>
- <label name="until_date"/>
- <field name="until_date"/>
- <label name="count"/>
- <field name="count" colspan="3"/>
- <label name="interval"/>
- <field name="interval" colspan="3"/>
- <label name="bysecond"/>
- <field name="bysecond" colspan="3"/>
- <label name="byminute"/>
- <field name="byminute" colspan="3"/>
- <label name="byhour"/>
- <field name="byhour" colspan="3"/>
- <label name="byday"/>
- <field name="byday" colspan="3"/>
- <label name="bymonthday"/>
- <field name="bymonthday" colspan="3"/>
- <label name="byyearday"/>
- <field name="byyearday" colspan="3"/>
- <label name="byweekno"/>
- <field name="byweekno" colspan="3"/>
- <label name="bymonth"/>
- <field name="bymonth" colspan="3"/>
- <label name="bysetpos"/>
- <field name="bysetpos" colspan="3"/>
- <label name="wkst"/>
- <field name="wkst" colspan="3"/>
- </form>
- ]]>
- </field>
+ <field name="name">exrule_form</field>
</record>
</data>
diff --git a/tryton.cfg b/tryton.cfg
index b904159..aae9557 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
[tryton]
-version=2.6.1
+version=2.8.0
depends:
calendar
ir
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index 3cdcac3..fa2a896 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.1
Name: trytond-calendar-todo
-Version: 2.6.1
+Version: 2.8.0
Summary: Tryton module to add TODO on CalDAV
Home-page: http://www.tryton.org/
Author: Tryton
Author-email: UNKNOWN
License: GPL-3
-Download-URL: http://downloads.tryton.org/2.6/
+Download-URL: http://downloads.tryton.org/2.8/
Description: trytond_calendar_todo
=====================
@@ -54,6 +54,7 @@ Classifier: Intended Audience :: Legal Industry
Classifier: Intended Audience :: Manufacturing
Classifier: License :: OSI Approved :: GNU General Public License (GPL)
Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Catalan
Classifier: Natural Language :: Czech
Classifier: Natural Language :: Dutch
Classifier: Natural Language :: English
diff --git a/trytond_calendar_todo.egg-info/SOURCES.txt b/trytond_calendar_todo.egg-info/SOURCES.txt
index a150cbb..35807aa 100644
--- a/trytond_calendar_todo.egg-info/SOURCES.txt
+++ b/trytond_calendar_todo.egg-info/SOURCES.txt
@@ -29,4 +29,17 @@ trytond_calendar_todo.egg-info/dependency_links.txt
trytond_calendar_todo.egg-info/entry_points.txt
trytond_calendar_todo.egg-info/not-zip-safe
trytond_calendar_todo.egg-info/requires.txt
-trytond_calendar_todo.egg-info/top_level.txt
\ No newline at end of file
+trytond_calendar_todo.egg-info/top_level.txt
+view/attendee_form.xml
+view/attendee_tree.xml
+view/exdate_form.xml
+view/exdate_tree.xml
+view/exrule_form.xml
+view/exrule_tree.xml
+view/rdate_form.xml
+view/rdate_tree.xml
+view/rrule_form.xml
+view/rrule_tree.xml
+view/todo_form.xml
+view/todo_tree.xml
+view/todo_tree_occurence.xml
\ No newline at end of file
diff --git a/trytond_calendar_todo.egg-info/requires.txt b/trytond_calendar_todo.egg-info/requires.txt
index 466ce88..d08f9d2 100644
--- a/trytond_calendar_todo.egg-info/requires.txt
+++ b/trytond_calendar_todo.egg-info/requires.txt
@@ -2,5 +2,5 @@ vobject >= 0.8.0
PyWebDAV >= 0.9.8
python-dateutil
pytz
-trytond_calendar >= 2.6, < 2.7
-trytond >= 2.6, < 2.7
\ No newline at end of file
+trytond_calendar >= 2.8, < 2.9
+trytond >= 2.8, < 2.9
\ No newline at end of file
diff --git a/view/attendee_form.xml b/view/attendee_form.xml
new file mode 100644
index 0000000..20ce42d
--- /dev/null
+++ b/view/attendee_form.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form string="Attendee">
+ <label name="todo"/>
+ <field name="todo" colspan="3"/>
+ <label name="email"/>
+ <field name="email"/>
+ <label name="status"/>
+ <field name="status"/>
+</form>
diff --git a/view/attendee_tree.xml b/view/attendee_tree.xml
new file mode 100644
index 0000000..457870a
--- /dev/null
+++ b/view/attendee_tree.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Attendees">
+ <field name="todo"/>
+ <field name="email"/>
+ <field name="status"/>
+</tree>
diff --git a/view/exdate_form.xml b/view/exdate_form.xml
new file mode 100644
index 0000000..853ec7b
--- /dev/null
+++ b/view/exdate_form.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form string="Exception Date">
+ <label name="todo"/>
+ <field name="todo" colspan="3"/>
+ <label name="datetime"/>
+ <field name="datetime"/>
+ <label name="date"/>
+ <field name="date"/>
+</form>
diff --git a/view/exdate_tree.xml b/view/exdate_tree.xml
new file mode 100644
index 0000000..ca5a2fe
--- /dev/null
+++ b/view/exdate_tree.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Exception Dates">
+ <field name="todo"/>
+ <field name="datetime"/>
+ <field name="date"/>
+</tree>
diff --git a/view/exrule_form.xml b/view/exrule_form.xml
new file mode 100644
index 0000000..4fdb681
--- /dev/null
+++ b/view/exrule_form.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form string="Exception Rule">
+ <label name="todo"/>
+ <field name="todo" colspan="3"/>
+ <label name="freq"/>
+ <field name="freq" colspan="3"/>
+ <label name="until"/>
+ <field name="until"/>
+ <label name="until_date"/>
+ <field name="until_date"/>
+ <label name="count"/>
+ <field name="count" colspan="3"/>
+ <label name="interval"/>
+ <field name="interval" colspan="3"/>
+ <label name="bysecond"/>
+ <field name="bysecond" colspan="3"/>
+ <label name="byminute"/>
+ <field name="byminute" colspan="3"/>
+ <label name="byhour"/>
+ <field name="byhour" colspan="3"/>
+ <label name="byday"/>
+ <field name="byday" colspan="3"/>
+ <label name="bymonthday"/>
+ <field name="bymonthday" colspan="3"/>
+ <label name="byyearday"/>
+ <field name="byyearday" colspan="3"/>
+ <label name="byweekno"/>
+ <field name="byweekno" colspan="3"/>
+ <label name="bymonth"/>
+ <field name="bymonth" colspan="3"/>
+ <label name="bysetpos"/>
+ <field name="bysetpos" colspan="3"/>
+ <label name="wkst"/>
+ <field name="wkst" colspan="3"/>
+</form>
diff --git a/view/exrule_tree.xml b/view/exrule_tree.xml
new file mode 100644
index 0000000..39009f5
--- /dev/null
+++ b/view/exrule_tree.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Exception Rules">
+ <field name="todo"/>
+ <field name="freq"/>
+</tree>
diff --git a/view/rdate_form.xml b/view/rdate_form.xml
new file mode 100644
index 0000000..9f4c7e6
--- /dev/null
+++ b/view/rdate_form.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form string="Recurrence Date">
+ <label name="todo"/>
+ <field name="todo" colspan="3"/>
+ <label name="datetime"/>
+ <field name="datetime"/>
+ <label name="date"/>
+ <field name="date"/>
+</form>
diff --git a/view/rdate_tree.xml b/view/rdate_tree.xml
new file mode 100644
index 0000000..1f13877
--- /dev/null
+++ b/view/rdate_tree.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Recurrence Dates">
+ <field name="todo"/>
+ <field name="datetime"/>
+ <field name="date"/>
+</tree>
diff --git a/view/rrule_form.xml b/view/rrule_form.xml
new file mode 100644
index 0000000..1330bae
--- /dev/null
+++ b/view/rrule_form.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form string="Recurrence Rule">
+ <label name="todo"/>
+ <field name="todo" colspan="3"/>
+ <label name="freq"/>
+ <field name="freq" colspan="3"/>
+ <label name="until"/>
+ <field name="until"/>
+ <label name="until_date"/>
+ <field name="until_date"/>
+ <label name="count"/>
+ <field name="count" colspan="3"/>
+ <label name="interval"/>
+ <field name="interval" colspan="3"/>
+ <label name="bysecond"/>
+ <field name="bysecond" colspan="3"/>
+ <label name="byminute"/>
+ <field name="byminute" colspan="3"/>
+ <label name="byhour"/>
+ <field name="byhour" colspan="3"/>
+ <label name="byday"/>
+ <field name="byday" colspan="3"/>
+ <label name="bymonthday"/>
+ <field name="bymonthday" colspan="3"/>
+ <label name="byyearday"/>
+ <field name="byyearday" colspan="3"/>
+ <label name="byweekno"/>
+ <field name="byweekno" colspan="3"/>
+ <label name="bymonth"/>
+ <field name="bymonth" colspan="3"/>
+ <label name="bysetpos"/>
+ <field name="bysetpos" colspan="3"/>
+ <label name="wkst"/>
+ <field name="wkst" colspan="3"/>
+</form>
diff --git a/view/rrule_tree.xml b/view/rrule_tree.xml
new file mode 100644
index 0000000..5f3e92d
--- /dev/null
+++ b/view/rrule_tree.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Recurrence Rules">
+ <field name="todo"/>
+ <field name="freq"/>
+</tree>
diff --git a/view/todo_form.xml b/view/todo_form.xml
new file mode 100644
index 0000000..63ce6dd
--- /dev/null
+++ b/view/todo_form.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form string="Todo">
+ <label name="summary"/>
+ <field name="summary"/>
+ <label name="recurrence"/>
+ <field name="recurrence"/>
+ <notebook colspan="4">
+ <page string="General" id="general">
+ <label name="location"/>
+ <field name="location"/>
+ <label name="status"/>
+ <field name="status"/>
+ <label name="classification"/>
+ <field name="classification"/>
+ <label name="calendar"/>
+ <field name="calendar"/>
+ <label name="dtstart"/>
+ <field name="dtstart"/>
+ <label name="due"/>
+ <field name="due"/>
+ <label name="percent_complete"/>
+ <field name="percent_complete"/>
+ <label name="completed"/>
+ <field name="completed"/>
+ <separator name="description" colspan="4"/>
+ <field name="description" colspan="4"/>
+ </page>
+ <page string="Categories" id="categories">
+ <field name="categories" colspan="4"/>
+ </page>
+ <page string="Attendees" id="attendees">
+ <label name="organizer"/>
+ <field name="organizer"/>
+ <field name="attendees" colspan="4"/>
+ </page>
+ <page string="Occurences" id="occurences"
+ states="{'invisible': Bool(Eval('_parent_parent'))}">
+ <field name="rrules" colspan="2"/>
+ <field name="rdates" colspan="2"/>
+ <field name="exrules" colspan="2"/>
+ <field name="exdates" colspan="2"/>
+ <field name="occurences" colspan="4"
+ view_ids="calendar_todo.todo_view_tree_occurence"/>
+ </page>
+ </notebook>
+</form>
diff --git a/view/todo_tree.xml b/view/todo_tree.xml
new file mode 100644
index 0000000..841d6bf
--- /dev/null
+++ b/view/todo_tree.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Todos">
+ <field name="calendar"/>
+ <field name="summary"/>
+ <field name="dtstart"/>
+ <field name="due"/>
+ <field name="status"/>
+ <field name="percent_complete"/>
+</tree>
diff --git a/view/todo_tree_occurence.xml b/view/todo_tree_occurence.xml
new file mode 100644
index 0000000..852fcf0
--- /dev/null
+++ b/view/todo_tree_occurence.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Todos">
+ <field name="summary"/>
+ <field name="recurrence"/>
+ <field name="dtstart"/>
+ <field name="due"/>
+ <field name="status"/>
+ <field name="percent_complete"/>
+</tree>
diff --git a/webdav.py b/webdav.py
index ed44d88..4fab749 100644
--- a/webdav.py
+++ b/webdav.py
@@ -109,7 +109,7 @@ class Collection:
if uri and (uri not in ('Calendars', 'Calendars/')) and \
uri.startswith('Calendars/'):
calendar_id = cls.calendar(uri)
- if calendar_id and not (uri[10:].split('/', 1) + [None])[1]:
+ if calendar_id and not (uri[10:].split('/', 1) + [None])[1]:
domain = cls._caldav_filter_domain_todo(filter)
todos = Todo.search([
('calendar', '=', calendar_id),
@@ -175,16 +175,16 @@ class Collection:
for i in range(0, len(ids), cursor.IN_MAX):
sub_ids = ids[i:i + cursor.IN_MAX]
red_sql, red_ids = reduce_ids('id', sub_ids)
- cursor.execute('SELECT id, ' \
- 'EXTRACT(epoch FROM create_date) ' \
- 'FROM "' + Todo.__table__ + '" ' \
+ cursor.execute('SELECT id, '
+ 'EXTRACT(epoch FROM create_date) '
+ 'FROM "' + Todo.__table__ + '" '
'WHERE ' + red_sql, red_ids)
for todo_id2, date in cursor.fetchall():
if todo_id2 == todo_id:
res = date
if cache is not None:
cache['_calendar'][Todo.__name__]\
- .setdefault(todo_id2, {})
+ .setdefault(todo_id2, {})
cache['_calendar'][Todo.__name__][
todo_id2]['creationdate'] = date
if res is not None:
@@ -220,19 +220,19 @@ class Collection:
red_id_sql, red_id_ids = reduce_ids('id', sub_ids)
red_parent_sql, red_parent_ids = reduce_ids('parent',
sub_ids)
- cursor.execute('SELECT COALESCE(parent, id), ' \
- 'MAX(EXTRACT(epoch FROM ' \
- 'COALESCE(write_date, create_date))) ' \
- 'FROM "' + Todo.__table__ + '" ' \
- 'WHERE ' + red_id_sql + ' ' \
- 'OR ' + red_parent_sql + ' ' \
- 'GROUP BY parent, id', red_id_ids + red_parent_ids)
+ cursor.execute('SELECT COALESCE(parent, id), '
+ 'MAX(EXTRACT(epoch FROM '
+ 'COALESCE(write_date, create_date))) '
+ 'FROM "' + Todo.__table__ + '" '
+ 'WHERE ' + red_id_sql + ' '
+ 'OR ' + red_parent_sql + ' '
+ 'GROUP BY parent, id', red_id_ids + red_parent_ids)
for todo_id2, date in cursor.fetchall():
if todo_id2 == todo_id:
res = date
if cache is not None:
cache['_calendar'][Todo.__name__]\
- .setdefault(todo_id2, {})
+ .setdefault(todo_id2, {})
cache['_calendar'][Todo.__name__][
todo_id2]['lastmodified'] = date
if res is not None:
@@ -274,10 +274,10 @@ class Collection:
if not todo_id:
values = Todo.ical2values(None, ical, calendar_id)
- todo = Todo.create(values)
+ todo, = Todo.create([values])
calendar = Calendar(calendar_id)
return Transaction().cursor.database_name + '/Calendars/' + \
- calendar.name + '/' + todo.uuid + '.ics'
+ calendar.name + '/' + todo.uuid + '.ics'
else:
values = Todo.ical2values(todo_id, ical, calendar_id)
Todo.write([Todo(todo_id)], values)
commit 77dc6f1ea96f64c14039c62c1cc56bdd858b02c4
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Sat Apr 27 18:44:42 2013 +0200
Releasing debian version 2.6.1-3.
diff --git a/debian/changelog b/debian/changelog
index e379cda..cb1bc13 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+tryton-modules-calendar-todo (2.6.1-3) experimental; urgency=low
+
+ * Removing Daniel from Uploaders. Thanks for your work! (Closes: #704376).
+ * Improving update of major version in Depends.
+
+ -- Mathias Behrle <mathiasb at m9s.biz> Sat, 27 Apr 2013 15:06:20 +0200
+
tryton-modules-calendar-todo (2.6.1-2) experimental; urgency=low
* Updating Vcs-Git to correct address.
commit ce547fa15f1b688842729c49540ec23669dfbde2
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Sat Apr 27 14:54:48 2013 +0200
Improving update of major version in Depends.
Pulling the major version for Depends directly from the package version.
Thanks to Ilya Melnikov for pushing the idea.
diff --git a/debian/control b/debian/control
index cf89e29..1a9ad57 100644
--- a/debian/control
+++ b/debian/control
@@ -13,9 +13,9 @@ X-Python-Version: >= 2.6
Package: tryton-modules-calendar-todo
Architecture: all
Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.6),
- tryton-modules-calendar (>= 2.6), python-dateutil, python-tz, python-vobject,
- python-webdav, python-pkg-resources
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= ${version:major}),
+ tryton-modules-calendar (>= ${version:major}), python-dateutil, python-tz,
+ python-vobject, python-webdav, python-pkg-resources
Description: Tryton Application Platform (Calendar Todo Module)
Tryton is a high-level general purpose application platform written in Python
and using PostgreSQL as database engine. It is the core base of a complete
diff --git a/debian/rules b/debian/rules
index 1ae0776..0f63ab4 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,5 +1,7 @@
#!/usr/bin/make -f
+MAJOR := $(shell python setup.py --version | awk -F "." '{print $$1 "." $$2}')
+
%:
dh ${@} --with python2
@@ -8,5 +10,8 @@ override_dh_auto_clean:
rm -rf *.egg-info
+override_dh_gencontrol:
+ dh_gencontrol -- -Vversion:major="$(MAJOR)"
+
override_dh_builddeb:
dh_builddeb -- -Zxz -z9
commit a25b60c075078ab4901bbbb1e51edaaa55849749
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Sun Apr 21 23:29:29 2013 +0200
Removing Daniel from Uploaders. Thanks for your work! (Closes: #704376).
diff --git a/debian/control b/debian/control
index ffda9d4..cf89e29 100644
--- a/debian/control
+++ b/debian/control
@@ -2,7 +2,7 @@ Source: tryton-modules-calendar-todo
Section: python
Priority: optional
Maintainer: Debian Tryton Maintainers <maintainers at debian.tryton.org>
-Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
+Uploaders: Mathias Behrle <mathiasb at m9s.biz>
Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools
Standards-Version: 3.9.4
Homepage: http://www.tryton.org/
commit ff702c93228a163f8c64e67aef8b56f388b8b2a1
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Sat Mar 23 15:04:02 2013 +0100
Releasing debian version 2.6.1-2.
diff --git a/debian/changelog b/debian/changelog
index 4e86b6f..e379cda 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+tryton-modules-calendar-todo (2.6.1-2) experimental; urgency=low
+
+ * Updating Vcs-Git to correct address.
+ * Adding watch file. Thanks to Bart Martens <bartm at debian.org>.
+
+ -- Mathias Behrle <mathiasb at m9s.biz> Sat, 23 Mar 2013 14:00:29 +0100
+
tryton-modules-calendar-todo (2.6.1-1) experimental; urgency=low
* Removing obsolete Dm-Upload-Allowed
commit 7498cb3806d65661a95d06846ae6088d62b1438f
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Sat Mar 23 13:52:32 2013 +0100
Adding watch file. Thanks to Bart Martens <bartm at debian.org>.
diff --git a/debian/watch b/debian/watch
new file mode 100644
index 0000000..b9e7219
--- /dev/null
+++ b/debian/watch
@@ -0,0 +1,2 @@
+version=3
+http://downloads.tryton.org/current/ .*trytond_calendar_todo-(\d.*)\.(?:tgz|tbz2|txz|tar\.(?:gz|bz2|xz))
commit f1e771ab30eef734fbae123ac5cf56d1a8af2513
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Sat Feb 23 20:08:09 2013 +0100
Updating Vcs-Git to correct address.
diff --git a/debian/control b/debian/control
index 561c68b..ffda9d4 100644
--- a/debian/control
+++ b/debian/control
@@ -7,7 +7,7 @@ Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools
Standards-Version: 3.9.4
Homepage: http://www.tryton.org/
Vcs-Browser: http://debian.tryton.org/gitweb/?p=packages/tryton-modules-calendar-todo.git
-Vcs-Git: git://debian.tryton.org/git/packages/tryton-modules-calendar-todo.git
+Vcs-Git: git://debian.tryton.org/packages/tryton-modules-calendar-todo.git
X-Python-Version: >= 2.6
Package: tryton-modules-calendar-todo
commit 55135ef8d5111e7c124a816fc869d0ce3d126765
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Sun Feb 17 13:50:40 2013 +0100
Releasing debian version 2.6.1-1.
diff --git a/debian/changelog b/debian/changelog
index 49f47f7..4e86b6f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+tryton-modules-calendar-todo (2.6.1-1) experimental; urgency=low
+
+ * Removing obsolete Dm-Upload-Allowed
+ * Updating to Standards-Version: 3.9.4, no changes needed.
+ * Merging upstream version 2.6.1.
+ * Updating copyright.
+
+ -- Mathias Behrle <mathiasb at m9s.biz> Sat, 16 Feb 2013 21:37:47 +0100
+
tryton-modules-calendar-todo (2.6.0-1) experimental; urgency=low
* Merging upstream version 2.6.0.
commit 13292affbcdc57badbe87a0e276482d6c306dbf5
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Sat Feb 16 21:29:19 2013 +0100
Updating copyright.
diff --git a/debian/copyright b/debian/copyright
index 99aff32..cbad1dd 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -1,8 +1,7 @@
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Files: *
-Copyright:
- 2009-2012 Cedric Krier
+Copyright: 2009-2012 Cédric Krier
2009-2012 Bertrand Chenal
2009-2012 B2CK SPRL
License: GPL-3+
@@ -10,7 +9,7 @@ License: GPL-3+
Files: debian/*
Copyright:
2009-2012 Daniel Baumann <daniel at debian.org>
- 2012 Mathias Behrle <mathiasb at m9s.biz>
+ 2012-2013 Mathias Behrle <mathiasb at m9s.biz>
License: GPL-3+
License: GPL-3+
commit 1cee554618abd042da0bed8af246fae191be4749
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Fri Feb 15 20:50:39 2013 +0100
Merging upstream version 2.6.1.
diff --git a/CHANGELOG b/CHANGELOG
index e9779b0..1766455 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.6.1 - 2012-12-23
+* Bug fixes (see mercurial logs for details)
+
Version 2.6.0 - 2012-10-22
* Bug fixes (see mercurial logs for details)
diff --git a/PKG-INFO b/PKG-INFO
index 504b4c5..d03b3f6 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
-Metadata-Version: 1.0
+Metadata-Version: 1.1
Name: trytond_calendar_todo
-Version: 2.6.0
+Version: 2.6.1
Summary: Tryton module to add TODO on CalDAV
Home-page: http://www.tryton.org/
Author: Tryton
diff --git a/tryton.cfg b/tryton.cfg
index 2c4b4f3..b904159 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
[tryton]
-version=2.6.0
+version=2.6.1
depends:
calendar
ir
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index c684d79..3cdcac3 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
-Metadata-Version: 1.0
+Metadata-Version: 1.1
Name: trytond-calendar-todo
-Version: 2.6.0
+Version: 2.6.1
Summary: Tryton module to add TODO on CalDAV
Home-page: http://www.tryton.org/
Author: Tryton
diff --git a/webdav.py b/webdav.py
index b3ea843..ed44d88 100644
--- a/webdav.py
+++ b/webdav.py
@@ -126,7 +126,7 @@ class Collection:
@classmethod
def get_resourcetype(cls, uri, cache=None):
- from DAV.constants import COLLECTION, OBJECT
+ from pywebdav.lib.constants import COLLECTION, OBJECT
if uri in ('Calendars', 'Calendars/'):
return COLLECTION
calendar_id = cls.calendar(uri)
commit 95fd0a78b47c9707e79f3f6a03a403c52f358eeb
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Fri Feb 15 19:28:28 2013 +0100
Updating to Standards-Version: 3.9.4, no changes needed.
diff --git a/debian/control b/debian/control
index 14ae824..561c68b 100644
--- a/debian/control
+++ b/debian/control
@@ -4,7 +4,7 @@ Priority: optional
Maintainer: Debian Tryton Maintainers <maintainers at debian.tryton.org>
Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools
-Standards-Version: 3.9.3
+Standards-Version: 3.9.4
Homepage: http://www.tryton.org/
Vcs-Browser: http://debian.tryton.org/gitweb/?p=packages/tryton-modules-calendar-todo.git
Vcs-Git: git://debian.tryton.org/git/packages/tryton-modules-calendar-todo.git
commit 80e6362f6d0d8ff11b3bbcc6f3b6cb2faa30f7d9
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Wed Feb 13 21:37:13 2013 +0100
Removing obsolete Dm-Upload-Allowed
diff --git a/debian/control b/debian/control
index 5306392..14ae824 100644
--- a/debian/control
+++ b/debian/control
@@ -3,7 +3,6 @@ Section: python
Priority: optional
Maintainer: Debian Tryton Maintainers <maintainers at debian.tryton.org>
Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
-Dm-Upload-Allowed: yes
Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools
Standards-Version: 3.9.3
Homepage: http://www.tryton.org/
commit 971d6f83cc5180d5e19667f8c51f6b8f37f77ac1
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Wed Oct 24 22:01:54 2012 +0200
Releasing debian version 2.6.0-1.
diff --git a/debian/changelog b/debian/changelog
index 9a1a501..49f47f7 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+tryton-modules-calendar-todo (2.6.0-1) experimental; urgency=low
+
+ * Merging upstream version 2.6.0.
+ * Bumping versioned tryton depends to 2.6.
+
+ -- Mathias Behrle <mathiasb at m9s.biz> Wed, 24 Oct 2012 14:24:18 +0200
+
tryton-modules-calendar-todo (2.4.2-2) experimental; urgency=low
[ Daniel Baumann ]
commit 101d9648efa79deec158434f28618d0bc4765fdc
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Oct 23 19:59:46 2012 +0200
Bumping versioned tryton depends to 2.6.
diff --git a/debian/control b/debian/control
index 44443ff..5306392 100644
--- a/debian/control
+++ b/debian/control
@@ -14,8 +14,8 @@ X-Python-Version: >= 2.6
Package: tryton-modules-calendar-todo
Architecture: all
Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.4),
- tryton-modules-calendar (>= 2.4), python-dateutil, python-tz, python-vobject,
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.6),
+ tryton-modules-calendar (>= 2.6), python-dateutil, python-tz, python-vobject,
python-webdav, python-pkg-resources
Description: Tryton Application Platform (Calendar Todo Module)
Tryton is a high-level general purpose application platform written in Python
commit d8ee2fd0235d31c1c4ea4a48fde2080e16c1d7b8
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Oct 23 19:53:30 2012 +0200
Merging upstream version 2.6.0.
diff --git a/CHANGELOG b/CHANGELOG
index b9a4c76..e9779b0 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,9 +1,6 @@
-Version 2.4.2 - 2012-09-02
+Version 2.6.0 - 2012-10-22
* Bug fixes (see mercurial logs for details)
-Version 2.4.1 - 2012-04-24
-* Restore es_AR translation
-
Version 2.4.0 - 2012-04-23
* Bug fixes (see mercurial logs for details)
diff --git a/MANIFEST.in b/MANIFEST.in
index 7f5d5fd..44969c7 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -4,6 +4,7 @@ include TODO
include COPYRIGHT
include CHANGELOG
include LICENSE
+include tryton.cfg
include *.xml
include *.odt
include locale/*.po
diff --git a/PKG-INFO b/PKG-INFO
index 8e0cd51..504b4c5 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,13 +1,49 @@
Metadata-Version: 1.0
Name: trytond_calendar_todo
-Version: 2.4.2
-Summary: Add Todo support on CalDAV
+Version: 2.6.0
+Summary: Tryton module to add TODO on CalDAV
Home-page: http://www.tryton.org/
-Author: B2CK
-Author-email: info at b2ck.com
+Author: Tryton
+Author-email: UNKNOWN
License: GPL-3
-Download-URL: http://downloads.tryton.org/2.4/
-Description: UNKNOWN
+Download-URL: http://downloads.tryton.org/2.6/
+Description: trytond_calendar_todo
+ =====================
+
+ The calendar_todo module of the Tryton application platform. See
+ __tryton__.py
+
+ Installing
+ ----------
+
+ See INSTALL
+
+ Support
+ -------
+
+ If you encounter any problems with Tryton, please don't hesitate to ask
+ questions on the Tryton bug tracker, mailing list, wiki or IRC channel:
+
+ http://bugs.tryton.org/
+ http://groups.tryton.org/
+ http://wiki.tryton.org/
+ irc://irc.freenode.net/tryton
+
+ License
+ -------
+
+ See LICENSE
+
+ Copyright
+ ---------
+
+ See COPYRIGHT
+
+
+ For more information please visit the Tryton web site:
+
+ http://www.tryton.org/
+
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Plugins
diff --git a/__init__.py b/__init__.py
index ac725d6..5092231 100644
--- a/__init__.py
+++ b/__init__.py
@@ -1,6 +1,21 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
+from trytond.pool import Pool
from . import caldav
from .todo import *
from .webdav import *
+
+
+def register():
+ Pool.register(
+ Todo,
+ TodoCategory,
+ TodoRDate,
+ TodoRRule,
+ TodoExDate,
+ TodoExRule,
+ TodoAttendee,
+ TodoAlarm,
+ Collection,
+ module='calendar_todo', type_='model')
diff --git a/__tryton__.py b/__tryton__.py
deleted file mode 100644
index 0c22fdc..0000000
--- a/__tryton__.py
+++ /dev/null
@@ -1,48 +0,0 @@
-# -*- coding: utf-8 -*-
-#This file is part of Tryton. The COPYRIGHT file at the top level of
-#this repository contains the full copyright notices and license terms.
-{
- 'name': 'Calendar Todo',
- 'name_bg_BG': 'Задачи за календар',
- 'name_ca_ES': 'Calendari de tasques pendents',
- 'name_de_DE': 'Kalender Aufgaben',
- 'name_es_AR': 'Calendario de tareas',
- 'name_es_CO': 'Calendario de tareas',
- 'name_es_ES': 'Calendario de tareas',
- 'name_fr_FR': 'Tâche Calendrier',
- 'name_ru_RU': 'Задачи для календаря',
- 'version': '2.4.2',
- 'author': 'B2CK',
- 'email': 'info at b2ck.com',
- 'website': 'http://www.tryton.org/',
- 'description': 'Add Todo support on CalDAV',
- 'description_bg_BG': 'Добавя поддръжка на задачи в CalDAV',
- 'description_ca_ES': 'Afegeix suport per tasques pendents al CalDAV.',
- 'description_de_DE': 'Fügt Unterstützung für Aufgaben in CalDAV hinzu',
- 'description_es_AR': 'Añade soporte de tareas sobre CalDAV',
- 'description_es_CO': 'Añade soporte de tareas sobre CalDAV',
- 'description_es_ES': 'Añade soporte de tareas sobre CalDAV',
- 'description_fr_FR': 'Ajoute la gestion des tâches au CalDAV',
- 'description_ru_RU': 'Добавление поддержки задач для CalDAV',
- 'depends': [
- 'ir',
- 'res',
- 'webdav',
- 'calendar',
- ],
- 'xml': [
- 'todo.xml',
- ],
- 'translation': [
- 'locale/bg_BG.po',
- 'locale/ca_ES.po',
- 'locale/cs_CZ.po',
- 'locale/de_DE.po',
- 'locale/es_AR.po',
- 'locale/es_CO.po',
- 'locale/es_ES.po',
- 'locale/fr_FR.po',
- 'locale/nl_NL.po',
- 'locale/ru_RU.po',
- ],
-}
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index 3f3d17e..c363f1b 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -24,15 +24,15 @@ msgstr "Calendari"
msgctxt "field:calendar.todo,calendar_owner:"
msgid "Owner"
-msgstr "Amo"
+msgstr "Propietaris"
msgctxt "field:calendar.todo,calendar_read_users:"
msgid "Read Users"
-msgstr "Usuaris amb lectura"
+msgstr "Usuaris amb permisos de lectura"
msgctxt "field:calendar.todo,calendar_write_users:"
msgid "Write Users"
-msgstr "Usuaris amb escriptura"
+msgstr "Usuaris amb permisos d'escriptura"
msgctxt "field:calendar.todo,categories:"
msgid "Categories"
@@ -48,12 +48,11 @@ msgstr "Completada"
msgctxt "field:calendar.todo,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.todo,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.todo,description:"
msgid "Description"
@@ -77,13 +76,12 @@ msgstr "Regles d'excepcions"
msgctxt "field:calendar.todo,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.todo,location:"
msgid "Location"
msgstr "Ubicació"
-#, fuzzy
msgctxt "field:calendar.todo,occurences:"
msgid "Occurences"
msgstr "Ocurrències"
@@ -142,11 +140,11 @@ msgstr "vtodo"
msgctxt "field:calendar.todo,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.todo,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:calendar.todo-calendar.category,category:"
msgid "Category"
@@ -154,16 +152,15 @@ msgstr "Categoria"
msgctxt "field:calendar.todo-calendar.category,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.todo-calendar.category,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.todo-calendar.category,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.todo-calendar.category,rec_name:"
msgid "Name"
@@ -175,11 +172,11 @@ msgstr "Per fer"
msgctxt "field:calendar.todo-calendar.category,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.todo-calendar.category,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:calendar.todo.alarm,calendar_alarm:"
msgid "Calendar Alarm"
@@ -187,16 +184,15 @@ msgstr "Alarma del calendari"
msgctxt "field:calendar.todo.alarm,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.todo.alarm,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.todo.alarm,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.todo.alarm,rec_name:"
msgid "Name"
@@ -208,11 +204,11 @@ msgstr "Tasca"
msgctxt "field:calendar.todo.alarm,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.todo.alarm,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:calendar.todo.attendee,calendar_attendee:"
msgid "Calendar Attendee"
@@ -220,16 +216,15 @@ msgstr "Calendari d'assistents"
msgctxt "field:calendar.todo.attendee,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.todo.attendee,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.todo.attendee,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.todo.attendee,rec_name:"
msgid "Name"
@@ -241,28 +236,27 @@ msgstr "Tasca"
msgctxt "field:calendar.todo.attendee,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.todo.attendee,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:calendar.todo.exdate,calendar_date:"
msgid "Calendar Date"
-msgstr ""
+msgstr "Data calendari"
msgctxt "field:calendar.todo.exdate,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.todo.exdate,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.todo.exdate,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.todo.exdate,rec_name:"
msgid "Name"
@@ -274,11 +268,11 @@ msgstr "Tasca"
msgctxt "field:calendar.todo.exdate,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.todo.exdate,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:calendar.todo.exrule,calendar_rrule:"
msgid "Calendar RRule"
@@ -286,16 +280,15 @@ msgstr "Regla de recurrencia"
msgctxt "field:calendar.todo.exrule,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.todo.exrule,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.todo.exrule,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.todo.exrule,rec_name:"
msgid "Name"
@@ -307,28 +300,27 @@ msgstr "Tasca"
msgctxt "field:calendar.todo.exrule,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.todo.exrule,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:calendar.todo.rdate,calendar_date:"
msgid "Calendar Date"
-msgstr ""
+msgstr "Data calendari"
msgctxt "field:calendar.todo.rdate,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.todo.rdate,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.todo.rdate,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.todo.rdate,rec_name:"
msgid "Name"
@@ -340,11 +332,11 @@ msgstr "Tasca"
msgctxt "field:calendar.todo.rdate,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.todo.rdate,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:calendar.todo.rrule,calendar_rrule:"
msgid "Calendar RRule"
@@ -352,16 +344,15 @@ msgstr "Regla de recurrencia"
msgctxt "field:calendar.todo.rrule,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.todo.rrule,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.todo.rrule,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.todo.rrule,rec_name:"
msgid "Name"
@@ -373,11 +364,11 @@ msgstr "Tasca"
msgctxt "field:calendar.todo.rrule,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.todo.rrule,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "help:calendar.todo,uuid:"
msgid "Universally Unique Identifier"
@@ -397,7 +388,7 @@ msgstr "Alarma"
msgctxt "model:calendar.todo.attendee,name:"
msgid "Attendee"
-msgstr "Assistents"
+msgstr "Assistent"
msgctxt "model:calendar.todo.exdate,name:"
msgid "Exception Date"
@@ -407,7 +398,6 @@ msgctxt "model:calendar.todo.exrule,name:"
msgid "Exception Rule"
msgstr "Regla d'excepció"
-#, fuzzy
msgctxt "model:calendar.todo.rdate,name:"
msgid "Todo Recurrence Date"
msgstr "Data de recurrencia"
@@ -420,7 +410,6 @@ msgctxt "model:ir.action,name:act_todo_form"
msgid "Todos"
msgstr "Tasques"
-#, fuzzy
msgctxt "model:ir.action,name:act_todo_form3"
msgid "Todos"
msgstr "Tasques"
@@ -441,9 +430,10 @@ msgctxt "selection:calendar.todo,classification:"
msgid "Public"
msgstr "Públic"
+#, fuzzy
msgctxt "selection:calendar.todo,status:"
msgid ""
-msgstr ""
+msgstr "Servidor"
msgctxt "selection:calendar.todo,status:"
msgid "Cancelled"
@@ -463,7 +453,7 @@ msgstr "Necessita una acció"
msgctxt "view:calendar.todo.attendee:"
msgid "Attendee"
-msgstr "Assistents"
+msgstr "Assistent"
msgctxt "view:calendar.todo.attendee:"
msgid "Attendees"
@@ -513,14 +503,13 @@ msgctxt "view:calendar.todo:"
msgid "General"
msgstr "General"
-#, fuzzy
msgctxt "view:calendar.todo:"
msgid "Occurences"
msgstr "Ocurrències"
msgctxt "view:calendar.todo:"
msgid "Recurrences"
-msgstr "Recurrencias"
+msgstr "Recurrencies"
msgctxt "view:calendar.todo:"
msgid "Todo"
diff --git a/locale/es_AR.po b/locale/es_AR.po
index adc2e33..e03cc96 100644
--- a/locale/es_AR.po
+++ b/locale/es_AR.po
@@ -64,7 +64,7 @@ msgstr "Fecha inicio"
msgctxt "field:calendar.todo,due:"
msgid "Due Date"
-msgstr "Fecha de vencimiento"
+msgstr "Fecha vencimiento"
msgctxt "field:calendar.todo,exdates:"
msgid "Exception Dates"
@@ -136,7 +136,7 @@ msgstr "UUID"
msgctxt "field:calendar.todo,vtodo:"
msgid "vtodo"
-msgstr "vtodo"
+msgstr "v- por hacer"
msgctxt "field:calendar.todo,write_date:"
msgid "Write Date"
@@ -244,7 +244,7 @@ msgstr "Usuario modificación"
msgctxt "field:calendar.todo.exdate,calendar_date:"
msgid "Calendar Date"
-msgstr "Fecha Calendario"
+msgstr "Fecha calendario"
msgctxt "field:calendar.todo.exdate,create_date:"
msgid "Create Date"
@@ -308,7 +308,7 @@ msgstr "Usuario modificación"
msgctxt "field:calendar.todo.rdate,calendar_date:"
msgid "Calendar Date"
-msgstr "Fecha Calendario"
+msgstr "Fecha calendario"
msgctxt "field:calendar.todo.rdate,create_date:"
msgid "Create Date"
@@ -400,7 +400,7 @@ msgstr "Regla de excepción"
msgctxt "model:calendar.todo.rdate,name:"
msgid "Todo Recurrence Date"
-msgstr "Fecha de recurrencia"
+msgstr "Fecha recurrencia"
msgctxt "model:calendar.todo.rrule,name:"
msgid "Recurrence Rule"
@@ -476,7 +476,7 @@ msgstr "Reglas de excepciones"
msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Date"
-msgstr "Fecha de recurrencia"
+msgstr "Fecha recurrencia"
msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Dates"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index 6497ec2..8c530f2 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -32,7 +32,7 @@ msgstr "Leer Usuarios"
msgctxt "field:calendar.todo,calendar_write_users:"
msgid "Write Users"
-msgstr "Escribir Usuarios"
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.todo,categories:"
msgid "Categories"
@@ -44,16 +44,15 @@ msgstr "Clasificación"
msgctxt "field:calendar.todo,completed:"
msgid "Completed"
-msgstr ""
+msgstr "Completado"
msgctxt "field:calendar.todo,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.todo,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.todo,description:"
msgid "Description"
@@ -65,7 +64,7 @@ msgstr "Fecha Inicio"
msgctxt "field:calendar.todo,due:"
msgid "Due Date"
-msgstr ""
+msgstr "Fecha Debida"
msgctxt "field:calendar.todo,exdates:"
msgid "Exception Dates"
@@ -77,7 +76,7 @@ msgstr "Reglas de Excepción"
msgctxt "field:calendar.todo,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.todo,location:"
msgid "Location"
@@ -97,7 +96,7 @@ msgstr "Padre"
msgctxt "field:calendar.todo,percent_complete:"
msgid "Percent complete"
-msgstr ""
+msgstr "Porcentaje completo"
msgctxt "field:calendar.todo,rdates:"
msgid "Recurrence Dates"
@@ -137,15 +136,15 @@ msgstr "UUID"
msgctxt "field:calendar.todo,vtodo:"
msgid "vtodo"
-msgstr ""
+msgstr "v- por hacer"
msgctxt "field:calendar.todo,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.todo,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.todo-calendar.category,category:"
msgid "Category"
@@ -153,16 +152,15 @@ msgstr "Categoría"
msgctxt "field:calendar.todo-calendar.category,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.todo-calendar.category,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.todo-calendar.category,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.todo-calendar.category,rec_name:"
msgid "Name"
@@ -170,32 +168,31 @@ msgstr "Nombre"
msgctxt "field:calendar.todo-calendar.category,todo:"
msgid "To-Do"
-msgstr ""
+msgstr "Por Hacer"
msgctxt "field:calendar.todo-calendar.category,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.todo-calendar.category,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.todo.alarm,calendar_alarm:"
msgid "Calendar Alarm"
-msgstr ""
+msgstr "Alarma del Calendario"
msgctxt "field:calendar.todo.alarm,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.todo.alarm,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.todo.alarm,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.todo.alarm,rec_name:"
msgid "Name"
@@ -203,32 +200,31 @@ msgstr "Nombre"
msgctxt "field:calendar.todo.alarm,todo:"
msgid "Todo"
-msgstr ""
+msgstr "Por Hacer"
msgctxt "field:calendar.todo.alarm,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.todo.alarm,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.todo.attendee,calendar_attendee:"
msgid "Calendar Attendee"
-msgstr ""
+msgstr "Asistente de Calendario "
msgctxt "field:calendar.todo.attendee,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.todo.attendee,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.todo.attendee,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.todo.attendee,rec_name:"
msgid "Name"
@@ -236,33 +232,31 @@ msgstr "Nombre"
msgctxt "field:calendar.todo.attendee,todo:"
msgid "Todo"
-msgstr ""
+msgstr "Por Hacer"
msgctxt "field:calendar.todo.attendee,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.todo.attendee,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
-#, fuzzy
msgctxt "field:calendar.todo.exdate,calendar_date:"
msgid "Calendar Date"
msgstr "Fecha Calendario"
msgctxt "field:calendar.todo.exdate,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.todo.exdate,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.todo.exdate,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.todo.exdate,rec_name:"
msgid "Name"
@@ -270,32 +264,31 @@ msgstr "Nombre"
msgctxt "field:calendar.todo.exdate,todo:"
msgid "Todo"
-msgstr ""
+msgstr "Por Hacer"
msgctxt "field:calendar.todo.exdate,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.todo.exdate,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.todo.exrule,calendar_rrule:"
msgid "Calendar RRule"
-msgstr ""
+msgstr "Regla de Calendario"
msgctxt "field:calendar.todo.exrule,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.todo.exrule,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.todo.exrule,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.todo.exrule,rec_name:"
msgid "Name"
@@ -303,33 +296,31 @@ msgstr "Nombre"
msgctxt "field:calendar.todo.exrule,todo:"
msgid "Todo"
-msgstr ""
+msgstr "Por Hacer"
msgctxt "field:calendar.todo.exrule,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.todo.exrule,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
-#, fuzzy
msgctxt "field:calendar.todo.rdate,calendar_date:"
msgid "Calendar Date"
msgstr "Fecha Calendario"
msgctxt "field:calendar.todo.rdate,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.todo.rdate,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.todo.rdate,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.todo.rdate,rec_name:"
msgid "Name"
@@ -337,32 +328,31 @@ msgstr "Nombre"
msgctxt "field:calendar.todo.rdate,todo:"
msgid "Todo"
-msgstr ""
+msgstr "Por Hacer"
msgctxt "field:calendar.todo.rdate,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.todo.rdate,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.todo.rrule,calendar_rrule:"
msgid "Calendar RRule"
-msgstr ""
+msgstr "Regla de Calendario"
msgctxt "field:calendar.todo.rrule,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.todo.rrule,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.todo.rrule,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.todo.rrule,rec_name:"
msgid "Name"
@@ -370,15 +360,15 @@ msgstr "Nombre"
msgctxt "field:calendar.todo.rrule,todo:"
msgid "Todo"
-msgstr ""
+msgstr "Por Hacer"
msgctxt "field:calendar.todo.rrule,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.todo.rrule,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "help:calendar.todo,uuid:"
msgid "Universally Unique Identifier"
@@ -386,11 +376,11 @@ msgstr "Identificador Único Universal"
msgctxt "model:calendar.todo,name:"
msgid "Todo"
-msgstr ""
+msgstr "Por Hacer"
msgctxt "model:calendar.todo-calendar.category,name:"
msgid "Todo - Category"
-msgstr ""
+msgstr "Por Hacer - Categoria"
msgctxt "model:calendar.todo.alarm,name:"
msgid "Alarm"
@@ -408,7 +398,6 @@ msgctxt "model:calendar.todo.exrule,name:"
msgid "Exception Rule"
msgstr "Regla de Excepción"
-#, fuzzy
msgctxt "model:calendar.todo.rdate,name:"
msgid "Todo Recurrence Date"
msgstr "Fecha de Repetición"
@@ -417,7 +406,6 @@ msgctxt "model:calendar.todo.rrule,name:"
msgid "Recurrence Rule"
msgstr "Regla de Repetición"
-#, fuzzy
msgctxt "model:ir.action,name:act_todo_form"
msgid "Todos"
msgstr "Por hacer"
@@ -426,7 +414,6 @@ msgctxt "model:ir.action,name:act_todo_form3"
msgid "Todos"
msgstr "Por hacer"
-#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_todo_form"
msgid "Todos"
msgstr "Por hacer"
@@ -445,7 +432,7 @@ msgstr "Público"
msgctxt "selection:calendar.todo,status:"
msgid ""
-msgstr ""
+msgstr "Punto de Orden"
msgctxt "selection:calendar.todo,status:"
msgid "Cancelled"
@@ -453,15 +440,15 @@ msgstr "Cancelado"
msgctxt "selection:calendar.todo,status:"
msgid "Completed"
-msgstr ""
+msgstr "Completado"
msgctxt "selection:calendar.todo,status:"
msgid "In-Process"
-msgstr ""
+msgstr "En-Proceso"
msgctxt "selection:calendar.todo,status:"
msgid "Needs-Action"
-msgstr ""
+msgstr "Necesita una Acción"
msgctxt "view:calendar.todo.attendee:"
msgid "Attendee"
@@ -525,9 +512,8 @@ msgstr "Repeticiones"
msgctxt "view:calendar.todo:"
msgid "Todo"
-msgstr ""
+msgstr "Por Hacer"
-#, fuzzy
msgctxt "view:calendar.todo:"
msgid "Todos"
msgstr "Por hacer"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index 950cf5d..463df55 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -28,11 +28,11 @@ msgstr "Propietario"
msgctxt "field:calendar.todo,calendar_read_users:"
msgid "Read Users"
-msgstr "Usuarios con lectura"
+msgstr "Usuarios con permisos de lectura"
msgctxt "field:calendar.todo,calendar_write_users:"
msgid "Write Users"
-msgstr "Usuarios con escritura"
+msgstr "Usuarios con permisos de escritura"
msgctxt "field:calendar.todo,categories:"
msgid "Categories"
@@ -452,7 +452,7 @@ msgstr "Necesita acción"
msgctxt "view:calendar.todo.attendee:"
msgid "Attendee"
-msgstr "Asistentes"
+msgstr "Asistente"
msgctxt "view:calendar.todo.attendee:"
msgid "Attendees"
diff --git a/setup.py b/setup.py
index baef0a5..9036958 100644
--- a/setup.py
+++ b/setup.py
@@ -4,8 +4,19 @@
from setuptools import setup
import re
+import os
+import ConfigParser
-info = eval(open('__tryton__.py').read())
+
+def read(fname):
+ return open(os.path.join(os.path.dirname(__file__), fname)).read()
+
+config = ConfigParser.ConfigParser()
+config.readfp(open('tryton.cfg'))
+info = dict(config.items('tryton'))
+for key in ('depends', 'extras_depend', 'xml'):
+ if key in info:
+ info[key] = info[key].strip().splitlines()
major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
major_version = int(major_version)
minor_version = int(minor_version)
@@ -21,21 +32,21 @@ requires.append('trytond >= %s.%s, < %s.%s' %
setup(name='trytond_calendar_todo',
version=info.get('version', '0.0.1'),
- description=info.get('description', ''),
- author=info.get('author', ''),
- author_email=info.get('email', ''),
- url=info.get('website', ''),
+ description='Tryton module to add TODO on CalDAV',
+ long_description=read('README'),
+ author='Tryton',
+ url='http://www.tryton.org/',
download_url="http://downloads.tryton.org/" + \
- info.get('version', '0.0.1').rsplit('.', 1)[0] + '/',
+ info.get('version', '0.0.1').rsplit('.', 1)[0] + '/',
package_dir={'trytond.modules.calendar_todo': '.'},
packages=[
'trytond.modules.calendar_todo',
'trytond.modules.calendar_todo.tests',
- ],
+ ],
package_data={
'trytond.modules.calendar_todo': info.get('xml', []) \
- + info.get('translation', []),
- },
+ + ['tryton.cfg', 'locale/*.po'],
+ },
classifiers=[
'Development Status :: 5 - Production/Stable',
'Environment :: Plugins',
@@ -57,7 +68,7 @@ setup(name='trytond_calendar_todo',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7',
'Topic :: Office/Business',
- ],
+ ],
license='GPL-3',
install_requires=requires,
zip_safe=False,
@@ -67,4 +78,4 @@ setup(name='trytond_calendar_todo',
""",
test_suite='tests',
test_loader='trytond.test_loader:Loader',
-)
+ )
diff --git a/todo.py b/todo.py
index a581127..dd97700 100644
--- a/todo.py
+++ b/todo.py
@@ -13,6 +13,9 @@ from trytond.pyson import Eval, If, Bool
from trytond.transaction import Transaction
from trytond.pool import Pool
+__all__ = ['Todo', 'TodoCategory', 'TodoRDate', 'TodoRRule', 'TodoExDate',
+ 'TodoExRule', 'TodoAttendee', 'TodoAlarm']
+
tzlocal = dateutil.tz.tzlocal()
tzutc = dateutil.tz.tzutc()
@@ -21,10 +24,8 @@ domimpl = xml.dom.minidom.getDOMImplementation()
class Todo(ModelSQL, ModelView):
"Todo"
- _description = __doc__
- _name = 'calendar.todo'
+ __name__ = 'calendar.todo'
_rec_name = 'uuid'
-
calendar = fields.Many2One('calendar.calendar', 'Calendar',
required=True, select=True, ondelete="CASCADE")
alarms = fields.One2Many('calendar.todo.alarm', 'todo', 'Alarms')
@@ -110,102 +111,107 @@ class Todo(ModelSQL, ModelView):
'Write Users'), 'get_calendar_field', searcher='search_calendar_field')
vtodo = fields.Binary('vtodo')
- def __init__(self):
- super(Todo, self).__init__()
- self._sql_constraints = [
+ @classmethod
+ def __setup__(cls):
+ super(Todo, cls).__setup__()
+ cls._sql_constraints = [
#XXX should be unique across all componenets
('uuid_recurrence_uniq', 'UNIQUE(uuid, calendar, recurrence)',
'UUID and recurrence must be unique in a calendar!'),
- ]
- self._constraints += [
+ ]
+ cls._constraints += [
('check_recurrence', 'invalid_recurrence'),
- ]
- self._error_messages.update({
- 'invalid_recurrence': 'Recurrence can not be recurrent!',
- })
+ ]
+ cls._error_messages.update({
+ 'invalid_recurrence': 'Recurrence can not be recurrent!',
+ })
- def init(self, module_name):
+ @classmethod
+ def __register__(cls, module_name):
+ pool = Pool()
# Migrate from 1.4: remove classification_public
- model_data_obj = Pool().get('ir.model.data')
- rule_obj = Pool().get('ir.rule')
+ ModelData = pool.get('ir.model.data')
+ Rule = pool.get('ir.rule')
with Transaction().set_user(0):
- model_data_ids = model_data_obj.search([
+ models_data = ModelData.search([
('fs_id', '=', 'rule_group_read_todo_line3'),
('module', '=', module_name),
('inherit', '=', None),
], limit=1)
- if model_data_ids:
- model_data = model_data_obj.browse(model_data_ids[0])
- rule_obj.delete(model_data.db_id)
- return super(Todo, self).init(module_name)
+ if models_data:
+ model_data, = models_data
+ Rule.delete([Rule(model_data.db_id)])
+ super(Todo, cls).__register__(module_name)
- def default_uuid(self):
+ @staticmethod
+ def default_uuid():
return str(uuid.uuid4())
- def default_sequence(self):
+ @staticmethod
+ def default_sequence():
return 0
- def default_classification(self):
+ @staticmethod
+ def default_classification():
return 'public'
- def default_timezone(self):
- user_obj = Pool().get('res.user')
- user = user_obj.browse(Transaction().user)
+ @staticmethod
+ def default_timezone():
+ User = Pool().get('res.user')
+ user = User(Transaction().user)
return user.timezone
- def default_percent_complete(self):
+ @staticmethod
+ def default_percent_complete():
return 0
- def on_change_status(self, vals):
+ def on_change_status(self):
res = {}
- if 'status' not in vals:
+ if not getattr(self, 'status', None):
return res
- if vals['status'] == 'completed':
+ if self.status == 'completed':
res['percent_complete'] = 100
- if not vals.get('completed'):
+ if not getattr(self, 'completed', None):
res['completed'] = datetime.datetime.now()
return res
- def timezones(self):
+ @staticmethod
+ def timezones():
return [(x, x) for x in pytz.common_timezones] + [('', '')]
- def get_calendar_field(self, ids, name):
- assert name in ('calendar_owner', 'calendar_read_users',
- 'calendar_write_users'), 'Invalid name'
- res = {}
- for todo in self.browse(ids):
- name = name[9:]
- if name in ('read_users', 'write_users'):
- res[todo.id] = [x.id for x in todo.calendar[name]]
- else:
- res[todo.id] = todo.calendar[name].id
- return res
+ def get_calendar_field(self, name):
+ name = name[9:]
+ if name in ('read_users', 'write_users'):
+ return [x.id for x in getattr(self.calendar, name)]
+ else:
+ return getattr(self.calendar, name).id
- def search_calendar_field(self, name, clause):
- return [('calendar.' + name[9:],) + clause[1:]]
+ @classmethod
+ def search_calendar_field(cls, name, clause):
+ return [('calendar.' + name[9:],) + tuple(clause[1:])]
- def check_recurrence(self, ids):
+ def check_recurrence(self):
'''
Check the recurrence is not recurrent.
'''
- for todo in self.browse(ids):
- if not todo.parent:
- continue
- if todo.rdates \
- or todo.rrules \
- or todo.exdates \
- or todo.exrules \
- or todo.occurences:
- return False
+ if not self.parent:
+ return True
+ if (self.rdates
+ or self.rrules
+ or self.exdates
+ or self.exrules
+ or self.occurences):
+ return False
return True
- def create(self, values):
- calendar_obj = Pool().get('calendar.calendar')
- collection_obj = Pool().get('webdav.collection')
+ @classmethod
+ def create(cls, values):
+ pool = Pool()
+ Calendar = pool.get('calendar.calendar')
+ Collection = pool.get('webdav.collection')
- res = super(Todo, self).create(values)
- todo = self.browse(res)
+ todo = super(Todo, cls).create(values)
if (todo.calendar.owner
and (todo.organizer == todo.calendar.owner.email
or (todo.parent
@@ -221,73 +227,72 @@ class Todo(ModelSQL, ModelView):
and x.email != todo.parent.organizer]
if attendee_emails:
with Transaction().set_user(0):
- calendar_ids = calendar_obj.search([
+ calendars = Calendar.search([
('owner.email', 'in', attendee_emails),
])
if not todo.recurrence:
- for calendar_id in calendar_ids:
- new_id = self.copy(todo.id, default={
- 'calendar': calendar_id,
+ for calendar in calendars:
+ new_todo, = cls.copy([todo], default={
+ 'calendar': calendar.id,
'occurences': None,
+ 'uuid': todo.uuid,
})
for occurence in todo.occurences:
- self.copy(occurence.id, default={
- 'calendar': calendar_id,
- 'parent': new_id,
+ cls.copy([occurence], default={
+ 'calendar': calendar.id,
+ 'parent': new_todo.id,
+ 'uuid': occurence.uuid,
})
else:
- parent_ids = self.search([
+ parents = cls.search([
('uuid', '=', todo.uuid),
('calendar.owner.email', 'in', attendee_emails),
('id', '!=', todo.id),
('recurrence', '=', None),
])
- for parent in self.browse(parent_ids):
- self.copy(todo.id, default={
+ for parent in parents:
+ cls.copy([todo], default={
'calendar': parent.calendar.id,
'parent': parent.id,
+ 'uuid': todo.uuid,
})
# Restart the cache for todo
- collection_obj.todo.reset()
- return res
-
- def _todo2update(self, todo):
- pool = Pool()
- rdate_obj = pool.get('calendar.todo.rdate')
- exdate_obj = pool.get('calendar.todo.exdate')
- rrule_obj = pool.get('calendar.todo.rrule')
- exrule_obj = pool.get('calendar.todo.exrule')
+ Collection._todo_cache.clear()
+ return todo
+ def _todo2update(self):
res = {}
- res['summary'] = todo.summary
- res['description'] = todo.description
- res['dtstart'] = todo.dtstart
- res['percent_complete'] = todo.percent_complete
- res['completed'] = todo.completed
- res['location'] = todo.location.id
- res['status'] = todo.status
- res['organizer'] = todo.organizer
+ res['summary'] = self.summary
+ res['description'] = self.description
+ res['dtstart'] = self.dtstart
+ res['percent_complete'] = self.percent_complete
+ res['completed'] = self.completed
+ res['location'] = self.location.id
+ res['status'] = self.status
+ res['organizer'] = self.organizer
res['rdates'] = [('delete_all',)]
- for rdate in todo.rdates:
- vals = rdate_obj._date2update(rdate)
+ for rdate in self.rdates:
+ vals = rdate._date2update()
res['rdates'].append(('create', vals))
res['exdates'] = [('delete_all',)]
- for exdate in todo.exdates:
- vals = exdate_obj._date2update(exdate)
+ for exdate in self.exdates:
+ vals = exdate._date2update()
res['exdates'].append(('create', vals))
res['rrules'] = [('delete_all',)]
- for rrule in todo.rrules:
- vals = rrule_obj._rule2update(rrule)
+ for rrule in self.rrules:
+ vals = rrule._rule2update()
res['rrules'].append(('create', vals))
res['exrules'] = [('delete_all',)]
- for exrule in todo.exrules:
- vals = exrule_obj._rule2update(exrule)
+ for exrule in self.exrules:
+ vals = exrule._rule2update()
res['exrules'].append(('create', vals))
return res
- def write(self, ids, values):
- calendar_obj = Pool().get('calendar.calendar')
- collection_obj = Pool().get('webdav.collection')
+ @classmethod
+ def write(cls, todos, values):
+ pool = Pool()
+ Calendar = pool.get('calendar.calendar')
+ Collection = pool.get('webdav.collection')
cursor = Transaction().cursor
@@ -295,19 +300,17 @@ class Todo(ModelSQL, ModelView):
if 'sequence' in values:
del values['sequence']
- res = super(Todo, self).write(ids, values)
-
- if isinstance(ids, (int, long)):
- ids = [ids]
+ super(Todo, cls).write(todos, values)
+ ids = [t.id for t in todos]
for i in range(0, len(ids), cursor.IN_MAX):
sub_ids = ids[i:i + cursor.IN_MAX]
red_sql, red_ids = reduce_ids('id', sub_ids)
- cursor.execute('UPDATE "' + self._table + '" ' \
+ cursor.execute('UPDATE "' + cls._table + '" ' \
'SET sequence = sequence + 1 ' \
'WHERE ' + red_sql, red_ids)
- for todo in self.browse(ids):
+ for todo in todos:
if todo.calendar.owner \
and (todo.organizer == todo.calendar.owner.email \
or (todo.parent \
@@ -322,57 +325,59 @@ class Todo(ModelSQL, ModelView):
and x.email != todo.parent.organizer]
if attendee_emails:
with Transaction().set_user(0):
- todo_ids = self.search([
+ todo2s = cls.search([
('uuid', '=', todo.uuid),
('calendar.owner.email', 'in', attendee_emails),
('id', '!=', todo.id),
('recurrence', '=', todo.recurrence),
])
- for todo2 in self.browse(todo_ids):
+ for todo2 in todo2s:
if todo2.calendar.owner.email in attendee_emails:
attendee_emails.remove(todo2.calendar.owner.email)
with Transaction().set_user(0):
- self.write(todo_ids, self._todo2update(todo))
+ cls.write(todos, todo._todo2update())
if attendee_emails:
with Transaction().set_user(0):
- calendar_ids = calendar_obj.search([
+ calendars = Calendar.search([
('owner.email', 'in', attendee_emails),
])
if not todo.recurrence:
- for calendar_id in calendar_ids:
- new_id = self.copy(todo.id, default={
- 'calendar': calendar_id,
+ for calendar in calendars:
+ new_todo, = cls.copy([todo], default={
+ 'calendar': calendar.id,
'occurences': None,
+ 'uuid': todo.uuid,
})
for occurence in todo.occurences:
- self.copy(occurence.id, default={
- 'calendar': calendar_id,
- 'parent': new_id,
+ cls.copy([occurence], default={
+ 'calendar': calendar.id,
+ 'parent': new_todo.id,
+ 'uuid': occurence.uuid,
})
else:
- parent_ids = self.search([
+ parents = cls.search([
('uuid', '=', todo.uuid),
('calendar.owner.email', 'in',
attendee_emails),
('id', '!=', todo.id),
('recurrence', '=', None),
])
- for parent in self.browse(parent_ids):
- self.copy(todo.id, default={
+ for parent in parents:
+ cls.copy([todo], default={
'calendar': parent.calendar.id,
'parent': parent.id,
+ 'uuid': todo.uuid,
})
# Restart the cache for todo
- collection_obj.todo.reset()
- return res
+ Collection._todo_cache.clear()
- def delete(self, ids):
- attendee_obj = Pool().get('calendar.todo.attendee')
- collection_obj = Pool().get('webdav.collection')
+ @classmethod
+ def delete(cls, todos):
+ pool = Pool()
+ Attendee = pool.get('calendar.todo.attendee')
+ Collection = pool.get('webdav.collection')
- if isinstance(ids, (int, long)):
- ids = [ids]
- for todo in self.browse(ids):
+ for todo in todos:
if todo.calendar.owner \
and (todo.organizer == todo.calendar.owner.email \
or (todo.parent \
@@ -385,13 +390,13 @@ class Todo(ModelSQL, ModelView):
if x.email != todo.parent.organizer]
if attendee_emails:
with Transaction().set_user(0):
- todo_ids = self.search([
+ todos_delete = cls.search([
('uuid', '=', todo.uuid),
('calendar.owner.email', 'in', attendee_emails),
('id', '!=', todo.id),
('recurrence', '=', todo.recurrence),
])
- self.delete(todo_ids)
+ cls.delete(todos_delete)
elif todo.organizer \
or (todo.parent and todo.parent.organizer):
if todo.organizer:
@@ -399,62 +404,54 @@ class Todo(ModelSQL, ModelView):
else:
organizer = todo.parent.organizer
with Transaction().set_user(0):
- todo_ids = self.search([
+ todo2s = cls.search([
('uuid', '=', todo.uuid),
('calendar.owner.email', '=', organizer),
('id', '!=', todo.id),
('recurrence', '=', todo.recurrence),
], limit=1)
- if todo_ids:
- todo2 = self.browse(todo_ids[0])
+ if todo2s:
+ todo2, = todo2s
for attendee in todo2.attendees:
if attendee.email == todo.calendar.owner.email:
- attendee_obj.write(attendee.id, {
+ Attendee.write([attendee], {
'status': 'declined',
})
- res = super(Todo, self).delete(ids)
+ super(Todo, cls).delete(todos)
# Restart the cache for todo
- collection_obj.todo.reset()
- return res
-
- def copy(self, ids, default=None):
- int_id = isinstance(ids, (int, long))
- if int_id:
- ids = [ids]
+ Collection._todo_cache.clear()
+ @classmethod
+ def copy(cls, todos, default=None):
if default is None:
default = {}
- new_ids = []
- for todo_id in ids:
+ new_todos = []
+ for todo in todos:
current_default = default.copy()
- current_default['uuid'] = self.default_uuid()
- new_id = super(Todo, self).copy(todo_id, default=current_default)
- new_ids.append(new_id)
+ current_default.setdefault('uuid', cls.default_uuid())
+ new_todo, = super(Todo, cls).copy([todo], default=current_default)
+ new_todos.append(new_todo)
+ return new_todos
- if int_id:
- return new_ids[0]
- return new_ids
-
- def ical2values(self, todo_id, ical, calendar_id, vtodo=None):
+ @classmethod
+ def ical2values(cls, todo_id, ical, calendar_id, vtodo=None):
'''
- Convert iCalendar to values for create or write
-
- :param todo_id: the todo id for write or None for create
- :param ical: a ical instance of vobject
- :param calendar_id: the calendar id of the todo
- :param vtodo: the vtodo of the ical to use if None use the first one
- :return: a dictionary with values
+ Convert iCalendar to values for create or write with:
+ todo_id: the todo id for write or None for create
+ ical: a ical instance of vobject
+ calendar_id: the calendar id of the todo
+ vtodo: the vtodo of the ical to use if None use the first one
'''
pool = Pool()
- category_obj = pool.get('calendar.category')
- location_obj = pool.get('calendar.location')
- alarm_obj = pool.get('calendar.todo.alarm')
- attendee_obj = pool.get('calendar.todo.attendee')
- rdate_obj = pool.get('calendar.todo.rdate')
- exdate_obj = pool.get('calendar.todo.exdate')
- rrule_obj = pool.get('calendar.todo.rrule')
- exrule_obj = pool.get('calendar.todo.exrule')
+ Category = pool.get('calendar.category')
+ Location = pool.get('calendar.location')
+ Alarm = pool.get('calendar.todo.alarm')
+ Attendee = pool.get('calendar.todo.attendee')
+ Rdate = pool.get('calendar.todo.rdate')
+ Exdate = pool.get('calendar.todo.exdate')
+ Rrule = pool.get('calendar.todo.rrule')
+ Exrule = pool.get('calendar.todo.exrule')
vtodos = []
if not vtodo:
@@ -467,7 +464,7 @@ class Todo(ModelSQL, ModelView):
todo = None
if todo_id:
- todo = self.browse(todo_id)
+ todo = cls(todo_id)
res = {}
if not todo:
if hasattr(vtodo, 'uid'):
@@ -535,40 +532,39 @@ class Todo(ModelSQL, ModelView):
else:
res['status'] = ''
if hasattr(vtodo, 'categories'):
- category_ids = category_obj.search([
+ categories = Category.search([
('name', 'in', [x for x in vtodo.categories.value]),
])
- categories = category_obj.browse(category_ids)
category_names2ids = {}
for category in categories:
category_names2ids[category.name] = category.id
for category in vtodo.categories.value:
if category not in category_names2ids:
- category_ids.append(category_obj.create({
+ categories.append(Category.create({
'name': category,
}))
- res['categories'] = [('set', category_ids)]
+ res['categories'] = [('set', [c.id for c in categories])]
else:
res['categories'] = [('unlink_all',)]
if hasattr(vtodo, 'class'):
if getattr(vtodo, 'class').value.lower() in \
- dict(self.classification.selection):
+ dict(cls.classification.selection):
res['classification'] = getattr(vtodo, 'class').value.lower()
else:
res['classification'] = 'public'
else:
res['classification'] = 'public'
if hasattr(vtodo, 'location'):
- location_ids = location_obj.search([
+ locations = Location.search([
('name', '=', vtodo.location.value),
], limit=1)
- if not location_ids:
- location_id = location_obj.create({
+ if not locations:
+ location, = Location.create({
'name': vtodo.location.value,
})
else:
- location_id = location_ids[0]
- res['location'] = location_id
+ location, = locations
+ res['location'] = location.id
else:
res['location'] = None
@@ -590,7 +586,7 @@ class Todo(ModelSQL, ModelView):
if hasattr(vtodo, 'attendee'):
while vtodo.attendee_list:
attendee = vtodo.attendee_list.pop()
- vals = attendee_obj.attendee2values(attendee)
+ vals = Attendee.attendee2values(attendee)
if vals['email'] in attendees_todel:
res['attendees'].append(('write',
attendees_todel[vals['email']], vals))
@@ -606,7 +602,7 @@ class Todo(ModelSQL, ModelView):
while vtodo.rdate_list:
rdate = vtodo.rdate_list.pop()
for date in rdate.value:
- vals = rdate_obj.date2values(date)
+ vals = Rdate.date2values(date)
res['rdates'].append(('create', vals))
res['exdates'] = []
@@ -616,7 +612,7 @@ class Todo(ModelSQL, ModelView):
while vtodo.exdate_list:
exdate = vtodo.exdate_list.pop()
for date in exdate.value:
- vals = exdate_obj.date2values(date)
+ vals = Exdate.date2values(date)
res['exdates'].append(('create', vals))
res['rrules'] = []
@@ -625,7 +621,7 @@ class Todo(ModelSQL, ModelView):
if hasattr(vtodo, 'rrule'):
while vtodo.rrule_list:
rrule = vtodo.rrule_list.pop()
- vals = rrule_obj.rule2values(rrule)
+ vals = Rrule.rule2values(rrule)
res['rrules'].append(('create', vals))
res['exrules'] = []
@@ -634,7 +630,7 @@ class Todo(ModelSQL, ModelView):
if hasattr(vtodo, 'exrule'):
while vtodo.exrule_list:
exrule = vtodo.exrule_list.pop()
- vals = exrule_obj.rule2values(exrule)
+ vals = Exrule.rule2values(exrule)
res['exrules'].append(('create', vals))
if todo:
@@ -644,7 +640,7 @@ class Todo(ModelSQL, ModelView):
res.setdefault('alarms', [])
while vtodo.valarm_list:
valarm = vtodo.valarm_list.pop()
- vals = alarm_obj.valarm2values(valarm)
+ vals = Alarm.valarm2values(valarm)
res['alarms'].append(('create', vals))
if hasattr(ical, 'vtimezone'):
@@ -668,7 +664,7 @@ class Todo(ModelSQL, ModelView):
== vtodo.recurrence_id.value:
todo_id = occurence.id
occurences_todel.remove(occurence.id)
- vals = self.ical2values(todo_id, ical, calendar_id, vtodo=vtodo)
+ vals = cls.ical2values(todo_id, ical, calendar_id, vtodo=vtodo)
if todo:
vals['uuid'] = todo.uuid
else:
@@ -683,361 +679,326 @@ class Todo(ModelSQL, ModelView):
res['occurences'].append(('delete', occurences_todel))
return res
- def todo2ical(self, todo):
+ def todo2ical(self):
'''
Return an iCalendar instance of vobject for todo
-
- :param todo: a BrowseRecord of calendar.todo
- or a calendar.todo id
- :return: an iCalendar instance of vobject
'''
pool = Pool()
- user_obj = pool.get('res.user')
- alarm_obj = pool.get('calendar.todo.alarm')
- attendee_obj = pool.get('calendar.todo.attendee')
- rdate_obj = pool.get('calendar.todo.rdate')
- exdate_obj = pool.get('calendar.todo.exdate')
- rrule_obj = pool.get('calendar.todo.rrule')
- exrule_obj = pool.get('calendar.todo.exrule')
-
- if isinstance(todo, (int, long)):
- todo = self.browse(todo)
-
- user = user_obj.browse(Transaction().user)
- if todo.timezone:
- tztodo = pytz.timezone(todo.timezone)
+ User = pool.get('res.user')
+
+ user = User(Transaction().user)
+ if self.timezone:
+ tztodo = dateutil.tz.gettz(self.timezone)
elif user.timezone:
- tztodo = pytz.timezone(user.timezone)
+ tztodo = dateutil.tz.gettz(user.timezone)
else:
tztodo = tzlocal
ical = vobject.iCalendar()
vtodo = ical.add('vtodo')
- if todo.vtodo:
- ical.vtodo = vobject.readOne(str(todo.vtodo))
+ if self.vtodo:
+ ical.vtodo = vobject.readOne(str(self.vtodo))
vtodo = ical.vtodo
ical.vtodo.transformToNative()
- if todo.summary:
+ if self.summary:
if not hasattr(vtodo, 'summary'):
vtodo.add('summary')
- vtodo.summary.value = todo.summary
+ vtodo.summary.value = self.summary
elif hasattr(vtodo, 'summary'):
del vtodo.summary
- if todo.percent_complete:
+ if self.percent_complete:
if not hasattr(vtodo, 'percent-complete'):
vtodo.add('percent-complete')
- vtodo.percent_complete.value = str(todo.percent_complete)
+ vtodo.percent_complete.value = str(self.percent_complete)
elif hasattr(vtodo, 'percent_complete'):
del vtodo.percent_complete
- if todo.description:
+ if self.description:
if not hasattr(vtodo, 'description'):
vtodo.add('description')
- vtodo.description.value = todo.description
+ vtodo.description.value = self.description
elif hasattr(vtodo, 'description'):
del vtodo.description
- if todo.completed:
+ if self.completed:
if not hasattr(vtodo, 'completed'):
vtodo.add('completed')
- vtodo.completed.value = todo.completed.replace(tzinfo=tzlocal)\
+ vtodo.completed.value = self.completed.replace(tzinfo=tzlocal)\
.astimezone(tzutc)
elif hasattr(vtodo, 'completed'):
del vtodo.completed
- if todo.dtstart:
+ if self.dtstart:
if not hasattr(vtodo, 'dtstart'):
vtodo.add('dtstart')
- vtodo.dtstart.value = todo.dtstart.replace(tzinfo=tzlocal)\
+ vtodo.dtstart.value = self.dtstart.replace(tzinfo=tzlocal)\
.astimezone(tztodo)
elif hasattr(vtodo, 'dtstart'):
del vtodo.dtstart
- if todo.due:
+ if self.due:
if not hasattr(vtodo, 'due'):
vtodo.add('due')
- vtodo.due.value = todo.due.replace(tzinfo=tzlocal)\
+ vtodo.due.value = self.due.replace(tzinfo=tzlocal)\
.astimezone(tztodo)
elif hasattr(vtodo, 'due'):
del vtodo.due
if not hasattr(vtodo, 'created'):
vtodo.add('created')
- vtodo.created.value = todo.create_date.replace(
+ vtodo.created.value = self.create_date.replace(
tzinfo=tzlocal).astimezone(tztodo)
if not hasattr(vtodo, 'dtstamp'):
vtodo.add('dtstamp')
- date = todo.write_date or todo.create_date
+ date = self.write_date or self.create_date
vtodo.dtstamp.value = date.replace(tzinfo=tzlocal).astimezone(tztodo)
if not hasattr(vtodo, 'last-modified'):
vtodo.add('last-modified')
vtodo.last_modified.value = date.replace(
tzinfo=tzlocal).astimezone(tztodo)
- if todo.recurrence and todo.parent:
+ if self.recurrence and self.parent:
if not hasattr(vtodo, 'recurrence-id'):
vtodo.add('recurrence-id')
- vtodo.recurrence_id.value = todo.recurrence\
+ vtodo.recurrence_id.value = self.recurrence\
.replace(tzinfo=tzlocal).astimezone(tztodo)
elif hasattr(vtodo, 'recurrence-id'):
del vtodo.recurrence_id
- if todo.status:
+ if self.status:
if not hasattr(vtodo, 'status'):
vtodo.add('status')
- vtodo.status.value = todo.status.upper()
+ vtodo.status.value = self.status.upper()
elif hasattr(vtodo, 'status'):
del vtodo.status
if not hasattr(vtodo, 'uid'):
vtodo.add('uid')
- vtodo.uid.value = todo.uuid
+ vtodo.uid.value = self.uuid
if not hasattr(vtodo, 'sequence'):
vtodo.add('sequence')
- vtodo.sequence.value = str(todo.sequence) or '0'
- if todo.categories:
+ vtodo.sequence.value = str(self.sequence) or '0'
+ if self.categories:
if not hasattr(vtodo, 'categories'):
vtodo.add('categories')
- vtodo.categories.value = [x.name for x in todo.categories]
+ vtodo.categories.value = [x.name for x in self.categories]
elif hasattr(vtodo, 'categories'):
del vtodo.categories
if not hasattr(vtodo, 'class'):
vtodo.add('class')
- getattr(vtodo, 'class').value = todo.classification.upper()
+ getattr(vtodo, 'class').value = self.classification.upper()
elif getattr(vtodo, 'class').value.lower() in \
dict(self.classification.selection):
- getattr(vtodo, 'class').value = todo.classification.upper()
- if todo.location:
+ getattr(vtodo, 'class').value = self.classification.upper()
+ if self.location:
if not hasattr(vtodo, 'location'):
vtodo.add('location')
- vtodo.location.value = todo.location.name
+ vtodo.location.value = self.location.name
elif hasattr(vtodo, 'location'):
del vtodo.location
- if todo.organizer:
+ if self.organizer:
if not hasattr(vtodo, 'organizer'):
vtodo.add('organizer')
- vtodo.organizer.value = 'MAILTO:' + todo.organizer
+ vtodo.organizer.value = 'MAILTO:' + self.organizer
elif hasattr(vtodo, 'organizer'):
del vtodo.organizer
vtodo.attendee_list = []
- for attendee in todo.attendees:
- vtodo.attendee_list.append(
- attendee_obj.attendee2attendee(attendee))
+ for attendee in self.attendees:
+ vtodo.attendee_list.append(attendee.attendee2attendee())
- if todo.rdates:
+ if self.rdates:
vtodo.add('rdate')
vtodo.rdate.value = []
- for rdate in todo.rdates:
- vtodo.rdate.value.append(rdate_obj.date2date(rdate))
+ for rdate in self.rdates:
+ vtodo.rdate.value.append(rdate.date2date())
- if todo.exdates:
+ if self.exdates:
vtodo.add('exdate')
vtodo.exdate.value = []
- for exdate in todo.exdates:
- vtodo.exdate.value.append(exdate_obj.date2date(exdate))
+ for exdate in self.exdates:
+ vtodo.exdate.value.append(exdate.date2date())
- if todo.rrules:
- for rrule in todo.rrules:
- vtodo.add('rrule').value = rrule_obj.rule2rule(rrule)
+ if self.rrules:
+ for rrule in self.rrules:
+ vtodo.add('rrule').value = rrule.rule2rule()
- if todo.exrules:
- for exrule in todo.exrules:
- vtodo.add('exrule').value = exrule_obj.rule2rule(exrule)
+ if self.exrules:
+ for exrule in self.exrules:
+ vtodo.add('exrule').value = exrule.rule2rule()
vtodo.valarm_list = []
- for alarm in todo.alarms:
- valarm = alarm_obj.alarm2valarm(alarm)
+ for alarm in self.alarms:
+ valarm = alarm.alarm2valarm()
if valarm:
vtodo.valarm_list.append(valarm)
- for occurence in todo.occurences:
+ for occurence in self.occurences:
rical = self.todo2ical(occurence)
ical.vtodo_list.append(rical.vtodo)
return ical
-Todo()
-
class TodoCategory(ModelSQL):
'Todo - Category'
- _description = __doc__
- _name = 'calendar.todo-calendar.category'
-
+ __name__ = 'calendar.todo-calendar.category'
todo = fields.Many2One('calendar.todo', 'To-Do', ondelete='CASCADE',
required=True, select=True)
category = fields.Many2One('calendar.category', 'Category',
ondelete='CASCADE', required=True, select=True)
-TodoCategory()
-
class TodoRDate(ModelSQL, ModelView):
'Todo Recurrence Date'
- _description = __doc__
- _name = 'calendar.todo.rdate'
+ __name__ = 'calendar.todo.rdate'
_inherits = {'calendar.date': 'calendar_date'}
_rec_name = 'datetime'
-
calendar_date = fields.Many2One('calendar.date', 'Calendar Date',
required=True, ondelete='CASCADE', select=True)
todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
select=True, required=True)
- def init(self, module_name):
+ @classmethod
+ def __register__(cls, module_name):
cursor = Transaction().cursor
# Migration from 1.4: calendar_rdate renamed to calendar_date
- table = TableHandler(cursor, self, module_name)
+ table = TableHandler(cursor, cls, module_name)
old_column = 'calendar_rdate'
if table.column_exist(old_column):
table.column_rename(old_column, 'calendar_date')
- return super(TodoRDate, self).init(module_name)
+ super(TodoRDate, cls).__register__(module_name)
- def create(self, values):
- todo_obj = Pool().get('calendar.todo')
+ @classmethod
+ def create(cls, values):
+ Todo = Pool().get('calendar.todo')
if values.get('todo'):
# Update write_date of todo
- todo_obj.write(values['todo'], {})
- return super(TodoRDate, self).create(values)
-
- def write(self, ids, values):
- todo_obj = Pool().get('calendar.todo')
- if isinstance(ids, (int, long)):
- ids = [ids]
- todo_ids = [x.todo.id for x in self.browse(ids)]
+ Todo.write([Todo(values['todo'])], {})
+ return super(TodoRDate, cls).create(values)
+
+ @classmethod
+ def write(cls, rdates, values):
+ Todo = Pool().get('calendar.todo')
+ todos = [x.todo for x in rdates]
if values.get('todo'):
- todo_ids.append(values['todo'])
- if todo_ids:
+ todos.append(Todo(values['todo']))
+ if todos:
# Update write_date of todo
- todo_obj.write(todo_ids, {})
- return super(TodoRDate, self).write(ids, values)
-
- def delete(self, ids):
- todo_obj = Pool().get('calendar.todo')
- rdate_obj = Pool().get('calendar.date')
- if isinstance(ids, (int, long)):
- ids = [ids]
- todo_rdates = self.browse(ids)
- rdate_ids = [a.calendar_date.id for a in todo_rdates]
- todo_ids = [x.todo.id for x in todo_rdates]
- if todo_ids:
- # Update write_date of todo
- todo_obj.write(todo_ids, {})
- res = super(TodoRDate, self).delete(ids)
- if rdate_ids:
- rdate_obj.delete(rdate_ids)
- return res
+ Todo.write(todos, {})
+ super(TodoRDate, cls).write(rdates, values)
- def _date2update(self, date):
- date_obj = Pool().get('calendar.date')
- return date_obj._date2update(date)
+ @classmethod
+ def delete(cls, todo_rdates):
+ pool = Pool()
+ Todo = pool.get('calendar.todo')
+ Rdate = pool.get('calendar.date')
+ rdates = [a.calendar_date for a in todo_rdates]
+ todos = [x.todo for x in todo_rdates]
+ if todos:
+ # Update write_date of todo
+ Todo.write(todos, {})
+ super(TodoRDate, cls).delete(todo_rdates)
+ if rdates:
+ Rdate.delete(rdates)
- def date2values(self, date):
- date_obj = Pool().get('calendar.date')
- return date_obj.date2values(date)
+ def _date2update(self):
+ return self.calendar_date._date2update()
- def date2date(self, date):
- date_obj = Pool().get('calendar.date')
- return date_obj.date2date(date)
+ @classmethod
+ def date2values(cls, date):
+ Date = Pool().get('calendar.date')
+ return Date.date2values(date.calendar_date)
-TodoRDate()
+ @classmethod
+ def date2date(cls, date):
+ Date = Pool().get('calendar.date')
+ return Date.date2date(date.calendar_date)
class TodoRRule(ModelSQL, ModelView):
'Recurrence Rule'
- _description = __doc__
- _name = 'calendar.todo.rrule'
+ __name__ = 'calendar.todo.rrule'
_inherits = {'calendar.rrule': 'calendar_rrule'}
_rec_name = 'freq'
-
calendar_rrule = fields.Many2One('calendar.rrule', 'Calendar RRule',
required=True, ondelete='CASCADE', select=True)
todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
select=True, required=True)
- def create(self, values):
- todo_obj = Pool().get('calendar.todo')
+ @classmethod
+ def create(cls, values):
+ Todo = Pool().get('calendar.todo')
if values.get('todo'):
# Update write_date of todo
- todo_obj.write(values['todo'], {})
- return super(TodoRRule, self).create(values)
-
- def write(self, ids, values):
- todo_obj = Pool().get('calendar.todo')
- if isinstance(ids, (int, long)):
- ids = [ids]
- todo_ids = [x.todo.id for x in self.browse(ids)]
+ Todo.write([Todo(values['todo'])], {})
+ return super(TodoRRule, cls).create(values)
+
+ @classmethod
+ def write(cls, todo_rrules, values):
+ Todo = Pool().get('calendar.todo')
+ todos = [x.todo for x in todo_rrules]
if values.get('todo'):
- todo_ids.append(values['todo'])
- if todo_ids:
- # Update write_date of todo
- todo_obj.write(todo_ids, {})
- return super(TodoRRule, self).write(ids, values)
-
- def delete(self, ids):
- todo_obj = Pool().get('calendar.todo')
- rrule_obj = Pool().get('calendar.rrule')
- if isinstance(ids, (int, long)):
- ids = [ids]
- todo_rrules = self.browse(ids)
- rrule_ids = [a.calendar_rrule.id for a in todo_rrules]
- todo_ids = [x.todo.id for x in todo_rrules]
- if todo_ids:
+ todos.append(Todo(values['todo']))
+ if todos:
# Update write_date of todo
- todo_obj.write(todo_ids, {})
- res = super(TodoRRule, self).delete(ids)
- if rrule_ids:
- rrule_obj.delete(rrule_ids)
- return res
+ Todo.write(todos, {})
+ super(TodoRRule, cls).write(todo_rrules, values)
- def _rule2update(self, rule):
- rule_obj = Pool().get('calendar.rrule')
- return rule_obj._rule2update(rule)
+ @classmethod
+ def delete(cls, todo_rrules):
+ pool = Pool()
+ Todo = pool.get('calendar.todo')
+ Rrule = pool.get('calendar.rrule')
+ rrules = [a.calendar_rrule for a in todo_rrules]
+ todos = [x.todo for x in todo_rrules]
+ if todos:
+ # Update write_date of todo
+ Todo.write(todos, {})
+ super(TodoRRule, cls).delete(todo_rrules)
+ if rrules:
+ Rrule.delete(rrules)
- def rule2values(self, rule):
- rule_obj = Pool().get('calendar.rrule')
- return rule_obj.rule2values(rule)
+ def _rule2update(self):
+ return self.calendar_rrule._rule2update()
- def rule2rule(self, rule):
- rule_obj = Pool().get('calendar.rrule')
- return rule_obj.rule2rule(rule)
+ @classmethod
+ def rule2values(cls, rule):
+ Rule = Pool().get('calendar.rrule')
+ return Rule.rule2values(rule.calendar_rrule)
-TodoRRule()
+ @classmethod
+ def rule2rule(cls, rule):
+ Rule = Pool().get('calendar.rrule')
+ return Rule.rule2rule(rule.calendar_rrule)
class TodoExDate(TodoRDate):
'Exception Date'
- _description = __doc__
- _name = 'calendar.todo.exdate'
-
-TodoExDate()
+ __name__ = 'calendar.todo.exdate'
+ _table = 'calendar_todo_exdate' # Needed to override TodoRDate._table
class TodoExRule(TodoRRule):
'Exception Rule'
- _description = __doc__
- _name = 'calendar.todo.exrule'
-
-TodoExRule()
+ __name__ = 'calendar.todo.exrule'
+ _table = 'calendar_todo_exrule' # Needed to override TodoRRule._table
class TodoAttendee(ModelSQL, ModelView):
'Attendee'
- _description = __doc__
- _name = 'calendar.todo.attendee'
+ __name__ = 'calendar.todo.attendee'
_inherits = {'calendar.attendee': 'calendar_attendee'}
-
calendar_attendee = fields.Many2One('calendar.attendee',
'Calendar Attendee', required=True, ondelete='CASCADE', select=True)
todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
required=True, select=True)
- def create(self, values):
- todo_obj = Pool().get('calendar.todo')
+ @classmethod
+ def create(cls, values):
+ Todo = Pool().get('calendar.todo')
if values.get('todo'):
# Update write_date of todo
- todo_obj.write(values['todo'], {})
- res = super(TodoAttendee, self).create(values)
- attendee = self.browse(res)
+ Todo.write([Todo(values['todo'])], {})
+ attendee = super(TodoAttendee, cls).create(values)
todo = attendee.todo
if (todo.calendar.owner
and (todo.organizer == todo.calendar.owner.email
@@ -1052,36 +1013,34 @@ class TodoAttendee(ModelSQL, ModelView):
if x.email != todo.parent.organizer]
if attendee_emails:
with Transaction().set_user(0):
- todo_ids = todo_obj.search([
+ todos = Todo.search([
('uuid', '=', todo.uuid),
('calendar.owner.email', 'in', attendee_emails),
('id', '!=', todo.id),
('recurrence', '=', todo.recurrence),
])
- for todo_id in todo_ids:
- self.copy(res, default={
- 'todo': todo_id,
+ for todo in todos:
+ cls.copy([attendee], default={
+ 'todo': todo.id,
})
- return res
+ return attendee
- def write(self, ids, values):
- todo_obj = Pool().get('calendar.todo')
+ @classmethod
+ def write(cls, attendees, values):
+ Todo = Pool().get('calendar.todo')
- if isinstance(ids, (int, long)):
- ids = [ids]
- todo_ids = [x.todo.id for x in self.browse(ids)]
+ todos = [x.todo.id for x in attendees]
if values.get('todo'):
- todo_ids.append(values['todo'])
- if todo_ids:
+ todos.append(Todo(values['todo']))
+ if todos:
# Update write_date of todo
- todo_obj.write(todo_ids, {})
+ Todo.write(todos, {})
if 'email' in values:
values = values.copy()
del values['email']
- res = super(TodoAttendee, self).write(ids, values)
- attendees = self.browse(ids)
+ super(TodoAttendee, cls).write(attendees, values)
for attendee in attendees:
todo = attendee.todo
if todo.calendar.owner \
@@ -1096,7 +1055,7 @@ class TodoAttendee(ModelSQL, ModelView):
if x.email != todo.parent.organizer]
if attendee_emails:
with Transaction().set_user(0):
- attendee_ids = self.search([
+ attendees2 = cls.search([
('todo.uuid', '=', todo.uuid),
('todo.calendar.owner.email', 'in',
attendee_emails),
@@ -1104,25 +1063,21 @@ class TodoAttendee(ModelSQL, ModelView):
('todo.recurrence', '=', todo.recurrence),
('email', '=', attendee.email),
])
- self.write(attendee_ids, self._attendee2update(
- attendee))
- return res
+ cls.write(attendees2, attendee._attendee2update())
+
+ @classmethod
+ def delete(cls, todo_attendees):
+ pool = Pool()
+ Todo = pool.get('calendar.todo')
+ Attendee = pool.get('calendar.attendee')
- def delete(self, ids):
- todo_obj = Pool().get('calendar.todo')
- attendee_obj = Pool().get('calendar.attendee')
-
- if isinstance(ids, (int, long)):
- ids = [ids]
- todo_attendees = self.browse(ids)
- calendar_attendee_ids = [a.calendar_attendee.id \
- for a in todo_attendees]
- todo_ids = [x.todo.id for x in todo_attendees]
- if todo_ids:
+ calendar_attendees = [a.calendar_attendee for a in todo_attendees]
+ todos = [x.todo for x in todo_attendees]
+ if todos:
# Update write_date of todo
- todo_obj.write(todo_ids, {})
+ Todo.write(todos, {})
- for attendee in self.browse(ids):
+ for attendee in todo_attendees:
todo = attendee.todo
if todo.calendar.owner \
and (todo.organizer == todo.calendar.owner.email \
@@ -1136,7 +1091,7 @@ class TodoAttendee(ModelSQL, ModelView):
if x.email != todo.parent.organizer]
if attendee_emails:
with Transaction().set_user(0):
- attendee_ids = self.search([
+ attendees = cls.search([
('todo.uuid', '=', todo.uuid),
('todo.calendar.owner.email', 'in',
attendee_emails),
@@ -1144,7 +1099,7 @@ class TodoAttendee(ModelSQL, ModelView):
('todo.recurrence', '=', todo.recurrence),
('email', '=', attendee.email),
])
- self.delete(attendee_ids)
+ cls.delete(attendees)
elif todo.calendar.organizer \
and ((todo.organizer \
or (todo.parent and todo.parent.organizer)) \
@@ -1154,110 +1109,98 @@ class TodoAttendee(ModelSQL, ModelView):
else:
organizer = todo.parent.organizer
with Transaction().set_user(0):
- attendee_ids = self.search([
+ attendees = cls.search([
('todo.uuid', '=', todo.uuid),
('todo.calendar.owner.email', '=', organizer),
('id', '!=', attendee.id),
('todo.recurrence', '=', todo.recurrence),
('email', '=', attendee.email),
])
- if attendee_ids:
- self.write(attendee_ids, {
+ if attendees:
+ cls.write(attendees, {
'status': 'declined',
})
- res = super(TodoAttendee, self).delete(ids)
- if calendar_attendee_ids:
- attendee_obj.delete(calendar_attendee_ids)
- return res
+ super(TodoAttendee, cls).delete(todo_attendees)
+ if calendar_attendees:
+ Attendee.delete(calendar_attendees)
- def copy(self, ids, default=None):
- attendee_obj = Pool().get('calendar.attendee')
+ @classmethod
+ def copy(cls, todo_attendees, default=None):
+ Attendee = Pool().get('calendar.attendee')
- int_id = False
- if isinstance(ids, (int, long)):
- int_id = True
- ids = [ids]
if default is None:
default = {}
default = default.copy()
- new_ids = []
- for attendee in self.browse(ids):
- default['calendar_attendee'] = attendee_obj.copy(
- attendee.calendar_attendee.id)
- new_id = super(TodoAttendee, self).copy(attendee.id,
- default=default)
- new_ids.append(new_id)
- if int_id:
- return new_ids[0]
- return new_ids
-
- def _attendee2update(self, attendee):
- attendee_obj = Pool().get('calendar.attendee')
- return attendee_obj._attendee2update(attendee)
+ new_attendees = []
+ for attendee in todo_attendees:
+ default['calendar_attendee'], = Attendee.copy(
+ [attendee.calendar_attendee])
+ new_attendee, = super(TodoAttendee, cls).copy([attendee],
+ default=default)
+ new_attendees.append(new_attendee)
+ return new_attendees
- def attendee2values(self, attendee):
- attendee_obj = Pool().get('calendar.attendee')
- return attendee_obj.attendee2values(attendee)
+ def _attendee2update(self):
+ return self.calendar_attendee._attendee2update()
- def attendee2attendee(self, attendee):
- attendee_obj = Pool().get('calendar.attendee')
- return attendee_obj.attendee2attendee(attendee)
+ @classmethod
+ def attendee2values(cls, attendee):
+ Attendee = Pool().get('calendar.attendee')
+ return Attendee.attendee2values(attendee.calendar_attendee)
-TodoAttendee()
+ @classmethod
+ def attendee2attendee(cls, attendee):
+ Attendee = Pool().get('calendar.attendee')
+ return Attendee.attendee2attendee(attendee.calendar_attendee)
class TodoAlarm(ModelSQL):
'Alarm'
- _description = __doc__
- _name = 'calendar.todo.alarm'
+ __name__ = 'calendar.todo.alarm'
_inherits = {'calendar.alarm': 'calendar_alarm'}
-
calendar_alarm = fields.Many2One('calendar.alarm', 'Calendar Alarm',
required=True, ondelete='CASCADE', select=True)
todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
required=True, select=True)
- def create(self, values):
- todo_obj = Pool().get('calendar.todo')
+ @classmethod
+ def create(cls, values):
+ Todo = Pool().get('calendar.todo')
if values.get('todo'):
# Update write_date of todo
- todo_obj.write(values['todo'], {})
- return super(TodoAlarm, self).create(values)
-
- def write(self, ids, values):
- todo_obj = Pool().get('calendar.todo')
- if isinstance(ids, (int, long)):
- ids = [ids]
- todo_ids = [x.todo.id for x in self.browse(ids)]
+ Todo.write([Todo(values['todo'])], {})
+ return super(TodoAlarm, cls).create(values)
+
+ @classmethod
+ def write(cls, alarms, values):
+ Todo = Pool().get('calendar.todo')
+ todos = [x.todo for x in alarms]
if values.get('todo'):
- todo_ids.append(values['todo'])
- if todo_ids:
+ todos.append(Todo(values['todo']))
+ if todos:
# Update write_date of todo
- todo_obj.write(todo_ids, {})
- return super(TodoAlarm, self).write(ids, values)
-
- def delete(self, ids):
- todo_obj = Pool().get('calendar.todo')
- alarm_obj = Pool().get('calendar.alarm')
- if isinstance(ids, (int, long)):
- ids = [ids]
- todo_alarms = self.browse(ids)
- alarm_ids = [a.calendar_alarm.id for a in todo_alarms]
- todo_ids = [x.todo.id for x in todo_alarms]
- if todo_ids:
+ Todo.write(todos, {})
+ super(TodoAlarm, cls).write(alarms, values)
+
+ @classmethod
+ def delete(cls, todo_alarms):
+ pool = Pool()
+ Todo = pool.get('calendar.todo')
+ Alarm = pool.get('calendar.alarm')
+ alarms = [a.calendar_alarm for a in todo_alarms]
+ todos = [x.todo for x in todo_alarms]
+ if todos:
# Update write_date of todo
- todo_obj.write(todo_ids, {})
- res = super(TodoAlarm, self).delete(ids)
- if alarm_ids:
- alarm_obj.delete(alarm_ids)
- return res
+ Todo.write(todos, {})
+ super(TodoAlarm, cls).delete(todo_alarms)
+ if alarms:
+ Alarm.delete(alarms)
- def valarm2values(self, alarm):
- alarm_obj = Pool().get('calendar.alarm')
- return alarm_obj.valarm2values(alarm)
+ @classmethod
+ def valarm2values(cls, alarm):
+ Alarm = Pool().get('calendar.alarm')
+ return Alarm.valarm2values(alarm.calendar_alarm)
def alarm2valarm(self, alarm):
- alarm_obj = Pool().get('calendar.alarm')
- return alarm_obj.alarm2valarm(alarm)
-
-TodoAlarm()
+ Alarm = Pool().get('calendar.alarm')
+ return Alarm.alarm2valarm(alarm.calendar_alarm)
diff --git a/tryton.cfg b/tryton.cfg
new file mode 100644
index 0000000..2c4b4f3
--- /dev/null
+++ b/tryton.cfg
@@ -0,0 +1,9 @@
+[tryton]
+version=2.6.0
+depends:
+ calendar
+ ir
+ res
+ webdav
+xml:
+ todo.xml
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index 7546ef5..c684d79 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,13 +1,49 @@
Metadata-Version: 1.0
Name: trytond-calendar-todo
-Version: 2.4.2
-Summary: Add Todo support on CalDAV
+Version: 2.6.0
+Summary: Tryton module to add TODO on CalDAV
Home-page: http://www.tryton.org/
-Author: B2CK
-Author-email: info at b2ck.com
+Author: Tryton
+Author-email: UNKNOWN
License: GPL-3
-Download-URL: http://downloads.tryton.org/2.4/
-Description: UNKNOWN
+Download-URL: http://downloads.tryton.org/2.6/
+Description: trytond_calendar_todo
+ =====================
+
+ The calendar_todo module of the Tryton application platform. See
+ __tryton__.py
+
+ Installing
+ ----------
+
+ See INSTALL
+
+ Support
+ -------
+
+ If you encounter any problems with Tryton, please don't hesitate to ask
+ questions on the Tryton bug tracker, mailing list, wiki or IRC channel:
+
+ http://bugs.tryton.org/
+ http://groups.tryton.org/
+ http://wiki.tryton.org/
+ irc://irc.freenode.net/tryton
+
+ License
+ -------
+
+ See LICENSE
+
+ Copyright
+ ---------
+
+ See COPYRIGHT
+
+
+ For more information please visit the Tryton web site:
+
+ http://www.tryton.org/
+
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Plugins
diff --git a/trytond_calendar_todo.egg-info/SOURCES.txt b/trytond_calendar_todo.egg-info/SOURCES.txt
index 79ef172..a150cbb 100644
--- a/trytond_calendar_todo.egg-info/SOURCES.txt
+++ b/trytond_calendar_todo.egg-info/SOURCES.txt
@@ -6,8 +6,8 @@ MANIFEST.in
README
setup.py
todo.xml
+tryton.cfg
./__init__.py
-./__tryton__.py
./caldav.py
./todo.py
./webdav.py
diff --git a/trytond_calendar_todo.egg-info/requires.txt b/trytond_calendar_todo.egg-info/requires.txt
index f65a590..466ce88 100644
--- a/trytond_calendar_todo.egg-info/requires.txt
+++ b/trytond_calendar_todo.egg-info/requires.txt
@@ -2,5 +2,5 @@ vobject >= 0.8.0
PyWebDAV >= 0.9.8
python-dateutil
pytz
-trytond_calendar >= 2.4, < 2.5
-trytond >= 2.4, < 2.5
\ No newline at end of file
+trytond_calendar >= 2.6, < 2.7
+trytond >= 2.6, < 2.7
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index 0999191..b3ea843 100644
--- a/webdav.py
+++ b/webdav.py
@@ -3,36 +3,33 @@
import vobject
import urllib
from pywebdav.lib.errors import DAV_NotFound, DAV_Forbidden
-from trytond.model import ModelView, ModelSQL
from trytond.tools import reduce_ids
from trytond.transaction import Transaction
from trytond.cache import Cache
-from trytond.pool import Pool
+from trytond.pool import Pool, PoolMeta
+__all__ = ['Collection']
+__metaclass__ = PoolMeta
-class Collection(ModelSQL, ModelView):
- _name = "webdav.collection"
+class Collection:
+ __name__ = "webdav.collection"
+ _todo_cache = Cache('webdav_collection.todo')
- @Cache('webdav_collection.todo')
- def todo(self, uri, calendar_id=False):
+ @classmethod
+ def todo(cls, uri, calendar_id=False):
'''
Return the todo id in the uri
-
- :param uri: the uri
- :param calendar_id: the calendar id
- :return: todo id
- or None if there is no todo
'''
- todo_obj = Pool().get('calendar.todo')
+ Todo = Pool().get('calendar.todo')
if uri and uri.startswith('Calendars/'):
calendar, todo_uri = (uri[10:].split('/', 1) + [None])[0:2]
if not calendar_id:
- calendar_id = self.calendar(uri)
+ calendar_id = cls.calendar(uri)
if not calendar_id:
return None
- todo_ids = todo_obj.search([
+ todo_ids = Todo.search([
('calendar', '=', calendar_id),
('uuid', '=', todo_uri[:-4]),
('parent', '=', None),
@@ -40,12 +37,10 @@ class Collection(ModelSQL, ModelView):
if todo_ids:
return todo_ids[0]
- def _caldav_filter_domain_todo(self, filter):
+ @classmethod
+ def _caldav_filter_domain_todo(cls, filter):
'''
Return a domain for caldav filter on todo
-
- :param filter: the DOM Element of filter
- :return: a list for domain
'''
res = []
if not filter:
@@ -98,78 +93,81 @@ class Collection(ModelSQL, ModelView):
continue
if uri:
uri = urllib.unquote_plus(uri)
- todo_id = self.todo(uri)
+ todo_id = cls.todo(uri)
if todo_id:
ids.append(todo_id)
return [('id', 'in', ids)]
return res
- def get_childs(self, uri, filter=None, cache=None):
- todo_obj = Pool().get('calendar.todo')
+ @classmethod
+ def get_childs(cls, uri, filter=None, cache=None):
+ Todo = Pool().get('calendar.todo')
- res = super(Collection, self).get_childs(uri, filter=filter,
+ res = super(Collection, cls).get_childs(uri, filter=filter,
cache=cache)
if uri and (uri not in ('Calendars', 'Calendars/')) and \
uri.startswith('Calendars/'):
- calendar_id = self.calendar(uri)
+ calendar_id = cls.calendar(uri)
if calendar_id and not (uri[10:].split('/', 1) + [None])[1]:
- domain = self._caldav_filter_domain_todo(filter)
- todo_ids = todo_obj.search([
+ domain = cls._caldav_filter_domain_todo(filter)
+ todos = Todo.search([
('calendar', '=', calendar_id),
domain,
])
- todos = todo_obj.browse(todo_ids)
if cache is not None:
cache.setdefault('_calendar', {})
- cache['_calendar'].setdefault(todo_obj._name, {})
- for todo_id in todo_ids:
- cache['_calendar'][todo_obj._name][todo_id] = {}
+ cache['_calendar'].setdefault(Todo.__name__, {})
+ for todo in todos:
+ cache['_calendar'][Todo.__name__][todo.id] = {}
return res + [x.uuid + '.ics' for x in todos]
return res
- def get_resourcetype(self, uri, cache=None):
+ @classmethod
+ def get_resourcetype(cls, uri, cache=None):
from DAV.constants import COLLECTION, OBJECT
if uri in ('Calendars', 'Calendars/'):
return COLLECTION
- calendar_id = self.calendar(uri)
+ calendar_id = cls.calendar(uri)
if calendar_id:
if not (uri[10:].split('/', 1) + [None])[1]:
return COLLECTION
- if self.todo(uri, calendar_id=calendar_id):
+ if cls.todo(uri, calendar_id=calendar_id):
return OBJECT
- elif self.calendar(uri, ics=True):
+ elif cls.calendar(uri, ics=True):
return OBJECT
- return super(Collection, self).get_resourcetype(uri, cache=cache)
+ return super(Collection, cls).get_resourcetype(uri, cache=cache)
- def get_contenttype(self, uri, cache=None):
- if self.todo(uri) \
- or self.calendar(uri, ics=True):
+ @classmethod
+ def get_contenttype(cls, uri, cache=None):
+ if (cls.todo(uri)
+ or cls.calendar(uri, ics=True)):
return 'text/calendar'
- return super(Collection, self).get_contenttype(uri, cache=cache)
+ return super(Collection, cls).get_contenttype(uri, cache=cache)
- def get_creationdate(self, uri, cache=None):
- todo_obj = Pool().get('calendar.todo')
+ @classmethod
+ def get_creationdate(cls, uri, cache=None):
+ Todo = Pool().get('calendar.todo')
cursor = Transaction().cursor
- calendar_id = self.calendar(uri)
+ calendar_id = cls.calendar(uri)
if not calendar_id:
- calendar_id = self.calendar(uri, ics=True)
+ calendar_id = cls.calendar(uri, ics=True)
if calendar_id and (uri[10:].split('/', 1) + [None])[1]:
- todo_id = self.todo(uri, calendar_id=calendar_id)
+ todo_id = cls.todo(uri, calendar_id=calendar_id)
if todo_id:
if cache is not None:
cache.setdefault('_calendar', {})
- cache['_calendar'].setdefault(todo_obj._name, {})
- ids = cache['_calendar'][todo_obj._name].keys()
+ cache['_calendar'].setdefault(Todo.__name__, {})
+ ids = cache['_calendar'][Todo.__name__].keys()
if todo_id not in ids:
ids.append(todo_id)
elif 'creationdate' in cache['_calendar'][
- todo_obj._name][todo_id]:
- return cache['_calendar'][todo_obj._name][
+ Todo.__name__][todo_id]:
+ return cache['_calendar'][Todo.__name__][
todo_id]['creationdate']
else:
ids = [todo_id]
@@ -179,39 +177,40 @@ class Collection(ModelSQL, ModelView):
red_sql, red_ids = reduce_ids('id', sub_ids)
cursor.execute('SELECT id, ' \
'EXTRACT(epoch FROM create_date) ' \
- 'FROM "' + todo_obj._table + '" ' \
+ 'FROM "' + Todo.__table__ + '" ' \
'WHERE ' + red_sql, red_ids)
for todo_id2, date in cursor.fetchall():
if todo_id2 == todo_id:
res = date
if cache is not None:
- cache['_calendar'][todo_obj._name]\
+ cache['_calendar'][Todo.__name__]\
.setdefault(todo_id2, {})
- cache['_calendar'][todo_obj._name][
+ cache['_calendar'][Todo.__name__][
todo_id2]['creationdate'] = date
if res is not None:
return res
- return super(Collection, self).get_creationdate(uri, cache=cache)
+ return super(Collection, cls).get_creationdate(uri, cache=cache)
- def get_lastmodified(self, uri, cache=None):
- todo_obj = Pool().get('calendar.todo')
+ @classmethod
+ def get_lastmodified(cls, uri, cache=None):
+ Todo = Pool().get('calendar.todo')
cursor = Transaction().cursor
- calendar_id = self.calendar(uri)
+ calendar_id = cls.calendar(uri)
if calendar_id and (uri[10:].split('/', 1) + [None])[1]:
- todo_id = self.todo(uri, calendar_id=calendar_id)
+ todo_id = cls.todo(uri, calendar_id=calendar_id)
if todo_id:
if cache is not None:
cache.setdefault('_calendar', {})
- cache['_calendar'].setdefault(todo_obj._name, {})
- ids = cache['_calendar'][todo_obj._name].keys()
+ cache['_calendar'].setdefault(Todo.__name__, {})
+ ids = cache['_calendar'][Todo.__name__].keys()
if todo_id not in ids:
ids.append(todo_id)
elif 'lastmodified' in cache['_calendar'][
- todo_obj._name][todo_id]:
- return cache['_calendar'][todo_obj._name][
+ Todo.__name__][todo_id]:
+ return cache['_calendar'][Todo.__name__][
todo_id]['lastmodified']
else:
ids = [todo_id]
@@ -224,7 +223,7 @@ class Collection(ModelSQL, ModelView):
cursor.execute('SELECT COALESCE(parent, id), ' \
'MAX(EXTRACT(epoch FROM ' \
'COALESCE(write_date, create_date))) ' \
- 'FROM "' + todo_obj._table + '" ' \
+ 'FROM "' + Todo.__table__ + '" ' \
'WHERE ' + red_id_sql + ' ' \
'OR ' + red_parent_sql + ' ' \
'GROUP BY parent, id', red_id_ids + red_parent_ids)
@@ -232,83 +231,85 @@ class Collection(ModelSQL, ModelView):
if todo_id2 == todo_id:
res = date
if cache is not None:
- cache['_calendar'][todo_obj._name]\
+ cache['_calendar'][Todo.__name__]\
.setdefault(todo_id2, {})
- cache['_calendar'][todo_obj._name][
+ cache['_calendar'][Todo.__name__][
todo_id2]['lastmodified'] = date
if res is not None:
return res
- return super(Collection, self).get_lastmodified(uri, cache=cache)
+ return super(Collection, cls).get_lastmodified(uri, cache=cache)
- def get_data(self, uri, cache=None):
- todo_obj = Pool().get('calendar.todo')
+ @classmethod
+ def get_data(cls, uri, cache=None):
+ Todo = Pool().get('calendar.todo')
- calendar_id = self.calendar(uri)
+ calendar_id = cls.calendar(uri)
if calendar_id:
if not (uri[10:].split('/', 1) + [None])[1]:
raise DAV_NotFound
- todo_id = self.todo(uri, calendar_id=calendar_id)
+ todo_id = cls.todo(uri, calendar_id=calendar_id)
if not todo_id:
- return super(Collection, self).get_data(uri, cache=cache)
- ical = todo_obj.todo2ical(todo_id)
+ return super(Collection, cls).get_data(uri, cache=cache)
+ ical = Todo(todo_id).todo2ical()
return ical.serialize()
- return super(Collection, self).get_data(uri, cache=cache)
+ return super(Collection, cls).get_data(uri, cache=cache)
- def put(self, uri, data, content_type, cache=None):
- todo_obj = Pool().get('calendar.todo')
- calendar_obj = Pool().get('calendar.calendar')
+ @classmethod
+ def put(cls, uri, data, content_type, cache=None):
+ pool = Pool()
+ Todo = pool.get('calendar.todo')
+ Calendar = pool.get('calendar.calendar')
- calendar_id = self.calendar(uri)
+ calendar_id = cls.calendar(uri)
if calendar_id:
if not (uri[10:].split('/', 1) + [None])[1]:
raise DAV_Forbidden
- todo_id = self.todo(uri, calendar_id=calendar_id)
+ todo_id = cls.todo(uri, calendar_id=calendar_id)
ical = vobject.readOne(data)
if not hasattr(ical, 'vtodo'):
- return super(Collection, self).put(uri, data, content_type)
+ return super(Collection, cls).put(uri, data, content_type)
if not todo_id:
- values = todo_obj.ical2values(None, ical, calendar_id)
- todo_id = todo_obj.create(values)
- todo = todo_obj.browse(todo_id)
- calendar = calendar_obj.browse(calendar_id)
+ values = Todo.ical2values(None, ical, calendar_id)
+ todo = Todo.create(values)
+ calendar = Calendar(calendar_id)
return Transaction().cursor.database_name + '/Calendars/' + \
calendar.name + '/' + todo.uuid + '.ics'
else:
- values = todo_obj.ical2values(todo_id, ical, calendar_id)
- todo_obj.write(todo_id, values)
+ values = Todo.ical2values(todo_id, ical, calendar_id)
+ Todo.write([Todo(todo_id)], values)
return
- return super(Collection, self).put(uri, data, content_type)
+ return super(Collection, cls).put(uri, data, content_type)
- def rm(self, uri, cache=None):
- todo_obj = Pool().get('calendar.todo')
+ @classmethod
+ def rm(cls, uri, cache=None):
+ Todo = Pool().get('calendar.todo')
- calendar_id = self.calendar(uri)
+ calendar_id = cls.calendar(uri)
if calendar_id:
if not (uri[10:].split('/', 1) + [None])[1]:
raise DAV_Forbidden
- todo_id = self.todo(uri, calendar_id=calendar_id)
+ todo_id = cls.todo(uri, calendar_id=calendar_id)
if todo_id:
try:
- todo_obj.delete(todo_id)
+ Todo.delete([Todo(todo_id)])
except Exception:
raise DAV_Forbidden
return 200
- return super(Collection, self).rm(uri, cache=cache)
+ return super(Collection, cls).rm(uri, cache=cache)
- def exists(self, uri, cache=None):
+ @classmethod
+ def exists(cls, uri, cache=None):
if uri in ('Calendars', 'Calendars/'):
return 1
- calendar_id = self.calendar(uri)
+ calendar_id = cls.calendar(uri)
if calendar_id:
if not (uri[10:].split('/', 1) + [None])[1]:
return 1
- if self.todo(uri, calendar_id=calendar_id):
+ if cls.todo(uri, calendar_id=calendar_id):
return 1
- return super(Collection, self).exists(uri, cache=cache)
-
-Collection()
+ return super(Collection, cls).exists(uri, cache=cache)
commit 86d7007309187b5335e70366d86a9e910f35a4f9
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Sep 18 16:07:19 2012 +0200
Releasing debian version 2.4.2-2.
diff --git a/debian/changelog b/debian/changelog
index 3e5a8a0..9a1a501 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,17 @@
+tryton-modules-calendar-todo (2.4.2-2) experimental; urgency=low
+
+ [ Daniel Baumann ]
+ * Updating maintainers field.
+ * Updating vcs fields.
+ * Correcting copyright file to match format version 1.0.
+ * Switching to xz compression.
+ * Updating to debhelper version 9.
+
+ [ Mathias Behrle ]
+ * Merging branch debian-wheezy-2.2 (Closes: #687754).
+
+ -- Mathias Behrle <mathiasb at m9s.biz> Mon, 17 Sep 2012 16:47:04 +0200
+
tryton-modules-calendar-todo (2.4.2-1) experimental; urgency=low
* Merging upstream version 2.4.2.
commit 3ca0afdc026d049c8ed7386b8936f605093d00b9
Author: Daniel Baumann <daniel at debian.org>
Date: Sat Jun 30 18:02:28 2012 +0200
Updating to debhelper version 9.
diff --git a/debian/compat b/debian/compat
index 45a4fb7..ec63514 100644
--- a/debian/compat
+++ b/debian/compat
@@ -1 +1 @@
-8
+9
diff --git a/debian/control b/debian/control
index 840e0e4..44443ff 100644
--- a/debian/control
+++ b/debian/control
@@ -4,7 +4,7 @@ Priority: optional
Maintainer: Debian Tryton Maintainers <maintainers at debian.tryton.org>
Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
Dm-Upload-Allowed: yes
-Build-Depends: debhelper (>= 8), python (>= 2.6.6-3~), python-setuptools
+Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools
Standards-Version: 3.9.3
Homepage: http://www.tryton.org/
Vcs-Browser: http://debian.tryton.org/gitweb/?p=packages/tryton-modules-calendar-todo.git
commit 5bb38926e18f2273059ca388df7cdfd50ea97137
Author: Daniel Baumann <daniel at debian.org>
Date: Sat Jun 30 17:54:36 2012 +0200
Switching to xz compression.
diff --git a/debian/rules b/debian/rules
index e32b791..1ae0776 100755
--- a/debian/rules
+++ b/debian/rules
@@ -7,3 +7,6 @@ override_dh_auto_clean:
dh_auto_clean
rm -rf *.egg-info
+
+override_dh_builddeb:
+ dh_builddeb -- -Zxz -z9
diff --git a/debian/source/options b/debian/source/options
index d053b65..22a4de9 100644
--- a/debian/source/options
+++ b/debian/source/options
@@ -1,2 +1,2 @@
-compression = gzip
+compression = xz
compression-level = 9
commit 7182bf9777020874c89075e0d922dadc9c70a971
Author: Daniel Baumann <daniel at debian.org>
Date: Sat Jun 30 17:50:23 2012 +0200
Correcting copyright file to match format version 1.0.
diff --git a/debian/copyright b/debian/copyright
index 3ec403d..99aff32 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -2,15 +2,15 @@ Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Files: *
Copyright:
- (C) 2009-2012 Cedric Krier
- (C) 2009-2012 Bertrand Chenal
- (C) 2009-2012 B2CK SPRL
+ 2009-2012 Cedric Krier
+ 2009-2012 Bertrand Chenal
+ 2009-2012 B2CK SPRL
License: GPL-3+
Files: debian/*
Copyright:
- (C) 2009-2012 Daniel Baumann <daniel at debian.org>
- (C) 2012 Mathias Behrle <mathiasb at m9s.biz>
+ 2009-2012 Daniel Baumann <daniel at debian.org>
+ 2012 Mathias Behrle <mathiasb at m9s.biz>
License: GPL-3+
License: GPL-3+
commit abf4e93f07e2cb5f425652510f1e789612a45e72
Author: Daniel Baumann <daniel at 127011.net>
Date: Sat Jun 30 16:55:04 2012 +0200
Updating vcs fields.
diff --git a/debian/control b/debian/control
index 4964fdd..840e0e4 100644
--- a/debian/control
+++ b/debian/control
@@ -7,8 +7,8 @@ Dm-Upload-Allowed: yes
Build-Depends: debhelper (>= 8), python (>= 2.6.6-3~), python-setuptools
Standards-Version: 3.9.3
Homepage: http://www.tryton.org/
-Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-calendar-todo.git
-Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-todo.git
+Vcs-Browser: http://debian.tryton.org/gitweb/?p=packages/tryton-modules-calendar-todo.git
+Vcs-Git: git://debian.tryton.org/git/packages/tryton-modules-calendar-todo.git
X-Python-Version: >= 2.6
Package: tryton-modules-calendar-todo
commit e14be4dea312fb4daf695bee867fa9ff01aabad7
Author: Daniel Baumann <daniel at 127011.net>
Date: Sat Jun 30 16:52:30 2012 +0200
Updating maintainers field.
diff --git a/debian/control b/debian/control
index 106f8f7..4964fdd 100644
--- a/debian/control
+++ b/debian/control
@@ -1,7 +1,7 @@
Source: tryton-modules-calendar-todo
Section: python
Priority: optional
-Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
+Maintainer: Debian Tryton Maintainers <maintainers at debian.tryton.org>
Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
Dm-Upload-Allowed: yes
Build-Depends: debhelper (>= 8), python (>= 2.6.6-3~), python-setuptools
commit d09cccbdc0df6e43d7ca307ce0d93bd974c62de7
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Sep 11 14:28:53 2012 +0200
Releasing debian version 2.4.2-1.
diff --git a/debian/changelog b/debian/changelog
index cb475dd..3e5a8a0 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+tryton-modules-calendar-todo (2.4.2-1) experimental; urgency=low
+
+ * Merging upstream version 2.4.2.
+
+ -- Mathias Behrle <mathiasb at m9s.biz> Tue, 11 Sep 2012 13:27:33 +0200
+
tryton-modules-calendar-todo (2.4.1-1) experimental; urgency=low
* Merging upstream version 2.4.0.
commit a31ce9618b11cd8f09d98f0fff312b212083052a
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Sep 11 13:25:52 2012 +0200
Merging upstream version 2.4.2.
diff --git a/CHANGELOG b/CHANGELOG
index 629ed01..b9a4c76 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.4.2 - 2012-09-02
+* Bug fixes (see mercurial logs for details)
+
Version 2.4.1 - 2012-04-24
* Restore es_AR translation
diff --git a/PKG-INFO b/PKG-INFO
index e706a1e..8e0cd51 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond_calendar_todo
-Version: 2.4.1
+Version: 2.4.2
Summary: Add Todo support on CalDAV
Home-page: http://www.tryton.org/
Author: B2CK
diff --git a/__tryton__.py b/__tryton__.py
index 1798545..0c22fdc 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -11,7 +11,7 @@
'name_es_ES': 'Calendario de tareas',
'name_fr_FR': 'Tâche Calendrier',
'name_ru_RU': 'Задачи для календаря',
- 'version': '2.4.1',
+ 'version': '2.4.2',
'author': 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
diff --git a/todo.py b/todo.py
index 86250b6..a581127 100644
--- a/todo.py
+++ b/todo.py
@@ -417,6 +417,25 @@ class Todo(ModelSQL, ModelView):
collection_obj.todo.reset()
return res
+ def copy(self, ids, default=None):
+ int_id = isinstance(ids, (int, long))
+ if int_id:
+ ids = [ids]
+
+ if default is None:
+ default = {}
+
+ new_ids = []
+ for todo_id in ids:
+ current_default = default.copy()
+ current_default['uuid'] = self.default_uuid()
+ new_id = super(Todo, self).copy(todo_id, default=current_default)
+ new_ids.append(new_id)
+
+ if int_id:
+ return new_ids[0]
+ return new_ids
+
def ical2values(self, todo_id, ical, calendar_id, vtodo=None):
'''
Convert iCalendar to values for create or write
@@ -695,7 +714,7 @@ class Todo(ModelSQL, ModelView):
ical = vobject.iCalendar()
vtodo = ical.add('vtodo')
if todo.vtodo:
- ical.vtodo = vobject.readOne(todo.vtodo)
+ ical.vtodo = vobject.readOne(str(todo.vtodo))
vtodo = ical.vtodo
ical.vtodo.transformToNative()
if todo.summary:
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index c4d44b0..7546ef5 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond-calendar-todo
-Version: 2.4.1
+Version: 2.4.2
Summary: Add Todo support on CalDAV
Home-page: http://www.tryton.org/
Author: B2CK
commit f8da269033dd1b20eb9ddf9b25105fd6bb7011eb
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Sat Apr 28 12:43:16 2012 +0200
Releasing debian version 2.4.1-1.
diff --git a/debian/changelog b/debian/changelog
index 818d944..cb475dd 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,13 @@
+tryton-modules-calendar-todo (2.4.1-1) experimental; urgency=low
+
+ * Merging upstream version 2.4.0.
+ * Merging upstream version 2.4.1.
+ * Updating Copyright.
+ * Removing patch 01-support-pywebdav-0.9.8, went upstream.
+ * Bumping versioned tryton depends to 2.4.
+
+ -- Mathias Behrle <mathiasb at m9s.biz> Thu, 26 Apr 2012 19:36:44 +0200
+
tryton-modules-calendar-todo (2.2.0-2) unstable; urgency=low
* Updating to Standards-Version: 3.9.3, no changes needed.
commit 13c36b82e958c8296fda906d5f653b7da03f8ced
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Thu Apr 26 19:10:56 2012 +0200
Bumping versioned tryton depends to 2.4.
diff --git a/debian/control b/debian/control
index 3a81163..106f8f7 100644
--- a/debian/control
+++ b/debian/control
@@ -14,8 +14,8 @@ X-Python-Version: >= 2.6
Package: tryton-modules-calendar-todo
Architecture: all
Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.2),
- tryton-modules-calendar (>= 2.2), python-dateutil, python-tz, python-vobject,
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.4),
+ tryton-modules-calendar (>= 2.4), python-dateutil, python-tz, python-vobject,
python-webdav, python-pkg-resources
Description: Tryton Application Platform (Calendar Todo Module)
Tryton is a high-level general purpose application platform written in Python
commit fbeafa4f140aa90973d5814a1a628e8030e18284
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Thu Apr 26 00:47:24 2012 +0200
Removing patch 01-support-pywebdav-0.9.8, went upstream.
diff --git a/debian/patches/01-support-pywebdav-0.9.8 b/debian/patches/01-support-pywebdav-0.9.8
deleted file mode 100644
index 24a9c76..0000000
--- a/debian/patches/01-support-pywebdav-0.9.8
+++ /dev/null
@@ -1,45 +0,0 @@
-Author: Mathias Behrle <mathiasb at m9s.biz>
-Description: Support new structure of pywebdav > 0.9.4.1.
---- tryton-modules-calendar-todo.orig/caldav.py 2012-01-02 12:49:21.541638844 +0100
-+++ tryton-modules-calendar-todo/caldav.py 2012-03-26 20:06:16.290050030 +0200
-@@ -2,8 +2,12 @@
- #this repository contains the full copyright notices and license terms.
- _TRYTON_RELOAD = False
-
--from DAV import propfind
--from DAV.utils import get_uriparentpath
-+try:
-+ from DAV import propfind
-+ from DAV.utils import get_uriparentpath
-+except ImportError:
-+ from pywebdav.lib import propfind
-+ from pywebdav.lib.utils import get_uriparentpath
- from trytond.protocols.webdav import TrytonDAVInterface
-
- _mk_prop_response = propfind.PROPFIND.mk_prop_response
---- tryton-modules-calendar-todo.orig/webdav.py 2012-01-02 12:49:21.613635117 +0100
-+++ tryton-modules-calendar-todo/webdav.py 2012-03-26 20:06:25.753733455 +0200
-@@ -2,7 +2,10 @@
- #this repository contains the full copyright notices and license terms.
- import vobject
- import urllib
--from DAV.errors import DAV_NotFound, DAV_Forbidden
-+try:
-+ from DAV.errors import DAV_NotFound, DAV_Forbidden
-+except ImportError:
-+ from pywebdav.lib.errors import DAV_NotFound, DAV_Forbidden
- from trytond.model import ModelView, ModelSQL
- from trytond.tools import reduce_ids
- from trytond.transaction import Transaction
-@@ -132,7 +135,10 @@
- return res
-
- def get_resourcetype(self, uri, cache=None):
-- from DAV.constants import COLLECTION, OBJECT
-+ try:
-+ from DAV.constants import COLLECTION, OBJECT
-+ except ImportError:
-+ from pywebdav.lib.constants import COLLECTION, OBJECT
- if uri in ('Calendars', 'Calendars/'):
- return COLLECTION
- calendar_id = self.calendar(uri)
diff --git a/debian/patches/series b/debian/patches/series
index 138cbbb..e69de29 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1 +0,0 @@
-01-support-pywebdav-0.9.8
commit 9e683431d32db39aca88b9919c0e6b65544320c8
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Wed Apr 25 20:08:32 2012 +0200
Updating Copyright.
diff --git a/debian/copyright b/debian/copyright
index 31cd674..3ec403d 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -2,9 +2,9 @@ Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Files: *
Copyright:
- (C) 2009-2011 Cedric Krier
- (C) 2009-2011 Bertrand Chenal
- (C) 2009-2011 B2CK SPRL
+ (C) 2009-2012 Cedric Krier
+ (C) 2009-2012 Bertrand Chenal
+ (C) 2009-2012 B2CK SPRL
License: GPL-3+
Files: debian/*
commit d2a2fa3990cdbef719840381c37807b4362d6aa3
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Wed Apr 25 11:03:31 2012 +0200
Merging upstream version 2.4.1.
diff --git a/CHANGELOG b/CHANGELOG
index b873356..629ed01 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.4.1 - 2012-04-24
+* Restore es_AR translation
+
Version 2.4.0 - 2012-04-23
* Bug fixes (see mercurial logs for details)
diff --git a/PKG-INFO b/PKG-INFO
index 72e42bc..e706a1e 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond_calendar_todo
-Version: 2.4.0
+Version: 2.4.1
Summary: Add Todo support on CalDAV
Home-page: http://www.tryton.org/
Author: B2CK
diff --git a/__tryton__.py b/__tryton__.py
index 303f9da..1798545 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -11,7 +11,7 @@
'name_es_ES': 'Calendario de tareas',
'name_fr_FR': 'Tâche Calendrier',
'name_ru_RU': 'Задачи для календаря',
- 'version': '2.4.0',
+ 'version': '2.4.1',
'author': 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
diff --git a/locale/es_AR.po b/locale/es_AR.po
index 542f292..adc2e33 100644
--- a/locale/es_AR.po
+++ b/locale/es_AR.po
@@ -1,3 +1,519 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.todo:"
+msgid "Recurrence can not be recurrent!"
+msgstr "¡Una recurrencia no puede ser recurrente!"
+
+msgctxt "error:calendar.todo:"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "¡UUID y recurrencia deben ser únicos en un calendario!"
+
+msgctxt "field:calendar.todo,alarms:"
+msgid "Alarms"
+msgstr "Alarmas"
+
+msgctxt "field:calendar.todo,attendees:"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "field:calendar.todo,calendar:"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.todo,calendar_owner:"
+msgid "Owner"
+msgstr "Dueño"
+
+msgctxt "field:calendar.todo,calendar_read_users:"
+msgid "Read Users"
+msgstr "Usuarios con lectura"
+
+msgctxt "field:calendar.todo,calendar_write_users:"
+msgid "Write Users"
+msgstr "Usuarios con escritura"
+
+msgctxt "field:calendar.todo,categories:"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "field:calendar.todo,classification:"
+msgid "Classification"
+msgstr "Clasificación"
+
+msgctxt "field:calendar.todo,completed:"
+msgid "Completed"
+msgstr "Completada"
+
+msgctxt "field:calendar.todo,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo,description:"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:calendar.todo,dtstart:"
+msgid "Start Date"
+msgstr "Fecha inicio"
+
+msgctxt "field:calendar.todo,due:"
+msgid "Due Date"
+msgstr "Fecha de vencimiento"
+
+msgctxt "field:calendar.todo,exdates:"
+msgid "Exception Dates"
+msgstr "Fechas excluidas"
+
+msgctxt "field:calendar.todo,exrules:"
+msgid "Exception Rules"
+msgstr "Reglas de excepciones"
+
+msgctxt "field:calendar.todo,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo,location:"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "field:calendar.todo,occurences:"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "field:calendar.todo,organizer:"
+msgid "Organizer"
+msgstr "Organizador"
+
+msgctxt "field:calendar.todo,parent:"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:calendar.todo,percent_complete:"
+msgid "Percent complete"
+msgstr "Porcentaje total"
+
+msgctxt "field:calendar.todo,rdates:"
+msgid "Recurrence Dates"
+msgstr "Fechas de recurrencia"
+
+msgctxt "field:calendar.todo,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo,recurrence:"
+msgid "Recurrence"
+msgstr "Recurrencia"
+
+msgctxt "field:calendar.todo,rrules:"
+msgid "Recurrence Rules"
+msgstr "Reglas de recurrencia"
+
+msgctxt "field:calendar.todo,sequence:"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:calendar.todo,status:"
+msgid "Status"
+msgstr "Estado"
+
+msgctxt "field:calendar.todo,summary:"
+msgid "Summary"
+msgstr "Resumen"
+
+msgctxt "field:calendar.todo,timezone:"
+msgid "Timezone"
+msgstr "Zona horaria"
+
+msgctxt "field:calendar.todo,uuid:"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.todo,vtodo:"
+msgid "vtodo"
+msgstr "vtodo"
+
+msgctxt "field:calendar.todo,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo-calendar.category,category:"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "field:calendar.todo-calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo-calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo-calendar.category,todo:"
+msgid "To-Do"
+msgstr "Por hacer"
+
+msgctxt "field:calendar.todo-calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo-calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:"
+msgid "Calendar Alarm"
+msgstr "Alarma del calendario"
+
+msgctxt "field:calendar.todo.alarm,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo.alarm,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.alarm,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.alarm,todo:"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "field:calendar.todo.alarm,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.alarm,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:"
+msgid "Calendar Attendee"
+msgstr "Calendario de asistentes"
+
+msgctxt "field:calendar.todo.attendee,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo.attendee,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.attendee,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.attendee,todo:"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "field:calendar.todo.attendee,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.attendee,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.exdate,calendar_date:"
+msgid "Calendar Date"
+msgstr "Fecha Calendario"
+
+msgctxt "field:calendar.todo.exdate,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo.exdate,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.exdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.exdate,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.exdate,todo:"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "field:calendar.todo.exdate,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.exdate,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:"
+msgid "Calendar RRule"
+msgstr "Regla de recurrencia"
+
+msgctxt "field:calendar.todo.exrule,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo.exrule,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.exrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.exrule,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.exrule,todo:"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "field:calendar.todo.exrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.exrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.rdate,calendar_date:"
+msgid "Calendar Date"
+msgstr "Fecha Calendario"
+
+msgctxt "field:calendar.todo.rdate,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo.rdate,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.rdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.rdate,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.rdate,todo:"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "field:calendar.todo.rdate,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.rdate,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:"
+msgid "Calendar RRule"
+msgstr "Regla de recurrencia"
+
+msgctxt "field:calendar.todo.rrule,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo.rrule,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.rrule,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.rrule,todo:"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "field:calendar.todo.rrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.rrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "help:calendar.todo,uuid:"
+msgid "Universally Unique Identifier"
+msgstr "Identificador universal único"
+
+msgctxt "model:calendar.todo,name:"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "model:calendar.todo-calendar.category,name:"
+msgid "Todo - Category"
+msgstr "Tarea - Categoría"
+
+msgctxt "model:calendar.todo.alarm,name:"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.todo.attendee,name:"
+msgid "Attendee"
+msgstr "Asistentes"
+
+msgctxt "model:calendar.todo.exdate,name:"
+msgid "Exception Date"
+msgstr "Fecha excluida"
+
+msgctxt "model:calendar.todo.exrule,name:"
+msgid "Exception Rule"
+msgstr "Regla de excepción"
+
+msgctxt "model:calendar.todo.rdate,name:"
+msgid "Todo Recurrence Date"
+msgstr "Fecha de recurrencia"
+
+msgctxt "model:calendar.todo.rrule,name:"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "model:ir.action,name:act_todo_form"
+msgid "Todos"
+msgstr "Tareas"
+
+msgctxt "model:ir.action,name:act_todo_form3"
+msgid "Todos"
+msgstr "Tareas"
+
+msgctxt "model:ir.ui.menu,name:menu_todo_form"
+msgid "Todos"
+msgstr "Tareas"
+
+msgctxt "selection:calendar.todo,classification:"
+msgid "Confidential"
+msgstr "Confidencial"
+
+msgctxt "selection:calendar.todo,classification:"
+msgid "Private"
+msgstr "Privado"
+
+msgctxt "selection:calendar.todo,classification:"
+msgid "Public"
+msgstr "Público"
+
+msgctxt "selection:calendar.todo,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:"
+msgid "Cancelled"
+msgstr "Cancelada"
+
+msgctxt "selection:calendar.todo,status:"
+msgid "Completed"
+msgstr "Completado"
+
+msgctxt "selection:calendar.todo,status:"
+msgid "In-Process"
+msgstr "En proceso"
+
+msgctxt "selection:calendar.todo,status:"
+msgid "Needs-Action"
+msgstr "Necesita una acción"
+
+msgctxt "view:calendar.todo.attendee:"
+msgid "Attendee"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.todo.attendee:"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.todo.exdate:"
+msgid "Exception Date"
+msgstr "Fecha excluida"
+
+msgctxt "view:calendar.todo.exdate:"
+msgid "Exception Dates"
+msgstr "Fechas excluidas"
+
+msgctxt "view:calendar.todo.exrule:"
+msgid "Exception Rule"
+msgstr "Regla de excepción"
+
+msgctxt "view:calendar.todo.exrule:"
+msgid "Exception Rules"
+msgstr "Reglas de excepciones"
+
+msgctxt "view:calendar.todo.rdate:"
+msgid "Recurrence Date"
+msgstr "Fecha de recurrencia"
+
+msgctxt "view:calendar.todo.rdate:"
+msgid "Recurrence Dates"
+msgstr "Fechas de recurrencia"
+
+msgctxt "view:calendar.todo.rrule:"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "view:calendar.todo.rrule:"
+msgid "Recurrence Rules"
+msgstr "Reglas de recurrencia"
+
+msgctxt "view:calendar.todo:"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.todo:"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "view:calendar.todo:"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:calendar.todo:"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "view:calendar.todo:"
+msgid "Recurrences"
+msgstr "Recurrencias"
+
+msgctxt "view:calendar.todo:"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "view:calendar.todo:"
+msgid "Todos"
+msgstr "Tareas"
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index 306c9f4..c4d44b0 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond-calendar-todo
-Version: 2.4.0
+Version: 2.4.1
Summary: Add Todo support on CalDAV
Home-page: http://www.tryton.org/
Author: B2CK
commit 8a7ea46ff4005186977d9a516263c5ef043215cf
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Apr 24 19:30:40 2012 +0200
Merging upstream version 2.4.0.
diff --git a/CHANGELOG b/CHANGELOG
index 72099a7..b873356 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.4.0 - 2012-04-23
+* Bug fixes (see mercurial logs for details)
+
Version 2.2.0 - 2011-10-24
* Bug fixes (see mercurial logs for details)
diff --git a/COPYRIGHT b/COPYRIGHT
index 1245dd5..8ad4b79 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,6 +1,6 @@
-Copyright (C) 2009-2011 Cédric Krier.
-Copyright (C) 2009-2011 Bertrand Chenal.
-Copyright (C) 2009-2011 B2CK SPRL.
+Copyright (C) 2009-2012 Cédric Krier.
+Copyright (C) 2009-2012 Bertrand Chenal.
+Copyright (C) 2009-2012 B2CK SPRL.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
diff --git a/INSTALL b/INSTALL
index 6577bda..bbf874a 100644
--- a/INSTALL
+++ b/INSTALL
@@ -4,10 +4,10 @@ Installing trytond_calendar_todo
Prerequisites
-------------
- * Python 2.5 or later (http://www.python.org/)
+ * Python 2.6 or later (http://www.python.org/)
* trytond (http://www.tryton.org/)
* vobject 0.8.0 or later (http://vobject.skyhouseconsulting.com/)
- * pywebdav 0.9.3 or later (http://sourceforge.net/projects/pywebdav/)
+ * pywebdav 0.9.8 or later (http://sourceforge.net/projects/pywebdav/)
* python-dateutil (http://labix.org/python-dateutil)
* pytz (http://pytz.sourceforge.net/)
* trytond_calendar (http://www.tryton.org/)
diff --git a/PKG-INFO b/PKG-INFO
index 782fc36..72e42bc 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.0
Name: trytond_calendar_todo
-Version: 2.2.0
+Version: 2.4.0
Summary: Add Todo support on CalDAV
Home-page: http://www.tryton.org/
Author: B2CK
Author-email: info at b2ck.com
License: GPL-3
-Download-URL: http://downloads.tryton.org/2.2/
+Download-URL: http://downloads.tryton.org/2.4/
Description: UNKNOWN
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
diff --git a/__init__.py b/__init__.py
index d62d024..ac725d6 100644
--- a/__init__.py
+++ b/__init__.py
@@ -1,6 +1,6 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-import caldav
-from todo import *
-from webdav import *
+from . import caldav
+from .todo import *
+from .webdav import *
diff --git a/__tryton__.py b/__tryton__.py
index 244dd66..303f9da 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -2,37 +2,43 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
{
- 'name' : 'Calendar Todo',
- 'name_bg_BG' : 'Задачи за календар',
- 'name_de_DE' : 'Kalender Aufgaben',
+ 'name': 'Calendar Todo',
+ 'name_bg_BG': 'Задачи за календар',
+ 'name_ca_ES': 'Calendari de tasques pendents',
+ 'name_de_DE': 'Kalender Aufgaben',
+ 'name_es_AR': 'Calendario de tareas',
'name_es_CO': 'Calendario de tareas',
'name_es_ES': 'Calendario de tareas',
- 'name_fr_FR' : 'Tâche Calendrier',
- 'name_ru_RU' : 'Задачи для календаря',
- 'version' : '2.2.0',
- 'author' : 'B2CK',
+ 'name_fr_FR': 'Tâche Calendrier',
+ 'name_ru_RU': 'Задачи для календаря',
+ 'version': '2.4.0',
+ 'author': 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
'description': 'Add Todo support on CalDAV',
- 'description_bg_BG' : 'Добавя поддръжка на задачи в CalDAV',
- 'description_de_DE' : 'Fügt Unterstützung für Aufgaben in CalDAV hinzu',
+ 'description_bg_BG': 'Добавя поддръжка на задачи в CalDAV',
+ 'description_ca_ES': 'Afegeix suport per tasques pendents al CalDAV.',
+ 'description_de_DE': 'Fügt Unterstützung für Aufgaben in CalDAV hinzu',
+ 'description_es_AR': 'Añade soporte de tareas sobre CalDAV',
'description_es_CO': 'Añade soporte de tareas sobre CalDAV',
'description_es_ES': 'Añade soporte de tareas sobre CalDAV',
'description_fr_FR': 'Ajoute la gestion des tâches au CalDAV',
- 'description_ru_RU' : 'Добавление поддержки задач для CalDAV',
- 'depends' : [
+ 'description_ru_RU': 'Добавление поддержки задач для CalDAV',
+ 'depends': [
'ir',
'res',
'webdav',
'calendar',
],
- 'xml' : [
+ 'xml': [
'todo.xml',
],
'translation': [
'locale/bg_BG.po',
+ 'locale/ca_ES.po',
'locale/cs_CZ.po',
'locale/de_DE.po',
+ 'locale/es_AR.po',
'locale/es_CO.po',
'locale/es_ES.po',
'locale/fr_FR.po',
diff --git a/caldav.py b/caldav.py
index 2d2fe00..b5f32b3 100644
--- a/caldav.py
+++ b/caldav.py
@@ -1,13 +1,12 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-_TRYTON_RELOAD = False
-
-from DAV import propfind
-from DAV.utils import get_uriparentpath
+from pywebdav.lib import propfind
+from pywebdav.lib.utils import get_uriparentpath
from trytond.protocols.webdav import TrytonDAVInterface
_mk_prop_response = propfind.PROPFIND.mk_prop_response
+
def mk_prop_response(self, uri, good_props, bad_props, doc):
res = _mk_prop_response(self, uri, good_props, bad_props, doc)
parent_uri = get_uriparentpath(uri and uri.strip('/') or '')
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
index ca18ebd..e234518 100644
--- a/locale/bg_BG.po
+++ b/locale/bg_BG.po
@@ -2,247 +2,407 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
msgid "Recurrence can not be recurrent!"
msgstr "Повторението не може да е периодично!"
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
msgid "UUID and recurrence must be unique in a calendar!"
msgstr "UUID и взаимна вложеност трябва да са уникални в календар!"
-msgctxt "field:calendar.todo,alarms:0"
+msgctxt "field:calendar.todo,alarms:"
msgid "Alarms"
msgstr "Аларми"
-msgctxt "field:calendar.todo,attendees:0"
+msgctxt "field:calendar.todo,attendees:"
msgid "Attendees"
msgstr "Присъстващи"
-msgctxt "field:calendar.todo,calendar:0"
+msgctxt "field:calendar.todo,calendar:"
msgid "Calendar"
msgstr "Календар"
-msgctxt "field:calendar.todo,calendar_owner:0"
+msgctxt "field:calendar.todo,calendar_owner:"
msgid "Owner"
msgstr "Собственик"
-msgctxt "field:calendar.todo,calendar_read_users:0"
+msgctxt "field:calendar.todo,calendar_read_users:"
msgid "Read Users"
msgstr "Потребители с права за четене"
-msgctxt "field:calendar.todo,calendar_write_users:0"
+msgctxt "field:calendar.todo,calendar_write_users:"
msgid "Write Users"
msgstr "Записване на потребители"
-msgctxt "field:calendar.todo,categories:0"
+msgctxt "field:calendar.todo,categories:"
msgid "Categories"
msgstr "Категории"
-msgctxt "field:calendar.todo,classification:0"
+msgctxt "field:calendar.todo,classification:"
msgid "Classification"
msgstr "Класификация"
-msgctxt "field:calendar.todo,completed:0"
+msgctxt "field:calendar.todo,completed:"
msgid "Completed"
msgstr "Изпълнен"
-msgctxt "field:calendar.todo,description:0"
+msgctxt "field:calendar.todo,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.todo,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.todo,description:"
msgid "Description"
msgstr "Описание"
-msgctxt "field:calendar.todo,dtstart:0"
+msgctxt "field:calendar.todo,dtstart:"
msgid "Start Date"
msgstr "Начална дата"
-msgctxt "field:calendar.todo,due:0"
+msgctxt "field:calendar.todo,due:"
msgid "Due Date"
msgstr "Дата на изпълнение"
-msgctxt "field:calendar.todo,exdates:0"
+msgctxt "field:calendar.todo,exdates:"
msgid "Exception Dates"
msgstr "Дати на грешките"
-msgctxt "field:calendar.todo,exrules:0"
+msgctxt "field:calendar.todo,exrules:"
msgid "Exception Rules"
msgstr "Правила при грешка"
-msgctxt "field:calendar.todo,location:0"
+msgctxt "field:calendar.todo,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo,location:"
msgid "Location"
msgstr "Местоположение"
-msgctxt "field:calendar.todo,occurences:0"
+msgctxt "field:calendar.todo,occurences:"
msgid "Occurences"
msgstr "Събития"
-msgctxt "field:calendar.todo,organizer:0"
+msgctxt "field:calendar.todo,organizer:"
msgid "Organizer"
msgstr "Организатор"
-msgctxt "field:calendar.todo,parent:0"
+msgctxt "field:calendar.todo,parent:"
msgid "Parent"
msgstr "Родител"
-msgctxt "field:calendar.todo,percent_complete:0"
+msgctxt "field:calendar.todo,percent_complete:"
msgid "Percent complete"
msgstr "Процент изпълнено"
-msgctxt "field:calendar.todo,rdates:0"
+msgctxt "field:calendar.todo,rdates:"
msgid "Recurrence Dates"
msgstr "Дати на повторяемост"
-msgctxt "field:calendar.todo,rec_name:0"
+msgctxt "field:calendar.todo,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.todo,recurrence:0"
+msgctxt "field:calendar.todo,recurrence:"
msgid "Recurrence"
msgstr "Повторение"
-msgctxt "field:calendar.todo,rrules:0"
+msgctxt "field:calendar.todo,rrules:"
msgid "Recurrence Rules"
msgstr "Правила за повторяемост"
-msgctxt "field:calendar.todo,sequence:0"
+msgctxt "field:calendar.todo,sequence:"
msgid "Sequence"
msgstr "Последователност"
-msgctxt "field:calendar.todo,status:0"
+msgctxt "field:calendar.todo,status:"
msgid "Status"
msgstr "Състояние"
-msgctxt "field:calendar.todo,summary:0"
+msgctxt "field:calendar.todo,summary:"
msgid "Summary"
msgstr "Обобщено"
-msgctxt "field:calendar.todo,timezone:0"
+msgctxt "field:calendar.todo,timezone:"
msgid "Timezone"
msgstr "Времева зона"
-msgctxt "field:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo,uuid:"
msgid "UUID"
msgstr "UUID"
-msgctxt "field:calendar.todo,vtodo:0"
+msgctxt "field:calendar.todo,vtodo:"
msgid "vtodo"
msgstr ""
-msgctxt "field:calendar.todo-calendar.category,category:0"
+msgctxt "field:calendar.todo,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.todo,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.todo-calendar.category,category:"
msgid "Category"
msgstr "Категория"
-msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgctxt "field:calendar.todo-calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.todo-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.todo-calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgctxt "field:calendar.todo-calendar.category,todo:"
msgid "To-Do"
msgstr "Задача"
-msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgctxt "field:calendar.todo-calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.todo-calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:"
msgid "Calendar Alarm"
msgstr "Аларма на календар"
-msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgctxt "field:calendar.todo.alarm,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.todo.alarm,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.todo.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.alarm,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.todo.alarm,todo:0"
+msgctxt "field:calendar.todo.alarm,todo:"
msgid "Todo"
msgstr "Задача"
-msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgctxt "field:calendar.todo.alarm,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.todo.alarm,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:"
msgid "Calendar Attendee"
msgstr "Присъстващ на календар"
-msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgctxt "field:calendar.todo.attendee,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.todo.attendee,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.todo.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.attendee,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.todo.attendee,todo:0"
+msgctxt "field:calendar.todo.attendee,todo:"
msgid "Todo"
msgstr "Задача"
-msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgctxt "field:calendar.todo.attendee,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.todo.attendee,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.todo.exdate,calendar_date:"
msgid "Calendar Date"
msgstr "Дата от календар"
-msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgctxt "field:calendar.todo.exdate,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.todo.exdate,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.todo.exdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.exdate,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.todo.exdate,todo:0"
+msgctxt "field:calendar.todo.exdate,todo:"
msgid "Todo"
msgstr "Задача"
-msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.exdate,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.todo.exdate,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr ""
-msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgctxt "field:calendar.todo.exrule,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.todo.exrule,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.todo.exrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.exrule,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.todo.exrule,todo:0"
+msgctxt "field:calendar.todo.exrule,todo:"
msgid "Todo"
msgstr "Задача"
-msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgctxt "field:calendar.todo.exrule,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.todo.exrule,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.todo.rdate,calendar_date:"
msgid "Calendar Date"
msgstr "Дата от календар"
-msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgctxt "field:calendar.todo.rdate,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.todo.rdate,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.todo.rdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.rdate,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.todo.rdate,todo:0"
+msgctxt "field:calendar.todo.rdate,todo:"
msgid "Todo"
msgstr "Задача"
-msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.rdate,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.todo.rdate,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr ""
-msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgctxt "field:calendar.todo.rrule,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.todo.rrule,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.todo.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.rrule,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.todo.rrule,todo:0"
+msgctxt "field:calendar.todo.rrule,todo:"
msgid "Todo"
msgstr "Задача"
-msgctxt "help:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo.rrule,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.todo.rrule,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "help:calendar.todo,uuid:"
msgid "Universally Unique Identifier"
msgstr "Универсален иникален идентификатор"
-msgctxt "model:calendar.todo,name:0"
+msgctxt "model:calendar.todo,name:"
msgid "Todo"
msgstr "Задача"
-msgctxt "model:calendar.todo-calendar.category,name:0"
+msgctxt "model:calendar.todo-calendar.category,name:"
msgid "Todo - Category"
msgstr "Задача - Категория"
-msgctxt "model:calendar.todo.alarm,name:0"
+msgctxt "model:calendar.todo.alarm,name:"
msgid "Alarm"
msgstr "Аларма"
-msgctxt "model:calendar.todo.attendee,name:0"
+msgctxt "model:calendar.todo.attendee,name:"
msgid "Attendee"
msgstr "Присъстващ"
-msgctxt "model:calendar.todo.exdate,name:0"
+msgctxt "model:calendar.todo.exdate,name:"
msgid "Exception Date"
msgstr "Дата на грешка"
-msgctxt "model:calendar.todo.exrule,name:0"
+msgctxt "model:calendar.todo.exrule,name:"
msgid "Exception Rule"
msgstr "Правило при грешка"
-msgctxt "model:calendar.todo.rdate,name:0"
+msgctxt "model:calendar.todo.rdate,name:"
msgid "Todo Recurrence Date"
msgstr "Дата на повторение на задача"
-msgctxt "model:calendar.todo.rrule,name:0"
+msgctxt "model:calendar.todo.rrule,name:"
msgid "Recurrence Rule"
msgstr "Правило за повторение"
@@ -258,98 +418,98 @@ msgctxt "model:ir.ui.menu,name:menu_todo_form"
msgid "Todos"
msgstr "Задачи"
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
msgid "Confidential"
msgstr "Поверителен"
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
msgid "Private"
msgstr "Частен"
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
msgid "Public"
msgstr "Публичен"
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid ""
msgstr ""
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "Cancelled"
msgstr "Отказан"
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "Completed"
msgstr "Изпълнен"
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "In-Process"
msgstr "Обработва се"
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "Needs-Action"
msgstr "Необходимо е действие"
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
msgid "Attendee"
msgstr "Присъстващ"
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
msgid "Attendees"
msgstr "Присъстващи"
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
msgid "Exception Date"
msgstr "Дата на грешка"
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
msgid "Exception Dates"
msgstr "Дати на грешките"
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
msgid "Exception Rule"
msgstr "Правило при грешка"
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
msgid "Exception Rules"
msgstr "Правила при грешка"
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Date"
msgstr "Повтаряща се дата"
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Dates"
msgstr "Дати на повторяемост"
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
msgid "Recurrence Rule"
msgstr "Правило за повторение"
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
msgid "Recurrence Rules"
msgstr "Правила за повторяемост"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Attendees"
msgstr "Присъстващи"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Categories"
msgstr "Категории"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "General"
msgstr "Основен"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Occurences"
msgstr "Събития"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Todo"
msgstr "Задача"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Todos"
msgstr "Задачи"
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
new file mode 100644
index 0000000..3f3d17e
--- /dev/null
+++ b/locale/ca_ES.po
@@ -0,0 +1,531 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.todo:"
+msgid "Recurrence can not be recurrent!"
+msgstr "Una recurrencia no pot ser recurrent"
+
+msgctxt "error:calendar.todo:"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "UUID i recurrencia han de ser únics en un calendari"
+
+msgctxt "field:calendar.todo,alarms:"
+msgid "Alarms"
+msgstr "Alarmes"
+
+msgctxt "field:calendar.todo,attendees:"
+msgid "Attendees"
+msgstr "Assistents"
+
+msgctxt "field:calendar.todo,calendar:"
+msgid "Calendar"
+msgstr "Calendari"
+
+msgctxt "field:calendar.todo,calendar_owner:"
+msgid "Owner"
+msgstr "Amo"
+
+msgctxt "field:calendar.todo,calendar_read_users:"
+msgid "Read Users"
+msgstr "Usuaris amb lectura"
+
+msgctxt "field:calendar.todo,calendar_write_users:"
+msgid "Write Users"
+msgstr "Usuaris amb escriptura"
+
+msgctxt "field:calendar.todo,categories:"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "field:calendar.todo,classification:"
+msgid "Classification"
+msgstr "Classificació"
+
+msgctxt "field:calendar.todo,completed:"
+msgid "Completed"
+msgstr "Completada"
+
+msgctxt "field:calendar.todo,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.todo,description:"
+msgid "Description"
+msgstr "Descripció"
+
+msgctxt "field:calendar.todo,dtstart:"
+msgid "Start Date"
+msgstr "Data inici"
+
+msgctxt "field:calendar.todo,due:"
+msgid "Due Date"
+msgstr "Data de venciment"
+
+msgctxt "field:calendar.todo,exdates:"
+msgid "Exception Dates"
+msgstr "Dates excloses"
+
+msgctxt "field:calendar.todo,exrules:"
+msgid "Exception Rules"
+msgstr "Regles d'excepcions"
+
+msgctxt "field:calendar.todo,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo,location:"
+msgid "Location"
+msgstr "Ubicació"
+
+#, fuzzy
+msgctxt "field:calendar.todo,occurences:"
+msgid "Occurences"
+msgstr "Ocurrències"
+
+msgctxt "field:calendar.todo,organizer:"
+msgid "Organizer"
+msgstr "Organitzador"
+
+msgctxt "field:calendar.todo,parent:"
+msgid "Parent"
+msgstr "Pare"
+
+msgctxt "field:calendar.todo,percent_complete:"
+msgid "Percent complete"
+msgstr "Percentatge total"
+
+msgctxt "field:calendar.todo,rdates:"
+msgid "Recurrence Dates"
+msgstr "Dates de recurrencia"
+
+msgctxt "field:calendar.todo,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo,recurrence:"
+msgid "Recurrence"
+msgstr "Recurrencia"
+
+msgctxt "field:calendar.todo,rrules:"
+msgid "Recurrence Rules"
+msgstr "Regles de recurrencia"
+
+msgctxt "field:calendar.todo,sequence:"
+msgid "Sequence"
+msgstr "Seqüència"
+
+msgctxt "field:calendar.todo,status:"
+msgid "Status"
+msgstr "Estat"
+
+msgctxt "field:calendar.todo,summary:"
+msgid "Summary"
+msgstr "Resum"
+
+msgctxt "field:calendar.todo,timezone:"
+msgid "Timezone"
+msgstr "Zona horària"
+
+msgctxt "field:calendar.todo,uuid:"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.todo,vtodo:"
+msgid "vtodo"
+msgstr "vtodo"
+
+msgctxt "field:calendar.todo,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,category:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "field:calendar.todo-calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.todo-calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo-calendar.category,todo:"
+msgid "To-Do"
+msgstr "Per fer"
+
+msgctxt "field:calendar.todo-calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:"
+msgid "Calendar Alarm"
+msgstr "Alarma del calendari"
+
+msgctxt "field:calendar.todo.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.alarm,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.todo.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.alarm,todo:"
+msgid "Todo"
+msgstr "Tasca"
+
+msgctxt "field:calendar.todo.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:"
+msgid "Calendar Attendee"
+msgstr "Calendari d'assistents"
+
+msgctxt "field:calendar.todo.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.attendee,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.todo.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.attendee,todo:"
+msgid "Todo"
+msgstr "Tasca"
+
+msgctxt "field:calendar.todo.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,calendar_date:"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.exdate,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.todo.exdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.exdate,todo:"
+msgid "Todo"
+msgstr "Tasca"
+
+msgctxt "field:calendar.todo.exdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:"
+msgid "Calendar RRule"
+msgstr "Regla de recurrencia"
+
+msgctxt "field:calendar.todo.exrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.exrule,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.todo.exrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.exrule,todo:"
+msgid "Todo"
+msgstr "Tasca"
+
+msgctxt "field:calendar.todo.exrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,calendar_date:"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.rdate,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.todo.rdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.rdate,todo:"
+msgid "Todo"
+msgstr "Tasca"
+
+msgctxt "field:calendar.todo.rdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:"
+msgid "Calendar RRule"
+msgstr "Regla de recurrencia"
+
+msgctxt "field:calendar.todo.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.rrule,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.todo.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.rrule,todo:"
+msgid "Todo"
+msgstr "Tasca"
+
+msgctxt "field:calendar.todo.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "help:calendar.todo,uuid:"
+msgid "Universally Unique Identifier"
+msgstr "Identificador universal únic"
+
+msgctxt "model:calendar.todo,name:"
+msgid "Todo"
+msgstr "Tasca"
+
+msgctxt "model:calendar.todo-calendar.category,name:"
+msgid "Todo - Category"
+msgstr "Tasca - Categoria"
+
+msgctxt "model:calendar.todo.alarm,name:"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.todo.attendee,name:"
+msgid "Attendee"
+msgstr "Assistents"
+
+msgctxt "model:calendar.todo.exdate,name:"
+msgid "Exception Date"
+msgstr "Data exclosa"
+
+msgctxt "model:calendar.todo.exrule,name:"
+msgid "Exception Rule"
+msgstr "Regla d'excepció"
+
+#, fuzzy
+msgctxt "model:calendar.todo.rdate,name:"
+msgid "Todo Recurrence Date"
+msgstr "Data de recurrencia"
+
+msgctxt "model:calendar.todo.rrule,name:"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "model:ir.action,name:act_todo_form"
+msgid "Todos"
+msgstr "Tasques"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_todo_form3"
+msgid "Todos"
+msgstr "Tasques"
+
+msgctxt "model:ir.ui.menu,name:menu_todo_form"
+msgid "Todos"
+msgstr "Tasques"
+
+msgctxt "selection:calendar.todo,classification:"
+msgid "Confidential"
+msgstr "Confidencial"
+
+msgctxt "selection:calendar.todo,classification:"
+msgid "Private"
+msgstr "Privat"
+
+msgctxt "selection:calendar.todo,classification:"
+msgid "Public"
+msgstr "Públic"
+
+msgctxt "selection:calendar.todo,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:"
+msgid "Cancelled"
+msgstr "Cancel·lada"
+
+msgctxt "selection:calendar.todo,status:"
+msgid "Completed"
+msgstr "Completat"
+
+msgctxt "selection:calendar.todo,status:"
+msgid "In-Process"
+msgstr "En procés"
+
+msgctxt "selection:calendar.todo,status:"
+msgid "Needs-Action"
+msgstr "Necessita una acció"
+
+msgctxt "view:calendar.todo.attendee:"
+msgid "Attendee"
+msgstr "Assistents"
+
+msgctxt "view:calendar.todo.attendee:"
+msgid "Attendees"
+msgstr "Assistents"
+
+msgctxt "view:calendar.todo.exdate:"
+msgid "Exception Date"
+msgstr "Data exclosa"
+
+msgctxt "view:calendar.todo.exdate:"
+msgid "Exception Dates"
+msgstr "Dates excloses"
+
+msgctxt "view:calendar.todo.exrule:"
+msgid "Exception Rule"
+msgstr "Regla d'excepció"
+
+msgctxt "view:calendar.todo.exrule:"
+msgid "Exception Rules"
+msgstr "Regles d'excepcions"
+
+msgctxt "view:calendar.todo.rdate:"
+msgid "Recurrence Date"
+msgstr "Data de recurrencia"
+
+msgctxt "view:calendar.todo.rdate:"
+msgid "Recurrence Dates"
+msgstr "Dates de recurrencia"
+
+msgctxt "view:calendar.todo.rrule:"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "view:calendar.todo.rrule:"
+msgid "Recurrence Rules"
+msgstr "Regles de recurrencia"
+
+msgctxt "view:calendar.todo:"
+msgid "Attendees"
+msgstr "Assistents"
+
+msgctxt "view:calendar.todo:"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "view:calendar.todo:"
+msgid "General"
+msgstr "General"
+
+#, fuzzy
+msgctxt "view:calendar.todo:"
+msgid "Occurences"
+msgstr "Ocurrències"
+
+msgctxt "view:calendar.todo:"
+msgid "Recurrences"
+msgstr "Recurrencias"
+
+msgctxt "view:calendar.todo:"
+msgid "Todo"
+msgstr "Tasca"
+
+msgctxt "view:calendar.todo:"
+msgid "Todos"
+msgstr "Tasques"
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
index 952cc84..3b45346 100644
--- a/locale/cs_CZ.po
+++ b/locale/cs_CZ.po
@@ -2,247 +2,407 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
msgid "Recurrence can not be recurrent!"
msgstr ""
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
msgid "UUID and recurrence must be unique in a calendar!"
msgstr ""
-msgctxt "field:calendar.todo,alarms:0"
+msgctxt "field:calendar.todo,alarms:"
msgid "Alarms"
msgstr ""
-msgctxt "field:calendar.todo,attendees:0"
+msgctxt "field:calendar.todo,attendees:"
msgid "Attendees"
msgstr ""
-msgctxt "field:calendar.todo,calendar:0"
+msgctxt "field:calendar.todo,calendar:"
msgid "Calendar"
msgstr ""
-msgctxt "field:calendar.todo,calendar_owner:0"
+msgctxt "field:calendar.todo,calendar_owner:"
msgid "Owner"
msgstr ""
-msgctxt "field:calendar.todo,calendar_read_users:0"
+msgctxt "field:calendar.todo,calendar_read_users:"
msgid "Read Users"
msgstr ""
-msgctxt "field:calendar.todo,calendar_write_users:0"
+msgctxt "field:calendar.todo,calendar_write_users:"
msgid "Write Users"
msgstr ""
-msgctxt "field:calendar.todo,categories:0"
+msgctxt "field:calendar.todo,categories:"
msgid "Categories"
msgstr ""
-msgctxt "field:calendar.todo,classification:0"
+msgctxt "field:calendar.todo,classification:"
msgid "Classification"
msgstr ""
-msgctxt "field:calendar.todo,completed:0"
+msgctxt "field:calendar.todo,completed:"
msgid "Completed"
msgstr ""
-msgctxt "field:calendar.todo,description:0"
+msgctxt "field:calendar.todo,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo,description:"
msgid "Description"
msgstr ""
-msgctxt "field:calendar.todo,dtstart:0"
+msgctxt "field:calendar.todo,dtstart:"
msgid "Start Date"
msgstr ""
-msgctxt "field:calendar.todo,due:0"
+msgctxt "field:calendar.todo,due:"
msgid "Due Date"
msgstr ""
-msgctxt "field:calendar.todo,exdates:0"
+msgctxt "field:calendar.todo,exdates:"
msgid "Exception Dates"
msgstr ""
-msgctxt "field:calendar.todo,exrules:0"
+msgctxt "field:calendar.todo,exrules:"
msgid "Exception Rules"
msgstr ""
-msgctxt "field:calendar.todo,location:0"
+msgctxt "field:calendar.todo,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo,location:"
msgid "Location"
msgstr ""
-msgctxt "field:calendar.todo,occurences:0"
+msgctxt "field:calendar.todo,occurences:"
msgid "Occurences"
msgstr ""
-msgctxt "field:calendar.todo,organizer:0"
+msgctxt "field:calendar.todo,organizer:"
msgid "Organizer"
msgstr ""
-msgctxt "field:calendar.todo,parent:0"
+msgctxt "field:calendar.todo,parent:"
msgid "Parent"
msgstr ""
-msgctxt "field:calendar.todo,percent_complete:0"
+msgctxt "field:calendar.todo,percent_complete:"
msgid "Percent complete"
msgstr ""
-msgctxt "field:calendar.todo,rdates:0"
+msgctxt "field:calendar.todo,rdates:"
msgid "Recurrence Dates"
msgstr ""
-msgctxt "field:calendar.todo,rec_name:0"
+msgctxt "field:calendar.todo,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.todo,recurrence:0"
+msgctxt "field:calendar.todo,recurrence:"
msgid "Recurrence"
msgstr ""
-msgctxt "field:calendar.todo,rrules:0"
+msgctxt "field:calendar.todo,rrules:"
msgid "Recurrence Rules"
msgstr ""
-msgctxt "field:calendar.todo,sequence:0"
+msgctxt "field:calendar.todo,sequence:"
msgid "Sequence"
msgstr ""
-msgctxt "field:calendar.todo,status:0"
+msgctxt "field:calendar.todo,status:"
msgid "Status"
msgstr ""
-msgctxt "field:calendar.todo,summary:0"
+msgctxt "field:calendar.todo,summary:"
msgid "Summary"
msgstr ""
-msgctxt "field:calendar.todo,timezone:0"
+msgctxt "field:calendar.todo,timezone:"
msgid "Timezone"
msgstr ""
-msgctxt "field:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo,uuid:"
msgid "UUID"
msgstr ""
-msgctxt "field:calendar.todo,vtodo:0"
+msgctxt "field:calendar.todo,vtodo:"
msgid "vtodo"
msgstr ""
-msgctxt "field:calendar.todo-calendar.category,category:0"
+msgctxt "field:calendar.todo,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,category:"
msgid "Category"
msgstr ""
-msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgctxt "field:calendar.todo-calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgctxt "field:calendar.todo-calendar.category,todo:"
msgid "To-Do"
msgstr ""
-msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgctxt "field:calendar.todo-calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:"
msgid "Calendar Alarm"
msgstr ""
-msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgctxt "field:calendar.todo.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.todo.alarm,todo:0"
+msgctxt "field:calendar.todo.alarm,todo:"
msgid "Todo"
msgstr ""
-msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgctxt "field:calendar.todo.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:"
msgid "Calendar Attendee"
msgstr ""
-msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgctxt "field:calendar.todo.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.todo.attendee,todo:0"
+msgctxt "field:calendar.todo.attendee,todo:"
msgid "Todo"
msgstr ""
-msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgctxt "field:calendar.todo.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,calendar_date:"
msgid "Calendar Date"
msgstr ""
-msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgctxt "field:calendar.todo.exdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.todo.exdate,todo:0"
+msgctxt "field:calendar.todo.exdate,todo:"
msgid "Todo"
msgstr ""
-msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.exdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr ""
-msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgctxt "field:calendar.todo.exrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.todo.exrule,todo:0"
+msgctxt "field:calendar.todo.exrule,todo:"
msgid "Todo"
msgstr ""
-msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgctxt "field:calendar.todo.exrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,calendar_date:"
msgid "Calendar Date"
msgstr ""
-msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgctxt "field:calendar.todo.rdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.todo.rdate,todo:0"
+msgctxt "field:calendar.todo.rdate,todo:"
msgid "Todo"
msgstr ""
-msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.rdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr ""
-msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgctxt "field:calendar.todo.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.todo.rrule,todo:0"
+msgctxt "field:calendar.todo.rrule,todo:"
msgid "Todo"
msgstr ""
-msgctxt "help:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "help:calendar.todo,uuid:"
msgid "Universally Unique Identifier"
msgstr ""
-msgctxt "model:calendar.todo,name:0"
+msgctxt "model:calendar.todo,name:"
msgid "Todo"
msgstr ""
-msgctxt "model:calendar.todo-calendar.category,name:0"
+msgctxt "model:calendar.todo-calendar.category,name:"
msgid "Todo - Category"
msgstr ""
-msgctxt "model:calendar.todo.alarm,name:0"
+msgctxt "model:calendar.todo.alarm,name:"
msgid "Alarm"
msgstr ""
-msgctxt "model:calendar.todo.attendee,name:0"
+msgctxt "model:calendar.todo.attendee,name:"
msgid "Attendee"
msgstr ""
-msgctxt "model:calendar.todo.exdate,name:0"
+msgctxt "model:calendar.todo.exdate,name:"
msgid "Exception Date"
msgstr ""
-msgctxt "model:calendar.todo.exrule,name:0"
+msgctxt "model:calendar.todo.exrule,name:"
msgid "Exception Rule"
msgstr ""
-msgctxt "model:calendar.todo.rdate,name:0"
+msgctxt "model:calendar.todo.rdate,name:"
msgid "Todo Recurrence Date"
msgstr ""
-msgctxt "model:calendar.todo.rrule,name:0"
+msgctxt "model:calendar.todo.rrule,name:"
msgid "Recurrence Rule"
msgstr ""
@@ -258,98 +418,98 @@ msgctxt "model:ir.ui.menu,name:menu_todo_form"
msgid "Todos"
msgstr ""
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
msgid "Confidential"
msgstr ""
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
msgid "Private"
msgstr ""
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
msgid "Public"
msgstr ""
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid ""
msgstr ""
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "Cancelled"
msgstr ""
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "Completed"
msgstr ""
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "In-Process"
msgstr ""
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "Needs-Action"
msgstr ""
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
msgid "Attendee"
msgstr ""
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
msgid "Attendees"
msgstr ""
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
msgid "Exception Date"
msgstr ""
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
msgid "Exception Dates"
msgstr ""
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
msgid "Exception Rule"
msgstr ""
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
msgid "Exception Rules"
msgstr ""
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Date"
msgstr ""
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Dates"
msgstr ""
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
msgid "Recurrence Rule"
msgstr ""
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
msgid "Recurrence Rules"
msgstr ""
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Attendees"
msgstr ""
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Categories"
msgstr ""
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "General"
msgstr ""
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Occurences"
msgstr ""
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Todo"
msgstr ""
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Todos"
msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
index e83f5d4..5e40432 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -2,249 +2,409 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
msgid "Recurrence can not be recurrent!"
msgstr "Wiederholungen können nicht rekursiv sein!"
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
msgid "UUID and recurrence must be unique in a calendar!"
msgstr ""
"UUID und Wiederholung können in einem Kalender nicht mehrfach vergeben "
"werden!"
-msgctxt "field:calendar.todo,alarms:0"
+msgctxt "field:calendar.todo,alarms:"
msgid "Alarms"
msgstr "Alarm"
-msgctxt "field:calendar.todo,attendees:0"
+msgctxt "field:calendar.todo,attendees:"
msgid "Attendees"
msgstr "Teilnehmer"
-msgctxt "field:calendar.todo,calendar:0"
+msgctxt "field:calendar.todo,calendar:"
msgid "Calendar"
msgstr "Kalender"
-msgctxt "field:calendar.todo,calendar_owner:0"
+msgctxt "field:calendar.todo,calendar_owner:"
msgid "Owner"
msgstr "Besitzer"
-msgctxt "field:calendar.todo,calendar_read_users:0"
+msgctxt "field:calendar.todo,calendar_read_users:"
msgid "Read Users"
msgstr "Benutzer mit Leseberechtigung"
-msgctxt "field:calendar.todo,calendar_write_users:0"
+msgctxt "field:calendar.todo,calendar_write_users:"
msgid "Write Users"
msgstr "Benutzer mit Schreibberechtigung"
-msgctxt "field:calendar.todo,categories:0"
+msgctxt "field:calendar.todo,categories:"
msgid "Categories"
msgstr "Kategorien"
-msgctxt "field:calendar.todo,classification:0"
+msgctxt "field:calendar.todo,classification:"
msgid "Classification"
msgstr "Klassifizierung"
-msgctxt "field:calendar.todo,completed:0"
+msgctxt "field:calendar.todo,completed:"
msgid "Completed"
msgstr "Abgeschlossen"
-msgctxt "field:calendar.todo,description:0"
+msgctxt "field:calendar.todo,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.todo,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.todo,description:"
msgid "Description"
msgstr "Bezeichnung"
-msgctxt "field:calendar.todo,dtstart:0"
+msgctxt "field:calendar.todo,dtstart:"
msgid "Start Date"
msgstr "Anfangsdatum"
-msgctxt "field:calendar.todo,due:0"
+msgctxt "field:calendar.todo,due:"
msgid "Due Date"
msgstr "Fälligkeitsdatum"
-msgctxt "field:calendar.todo,exdates:0"
+msgctxt "field:calendar.todo,exdates:"
msgid "Exception Dates"
msgstr "Ausnahmedaten"
-msgctxt "field:calendar.todo,exrules:0"
+msgctxt "field:calendar.todo,exrules:"
msgid "Exception Rules"
msgstr "Ausnahmeregeln"
-msgctxt "field:calendar.todo,location:0"
+msgctxt "field:calendar.todo,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo,location:"
msgid "Location"
msgstr "Ort"
-msgctxt "field:calendar.todo,occurences:0"
+msgctxt "field:calendar.todo,occurences:"
msgid "Occurences"
msgstr "Ereignisse"
-msgctxt "field:calendar.todo,organizer:0"
+msgctxt "field:calendar.todo,organizer:"
msgid "Organizer"
msgstr "Organisator"
-msgctxt "field:calendar.todo,parent:0"
+msgctxt "field:calendar.todo,parent:"
msgid "Parent"
msgstr "Übergeordnet (Aufgabe)"
-msgctxt "field:calendar.todo,percent_complete:0"
+msgctxt "field:calendar.todo,percent_complete:"
msgid "Percent complete"
msgstr "% erledigt"
-msgctxt "field:calendar.todo,rdates:0"
+msgctxt "field:calendar.todo,rdates:"
msgid "Recurrence Dates"
msgstr "Wiederholungsdaten"
-msgctxt "field:calendar.todo,rec_name:0"
+msgctxt "field:calendar.todo,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.todo,recurrence:0"
+msgctxt "field:calendar.todo,recurrence:"
msgid "Recurrence"
msgstr "Wiederholung"
-msgctxt "field:calendar.todo,rrules:0"
+msgctxt "field:calendar.todo,rrules:"
msgid "Recurrence Rules"
msgstr "Wiederholungsregeln"
-msgctxt "field:calendar.todo,sequence:0"
+msgctxt "field:calendar.todo,sequence:"
msgid "Sequence"
msgstr "Revision"
-msgctxt "field:calendar.todo,status:0"
+msgctxt "field:calendar.todo,status:"
msgid "Status"
msgstr "Status"
-msgctxt "field:calendar.todo,summary:0"
+msgctxt "field:calendar.todo,summary:"
msgid "Summary"
msgstr "Zusammenfassung"
-msgctxt "field:calendar.todo,timezone:0"
+msgctxt "field:calendar.todo,timezone:"
msgid "Timezone"
msgstr "Zeitzone"
-msgctxt "field:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo,uuid:"
msgid "UUID"
msgstr "UUID"
-msgctxt "field:calendar.todo,vtodo:0"
+msgctxt "field:calendar.todo,vtodo:"
msgid "vtodo"
msgstr "vtodo"
-msgctxt "field:calendar.todo-calendar.category,category:0"
+msgctxt "field:calendar.todo,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.todo,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.todo-calendar.category,category:"
msgid "Category"
msgstr "Kategorie"
-msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgctxt "field:calendar.todo-calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.todo-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.todo-calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgctxt "field:calendar.todo-calendar.category,todo:"
msgid "To-Do"
msgstr "Aufgabe"
-msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgctxt "field:calendar.todo-calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.todo-calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:"
msgid "Calendar Alarm"
msgstr "Kalender Alarm"
-msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgctxt "field:calendar.todo.alarm,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.todo.alarm,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.todo.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.alarm,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.todo.alarm,todo:0"
+msgctxt "field:calendar.todo.alarm,todo:"
msgid "Todo"
msgstr "Aufgabe"
-msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgctxt "field:calendar.todo.alarm,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.todo.alarm,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:"
msgid "Calendar Attendee"
msgstr "Kalender Teilnehmer"
-msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgctxt "field:calendar.todo.attendee,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.todo.attendee,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.todo.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.attendee,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.todo.attendee,todo:0"
+msgctxt "field:calendar.todo.attendee,todo:"
msgid "Todo"
msgstr "Aufgabe"
-msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgctxt "field:calendar.todo.attendee,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.todo.attendee,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.todo.exdate,calendar_date:"
msgid "Calendar Date"
msgstr "Kalender Datum"
-msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgctxt "field:calendar.todo.exdate,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.todo.exdate,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.todo.exdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.exdate,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.todo.exdate,todo:0"
+msgctxt "field:calendar.todo.exdate,todo:"
msgid "Todo"
msgstr "Aufgabe"
-msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.exdate,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.todo.exdate,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr "Kalender WRegel"
-msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgctxt "field:calendar.todo.exrule,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.todo.exrule,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.todo.exrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.exrule,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.todo.exrule,todo:0"
+msgctxt "field:calendar.todo.exrule,todo:"
msgid "Todo"
msgstr "Aufgabe"
-msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgctxt "field:calendar.todo.exrule,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.todo.exrule,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.todo.rdate,calendar_date:"
msgid "Calendar Date"
msgstr "Kalender Datum"
-msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgctxt "field:calendar.todo.rdate,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.todo.rdate,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.todo.rdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.rdate,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.todo.rdate,todo:0"
+msgctxt "field:calendar.todo.rdate,todo:"
msgid "Todo"
msgstr "Aufgabe"
-msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.rdate,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.todo.rdate,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr "Kalender WRegel"
-msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgctxt "field:calendar.todo.rrule,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.todo.rrule,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.todo.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.rrule,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.todo.rrule,todo:0"
+msgctxt "field:calendar.todo.rrule,todo:"
msgid "Todo"
msgstr "Aufgabe"
-msgctxt "help:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo.rrule,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.todo.rrule,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "help:calendar.todo,uuid:"
msgid "Universally Unique Identifier"
msgstr "Universally Unique Identifier"
-msgctxt "model:calendar.todo,name:0"
+msgctxt "model:calendar.todo,name:"
msgid "Todo"
msgstr "Aufgabe"
-msgctxt "model:calendar.todo-calendar.category,name:0"
+msgctxt "model:calendar.todo-calendar.category,name:"
msgid "Todo - Category"
msgstr "Aufgabe - Kategorie"
-msgctxt "model:calendar.todo.alarm,name:0"
+msgctxt "model:calendar.todo.alarm,name:"
msgid "Alarm"
msgstr "Alarm"
-msgctxt "model:calendar.todo.attendee,name:0"
+msgctxt "model:calendar.todo.attendee,name:"
msgid "Attendee"
msgstr "Teilnehmer"
-msgctxt "model:calendar.todo.exdate,name:0"
+msgctxt "model:calendar.todo.exdate,name:"
msgid "Exception Date"
msgstr "Ausnahmedatum"
-msgctxt "model:calendar.todo.exrule,name:0"
+msgctxt "model:calendar.todo.exrule,name:"
msgid "Exception Rule"
msgstr "Ausnahmeregel"
-msgctxt "model:calendar.todo.rdate,name:0"
+msgctxt "model:calendar.todo.rdate,name:"
msgid "Todo Recurrence Date"
msgstr "Aufgabe Wiederholungsdatum"
-msgctxt "model:calendar.todo.rrule,name:0"
+msgctxt "model:calendar.todo.rrule,name:"
msgid "Recurrence Rule"
msgstr "Wiederholungsregel"
@@ -260,102 +420,102 @@ msgctxt "model:ir.ui.menu,name:menu_todo_form"
msgid "Todos"
msgstr "Aufgaben"
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
msgid "Confidential"
msgstr "Vertraulich"
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
msgid "Private"
msgstr "Privat"
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
msgid "Public"
msgstr "Öffentlich"
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid ""
msgstr ""
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "Cancelled"
msgstr "Abgesagt"
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "Completed"
msgstr "Abgeschlossen"
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "In-Process"
msgstr "In Arbeit"
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "Needs-Action"
msgstr "Benötigt Eingriff"
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
msgid "Attendee"
msgstr "Teilnehmer"
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
msgid "Attendees"
msgstr "Teilnehmer"
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
msgid "Exception Date"
msgstr "Ausnahmedatum"
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
msgid "Exception Dates"
msgstr "Ausnahmedaten"
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
msgid "Exception Rule"
msgstr "Ausnahmeregel"
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
msgid "Exception Rules"
msgstr "Ausnahmeregeln"
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Date"
msgstr "Wiederholungsdatum"
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Dates"
msgstr "Wiederholungsdaten"
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
msgid "Recurrence Rule"
msgstr "Wiederholungsregel"
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
msgid "Recurrence Rules"
msgstr "Wiederholungsregeln"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Attendees"
msgstr "Teilnehmer"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Categories"
msgstr "Kategorien"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "General"
msgstr "Allgemein"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Occurences"
msgstr "Ereignisse"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Recurrences"
msgstr "Wiederholungen"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Todo"
msgstr "Aufgabe"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Todos"
msgstr "Aufgaben"
diff --git a/locale/es_AR.po b/locale/es_AR.po
new file mode 100644
index 0000000..542f292
--- /dev/null
+++ b/locale/es_AR.po
@@ -0,0 +1,3 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index 90e30ea..6497ec2 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -2,250 +2,418 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
msgid "Recurrence can not be recurrent!"
msgstr "¡La repetición no puede repetirse!"
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
msgid "UUID and recurrence must be unique in a calendar!"
msgstr "¡El UUID y la recurrencia deben ser únicos por calendario! "
-msgctxt "field:calendar.todo,alarms:0"
+msgctxt "field:calendar.todo,alarms:"
msgid "Alarms"
msgstr "Alarmas"
-msgctxt "field:calendar.todo,attendees:0"
+msgctxt "field:calendar.todo,attendees:"
msgid "Attendees"
msgstr "Asistentes"
-msgctxt "field:calendar.todo,calendar:0"
+msgctxt "field:calendar.todo,calendar:"
msgid "Calendar"
msgstr "Calendario"
-msgctxt "field:calendar.todo,calendar_owner:0"
+msgctxt "field:calendar.todo,calendar_owner:"
msgid "Owner"
msgstr "Propietario"
-msgctxt "field:calendar.todo,calendar_read_users:0"
+msgctxt "field:calendar.todo,calendar_read_users:"
msgid "Read Users"
msgstr "Leer Usuarios"
-msgctxt "field:calendar.todo,calendar_write_users:0"
+msgctxt "field:calendar.todo,calendar_write_users:"
msgid "Write Users"
msgstr "Escribir Usuarios"
-msgctxt "field:calendar.todo,categories:0"
+msgctxt "field:calendar.todo,categories:"
msgid "Categories"
msgstr "Categorías"
-msgctxt "field:calendar.todo,classification:0"
+msgctxt "field:calendar.todo,classification:"
msgid "Classification"
msgstr "Clasificación"
-msgctxt "field:calendar.todo,completed:0"
+msgctxt "field:calendar.todo,completed:"
msgid "Completed"
msgstr ""
-msgctxt "field:calendar.todo,description:0"
+msgctxt "field:calendar.todo,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.todo,description:"
msgid "Description"
msgstr "Descripción"
-msgctxt "field:calendar.todo,dtstart:0"
+msgctxt "field:calendar.todo,dtstart:"
msgid "Start Date"
msgstr "Fecha Inicio"
-msgctxt "field:calendar.todo,due:0"
+msgctxt "field:calendar.todo,due:"
msgid "Due Date"
msgstr ""
-msgctxt "field:calendar.todo,exdates:0"
+msgctxt "field:calendar.todo,exdates:"
msgid "Exception Dates"
msgstr "Fechas de Excepción"
-msgctxt "field:calendar.todo,exrules:0"
+msgctxt "field:calendar.todo,exrules:"
msgid "Exception Rules"
msgstr "Reglas de Excepción"
-msgctxt "field:calendar.todo,location:0"
+msgctxt "field:calendar.todo,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo,location:"
msgid "Location"
msgstr "Lugar"
-msgctxt "field:calendar.todo,occurences:0"
+msgctxt "field:calendar.todo,occurences:"
msgid "Occurences"
msgstr "Ocurrencias"
-msgctxt "field:calendar.todo,organizer:0"
+msgctxt "field:calendar.todo,organizer:"
msgid "Organizer"
msgstr "Organizador"
-msgctxt "field:calendar.todo,parent:0"
+msgctxt "field:calendar.todo,parent:"
msgid "Parent"
msgstr "Padre"
-msgctxt "field:calendar.todo,percent_complete:0"
+msgctxt "field:calendar.todo,percent_complete:"
msgid "Percent complete"
msgstr ""
-msgctxt "field:calendar.todo,rdates:0"
+msgctxt "field:calendar.todo,rdates:"
msgid "Recurrence Dates"
msgstr "Fechas de Repetición"
-msgctxt "field:calendar.todo,rec_name:0"
+msgctxt "field:calendar.todo,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.todo,recurrence:0"
+msgctxt "field:calendar.todo,recurrence:"
msgid "Recurrence"
msgstr "Repetición"
-msgctxt "field:calendar.todo,rrules:0"
+msgctxt "field:calendar.todo,rrules:"
msgid "Recurrence Rules"
msgstr "Reglas de Repetición"
-msgctxt "field:calendar.todo,sequence:0"
+msgctxt "field:calendar.todo,sequence:"
msgid "Sequence"
msgstr "Secuencia"
-msgctxt "field:calendar.todo,status:0"
+msgctxt "field:calendar.todo,status:"
msgid "Status"
msgstr "Estado"
-msgctxt "field:calendar.todo,summary:0"
+msgctxt "field:calendar.todo,summary:"
msgid "Summary"
msgstr "Resumen"
-msgctxt "field:calendar.todo,timezone:0"
+msgctxt "field:calendar.todo,timezone:"
msgid "Timezone"
msgstr "Zona horaria"
-msgctxt "field:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo,uuid:"
msgid "UUID"
msgstr "UUID"
-msgctxt "field:calendar.todo,vtodo:0"
+msgctxt "field:calendar.todo,vtodo:"
msgid "vtodo"
msgstr ""
-msgctxt "field:calendar.todo-calendar.category,category:0"
+msgctxt "field:calendar.todo,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,category:"
msgid "Category"
msgstr "Categoría"
-msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgctxt "field:calendar.todo-calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.todo-calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgctxt "field:calendar.todo-calendar.category,todo:"
msgid "To-Do"
msgstr ""
-msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgctxt "field:calendar.todo-calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:"
msgid "Calendar Alarm"
msgstr ""
-msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgctxt "field:calendar.todo.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.alarm,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.todo.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.todo.alarm,todo:0"
+msgctxt "field:calendar.todo.alarm,todo:"
msgid "Todo"
msgstr ""
-msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgctxt "field:calendar.todo.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:"
msgid "Calendar Attendee"
msgstr ""
-msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgctxt "field:calendar.todo.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.attendee,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.todo.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.todo.attendee,todo:0"
+msgctxt "field:calendar.todo.attendee,todo:"
msgid "Todo"
msgstr ""
+msgctxt "field:calendar.todo.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgctxt "field:calendar.todo.exdate,calendar_date:"
msgid "Calendar Date"
msgstr "Fecha Calendario"
-msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgctxt "field:calendar.todo.exdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.exdate,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.todo.exdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.todo.exdate,todo:0"
+msgctxt "field:calendar.todo.exdate,todo:"
msgid "Todo"
msgstr ""
-msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.exdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr ""
-msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgctxt "field:calendar.todo.exrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.exrule,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.todo.exrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.todo.exrule,todo:0"
+msgctxt "field:calendar.todo.exrule,todo:"
msgid "Todo"
msgstr ""
+msgctxt "field:calendar.todo.exrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgctxt "field:calendar.todo.rdate,calendar_date:"
msgid "Calendar Date"
msgstr "Fecha Calendario"
-msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgctxt "field:calendar.todo.rdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.rdate,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.todo.rdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.todo.rdate,todo:0"
+msgctxt "field:calendar.todo.rdate,todo:"
msgid "Todo"
msgstr ""
-msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.rdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr ""
-msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgctxt "field:calendar.todo.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.rrule,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.todo.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.todo.rrule,todo:0"
+msgctxt "field:calendar.todo.rrule,todo:"
msgid "Todo"
msgstr ""
-msgctxt "help:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "help:calendar.todo,uuid:"
msgid "Universally Unique Identifier"
msgstr "Identificador Único Universal"
-msgctxt "model:calendar.todo,name:0"
+msgctxt "model:calendar.todo,name:"
msgid "Todo"
msgstr ""
-msgctxt "model:calendar.todo-calendar.category,name:0"
+msgctxt "model:calendar.todo-calendar.category,name:"
msgid "Todo - Category"
msgstr ""
-msgctxt "model:calendar.todo.alarm,name:0"
+msgctxt "model:calendar.todo.alarm,name:"
msgid "Alarm"
msgstr "Alarma"
-msgctxt "model:calendar.todo.attendee,name:0"
+msgctxt "model:calendar.todo.attendee,name:"
msgid "Attendee"
msgstr "Asistente"
-msgctxt "model:calendar.todo.exdate,name:0"
+msgctxt "model:calendar.todo.exdate,name:"
msgid "Exception Date"
msgstr "Fecha de Excepción"
-msgctxt "model:calendar.todo.exrule,name:0"
+msgctxt "model:calendar.todo.exrule,name:"
msgid "Exception Rule"
msgstr "Regla de Excepción"
#, fuzzy
-msgctxt "model:calendar.todo.rdate,name:0"
+msgctxt "model:calendar.todo.rdate,name:"
msgid "Todo Recurrence Date"
msgstr "Fecha de Repetición"
-msgctxt "model:calendar.todo.rrule,name:0"
+msgctxt "model:calendar.todo.rrule,name:"
msgid "Recurrence Rule"
msgstr "Regla de Repetición"
@@ -263,103 +431,103 @@ msgctxt "model:ir.ui.menu,name:menu_todo_form"
msgid "Todos"
msgstr "Por hacer"
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
msgid "Confidential"
msgstr "Confidencial"
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
msgid "Private"
msgstr "Privado"
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
msgid "Public"
msgstr "Público"
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid ""
msgstr ""
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "Cancelled"
msgstr "Cancelado"
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "Completed"
msgstr ""
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "In-Process"
msgstr ""
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "Needs-Action"
msgstr ""
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
msgid "Attendee"
msgstr "Asistente"
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
msgid "Attendees"
msgstr "Asistentes"
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
msgid "Exception Date"
msgstr "Fecha de Excepción"
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
msgid "Exception Dates"
msgstr "Fechas de Excepción"
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
msgid "Exception Rule"
msgstr "Regla de Excepción"
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
msgid "Exception Rules"
msgstr "Reglas de Excepción"
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Date"
msgstr "Fecha de Repetición"
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Dates"
msgstr "Fechas de Repetición"
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
msgid "Recurrence Rule"
msgstr "Regla de Repetición"
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
msgid "Recurrence Rules"
msgstr "Reglas de Repetición"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Attendees"
msgstr "Asistentes"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Categories"
msgstr "Categorías"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "General"
msgstr "General"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Occurences"
msgstr "Ocurrencias"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Recurrences"
msgstr "Repeticiones"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Todo"
msgstr ""
#, fuzzy
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Todos"
msgstr "Por hacer"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index 26b3e1f..950cf5d 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -2,249 +2,407 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
msgid "Recurrence can not be recurrent!"
-msgstr "Una recurrencia no puede ser recurrente"
+msgstr "Una recurrencia no puede ser recurrente."
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "UUID y recurrencia deben ser únicos en un calendario"
+msgstr "UUID y recurrencia deben ser únicos en un calendario."
-msgctxt "field:calendar.todo,alarms:0"
+msgctxt "field:calendar.todo,alarms:"
msgid "Alarms"
msgstr "Alarmas"
-msgctxt "field:calendar.todo,attendees:0"
+msgctxt "field:calendar.todo,attendees:"
msgid "Attendees"
msgstr "Asistentes"
-msgctxt "field:calendar.todo,calendar:0"
+msgctxt "field:calendar.todo,calendar:"
msgid "Calendar"
msgstr "Calendario"
-msgctxt "field:calendar.todo,calendar_owner:0"
+msgctxt "field:calendar.todo,calendar_owner:"
msgid "Owner"
-msgstr "Dueño"
+msgstr "Propietario"
-msgctxt "field:calendar.todo,calendar_read_users:0"
+msgctxt "field:calendar.todo,calendar_read_users:"
msgid "Read Users"
msgstr "Usuarios con lectura"
-msgctxt "field:calendar.todo,calendar_write_users:0"
+msgctxt "field:calendar.todo,calendar_write_users:"
msgid "Write Users"
msgstr "Usuarios con escritura"
-msgctxt "field:calendar.todo,categories:0"
+msgctxt "field:calendar.todo,categories:"
msgid "Categories"
msgstr "Categorías"
-msgctxt "field:calendar.todo,classification:0"
+msgctxt "field:calendar.todo,classification:"
msgid "Classification"
msgstr "Clasificación"
-msgctxt "field:calendar.todo,completed:0"
+msgctxt "field:calendar.todo,completed:"
msgid "Completed"
msgstr "Completada"
-msgctxt "field:calendar.todo,description:0"
+msgctxt "field:calendar.todo,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo,description:"
msgid "Description"
msgstr "Descripción"
-msgctxt "field:calendar.todo,dtstart:0"
+msgctxt "field:calendar.todo,dtstart:"
msgid "Start Date"
-msgstr "Fecha inicio"
+msgstr "Fecha inicial"
-msgctxt "field:calendar.todo,due:0"
+msgctxt "field:calendar.todo,due:"
msgid "Due Date"
-msgstr "Fecha de vencimiento"
+msgstr "Fecha vencimiento"
-msgctxt "field:calendar.todo,exdates:0"
+msgctxt "field:calendar.todo,exdates:"
msgid "Exception Dates"
msgstr "Fechas excluidas"
-msgctxt "field:calendar.todo,exrules:0"
+msgctxt "field:calendar.todo,exrules:"
msgid "Exception Rules"
msgstr "Reglas de excepciones"
-msgctxt "field:calendar.todo,location:0"
+msgctxt "field:calendar.todo,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo,location:"
msgid "Location"
msgstr "Ubicación"
-#, fuzzy
-msgctxt "field:calendar.todo,occurences:0"
+msgctxt "field:calendar.todo,occurences:"
msgid "Occurences"
msgstr "Ocurrencias"
-msgctxt "field:calendar.todo,organizer:0"
+msgctxt "field:calendar.todo,organizer:"
msgid "Organizer"
msgstr "Organizador"
-msgctxt "field:calendar.todo,parent:0"
+msgctxt "field:calendar.todo,parent:"
msgid "Parent"
msgstr "Padre"
-msgctxt "field:calendar.todo,percent_complete:0"
+msgctxt "field:calendar.todo,percent_complete:"
msgid "Percent complete"
msgstr "Porcentaje total"
-msgctxt "field:calendar.todo,rdates:0"
+msgctxt "field:calendar.todo,rdates:"
msgid "Recurrence Dates"
msgstr "Fechas de recurrencia"
-msgctxt "field:calendar.todo,rec_name:0"
+msgctxt "field:calendar.todo,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.todo,recurrence:0"
+msgctxt "field:calendar.todo,recurrence:"
msgid "Recurrence"
msgstr "Recurrencia"
-msgctxt "field:calendar.todo,rrules:0"
+msgctxt "field:calendar.todo,rrules:"
msgid "Recurrence Rules"
msgstr "Reglas de recurrencia"
-msgctxt "field:calendar.todo,sequence:0"
+msgctxt "field:calendar.todo,sequence:"
msgid "Sequence"
msgstr "Secuencia"
-msgctxt "field:calendar.todo,status:0"
+msgctxt "field:calendar.todo,status:"
msgid "Status"
msgstr "Estado"
-msgctxt "field:calendar.todo,summary:0"
+msgctxt "field:calendar.todo,summary:"
msgid "Summary"
msgstr "Resumen"
-msgctxt "field:calendar.todo,timezone:0"
+msgctxt "field:calendar.todo,timezone:"
msgid "Timezone"
msgstr "Zona horaria"
-msgctxt "field:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo,uuid:"
msgid "UUID"
msgstr "UUID"
-msgctxt "field:calendar.todo,vtodo:0"
+msgctxt "field:calendar.todo,vtodo:"
msgid "vtodo"
-msgstr "vtodo"
+msgstr "vtarea"
-msgctxt "field:calendar.todo-calendar.category,category:0"
+msgctxt "field:calendar.todo,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo-calendar.category,category:"
msgid "Category"
msgstr "Categoría"
-msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgctxt "field:calendar.todo-calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo-calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgctxt "field:calendar.todo-calendar.category,todo:"
msgid "To-Do"
msgstr "Por hacer"
-msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgctxt "field:calendar.todo-calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo-calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:"
msgid "Calendar Alarm"
msgstr "Alarma del calendario"
-msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgctxt "field:calendar.todo.alarm,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo.alarm,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.alarm,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.todo.alarm,todo:0"
+msgctxt "field:calendar.todo.alarm,todo:"
msgid "Todo"
msgstr "Tarea"
-msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgctxt "field:calendar.todo.alarm,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.alarm,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:"
msgid "Calendar Attendee"
msgstr "Calendario de asistentes"
-msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgctxt "field:calendar.todo.attendee,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo.attendee,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.attendee,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.todo.attendee,todo:0"
+msgctxt "field:calendar.todo.attendee,todo:"
msgid "Todo"
msgstr "Tarea"
-msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgctxt "field:calendar.todo.attendee,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.attendee,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.exdate,calendar_date:"
msgid "Calendar Date"
-msgstr ""
+msgstr "Fecha calendario"
+
+msgctxt "field:calendar.todo.exdate,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
-msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgctxt "field:calendar.todo.exdate,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.exdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.exdate,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.todo.exdate,todo:0"
+msgctxt "field:calendar.todo.exdate,todo:"
msgid "Todo"
msgstr "Tarea"
-msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.exdate,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.exdate,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr "Regla de recurrencia"
-msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgctxt "field:calendar.todo.exrule,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo.exrule,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.exrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.exrule,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.todo.exrule,todo:0"
+msgctxt "field:calendar.todo.exrule,todo:"
msgid "Todo"
msgstr "Tarea"
-msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgctxt "field:calendar.todo.exrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.exrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.rdate,calendar_date:"
msgid "Calendar Date"
-msgstr ""
+msgstr "Fecha calendario"
+
+msgctxt "field:calendar.todo.rdate,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
-msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgctxt "field:calendar.todo.rdate,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.rdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.rdate,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.todo.rdate,todo:0"
+msgctxt "field:calendar.todo.rdate,todo:"
msgid "Todo"
msgstr "Tarea"
-msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.rdate,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.rdate,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr "Regla de recurrencia"
-msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgctxt "field:calendar.todo.rrule,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo.rrule,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.rrule,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.todo.rrule,todo:0"
+msgctxt "field:calendar.todo.rrule,todo:"
msgid "Todo"
msgstr "Tarea"
-msgctxt "help:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo.rrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.rrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "help:calendar.todo,uuid:"
msgid "Universally Unique Identifier"
-msgstr "Identificador universal único"
+msgstr "Identificador universal único."
-msgctxt "model:calendar.todo,name:0"
+msgctxt "model:calendar.todo,name:"
msgid "Todo"
msgstr "Tarea"
-msgctxt "model:calendar.todo-calendar.category,name:0"
+msgctxt "model:calendar.todo-calendar.category,name:"
msgid "Todo - Category"
msgstr "Tarea - Categoría"
-msgctxt "model:calendar.todo.alarm,name:0"
+msgctxt "model:calendar.todo.alarm,name:"
msgid "Alarm"
msgstr "Alarma"
-msgctxt "model:calendar.todo.attendee,name:0"
+msgctxt "model:calendar.todo.attendee,name:"
msgid "Attendee"
msgstr "Asistentes"
-msgctxt "model:calendar.todo.exdate,name:0"
+msgctxt "model:calendar.todo.exdate,name:"
msgid "Exception Date"
msgstr "Fecha excluida"
-msgctxt "model:calendar.todo.exrule,name:0"
+msgctxt "model:calendar.todo.exrule,name:"
msgid "Exception Rule"
msgstr "Regla de excepción"
-#, fuzzy
-msgctxt "model:calendar.todo.rdate,name:0"
+msgctxt "model:calendar.todo.rdate,name:"
msgid "Todo Recurrence Date"
-msgstr "Fecha de recurrencia"
+msgstr "Fecha recurrente de tarea"
-msgctxt "model:calendar.todo.rrule,name:0"
+msgctxt "model:calendar.todo.rrule,name:"
msgid "Recurrence Rule"
msgstr "Regla de recurrencia"
@@ -252,7 +410,6 @@ msgctxt "model:ir.action,name:act_todo_form"
msgid "Todos"
msgstr "Tareas"
-#, fuzzy
msgctxt "model:ir.action,name:act_todo_form3"
msgid "Todos"
msgstr "Tareas"
@@ -261,103 +418,102 @@ msgctxt "model:ir.ui.menu,name:menu_todo_form"
msgid "Todos"
msgstr "Tareas"
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
msgid "Confidential"
msgstr "Confidencial"
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
msgid "Private"
msgstr "Privado"
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
msgid "Public"
msgstr "Público"
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid ""
msgstr ""
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "Cancelled"
msgstr "Cancelada"
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "Completed"
-msgstr "Completado"
+msgstr "Completada"
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "In-Process"
msgstr "En proceso"
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "Needs-Action"
-msgstr "Necesita una acción"
+msgstr "Necesita acción"
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
msgid "Attendee"
msgstr "Asistentes"
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
msgid "Attendees"
msgstr "Asistentes"
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
msgid "Exception Date"
msgstr "Fecha excluida"
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
msgid "Exception Dates"
msgstr "Fechas excluidas"
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
msgid "Exception Rule"
msgstr "Regla de excepción"
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
msgid "Exception Rules"
msgstr "Reglas de excepciones"
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Date"
msgstr "Fecha de recurrencia"
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Dates"
msgstr "Fechas de recurrencia"
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
msgid "Recurrence Rule"
msgstr "Regla de recurrencia"
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
msgid "Recurrence Rules"
msgstr "Reglas de recurrencia"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Attendees"
msgstr "Asistentes"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Categories"
msgstr "Categorías"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "General"
msgstr "General"
-#, fuzzy
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Occurences"
msgstr "Ocurrencias"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Recurrences"
msgstr "Recurrencias"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Todo"
msgstr "Tarea"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Todos"
msgstr "Tareas"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index bbe3ff4..993dc35 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -2,247 +2,415 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
msgid "Recurrence can not be recurrent!"
msgstr "Une récurrence ne peut pas être récurrente !"
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
+msgid "Recurrence can not be recurrent!"
+msgstr "Une récurrence ne peut pas être récurrente !"
+
+msgctxt "error:calendar.todo:"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "UUID et récurrence doivent être uniques sur un calendrier !"
+
+msgctxt "error:calendar.todo:"
msgid "UUID and recurrence must be unique in a calendar!"
msgstr "UUID et récurrence doivent être uniques sur un calendrier !"
-msgctxt "field:calendar.todo,alarms:0"
+msgctxt "field:calendar.todo,alarms:"
msgid "Alarms"
msgstr "Alarmes"
-msgctxt "field:calendar.todo,attendees:0"
+msgctxt "field:calendar.todo,attendees:"
msgid "Attendees"
msgstr "Participants"
-msgctxt "field:calendar.todo,calendar:0"
+msgctxt "field:calendar.todo,calendar:"
msgid "Calendar"
msgstr "Calendrier"
-msgctxt "field:calendar.todo,calendar_owner:0"
+msgctxt "field:calendar.todo,calendar_owner:"
msgid "Owner"
msgstr "Propriétaire"
-msgctxt "field:calendar.todo,calendar_read_users:0"
+msgctxt "field:calendar.todo,calendar_read_users:"
msgid "Read Users"
msgstr "Utilisateurs en lecture"
-msgctxt "field:calendar.todo,calendar_write_users:0"
+msgctxt "field:calendar.todo,calendar_write_users:"
msgid "Write Users"
msgstr "Utilisateurs en écriture"
-msgctxt "field:calendar.todo,categories:0"
+msgctxt "field:calendar.todo,categories:"
msgid "Categories"
msgstr "Catégories"
-msgctxt "field:calendar.todo,classification:0"
+msgctxt "field:calendar.todo,classification:"
msgid "Classification"
msgstr "Classification"
-msgctxt "field:calendar.todo,completed:0"
+msgctxt "field:calendar.todo,completed:"
msgid "Completed"
msgstr "Complété"
-msgctxt "field:calendar.todo,description:0"
+msgctxt "field:calendar.todo,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.todo,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.todo,description:"
msgid "Description"
msgstr "Description"
-msgctxt "field:calendar.todo,dtstart:0"
+msgctxt "field:calendar.todo,dtstart:"
msgid "Start Date"
msgstr "Date de début"
-msgctxt "field:calendar.todo,due:0"
+msgctxt "field:calendar.todo,due:"
msgid "Due Date"
msgstr "Date d'échéance"
-msgctxt "field:calendar.todo,exdates:0"
+msgctxt "field:calendar.todo,exdates:"
msgid "Exception Dates"
msgstr "Dates d'exception"
-msgctxt "field:calendar.todo,exrules:0"
+msgctxt "field:calendar.todo,exrules:"
msgid "Exception Rules"
msgstr "Règles d'exception"
-msgctxt "field:calendar.todo,location:0"
+msgctxt "field:calendar.todo,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo,location:"
msgid "Location"
msgstr "Emplacement"
-msgctxt "field:calendar.todo,occurences:0"
+msgctxt "field:calendar.todo,occurences:"
msgid "Occurences"
msgstr "Occurrences"
-msgctxt "field:calendar.todo,organizer:0"
+msgctxt "field:calendar.todo,organizer:"
msgid "Organizer"
msgstr "Organisateur"
-msgctxt "field:calendar.todo,parent:0"
+msgctxt "field:calendar.todo,parent:"
msgid "Parent"
msgstr "Parent"
-msgctxt "field:calendar.todo,percent_complete:0"
+msgctxt "field:calendar.todo,percent_complete:"
msgid "Percent complete"
msgstr "Pourcentage effectué"
-msgctxt "field:calendar.todo,rdates:0"
+msgctxt "field:calendar.todo,rdates:"
msgid "Recurrence Dates"
msgstr "Dates de récurrence"
-msgctxt "field:calendar.todo,rec_name:0"
+msgctxt "field:calendar.todo,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.todo,recurrence:0"
+msgctxt "field:calendar.todo,recurrence:"
msgid "Recurrence"
msgstr "Récurrence"
-msgctxt "field:calendar.todo,rrules:0"
+msgctxt "field:calendar.todo,rrules:"
msgid "Recurrence Rules"
msgstr "Règles de récurrence"
-msgctxt "field:calendar.todo,sequence:0"
+msgctxt "field:calendar.todo,sequence:"
msgid "Sequence"
msgstr "Séquence"
-msgctxt "field:calendar.todo,status:0"
+msgctxt "field:calendar.todo,status:"
msgid "Status"
msgstr "Statut"
-msgctxt "field:calendar.todo,summary:0"
+msgctxt "field:calendar.todo,summary:"
msgid "Summary"
msgstr "Résumé"
-msgctxt "field:calendar.todo,timezone:0"
+msgctxt "field:calendar.todo,timezone:"
msgid "Timezone"
msgstr "Fuseau Horaire"
-msgctxt "field:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo,uuid:"
msgid "UUID"
msgstr "UUID"
-msgctxt "field:calendar.todo,vtodo:0"
+msgctxt "field:calendar.todo,vtodo:"
msgid "vtodo"
msgstr "vtodo"
-msgctxt "field:calendar.todo-calendar.category,category:0"
+msgctxt "field:calendar.todo,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.todo,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.todo-calendar.category,category:"
msgid "Category"
msgstr "Catégorie"
-msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgctxt "field:calendar.todo-calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.todo-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.todo-calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgctxt "field:calendar.todo-calendar.category,todo:"
msgid "To-Do"
msgstr "Tâche"
-msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgctxt "field:calendar.todo-calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.todo-calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:"
msgid "Calendar Alarm"
msgstr "Alarme calendrier"
-msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgctxt "field:calendar.todo.alarm,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.todo.alarm,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.todo.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.alarm,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.todo.alarm,todo:0"
+msgctxt "field:calendar.todo.alarm,todo:"
msgid "Todo"
msgstr "Tâche"
-msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgctxt "field:calendar.todo.alarm,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.todo.alarm,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:"
msgid "Calendar Attendee"
msgstr "Participant calendrier"
-msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgctxt "field:calendar.todo.attendee,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.todo.attendee,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.todo.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.attendee,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.todo.attendee,todo:0"
+msgctxt "field:calendar.todo.attendee,todo:"
msgid "Todo"
msgstr "Tâche"
-msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgctxt "field:calendar.todo.attendee,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.todo.attendee,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.todo.exdate,calendar_date:"
msgid "Calendar Date"
msgstr "Date calendrier"
-msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgctxt "field:calendar.todo.exdate,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.todo.exdate,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.todo.exdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.exdate,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.todo.exdate,todo:0"
+msgctxt "field:calendar.todo.exdate,todo:"
msgid "Todo"
msgstr "Tâche"
-msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.exdate,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.todo.exdate,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr "Règle de récurrence"
-msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgctxt "field:calendar.todo.exrule,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.todo.exrule,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.todo.exrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.exrule,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.todo.exrule,todo:0"
+msgctxt "field:calendar.todo.exrule,todo:"
msgid "Todo"
msgstr "Tâche"
-msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgctxt "field:calendar.todo.exrule,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.todo.exrule,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.todo.rdate,calendar_date:"
msgid "Calendar Date"
msgstr "Date calendrier"
-msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgctxt "field:calendar.todo.rdate,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.todo.rdate,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.todo.rdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.rdate,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.todo.rdate,todo:0"
+msgctxt "field:calendar.todo.rdate,todo:"
msgid "Todo"
msgstr "Tâche"
-msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.rdate,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.todo.rdate,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr "Règle de récurrence"
-msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgctxt "field:calendar.todo.rrule,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.todo.rrule,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.todo.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.rrule,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.todo.rrule,todo:0"
+msgctxt "field:calendar.todo.rrule,todo:"
msgid "Todo"
msgstr "Tâche"
-msgctxt "help:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo.rrule,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.todo.rrule,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "help:calendar.todo,uuid:"
msgid "Universally Unique Identifier"
msgstr "Identificateur unique universel"
-msgctxt "model:calendar.todo,name:0"
+msgctxt "model:calendar.todo,name:"
msgid "Todo"
msgstr "Tâche"
-msgctxt "model:calendar.todo-calendar.category,name:0"
+msgctxt "model:calendar.todo-calendar.category,name:"
msgid "Todo - Category"
msgstr "Todo - Catégorie"
-msgctxt "model:calendar.todo.alarm,name:0"
+msgctxt "model:calendar.todo.alarm,name:"
msgid "Alarm"
msgstr "Alarme"
-msgctxt "model:calendar.todo.attendee,name:0"
+msgctxt "model:calendar.todo.attendee,name:"
msgid "Attendee"
msgstr "Participant"
-msgctxt "model:calendar.todo.exdate,name:0"
+msgctxt "model:calendar.todo.exdate,name:"
msgid "Exception Date"
msgstr "Date d'exception"
-msgctxt "model:calendar.todo.exrule,name:0"
+msgctxt "model:calendar.todo.exrule,name:"
msgid "Exception Rule"
msgstr "Règle d'exception"
-msgctxt "model:calendar.todo.rdate,name:0"
+msgctxt "model:calendar.todo.rdate,name:"
msgid "Todo Recurrence Date"
msgstr "Date de récurrence"
-msgctxt "model:calendar.todo.rrule,name:0"
+msgctxt "model:calendar.todo.rrule,name:"
msgid "Recurrence Rule"
msgstr "Règle de récurrence"
@@ -258,102 +426,198 @@ msgctxt "model:ir.ui.menu,name:menu_todo_form"
msgid "Todos"
msgstr "Tâches"
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
+msgid "Confidential"
+msgstr "Confidentiel"
+
+msgctxt "selection:calendar.todo,classification:"
msgid "Confidential"
msgstr "Confidentiel"
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
+msgid "Private"
+msgstr "Privé"
+
+msgctxt "selection:calendar.todo,classification:"
msgid "Private"
msgstr "Privé"
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
msgid "Public"
msgstr "Publique"
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,classification:"
+msgid "Public"
+msgstr "Publique"
+
+msgctxt "selection:calendar.todo,status:"
msgid ""
msgstr ""
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:"
+msgid "Cancelled"
+msgstr "Annulé"
+
+msgctxt "selection:calendar.todo,status:"
msgid "Cancelled"
msgstr "Annulé"
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
+msgid "Completed"
+msgstr "Complété"
+
+msgctxt "selection:calendar.todo,status:"
msgid "Completed"
msgstr "Complété"
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
+msgid "In-Process"
+msgstr "En court"
+
+msgctxt "selection:calendar.todo,status:"
msgid "In-Process"
msgstr "En court"
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "Needs-Action"
msgstr "Nécessite une action"
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "selection:calendar.todo,status:"
+msgid "Needs-Action"
+msgstr "Nécessite une action"
+
+msgctxt "view:calendar.todo.attendee:"
msgid "Attendee"
msgstr "Participant"
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
+msgid "Attendee"
+msgstr "Participant"
+
+msgctxt "view:calendar.todo.attendee:"
+msgid "Attendees"
+msgstr "Participants"
+
+msgctxt "view:calendar.todo.attendee:"
msgid "Attendees"
msgstr "Participants"
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
+msgid "Exception Date"
+msgstr "Date d'exception"
+
+msgctxt "view:calendar.todo.exdate:"
msgid "Exception Date"
msgstr "Date d'exception"
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
+msgid "Exception Dates"
+msgstr "Dates d'exception"
+
+msgctxt "view:calendar.todo.exdate:"
msgid "Exception Dates"
msgstr "Dates d'exception"
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
msgid "Exception Rule"
msgstr "Règle d'exception"
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
+msgid "Exception Rule"
+msgstr "Règle d'exception"
+
+msgctxt "view:calendar.todo.exrule:"
msgid "Exception Rules"
msgstr "Règles d'exception"
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.exrule:"
+msgid "Exception Rules"
+msgstr "Règles d'exception"
+
+msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Date"
msgstr "Date de récurrence"
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
+msgid "Recurrence Date"
+msgstr "Date de récurrence"
+
+msgctxt "view:calendar.todo.rdate:"
+msgid "Recurrence Dates"
+msgstr "Dates de récurrence"
+
+msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Dates"
msgstr "Dates de récurrence"
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
+msgid "Recurrence Rule"
+msgstr "Règle de récurrence"
+
+msgctxt "view:calendar.todo.rrule:"
msgid "Recurrence Rule"
msgstr "Règle de récurrence"
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
msgid "Recurrence Rules"
msgstr "Règles de récurrence"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo.rrule:"
+msgid "Recurrence Rules"
+msgstr "Règles de récurrence"
+
+msgctxt "view:calendar.todo:"
msgid "Attendees"
msgstr "Participants"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
+msgid "Attendees"
+msgstr "Participants"
+
+msgctxt "view:calendar.todo:"
msgid "Categories"
msgstr "Catégories"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "view:calendar.todo:"
msgid "General"
msgstr "Général"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:calendar.todo:"
+msgid "Occurences"
+msgstr "Occurrences"
+
+msgctxt "view:calendar.todo:"
msgid "Occurences"
msgstr "Occurrences"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Recurrences"
msgstr "Récurrences"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
+msgid "Todo"
+msgstr "Tâche"
+
+msgctxt "view:calendar.todo:"
msgid "Todo"
msgstr "Tâche"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
+msgid "Todos"
+msgstr "Tâches"
+
+msgctxt "view:calendar.todo:"
msgid "Todos"
msgstr "Tâches"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
index d98d936..c17980d 100644
--- a/locale/nl_NL.po
+++ b/locale/nl_NL.po
@@ -2,261 +2,421 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
msgid "Recurrence can not be recurrent!"
msgstr ""
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
msgid "UUID and recurrence must be unique in a calendar!"
msgstr ""
-msgctxt "field:calendar.todo,alarms:0"
+msgctxt "field:calendar.todo,alarms:"
msgid "Alarms"
msgstr ""
-msgctxt "field:calendar.todo,attendees:0"
+msgctxt "field:calendar.todo,attendees:"
msgid "Attendees"
msgstr ""
-msgctxt "field:calendar.todo,calendar:0"
+msgctxt "field:calendar.todo,calendar:"
msgid "Calendar"
msgstr ""
-msgctxt "field:calendar.todo,calendar_owner:0"
+msgctxt "field:calendar.todo,calendar_owner:"
msgid "Owner"
msgstr ""
-msgctxt "field:calendar.todo,calendar_read_users:0"
+msgctxt "field:calendar.todo,calendar_read_users:"
msgid "Read Users"
msgstr ""
-msgctxt "field:calendar.todo,calendar_write_users:0"
+msgctxt "field:calendar.todo,calendar_write_users:"
msgid "Write Users"
msgstr ""
#, fuzzy
-msgctxt "field:calendar.todo,categories:0"
+msgctxt "field:calendar.todo,categories:"
msgid "Categories"
msgstr "Categorieën"
-msgctxt "field:calendar.todo,classification:0"
+msgctxt "field:calendar.todo,classification:"
msgid "Classification"
msgstr ""
-msgctxt "field:calendar.todo,completed:0"
+msgctxt "field:calendar.todo,completed:"
msgid "Completed"
msgstr ""
+msgctxt "field:calendar.todo,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,create_uid:"
+msgid "Create User"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.todo,description:0"
+msgctxt "field:calendar.todo,description:"
msgid "Description"
msgstr "Specificatie"
#, fuzzy
-msgctxt "field:calendar.todo,dtstart:0"
+msgctxt "field:calendar.todo,dtstart:"
msgid "Start Date"
msgstr "Start datum"
-msgctxt "field:calendar.todo,due:0"
+msgctxt "field:calendar.todo,due:"
msgid "Due Date"
msgstr ""
-msgctxt "field:calendar.todo,exdates:0"
+msgctxt "field:calendar.todo,exdates:"
msgid "Exception Dates"
msgstr ""
-msgctxt "field:calendar.todo,exrules:0"
+msgctxt "field:calendar.todo,exrules:"
msgid "Exception Rules"
msgstr ""
-msgctxt "field:calendar.todo,location:0"
+msgctxt "field:calendar.todo,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo,location:"
msgid "Location"
msgstr ""
-msgctxt "field:calendar.todo,occurences:0"
+msgctxt "field:calendar.todo,occurences:"
msgid "Occurences"
msgstr ""
-msgctxt "field:calendar.todo,organizer:0"
+msgctxt "field:calendar.todo,organizer:"
msgid "Organizer"
msgstr ""
#, fuzzy
-msgctxt "field:calendar.todo,parent:0"
+msgctxt "field:calendar.todo,parent:"
msgid "Parent"
msgstr "Bovenliggend niveau"
-msgctxt "field:calendar.todo,percent_complete:0"
+msgctxt "field:calendar.todo,percent_complete:"
msgid "Percent complete"
msgstr ""
-msgctxt "field:calendar.todo,rdates:0"
+msgctxt "field:calendar.todo,rdates:"
msgid "Recurrence Dates"
msgstr ""
#, fuzzy
-msgctxt "field:calendar.todo,rec_name:0"
+msgctxt "field:calendar.todo,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.todo,recurrence:0"
+msgctxt "field:calendar.todo,recurrence:"
msgid "Recurrence"
msgstr ""
-msgctxt "field:calendar.todo,rrules:0"
+msgctxt "field:calendar.todo,rrules:"
msgid "Recurrence Rules"
msgstr ""
#, fuzzy
-msgctxt "field:calendar.todo,sequence:0"
+msgctxt "field:calendar.todo,sequence:"
msgid "Sequence"
msgstr "Reeks"
-msgctxt "field:calendar.todo,status:0"
+msgctxt "field:calendar.todo,status:"
msgid "Status"
msgstr ""
-msgctxt "field:calendar.todo,summary:0"
+msgctxt "field:calendar.todo,summary:"
msgid "Summary"
msgstr ""
-msgctxt "field:calendar.todo,timezone:0"
+msgctxt "field:calendar.todo,timezone:"
msgid "Timezone"
msgstr ""
-msgctxt "field:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo,uuid:"
msgid "UUID"
msgstr ""
-msgctxt "field:calendar.todo,vtodo:0"
+msgctxt "field:calendar.todo,vtodo:"
msgid "vtodo"
msgstr ""
+msgctxt "field:calendar.todo,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,write_uid:"
+msgid "Write User"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.todo-calendar.category,category:0"
+msgctxt "field:calendar.todo-calendar.category,category:"
msgid "Category"
msgstr "Categorie"
+msgctxt "field:calendar.todo-calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgctxt "field:calendar.todo-calendar.category,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgctxt "field:calendar.todo-calendar.category,todo:"
msgid "To-Do"
msgstr ""
-msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgctxt "field:calendar.todo-calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:"
msgid "Calendar Alarm"
msgstr ""
+msgctxt "field:calendar.todo.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgctxt "field:calendar.todo.alarm,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.todo.alarm,todo:0"
+msgctxt "field:calendar.todo.alarm,todo:"
msgid "Todo"
msgstr ""
-msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgctxt "field:calendar.todo.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:"
msgid "Calendar Attendee"
msgstr ""
+msgctxt "field:calendar.todo.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgctxt "field:calendar.todo.attendee,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.todo.attendee,todo:0"
+msgctxt "field:calendar.todo.attendee,todo:"
msgid "Todo"
msgstr ""
-msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgctxt "field:calendar.todo.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,calendar_date:"
msgid "Calendar Date"
msgstr ""
+msgctxt "field:calendar.todo.exdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgctxt "field:calendar.todo.exdate,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.todo.exdate,todo:0"
+msgctxt "field:calendar.todo.exdate,todo:"
msgid "Todo"
msgstr ""
-msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.exdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr ""
+msgctxt "field:calendar.todo.exrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgctxt "field:calendar.todo.exrule,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.todo.exrule,todo:0"
+msgctxt "field:calendar.todo.exrule,todo:"
msgid "Todo"
msgstr ""
-msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgctxt "field:calendar.todo.exrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,calendar_date:"
msgid "Calendar Date"
msgstr ""
+msgctxt "field:calendar.todo.rdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgctxt "field:calendar.todo.rdate,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.todo.rdate,todo:0"
+msgctxt "field:calendar.todo.rdate,todo:"
msgid "Todo"
msgstr ""
-msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.rdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr ""
+msgctxt "field:calendar.todo.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgctxt "field:calendar.todo.rrule,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.todo.rrule,todo:0"
+msgctxt "field:calendar.todo.rrule,todo:"
msgid "Todo"
msgstr ""
-msgctxt "help:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "help:calendar.todo,uuid:"
msgid "Universally Unique Identifier"
msgstr ""
-msgctxt "model:calendar.todo,name:0"
+msgctxt "model:calendar.todo,name:"
msgid "Todo"
msgstr ""
-msgctxt "model:calendar.todo-calendar.category,name:0"
+msgctxt "model:calendar.todo-calendar.category,name:"
msgid "Todo - Category"
msgstr ""
-msgctxt "model:calendar.todo.alarm,name:0"
+msgctxt "model:calendar.todo.alarm,name:"
msgid "Alarm"
msgstr ""
-msgctxt "model:calendar.todo.attendee,name:0"
+msgctxt "model:calendar.todo.attendee,name:"
msgid "Attendee"
msgstr ""
-msgctxt "model:calendar.todo.exdate,name:0"
+msgctxt "model:calendar.todo.exdate,name:"
msgid "Exception Date"
msgstr ""
-msgctxt "model:calendar.todo.exrule,name:0"
+msgctxt "model:calendar.todo.exrule,name:"
msgid "Exception Rule"
msgstr ""
-msgctxt "model:calendar.todo.rdate,name:0"
+msgctxt "model:calendar.todo.rdate,name:"
msgid "Todo Recurrence Date"
msgstr ""
-msgctxt "model:calendar.todo.rrule,name:0"
+msgctxt "model:calendar.todo.rrule,name:"
msgid "Recurrence Rule"
msgstr ""
@@ -272,100 +432,100 @@ msgctxt "model:ir.ui.menu,name:menu_todo_form"
msgid "Todos"
msgstr ""
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
msgid "Confidential"
msgstr ""
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
msgid "Private"
msgstr ""
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
msgid "Public"
msgstr ""
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid ""
msgstr ""
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "Cancelled"
msgstr ""
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "Completed"
msgstr ""
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "In-Process"
msgstr ""
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "Needs-Action"
msgstr ""
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
msgid "Attendee"
msgstr ""
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
msgid "Attendees"
msgstr ""
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
msgid "Exception Date"
msgstr ""
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
msgid "Exception Dates"
msgstr ""
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
msgid "Exception Rule"
msgstr ""
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
msgid "Exception Rules"
msgstr ""
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Date"
msgstr ""
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Dates"
msgstr ""
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
msgid "Recurrence Rule"
msgstr ""
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
msgid "Recurrence Rules"
msgstr ""
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Attendees"
msgstr ""
#, fuzzy
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Categories"
msgstr "Categorieën"
#, fuzzy
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "General"
msgstr "Algemeen"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Occurences"
msgstr ""
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Todo"
msgstr ""
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Todos"
msgstr ""
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
index ca4dbea..54e0693 100644
--- a/locale/ru_RU.po
+++ b/locale/ru_RU.po
@@ -2,247 +2,407 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
msgid "Recurrence can not be recurrent!"
msgstr ""
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
msgid "UUID and recurrence must be unique in a calendar!"
msgstr ""
-msgctxt "field:calendar.todo,alarms:0"
+msgctxt "field:calendar.todo,alarms:"
msgid "Alarms"
msgstr "Вызов"
-msgctxt "field:calendar.todo,attendees:0"
+msgctxt "field:calendar.todo,attendees:"
msgid "Attendees"
msgstr "Участники"
-msgctxt "field:calendar.todo,calendar:0"
+msgctxt "field:calendar.todo,calendar:"
msgid "Calendar"
msgstr "Календарь"
-msgctxt "field:calendar.todo,calendar_owner:0"
+msgctxt "field:calendar.todo,calendar_owner:"
msgid "Owner"
msgstr "Владелец"
-msgctxt "field:calendar.todo,calendar_read_users:0"
+msgctxt "field:calendar.todo,calendar_read_users:"
msgid "Read Users"
msgstr "Пользователи могут читать"
-msgctxt "field:calendar.todo,calendar_write_users:0"
+msgctxt "field:calendar.todo,calendar_write_users:"
msgid "Write Users"
msgstr "Пользователи могут писать"
-msgctxt "field:calendar.todo,categories:0"
+msgctxt "field:calendar.todo,categories:"
msgid "Categories"
msgstr "Категория"
-msgctxt "field:calendar.todo,classification:0"
+msgctxt "field:calendar.todo,classification:"
msgid "Classification"
msgstr "Классификация"
-msgctxt "field:calendar.todo,completed:0"
+msgctxt "field:calendar.todo,completed:"
msgid "Completed"
msgstr "Выполнен"
-msgctxt "field:calendar.todo,description:0"
+msgctxt "field:calendar.todo,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo,description:"
msgid "Description"
msgstr "Описание"
-msgctxt "field:calendar.todo,dtstart:0"
+msgctxt "field:calendar.todo,dtstart:"
msgid "Start Date"
msgstr "Дата начала"
-msgctxt "field:calendar.todo,due:0"
+msgctxt "field:calendar.todo,due:"
msgid "Due Date"
msgstr "Срок сдачи"
-msgctxt "field:calendar.todo,exdates:0"
+msgctxt "field:calendar.todo,exdates:"
msgid "Exception Dates"
msgstr "Дата исключения"
-msgctxt "field:calendar.todo,exrules:0"
+msgctxt "field:calendar.todo,exrules:"
msgid "Exception Rules"
msgstr "Правила исключения"
-msgctxt "field:calendar.todo,location:0"
+msgctxt "field:calendar.todo,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo,location:"
msgid "Location"
msgstr "Местоположение"
-msgctxt "field:calendar.todo,occurences:0"
+msgctxt "field:calendar.todo,occurences:"
msgid "Occurences"
msgstr "Дополнительные задачи"
-msgctxt "field:calendar.todo,organizer:0"
+msgctxt "field:calendar.todo,organizer:"
msgid "Organizer"
msgstr "Организатор"
-msgctxt "field:calendar.todo,parent:0"
+msgctxt "field:calendar.todo,parent:"
msgid "Parent"
msgstr "Основной"
-msgctxt "field:calendar.todo,percent_complete:0"
+msgctxt "field:calendar.todo,percent_complete:"
msgid "Percent complete"
msgstr "Процент выполнения"
-msgctxt "field:calendar.todo,rdates:0"
+msgctxt "field:calendar.todo,rdates:"
msgid "Recurrence Dates"
msgstr "Даты повторения"
-msgctxt "field:calendar.todo,rec_name:0"
+msgctxt "field:calendar.todo,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.todo,recurrence:0"
+msgctxt "field:calendar.todo,recurrence:"
msgid "Recurrence"
msgstr "Повторение"
-msgctxt "field:calendar.todo,rrules:0"
+msgctxt "field:calendar.todo,rrules:"
msgid "Recurrence Rules"
msgstr "Правила повторения"
-msgctxt "field:calendar.todo,sequence:0"
+msgctxt "field:calendar.todo,sequence:"
msgid "Sequence"
msgstr "Последовательность"
-msgctxt "field:calendar.todo,status:0"
+msgctxt "field:calendar.todo,status:"
msgid "Status"
msgstr "Состояние"
-msgctxt "field:calendar.todo,summary:0"
+msgctxt "field:calendar.todo,summary:"
msgid "Summary"
msgstr "Резюме"
-msgctxt "field:calendar.todo,timezone:0"
+msgctxt "field:calendar.todo,timezone:"
msgid "Timezone"
msgstr "Зона времени"
-msgctxt "field:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo,uuid:"
msgid "UUID"
msgstr ""
-msgctxt "field:calendar.todo,vtodo:0"
+msgctxt "field:calendar.todo,vtodo:"
msgid "vtodo"
msgstr ""
-msgctxt "field:calendar.todo-calendar.category,category:0"
+msgctxt "field:calendar.todo,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,category:"
msgid "Category"
msgstr "Категории"
-msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgctxt "field:calendar.todo-calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgctxt "field:calendar.todo-calendar.category,todo:"
msgid "To-Do"
msgstr "Дела"
-msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgctxt "field:calendar.todo-calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:"
msgid "Calendar Alarm"
msgstr "Сигнала календаря"
-msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgctxt "field:calendar.todo.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.todo.alarm,todo:0"
+msgctxt "field:calendar.todo.alarm,todo:"
msgid "Todo"
msgstr "Дело"
-msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgctxt "field:calendar.todo.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:"
msgid "Calendar Attendee"
msgstr "Календарь участников"
-msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgctxt "field:calendar.todo.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.todo.attendee,todo:0"
+msgctxt "field:calendar.todo.attendee,todo:"
msgid "Todo"
msgstr "Дело"
-msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgctxt "field:calendar.todo.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,calendar_date:"
msgid "Calendar Date"
msgstr "День календаря"
-msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgctxt "field:calendar.todo.exdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.todo.exdate,todo:0"
+msgctxt "field:calendar.todo.exdate,todo:"
msgid "Todo"
msgstr "Дело"
-msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.exdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr "Правила календаря"
-msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgctxt "field:calendar.todo.exrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.todo.exrule,todo:0"
+msgctxt "field:calendar.todo.exrule,todo:"
msgid "Todo"
msgstr "Дело"
-msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgctxt "field:calendar.todo.exrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,calendar_date:"
msgid "Calendar Date"
msgstr "День календаря"
-msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgctxt "field:calendar.todo.rdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.todo.rdate,todo:0"
+msgctxt "field:calendar.todo.rdate,todo:"
msgid "Todo"
msgstr "Дело"
-msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.rdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr "Правила календаря"
-msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgctxt "field:calendar.todo.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.todo.rrule,todo:0"
+msgctxt "field:calendar.todo.rrule,todo:"
msgid "Todo"
msgstr "Дело"
-msgctxt "help:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "help:calendar.todo,uuid:"
msgid "Universally Unique Identifier"
msgstr "Универсальный уникальный идентификатор"
-msgctxt "model:calendar.todo,name:0"
+msgctxt "model:calendar.todo,name:"
msgid "Todo"
msgstr "Дело"
-msgctxt "model:calendar.todo-calendar.category,name:0"
+msgctxt "model:calendar.todo-calendar.category,name:"
msgid "Todo - Category"
msgstr "Категории - Дел"
-msgctxt "model:calendar.todo.alarm,name:0"
+msgctxt "model:calendar.todo.alarm,name:"
msgid "Alarm"
msgstr "Вызов"
-msgctxt "model:calendar.todo.attendee,name:0"
+msgctxt "model:calendar.todo.attendee,name:"
msgid "Attendee"
msgstr "Участник"
-msgctxt "model:calendar.todo.exdate,name:0"
+msgctxt "model:calendar.todo.exdate,name:"
msgid "Exception Date"
msgstr "Дата исключения"
-msgctxt "model:calendar.todo.exrule,name:0"
+msgctxt "model:calendar.todo.exrule,name:"
msgid "Exception Rule"
msgstr "Правило исключения"
-msgctxt "model:calendar.todo.rdate,name:0"
+msgctxt "model:calendar.todo.rdate,name:"
msgid "Todo Recurrence Date"
msgstr "Дела повторяющиеся по дате"
-msgctxt "model:calendar.todo.rrule,name:0"
+msgctxt "model:calendar.todo.rrule,name:"
msgid "Recurrence Rule"
msgstr "Правила повторения"
@@ -260,99 +420,98 @@ msgctxt "model:ir.ui.menu,name:menu_todo_form"
msgid "Todos"
msgstr "Задачи"
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
msgid "Confidential"
msgstr "Конфиденциальное"
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
msgid "Private"
msgstr "Личное"
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
msgid "Public"
msgstr "Публичное"
-#, fuzzy
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid ""
-msgstr "Резервный счет"
+msgstr ""
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "Cancelled"
msgstr "Отмененно"
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "Completed"
msgstr "Выполнен"
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "In-Process"
msgstr "В процессе"
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
msgid "Needs-Action"
msgstr "Требуется действие"
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
msgid "Attendee"
msgstr "Участник"
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
msgid "Attendees"
msgstr "Участники"
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
msgid "Exception Date"
msgstr "Дата исключения"
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
msgid "Exception Dates"
msgstr "Дата исключения"
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
msgid "Exception Rule"
msgstr "Правило исключения"
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
msgid "Exception Rules"
msgstr "Правила исключения"
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Date"
msgstr "Даты повторения"
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
msgid "Recurrence Dates"
msgstr "Даты повторения"
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
msgid "Recurrence Rule"
msgstr "Правила повторения"
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
msgid "Recurrence Rules"
msgstr "Правила повторения"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Attendees"
msgstr "Участники"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Categories"
msgstr "Категория"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "General"
msgstr "Основной"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Occurences"
msgstr "Повторение"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Todo"
msgstr "Дело"
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
msgid "Todos"
msgstr "Дела"
diff --git a/setup.py b/setup.py
index 65d89f1..baef0a5 100644
--- a/setup.py
+++ b/setup.py
@@ -10,9 +10,9 @@ major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
major_version = int(major_version)
minor_version = int(minor_version)
-requires = ['vobject >= 0.8.0', 'PyWebDAV >= 0.9.3', 'python-dateutil', 'pytz']
+requires = ['vobject >= 0.8.0', 'PyWebDAV >= 0.9.8', 'python-dateutil', 'pytz']
for dep in info.get('depends', []):
- if not re.match(r'(ir|res|workflow|webdav)(\W|$)', dep):
+ if not re.match(r'(ir|res|webdav)(\W|$)', dep):
requires.append('trytond_%s >= %s.%s, < %s.%s' %
(dep, major_version, minor_version, major_version,
minor_version + 1))
diff --git a/tests/__init__.py b/tests/__init__.py
index 4dad3ab..62e4f36 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -1,4 +1,4 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from test_calendar_todo import suite
+from .test_calendar_todo import suite
diff --git a/tests/test_calendar_todo.py b/tests/test_calendar_todo.py
index de92dd8..e5f93d6 100644
--- a/tests/test_calendar_todo.py
+++ b/tests/test_calendar_todo.py
@@ -2,7 +2,8 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-import sys, os
+import sys
+import os
DIR = os.path.abspath(os.path.normpath(os.path.join(__file__,
'..', '..', '..', '..', '..', 'trytond')))
if os.path.isdir(DIR):
@@ -33,6 +34,7 @@ class CalendarTodoTestCase(unittest.TestCase):
'''
test_depends()
+
def suite():
suite = trytond.tests.test_tryton.suite()
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
diff --git a/todo.py b/todo.py
index 6226af9..86250b6 100644
--- a/todo.py
+++ b/todo.py
@@ -26,7 +26,7 @@ class Todo(ModelSQL, ModelView):
_rec_name = 'uuid'
calendar = fields.Many2One('calendar.calendar', 'Calendar',
- required=True, select=1, ondelete="CASCADE")
+ required=True, select=True, ondelete="CASCADE")
alarms = fields.One2Many('calendar.todo.alarm', 'todo', 'Alarms')
classification = fields.Selection([
('public', 'Public'),
@@ -38,7 +38,7 @@ class Todo(ModelSQL, ModelView):
'readonly': Eval('status') != 'completed',
}, depends=['status'])
description = fields.Text('Description')
- dtstart = fields.DateTime('Start Date', select=1)
+ dtstart = fields.DateTime('Start Date', select=True)
location = fields.Many2One('calendar.location', 'Location')
organizer = fields.Char('Organizer', states={
'required': If(Bool(Eval('attendees')),
@@ -46,7 +46,7 @@ class Todo(ModelSQL, ModelView):
}, depends=['attendees', 'parent'])
attendees = fields.One2Many('calendar.todo.attendee', 'todo',
'Attendees')
- percent_complete = fields.Integer('Percent complete',
+ percent_complete = fields.Integer('Percent complete', required=True,
states={
'readonly': ~Eval('status').in_(['needs-action', 'in-process']),
}, depends=['status'])
@@ -58,15 +58,15 @@ class Todo(ModelSQL, ModelView):
states={
'invisible': Bool(Eval('parent')),
}, depends=['uuid', 'calendar', 'parent'])
- recurrence = fields.DateTime('Recurrence', select=1, states={
+ recurrence = fields.DateTime('Recurrence', select=True, states={
'invisible': ~Eval('_parent_parent'),
'required': Bool(Eval('_parent_parent')),
}, depends=['parent'])
- sequence = fields.Integer('Sequence')
+ sequence = fields.Integer('Sequence', required=True)
parent = fields.Many2One('calendar.todo', 'Parent',
domain=[
('uuid', '=', Eval('uuid')),
- ('parent', '=', False),
+ ('parent', '=', None),
('calendar', '=', Eval('calendar'))
],
ondelete='CASCADE', depends=['uuid', 'calendar'])
@@ -80,17 +80,19 @@ class Todo(ModelSQL, ModelView):
], 'Status', on_change=['status', 'completed', 'percent_complete'])
summary = fields.Char('Summary')
uuid = fields.Char('UUID', required=True,
- help='Universally Unique Identifier', select=1)
- due = fields.DateTime('Due Date', select=1)
+ help='Universally Unique Identifier', select=True)
+ due = fields.DateTime('Due Date', select=True)
categories = fields.Many2Many('calendar.todo-calendar.category',
'todo', 'category', 'Categories')
- exdates = fields.One2Many('calendar.todo.exdate', 'todo', 'Exception Dates',
- states={
- 'invisible': Bool(Eval('parent')),
+ exdates = fields.One2Many('calendar.todo.exdate', 'todo',
+ 'Exception Dates',
+ states={
+ 'invisible': Bool(Eval('parent')),
}, depends=['parent'])
- exrules = fields.One2Many('calendar.todo.exrule', 'todo', 'Exception Rules',
- states={
- 'invisible': Bool(Eval('parent')),
+ exrules = fields.One2Many('calendar.todo.exrule', 'todo',
+ 'Exception Rules',
+ states={
+ 'invisible': Bool(Eval('parent')),
}, depends=['parent'])
rdates = fields.One2Many('calendar.todo.rdate', 'todo', 'Recurrence Dates',
states={
@@ -111,8 +113,9 @@ class Todo(ModelSQL, ModelView):
def __init__(self):
super(Todo, self).__init__()
self._sql_constraints = [
+ #XXX should be unique across all componenets
('uuid_recurrence_uniq', 'UNIQUE(uuid, calendar, recurrence)',
- 'UUID and recurrence must be unique in a calendar!'), #XXX should be unique across all componenets
+ 'UUID and recurrence must be unique in a calendar!'),
]
self._constraints += [
('check_recurrence', 'invalid_recurrence'),
@@ -129,7 +132,7 @@ class Todo(ModelSQL, ModelView):
model_data_ids = model_data_obj.search([
('fs_id', '=', 'rule_group_read_todo_line3'),
('module', '=', module_name),
- ('inherit', '=', False),
+ ('inherit', '=', None),
], limit=1)
if model_data_ids:
model_data = model_data_obj.browse(model_data_ids[0])
@@ -150,6 +153,9 @@ class Todo(ModelSQL, ModelView):
user = user_obj.browse(Transaction().user)
return user.timezone
+ def default_percent_complete(self):
+ return 0
+
def on_change_status(self, vals):
res = {}
if 'status' not in vals:
@@ -200,10 +206,11 @@ class Todo(ModelSQL, ModelView):
res = super(Todo, self).create(values)
todo = self.browse(res)
- if todo.calendar.owner \
- and (todo.organizer == todo.calendar.owner.email \
- or (todo.parent \
- and todo.parent.organizer == todo.parent.calendar.owner.email)):
+ if (todo.calendar.owner
+ and (todo.organizer == todo.calendar.owner.email
+ or (todo.parent
+ and todo.parent.organizer == \
+ todo.parent.calendar.owner.email))):
if todo.organizer == todo.calendar.owner.email:
attendee_emails = [x.email for x in todo.attendees
if x.status != 'declined'
@@ -221,7 +228,7 @@ class Todo(ModelSQL, ModelView):
for calendar_id in calendar_ids:
new_id = self.copy(todo.id, default={
'calendar': calendar_id,
- 'occurences': False,
+ 'occurences': None,
})
for occurence in todo.occurences:
self.copy(occurence.id, default={
@@ -233,7 +240,7 @@ class Todo(ModelSQL, ModelView):
('uuid', '=', todo.uuid),
('calendar.owner.email', 'in', attendee_emails),
('id', '!=', todo.id),
- ('recurrence', '=', False),
+ ('recurrence', '=', None),
])
for parent in self.browse(parent_ids):
self.copy(todo.id, default={
@@ -319,7 +326,7 @@ class Todo(ModelSQL, ModelView):
('uuid', '=', todo.uuid),
('calendar.owner.email', 'in', attendee_emails),
('id', '!=', todo.id),
- ('recurrence', '=', todo.recurrence or False),
+ ('recurrence', '=', todo.recurrence),
])
for todo2 in self.browse(todo_ids):
if todo2.calendar.owner.email in attendee_emails:
@@ -335,7 +342,7 @@ class Todo(ModelSQL, ModelView):
for calendar_id in calendar_ids:
new_id = self.copy(todo.id, default={
'calendar': calendar_id,
- 'occurences': False,
+ 'occurences': None,
})
for occurence in todo.occurences:
self.copy(occurence.id, default={
@@ -344,11 +351,12 @@ class Todo(ModelSQL, ModelView):
})
else:
parent_ids = self.search([
- ('uuid', '=', todo.uuid),
- ('calendar.owner.email', 'in', attendee_emails),
- ('id', '!=', todo.id),
- ('recurrence', '=', False),
- ])
+ ('uuid', '=', todo.uuid),
+ ('calendar.owner.email', 'in',
+ attendee_emails),
+ ('id', '!=', todo.id),
+ ('recurrence', '=', None),
+ ])
for parent in self.browse(parent_ids):
self.copy(todo.id, default={
'calendar': parent.calendar.id,
@@ -381,7 +389,7 @@ class Todo(ModelSQL, ModelView):
('uuid', '=', todo.uuid),
('calendar.owner.email', 'in', attendee_emails),
('id', '!=', todo.id),
- ('recurrence', '=', todo.recurrence or False),
+ ('recurrence', '=', todo.recurrence),
])
self.delete(todo_ids)
elif todo.organizer \
@@ -395,7 +403,7 @@ class Todo(ModelSQL, ModelView):
('uuid', '=', todo.uuid),
('calendar.owner.email', '=', organizer),
('id', '!=', todo.id),
- ('recurrence', '=', todo.recurrence or False),
+ ('recurrence', '=', todo.recurrence),
], limit=1)
if todo_ids:
todo2 = self.browse(todo_ids[0])
@@ -422,7 +430,6 @@ class Todo(ModelSQL, ModelView):
pool = Pool()
category_obj = pool.get('calendar.category')
location_obj = pool.get('calendar.location')
- user_obj = pool.get('res.user')
alarm_obj = pool.get('calendar.todo.alarm')
attendee_obj = pool.get('calendar.todo.attendee')
rdate_obj = pool.get('calendar.todo.rdate')
@@ -451,23 +458,24 @@ class Todo(ModelSQL, ModelView):
if hasattr(vtodo, 'summary'):
res['summary'] = vtodo.summary.value
else:
- res['summary'] = False
+ res['summary'] = None
if hasattr(vtodo, 'description'):
res['description'] = vtodo.description.value
else:
- res['description'] = False
+ res['description'] = None
if hasattr(vtodo, 'percent_complete'):
res['percent_complete'] = int(vtodo.percent_complete.value)
else:
- res['percent_complete'] = False
+ res['percent_complete'] = None
if hasattr(vtodo, 'completed'):
if not isinstance(vtodo.completed.value, datetime.datetime):
- res['completed'] = datetime.datetime.combine(vtodo.completed.value,
- datetime.time())
+ res['completed'] = datetime.datetime.combine(
+ vtodo.completed.value, datetime.time())
else:
if vtodo.completed.value.tzinfo:
- res['completed'] = vtodo.completed.value.astimezone(tzlocal)
+ res['completed'] = vtodo.completed.value.astimezone(
+ tzlocal)
else:
res['completed'] = vtodo.completed.value
@@ -502,7 +510,7 @@ class Todo(ModelSQL, ModelView):
else:
res['recurrence'] = vtodo.recurrence_id.value
else:
- res['recurrence'] = False
+ res['recurrence'] = None
if hasattr(vtodo, 'status'):
res['status'] = vtodo.status.value.lower()
else:
@@ -543,7 +551,7 @@ class Todo(ModelSQL, ModelView):
location_id = location_ids[0]
res['location'] = location_id
else:
- res['location'] = False
+ res['location'] = None
res['calendar'] = calendar_id
@@ -553,7 +561,7 @@ class Todo(ModelSQL, ModelView):
else:
res['organizer'] = vtodo.organizer.value
else:
- res['organizer'] = False
+ res['organizer'] = None
attendees_todel = {}
if todo:
@@ -733,17 +741,18 @@ class Todo(ModelSQL, ModelView):
elif hasattr(vtodo, 'due'):
del vtodo.due
-
if not hasattr(vtodo, 'created'):
vtodo.add('created')
- vtodo.created.value = todo.create_date.replace(tzinfo=tzlocal).astimezone(tztodo)
+ vtodo.created.value = todo.create_date.replace(
+ tzinfo=tzlocal).astimezone(tztodo)
if not hasattr(vtodo, 'dtstamp'):
vtodo.add('dtstamp')
date = todo.write_date or todo.create_date
vtodo.dtstamp.value = date.replace(tzinfo=tzlocal).astimezone(tztodo)
if not hasattr(vtodo, 'last-modified'):
vtodo.add('last-modified')
- vtodo.last_modified.value = date.replace(tzinfo=tzlocal).astimezone(tztodo)
+ vtodo.last_modified.value = date.replace(
+ tzinfo=tzlocal).astimezone(tztodo)
if todo.recurrence and todo.parent:
if not hasattr(vtodo, 'recurrence-id'):
vtodo.add('recurrence-id')
@@ -791,7 +800,8 @@ class Todo(ModelSQL, ModelView):
vtodo.attendee_list = []
for attendee in todo.attendees:
- vtodo.attendee_list.append(attendee_obj.attendee2attendee(attendee))
+ vtodo.attendee_list.append(
+ attendee_obj.attendee2attendee(attendee))
if todo.rdates:
vtodo.add('rdate')
@@ -833,9 +843,9 @@ class TodoCategory(ModelSQL):
_name = 'calendar.todo-calendar.category'
todo = fields.Many2One('calendar.todo', 'To-Do', ondelete='CASCADE',
- required=True, select=1)
+ required=True, select=True)
category = fields.Many2One('calendar.category', 'Category',
- ondelete='CASCADE', required=True, select=1)
+ ondelete='CASCADE', required=True, select=True)
TodoCategory()
@@ -848,9 +858,9 @@ class TodoRDate(ModelSQL, ModelView):
_rec_name = 'datetime'
calendar_date = fields.Many2One('calendar.date', 'Calendar Date',
- required=True, ondelete='CASCADE', select=1)
+ required=True, ondelete='CASCADE', select=True)
todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
- select=1, required=True)
+ select=True, required=True)
def init(self, module_name):
cursor = Transaction().cursor
@@ -920,9 +930,9 @@ class TodoRRule(ModelSQL, ModelView):
_rec_name = 'freq'
calendar_rrule = fields.Many2One('calendar.rrule', 'Calendar RRule',
- required=True, ondelete='CASCADE', select=1)
+ required=True, ondelete='CASCADE', select=True)
todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
- select=1, required=True)
+ select=True, required=True)
def create(self, values):
todo_obj = Pool().get('calendar.todo')
@@ -997,9 +1007,9 @@ class TodoAttendee(ModelSQL, ModelView):
_inherits = {'calendar.attendee': 'calendar_attendee'}
calendar_attendee = fields.Many2One('calendar.attendee',
- 'Calendar Attendee', required=True, ondelete='CASCADE', select=1)
+ 'Calendar Attendee', required=True, ondelete='CASCADE', select=True)
todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
- required=True, select=1)
+ required=True, select=True)
def create(self, values):
todo_obj = Pool().get('calendar.todo')
@@ -1010,10 +1020,11 @@ class TodoAttendee(ModelSQL, ModelView):
res = super(TodoAttendee, self).create(values)
attendee = self.browse(res)
todo = attendee.todo
- if todo.calendar.owner \
- and (todo.organizer == todo.calendar.owner.email \
- or (todo.parent \
- and todo.parent.organizer == todo.parent.calendar.owner.email)):
+ if (todo.calendar.owner
+ and (todo.organizer == todo.calendar.owner.email
+ or (todo.parent
+ and todo.parent.organizer == \
+ todo.parent.calendar.owner.email))):
if todo.organizer == todo.calendar.owner.email:
attendee_emails = [x.email for x in todo.attendees
if x.email != todo.organizer]
@@ -1026,7 +1037,7 @@ class TodoAttendee(ModelSQL, ModelView):
('uuid', '=', todo.uuid),
('calendar.owner.email', 'in', attendee_emails),
('id', '!=', todo.id),
- ('recurrence', '=', todo.recurrence or False),
+ ('recurrence', '=', todo.recurrence),
])
for todo_id in todo_ids:
self.copy(res, default={
@@ -1071,7 +1082,7 @@ class TodoAttendee(ModelSQL, ModelView):
('todo.calendar.owner.email', 'in',
attendee_emails),
('id', '!=', attendee.id),
- ('todo.recurrence', '=', todo.recurrence or False),
+ ('todo.recurrence', '=', todo.recurrence),
('email', '=', attendee.email),
])
self.write(attendee_ids, self._attendee2update(
@@ -1111,7 +1122,7 @@ class TodoAttendee(ModelSQL, ModelView):
('todo.calendar.owner.email', 'in',
attendee_emails),
('id', '!=', attendee.id),
- ('todo.recurrence', '=', todo.recurrence or False),
+ ('todo.recurrence', '=', todo.recurrence),
('email', '=', attendee.email),
])
self.delete(attendee_ids)
@@ -1128,7 +1139,7 @@ class TodoAttendee(ModelSQL, ModelView):
('todo.uuid', '=', todo.uuid),
('todo.calendar.owner.email', '=', organizer),
('id', '!=', attendee.id),
- ('todo.recurrence', '=', todo.recurrence or False),
+ ('todo.recurrence', '=', todo.recurrence),
('email', '=', attendee.email),
])
if attendee_ids:
@@ -1183,9 +1194,9 @@ class TodoAlarm(ModelSQL):
_inherits = {'calendar.alarm': 'calendar_alarm'}
calendar_alarm = fields.Many2One('calendar.alarm', 'Calendar Alarm',
- required=True, ondelete='CASCADE', select=1)
+ required=True, ondelete='CASCADE', select=True)
todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
- required=True, select=1)
+ required=True, select=True)
def create(self, values):
todo_obj = Pool().get('calendar.todo')
diff --git a/todo.xml b/todo.xml
index 71a9d41..d8d7e92 100644
--- a/todo.xml
+++ b/todo.xml
@@ -7,6 +7,7 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.ui.view" id="todo_view_tree">
<field name="model">calendar.todo</field>
<field name="type">tree</field>
+ <field name="priority" eval="10"/>
<field name="arch" type="xml">
<![CDATA[
<tree string="Todos">
@@ -21,6 +22,24 @@ this repository contains the full copyright notices and license terms. -->
</field>
</record>
+ <record model="ir.ui.view" id="todo_view_tree_occurence">
+ <field name="model">calendar.todo</field>
+ <field name="type">tree</field>
+ <field name="priority" eval="20"/>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Todos">
+ <field name="summary"/>
+ <field name="recurrence"/>
+ <field name="dtstart"/>
+ <field name="due"/>
+ <field name="status"/>
+ <field name="percent_complete"/>
+ </tree>
+ ]]>
+ </field>
+ </record>
+
<record model="ir.ui.view" id="todo_view_form">
<field name="model">calendar.todo</field>
<field name="type">form</field>
@@ -66,16 +85,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="rdates" colspan="2"/>
<field name="exrules" colspan="2"/>
<field name="exdates" colspan="2"/>
- <field name="occurences" colspan="4">
- <tree string="Todos">
- <field name="summary"/>
- <field name="recurrence"/>
- <field name="dtstart"/>
- <field name="due"/>
- <field name="status"/>
- <field name="percent_complete"/>
- </tree>
- </field>
+ <field name="occurences" colspan="4"
+ view_ids="calendar_todo.todo_view_tree_occurence"/>
</page>
</notebook>
</form>
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index 41e6827..306c9f4 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.0
Name: trytond-calendar-todo
-Version: 2.2.0
+Version: 2.4.0
Summary: Add Todo support on CalDAV
Home-page: http://www.tryton.org/
Author: B2CK
Author-email: info at b2ck.com
License: GPL-3
-Download-URL: http://downloads.tryton.org/2.2/
+Download-URL: http://downloads.tryton.org/2.4/
Description: UNKNOWN
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
diff --git a/trytond_calendar_todo.egg-info/SOURCES.txt b/trytond_calendar_todo.egg-info/SOURCES.txt
index bb326df..79ef172 100644
--- a/trytond_calendar_todo.egg-info/SOURCES.txt
+++ b/trytond_calendar_todo.egg-info/SOURCES.txt
@@ -14,8 +14,10 @@ todo.xml
./tests/__init__.py
./tests/test_calendar_todo.py
locale/bg_BG.po
+locale/ca_ES.po
locale/cs_CZ.po
locale/de_DE.po
+locale/es_AR.po
locale/es_CO.po
locale/es_ES.po
locale/fr_FR.po
diff --git a/trytond_calendar_todo.egg-info/requires.txt b/trytond_calendar_todo.egg-info/requires.txt
index f881d88..f65a590 100644
--- a/trytond_calendar_todo.egg-info/requires.txt
+++ b/trytond_calendar_todo.egg-info/requires.txt
@@ -1,6 +1,6 @@
vobject >= 0.8.0
-PyWebDAV >= 0.9.3
+PyWebDAV >= 0.9.8
python-dateutil
pytz
-trytond_calendar >= 2.2, < 2.3
-trytond >= 2.2, < 2.3
\ No newline at end of file
+trytond_calendar >= 2.4, < 2.5
+trytond >= 2.4, < 2.5
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index e7db419..0999191 100644
--- a/webdav.py
+++ b/webdav.py
@@ -2,7 +2,7 @@
#this repository contains the full copyright notices and license terms.
import vobject
import urllib
-from DAV.errors import DAV_NotFound, DAV_Forbidden
+from pywebdav.lib.errors import DAV_NotFound, DAV_Forbidden
from trytond.model import ModelView, ModelSQL
from trytond.tools import reduce_ids
from trytond.transaction import Transaction
@@ -17,12 +17,12 @@ class Collection(ModelSQL, ModelView):
@Cache('webdav_collection.todo')
def todo(self, uri, calendar_id=False):
'''
- Return the todo id in the uri or False
+ Return the todo id in the uri
:param uri: the uri
:param calendar_id: the calendar id
:return: todo id
- or False if there is no todo
+ or None if there is no todo
'''
todo_obj = Pool().get('calendar.todo')
@@ -31,15 +31,14 @@ class Collection(ModelSQL, ModelView):
if not calendar_id:
calendar_id = self.calendar(uri)
if not calendar_id:
- return False
+ return None
todo_ids = todo_obj.search([
('calendar', '=', calendar_id),
('uuid', '=', todo_uri[:-4]),
- ('parent', '=', False),
+ ('parent', '=', None),
], limit=1)
if todo_ids:
return todo_ids[0]
- return False
def _caldav_filter_domain_todo(self, filter):
'''
@@ -106,7 +105,6 @@ class Collection(ModelSQL, ModelView):
return res
def get_childs(self, uri, filter=None, cache=None):
- calendar_obj = Pool().get('calendar.calendar')
todo_obj = Pool().get('calendar.todo')
res = super(Collection, self).get_childs(uri, filter=filter,
@@ -152,7 +150,6 @@ class Collection(ModelSQL, ModelView):
return super(Collection, self).get_contenttype(uri, cache=cache)
def get_creationdate(self, uri, cache=None):
- calendar_obj = Pool().get('calendar.calendar')
todo_obj = Pool().get('calendar.todo')
cursor = Transaction().cursor
@@ -170,10 +167,10 @@ class Collection(ModelSQL, ModelView):
ids = cache['_calendar'][todo_obj._name].keys()
if todo_id not in ids:
ids.append(todo_id)
- elif 'creationdate' in cache['_calendar']\
- [todo_obj._name][todo_id]:
- return cache['_calendar'][todo_obj._name]\
- [todo_id]['creationdate']
+ elif 'creationdate' in cache['_calendar'][
+ todo_obj._name][todo_id]:
+ return cache['_calendar'][todo_obj._name][
+ todo_id]['creationdate']
else:
ids = [todo_id]
res = None
@@ -190,15 +187,14 @@ class Collection(ModelSQL, ModelView):
if cache is not None:
cache['_calendar'][todo_obj._name]\
.setdefault(todo_id2, {})
- cache['_calendar'][todo_obj._name]\
- [todo_id2]['creationdate'] = date
+ cache['_calendar'][todo_obj._name][
+ todo_id2]['creationdate'] = date
if res is not None:
return res
return super(Collection, self).get_creationdate(uri, cache=cache)
def get_lastmodified(self, uri, cache=None):
- calendar_obj = Pool().get('calendar.calendar')
todo_obj = Pool().get('calendar.todo')
cursor = Transaction().cursor
@@ -213,15 +209,15 @@ class Collection(ModelSQL, ModelView):
ids = cache['_calendar'][todo_obj._name].keys()
if todo_id not in ids:
ids.append(todo_id)
- elif 'lastmodified' in cache['_calendar']\
- [todo_obj._name][todo_id]:
- return cache['_calendar'][todo_obj._name]\
- [todo_id]['lastmodified']
+ elif 'lastmodified' in cache['_calendar'][
+ todo_obj._name][todo_id]:
+ return cache['_calendar'][todo_obj._name][
+ todo_id]['lastmodified']
else:
ids = [todo_id]
res = None
- for i in range(0, len(ids), cursor.IN_MAX/2):
- sub_ids = ids[i:i + cursor.IN_MAX/2]
+ for i in range(0, len(ids), cursor.IN_MAX / 2):
+ sub_ids = ids[i:i + cursor.IN_MAX / 2]
red_id_sql, red_id_ids = reduce_ids('id', sub_ids)
red_parent_sql, red_parent_ids = reduce_ids('parent',
sub_ids)
@@ -238,8 +234,8 @@ class Collection(ModelSQL, ModelView):
if cache is not None:
cache['_calendar'][todo_obj._name]\
.setdefault(todo_id2, {})
- cache['_calendar'][todo_obj._name]\
- [todo_id2]['lastmodified'] = date
+ cache['_calendar'][todo_obj._name][
+ todo_id2]['lastmodified'] = date
if res is not None:
return res
@@ -247,7 +243,6 @@ class Collection(ModelSQL, ModelView):
def get_data(self, uri, cache=None):
todo_obj = Pool().get('calendar.todo')
- calendar_obj = Pool().get('calendar.calendar')
calendar_id = self.calendar(uri)
if calendar_id:
commit 8e5f4e53679b77ef4e2fcf66573fce78b6c021bc
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Mar 27 11:05:29 2012 +0200
Releasing debian version 2.2.0-2.
diff --git a/debian/changelog b/debian/changelog
index 9848e87..818d944 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,13 @@
+tryton-modules-calendar-todo (2.2.0-2) unstable; urgency=low
+
+ * Updating to Standards-Version: 3.9.3, no changes needed.
+ * Updating year in copyright.
+ * Adding myself to copyright.
+ * Adding Format header for DEP5.
+ * Adding patch to support new structure of pywebdav > 0.9.4.1.
+
+ -- Mathias Behrle <mathiasb at m9s.biz> Tue, 27 Mar 2012 10:37:00 +0200
+
tryton-modules-calendar-todo (2.2.0-1) unstable; urgency=low
* Bumping X-Python-Version to >=2.6.
commit 8101a7020753009d06148f8a97612a29c3ab5f3e
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Mar 27 10:33:43 2012 +0200
Adding patch to support new structure of pywebdav > 0.9.4.1.
diff --git a/debian/patches/01-support-pywebdav-0.9.8 b/debian/patches/01-support-pywebdav-0.9.8
new file mode 100644
index 0000000..24a9c76
--- /dev/null
+++ b/debian/patches/01-support-pywebdav-0.9.8
@@ -0,0 +1,45 @@
+Author: Mathias Behrle <mathiasb at m9s.biz>
+Description: Support new structure of pywebdav > 0.9.4.1.
+--- tryton-modules-calendar-todo.orig/caldav.py 2012-01-02 12:49:21.541638844 +0100
++++ tryton-modules-calendar-todo/caldav.py 2012-03-26 20:06:16.290050030 +0200
+@@ -2,8 +2,12 @@
+ #this repository contains the full copyright notices and license terms.
+ _TRYTON_RELOAD = False
+
+-from DAV import propfind
+-from DAV.utils import get_uriparentpath
++try:
++ from DAV import propfind
++ from DAV.utils import get_uriparentpath
++except ImportError:
++ from pywebdav.lib import propfind
++ from pywebdav.lib.utils import get_uriparentpath
+ from trytond.protocols.webdav import TrytonDAVInterface
+
+ _mk_prop_response = propfind.PROPFIND.mk_prop_response
+--- tryton-modules-calendar-todo.orig/webdav.py 2012-01-02 12:49:21.613635117 +0100
++++ tryton-modules-calendar-todo/webdav.py 2012-03-26 20:06:25.753733455 +0200
+@@ -2,7 +2,10 @@
+ #this repository contains the full copyright notices and license terms.
+ import vobject
+ import urllib
+-from DAV.errors import DAV_NotFound, DAV_Forbidden
++try:
++ from DAV.errors import DAV_NotFound, DAV_Forbidden
++except ImportError:
++ from pywebdav.lib.errors import DAV_NotFound, DAV_Forbidden
+ from trytond.model import ModelView, ModelSQL
+ from trytond.tools import reduce_ids
+ from trytond.transaction import Transaction
+@@ -132,7 +135,10 @@
+ return res
+
+ def get_resourcetype(self, uri, cache=None):
+- from DAV.constants import COLLECTION, OBJECT
++ try:
++ from DAV.constants import COLLECTION, OBJECT
++ except ImportError:
++ from pywebdav.lib.constants import COLLECTION, OBJECT
+ if uri in ('Calendars', 'Calendars/'):
+ return COLLECTION
+ calendar_id = self.calendar(uri)
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..138cbbb
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1 @@
+01-support-pywebdav-0.9.8
commit d37bfa70a901abca7e8fd6bb53c7017fab4ba225
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Sun Mar 25 15:28:18 2012 +0200
Adding Format header for DEP5.
diff --git a/debian/copyright b/debian/copyright
index c905bbf..31cd674 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -1,3 +1,5 @@
+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+
Files: *
Copyright:
(C) 2009-2011 Cedric Krier
commit 6acd52c0d52ae9f013bef475620223e94e27a292
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Fri Feb 24 14:09:12 2012 +0100
Adding myself to copyright.
diff --git a/debian/copyright b/debian/copyright
index 6d5ec8c..c905bbf 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -6,7 +6,9 @@ Copyright:
License: GPL-3+
Files: debian/*
-Copyright: (C) 2009-2012 Daniel Baumann <daniel at debian.org>
+Copyright:
+ (C) 2009-2012 Daniel Baumann <daniel at debian.org>
+ (C) 2012 Mathias Behrle <mathiasb at m9s.biz>
License: GPL-3+
License: GPL-3+
commit 0703e97e47381c517917c4dfe2d7905e1c7fe8c1
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Fri Feb 24 14:01:03 2012 +0100
Updating year in copyright.
diff --git a/debian/copyright b/debian/copyright
index 6da6058..6d5ec8c 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -6,7 +6,7 @@ Copyright:
License: GPL-3+
Files: debian/*
-Copyright: (C) 2009-2011 Daniel Baumann <daniel at debian.org>
+Copyright: (C) 2009-2012 Daniel Baumann <daniel at debian.org>
License: GPL-3+
License: GPL-3+
commit fd86c238af4e5f071d3a53797a382adc288a7cb5
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Fri Feb 24 13:47:01 2012 +0100
Updating to Standards-Version: 3.9.3, no changes needed.
diff --git a/debian/control b/debian/control
index 9436ca8..3a81163 100644
--- a/debian/control
+++ b/debian/control
@@ -5,7 +5,7 @@ Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
Dm-Upload-Allowed: yes
Build-Depends: debhelper (>= 8), python (>= 2.6.6-3~), python-setuptools
-Standards-Version: 3.9.2
+Standards-Version: 3.9.3
Homepage: http://www.tryton.org/
Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-calendar-todo.git
Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-todo.git
commit 1a72d79d15142e15f93e0dc3527cc838dfc3c45f
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Mon Dec 26 18:09:29 2011 +0100
Releasing debian version 2.2.0-1.
diff --git a/debian/changelog b/debian/changelog
index a6d4593..9848e87 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+tryton-modules-calendar-todo (2.2.0-1) unstable; urgency=low
+
+ * Bumping X-Python-Version to >=2.6.
+ * Updating versioned tryton depends to 2.2.
+ * Merging upstream version 2.2.0.
+ * Removing deprecated XB-Python-Version for dh_python2.
+
+ -- Mathias Behrle <mathiasb at m9s.biz> Mon, 26 Dec 2011 14:00:34 +0100
+
tryton-modules-calendar-todo (2.0.0-2) unstable; urgency=low
[ Daniel Baumann ]
commit ece2f1cdfd91cec1ef5ef7d4e36e4686bfa6f3b9
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Sat Dec 17 13:59:42 2011 +0100
Bumping X-Python-Version to >=2.6.
diff --git a/debian/control b/debian/control
index 67c14c5..9436ca8 100644
--- a/debian/control
+++ b/debian/control
@@ -9,7 +9,7 @@ Standards-Version: 3.9.2
Homepage: http://www.tryton.org/
Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-calendar-todo.git
Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-todo.git
-X-Python-Version: >= 2.5
+X-Python-Version: >= 2.6
Package: tryton-modules-calendar-todo
Architecture: all
commit 3f93e4da1a6df6e68c88e87c8857d586f0a4ea3c
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Nov 1 15:19:31 2011 +0100
Updating versioned tryton depends to 2.2.
diff --git a/debian/control b/debian/control
index 5370307..67c14c5 100644
--- a/debian/control
+++ b/debian/control
@@ -14,8 +14,8 @@ X-Python-Version: >= 2.5
Package: tryton-modules-calendar-todo
Architecture: all
Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.0),
- tryton-modules-calendar (>= 2.0), python-dateutil, python-tz, python-vobject,
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.2),
+ tryton-modules-calendar (>= 2.2), python-dateutil, python-tz, python-vobject,
python-webdav, python-pkg-resources
Description: Tryton Application Platform (Calendar Todo Module)
Tryton is a high-level general purpose application platform written in Python
commit 896d5ce4093f7f716fbb03a72440c12326a0060c
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Mon Oct 31 16:20:44 2011 +0100
Merging upstream version 2.2.0.
diff --git a/CHANGELOG b/CHANGELOG
index 8d69511..72099a7 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.2.0 - 2011-10-24
+* Bug fixes (see mercurial logs for details)
+
Version 2.0.0 - 2011-04-27
* Bug fixes (see mercurial logs for details)
diff --git a/MANIFEST.in b/MANIFEST.in
index 5343ad8..7f5d5fd 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -6,4 +6,4 @@ include CHANGELOG
include LICENSE
include *.xml
include *.odt
-include *.csv
+include locale/*.po
diff --git a/PKG-INFO b/PKG-INFO
index 744dd33..782fc36 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,29 +1,31 @@
Metadata-Version: 1.0
Name: trytond_calendar_todo
-Version: 2.0.0
+Version: 2.2.0
Summary: Add Todo support on CalDAV
Home-page: http://www.tryton.org/
Author: B2CK
Author-email: info at b2ck.com
License: GPL-3
-Download-URL: http://downloads.tryton.org/2.0/
+Download-URL: http://downloads.tryton.org/2.2/
Description: UNKNOWN
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Plugins
+Classifier: Framework :: Tryton
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Financial and Insurance Industry
Classifier: Intended Audience :: Legal Industry
Classifier: Intended Audience :: Manufacturing
Classifier: License :: OSI Approved :: GNU General Public License (GPL)
Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Czech
+Classifier: Natural Language :: Dutch
Classifier: Natural Language :: English
Classifier: Natural Language :: French
Classifier: Natural Language :: German
Classifier: Natural Language :: Russian
Classifier: Natural Language :: Spanish
Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 2.5
Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Topic :: Office/Business
diff --git a/__tryton__.py b/__tryton__.py
index f04e3f8..244dd66 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -9,7 +9,7 @@
'name_es_ES': 'Calendario de tareas',
'name_fr_FR' : 'Tâche Calendrier',
'name_ru_RU' : 'Задачи для календаря',
- 'version' : '2.0.0',
+ 'version' : '2.2.0',
'author' : 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
@@ -30,11 +30,13 @@
'todo.xml',
],
'translation': [
- 'bg_BG.csv',
- 'de_DE.csv',
- 'es_CO.csv',
- 'es_ES.csv',
- 'fr_FR.csv',
- 'ru_RU.csv',
+ 'locale/bg_BG.po',
+ 'locale/cs_CZ.po',
+ 'locale/de_DE.po',
+ 'locale/es_CO.po',
+ 'locale/es_ES.po',
+ 'locale/fr_FR.po',
+ 'locale/nl_NL.po',
+ 'locale/ru_RU.po',
],
}
diff --git a/bg_BG.csv b/bg_BG.csv
deleted file mode 100644
index 0446c93..0000000
--- a/bg_BG.csv
+++ /dev/null
@@ -1,91 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.todo,0,Recurrence can not be recurrent!,Повторението не може да е периодично!,0
-error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,UUID и взаимна вложеност трябва да са уникални в календар!,0
-field,"calendar.todo,alarms",0,Alarms,Аларми,0
-field,"calendar.todo,attendees",0,Attendees,Присъстващи,0
-field,"calendar.todo,calendar",0,Calendar,Календар,0
-field,"calendar.todo,calendar_owner",0,Owner,Собственик,0
-field,"calendar.todo,calendar_read_users",0,Read Users,Потребители с права за четене,0
-field,"calendar.todo,calendar_write_users",0,Write Users,Записване на потребители,0
-field,"calendar.todo,categories",0,Categories,Категории,0
-field,"calendar.todo,classification",0,Classification,Класификация,0
-field,"calendar.todo,completed",0,Completed,Изпълнен,0
-field,"calendar.todo,description",0,Description,Описание,0
-field,"calendar.todo,dtstart",0,Start Date,Начална дата,0
-field,"calendar.todo,due",0,Due Date,Дата на изпълнение,0
-field,"calendar.todo,exdates",0,Exception Dates,Дати на грешките,0
-field,"calendar.todo,exrules",0,Exception Rules,Правила при грешка,0
-field,"calendar.todo,location",0,Location,Местоположение,0
-field,"calendar.todo,occurences",0,Occurences,Събития,0
-field,"calendar.todo,organizer",0,Organizer,Организатор,0
-field,"calendar.todo,parent",0,Parent,Родител,0
-field,"calendar.todo,percent_complete",0,Percent complete,Процент изпълнено,0
-field,"calendar.todo,rdates",0,Recurrence Dates,Дати на повторяемост,0
-field,"calendar.todo,rec_name",0,Name,Име,0
-field,"calendar.todo,recurrence",0,Recurrence,Повторение,0
-field,"calendar.todo,rrules",0,Recurrence Rules,Правила за повторяемост,0
-field,"calendar.todo,sequence",0,Sequence,Последователност,0
-field,"calendar.todo,status",0,Status,Състояние,0
-field,"calendar.todo,summary",0,Summary,Обобщено,0
-field,"calendar.todo,timezone",0,Timezone,Времева зона,0
-field,"calendar.todo,uuid",0,UUID,UUID,0
-field,"calendar.todo,vtodo",0,vtodo,,0
-field,"calendar.todo-calendar.category,category",0,Category,Категория,0
-field,"calendar.todo-calendar.category,rec_name",0,Name,Име,0
-field,"calendar.todo-calendar.category,todo",0,To-Do,Задача,0
-field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Аларма на календар,0
-field,"calendar.todo.alarm,rec_name",0,Name,Име,0
-field,"calendar.todo.alarm,todo",0,Todo,Задача,0
-field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Присъстващ на календар,0
-field,"calendar.todo.attendee,rec_name",0,Name,Име,0
-field,"calendar.todo.attendee,todo",0,Todo,Задача,0
-field,"calendar.todo.exdate,calendar_date",0,Calendar Date,Дата от календар,0
-field,"calendar.todo.exdate,rec_name",0,Name,Име,0
-field,"calendar.todo.exdate,todo",0,Todo,Задача,0
-field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,,0
-field,"calendar.todo.exrule,rec_name",0,Name,Име,0
-field,"calendar.todo.exrule,todo",0,Todo,Задача,0
-field,"calendar.todo.rdate,calendar_date",0,Calendar Date,Дата от календар,0
-field,"calendar.todo.rdate,rec_name",0,Name,Име,0
-field,"calendar.todo.rdate,todo",0,Todo,Задача,0
-field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,,0
-field,"calendar.todo.rrule,rec_name",0,Name,Име,0
-field,"calendar.todo.rrule,todo",0,Todo,Задача,0
-help,"calendar.todo,uuid",0,Universally Unique Identifier,Универсален иникален идентификатор,0
-model,"calendar.todo,name",0,Todo,Задача,0
-model,"calendar.todo-calendar.category,name",0,Todo - Category,Задача - Категория,0
-model,"calendar.todo.alarm,name",0,Alarm,Аларма,0
-model,"calendar.todo.attendee,name",0,Attendee,Присъстващ,0
-model,"calendar.todo.exdate,name",0,Exception Date,Дата на грешка,0
-model,"calendar.todo.exrule,name",0,Exception Rule,Правило при грешка,0
-model,"calendar.todo.rdate,name",0,Todo Recurrence Date,Дата на повторение на задача,0
-model,"calendar.todo.rrule,name",0,Recurrence Rule,Правило за повторение,0
-model,"ir.action,name",act_todo_form,Todos,Задачи,0
-model,"ir.action,name",act_todo_form2,Todos,Задачи,0
-model,"ir.action,name",act_todo_form3,Todos,Задачи,0
-model,"ir.ui.menu,name",menu_todo_form,Todos,Задачи,0
-model,"ir.ui.menu,name",menu_todo_form2,New Todo,Нова задача,0
-selection,"calendar.todo,classification",0,Confidential,Поверителен,0
-selection,"calendar.todo,classification",0,Private,Частен,0
-selection,"calendar.todo,classification",0,Public,Публичен,0
-selection,"calendar.todo,status",0,,,0
-selection,"calendar.todo,status",0,Cancelled,Отказан,0
-selection,"calendar.todo,status",0,Completed,Изпълнен,0
-selection,"calendar.todo,status",0,In-Process,Обработва се,0
-selection,"calendar.todo,status",0,Needs-Action,Необходимо е действие,0
-view,calendar.todo,0,Attendees,Присъстващи,0
-view,calendar.todo,0,Categories,Категории,0
-view,calendar.todo,0,General,Основен,0
-view,calendar.todo,0,Occurences,Събития,0
-view,calendar.todo,0,Todo,Задача,0
-view,calendar.todo,0,Todos,Задачи,0
-view,calendar.todo.attendee,0,Attendee,Присъстващ,0
-view,calendar.todo.attendee,0,Attendees,Присъстващи,0
-view,calendar.todo.exdate,0,Exception Date,Дата на грешка,0
-view,calendar.todo.exdate,0,Exception Dates,Дати на грешките,0
-view,calendar.todo.exrule,0,Exception Rule,Правило при грешка,0
-view,calendar.todo.exrule,0,Exception Rules,Правила при грешка,0
-view,calendar.todo.rdate,0,Recurrence Date,Повтаряща се дата,0
-view,calendar.todo.rdate,0,Recurrence Dates,Дати на повторяемост,0
-view,calendar.todo.rrule,0,Recurrence Rule,Правило за повторение,0
-view,calendar.todo.rrule,0,Recurrence Rules,Правила за повторяемост,0
diff --git a/de_DE.csv b/de_DE.csv
deleted file mode 100644
index d9bb158..0000000
--- a/de_DE.csv
+++ /dev/null
@@ -1,92 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.todo,0,Recurrence can not be recurrent!,Wiederholungen können nicht rekursiv sein!,0
-error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,UUID und Wiederholung können in einem Kalender nicht mehrfach vergeben werden!,0
-field,"calendar.todo,alarms",0,Alarms,Alarm,0
-field,"calendar.todo,attendees",0,Attendees,Teilnehmer,0
-field,"calendar.todo,calendar",0,Calendar,Kalender,0
-field,"calendar.todo,calendar_owner",0,Owner,Besitzer,0
-field,"calendar.todo,calendar_read_users",0,Read Users,Benutzer mit Leseberechtigung,0
-field,"calendar.todo,calendar_write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
-field,"calendar.todo,categories",0,Categories,Kategorien,0
-field,"calendar.todo,classification",0,Classification,Klassifizierung,0
-field,"calendar.todo,completed",0,Completed,Abgeschlossen,0
-field,"calendar.todo,description",0,Description,Bezeichnung,0
-field,"calendar.todo,dtstart",0,Start Date,Anfangsdatum,0
-field,"calendar.todo,due",0,Due Date,Fälligkeitsdatum,0
-field,"calendar.todo,exdates",0,Exception Dates,Ausnahmedaten,0
-field,"calendar.todo,exrules",0,Exception Rules,Ausnahmeregeln,0
-field,"calendar.todo,location",0,Location,Ort,0
-field,"calendar.todo,occurences",0,Occurences,Ereignisse,0
-field,"calendar.todo,organizer",0,Organizer,Organisator,0
-field,"calendar.todo,parent",0,Parent,Übergeordnet (Aufgabe),0
-field,"calendar.todo,percent_complete",0,Percent complete,% erledigt,0
-field,"calendar.todo,rdates",0,Recurrence Dates,Wiederholungsdaten,0
-field,"calendar.todo,rec_name",0,Name,Name,0
-field,"calendar.todo,recurrence",0,Recurrence,Wiederholung,0
-field,"calendar.todo,rrules",0,Recurrence Rules,Wiederholungsregeln,0
-field,"calendar.todo,sequence",0,Sequence,Revision,0
-field,"calendar.todo,status",0,Status,Status,0
-field,"calendar.todo,summary",0,Summary,Zusammenfassung,0
-field,"calendar.todo,timezone",0,Timezone,Zeitzone,0
-field,"calendar.todo,uuid",0,UUID,UUID,0
-field,"calendar.todo,vtodo",0,vtodo,vtodo,0
-field,"calendar.todo-calendar.category,category",0,Category,Kategorie,0
-field,"calendar.todo-calendar.category,rec_name",0,Name,Name,0
-field,"calendar.todo-calendar.category,todo",0,To-Do,Aufgabe,0
-field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Kalender Alarm,0
-field,"calendar.todo.alarm,rec_name",0,Name,Name,0
-field,"calendar.todo.alarm,todo",0,Todo,Aufgabe,0
-field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Kalender Teilnehmer,0
-field,"calendar.todo.attendee,rec_name",0,Name,Name,0
-field,"calendar.todo.attendee,todo",0,Todo,Aufgabe,0
-field,"calendar.todo.exdate,calendar_date",0,Calendar Date,Kalender Datum,0
-field,"calendar.todo.exdate,rec_name",0,Name,Name,0
-field,"calendar.todo.exdate,todo",0,Todo,Aufgabe,0
-field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
-field,"calendar.todo.exrule,rec_name",0,Name,Name,0
-field,"calendar.todo.exrule,todo",0,Todo,Aufgabe,0
-field,"calendar.todo.rdate,calendar_date",0,Calendar Date,Kalender Datum,0
-field,"calendar.todo.rdate,rec_name",0,Name,Name,0
-field,"calendar.todo.rdate,todo",0,Todo,Aufgabe,0
-field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
-field,"calendar.todo.rrule,rec_name",0,Name,Name,0
-field,"calendar.todo.rrule,todo",0,Todo,Aufgabe,0
-help,"calendar.todo,uuid",0,Universally Unique Identifier,Universally Unique Identifier,0
-model,"calendar.todo,name",0,Todo,Aufgabe,0
-model,"calendar.todo-calendar.category,name",0,Todo - Category,Aufgabe - Kategorie,0
-model,"calendar.todo.alarm,name",0,Alarm,Alarm,0
-model,"calendar.todo.attendee,name",0,Attendee,Teilnehmer,0
-model,"calendar.todo.exdate,name",0,Exception Date,Ausnahmedatum,0
-model,"calendar.todo.exrule,name",0,Exception Rule,Ausnahmeregel,0
-model,"calendar.todo.rdate,name",0,Todo Recurrence Date,Aufgabe Wiederholungsdatum,0
-model,"calendar.todo.rrule,name",0,Recurrence Rule,Wiederholungsregel,0
-model,"ir.action,name",act_todo_form,Todos,Aufgaben,0
-model,"ir.action,name",act_todo_form2,Todos,Aufgaben,0
-model,"ir.action,name",act_todo_form3,Todos,Aufgaben,0
-model,"ir.ui.menu,name",menu_todo_form,Todos,Aufgaben,0
-model,"ir.ui.menu,name",menu_todo_form2,New Todo,Neue Aufgabe,0
-selection,"calendar.todo,classification",0,Confidential,Vertraulich,0
-selection,"calendar.todo,classification",0,Private,Privat,0
-selection,"calendar.todo,classification",0,Public,Öffentlich,0
-selection,"calendar.todo,status",0,,,0
-selection,"calendar.todo,status",0,Cancelled,Abgesagt,0
-selection,"calendar.todo,status",0,Completed,Abgeschlossen,0
-selection,"calendar.todo,status",0,In-Process,In Arbeit,0
-selection,"calendar.todo,status",0,Needs-Action,Benötigt Eingriff,0
-view,calendar.todo,0,Attendees,Teilnehmer,0
-view,calendar.todo,0,Categories,Kategorien,0
-view,calendar.todo,0,General,Allgemein,0
-view,calendar.todo,0,Occurences,Ereignisse,0
-view,calendar.todo,0,Recurrences,Wiederholungen,0
-view,calendar.todo,0,Todo,Aufgabe,0
-view,calendar.todo,0,Todos,Aufgaben,0
-view,calendar.todo.attendee,0,Attendee,Teilnehmer,0
-view,calendar.todo.attendee,0,Attendees,Teilnehmer,0
-view,calendar.todo.exdate,0,Exception Date,Ausnahmedatum,0
-view,calendar.todo.exdate,0,Exception Dates,Ausnahmedaten,0
-view,calendar.todo.exrule,0,Exception Rule,Ausnahmeregel,0
-view,calendar.todo.exrule,0,Exception Rules,Ausnahmeregeln,0
-view,calendar.todo.rdate,0,Recurrence Date,Wiederholungsdatum,0
-view,calendar.todo.rdate,0,Recurrence Dates,Wiederholungsdaten,0
-view,calendar.todo.rrule,0,Recurrence Rule,Wiederholungsregel,0
-view,calendar.todo.rrule,0,Recurrence Rules,Wiederholungsregeln,0
diff --git a/es_CO.csv b/es_CO.csv
deleted file mode 100644
index c49cab3..0000000
--- a/es_CO.csv
+++ /dev/null
@@ -1,93 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.todo,0,Recurrence can not be recurrent!,¡La repetición no puede repetirse!,0
-error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,¡El UUID y la recurrencia deben ser únicos por calendario! ,0
-field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,,0
-field,"calendar.todo.alarm,rec_name",0,Name,Nombre,0
-field,"calendar.todo,alarms",0,Alarms,Alarmas,0
-field,"calendar.todo.alarm,todo",0,Todo,,0
-field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,,0
-field,"calendar.todo.attendee,rec_name",0,Name,Nombre,0
-field,"calendar.todo,attendees",0,Attendees,Asistentes,0
-field,"calendar.todo.attendee,todo",0,Todo,,0
-field,"calendar.todo,calendar",0,Calendar,Calendario,0
-field,"calendar.todo-calendar.category,category",0,Category,Categoría,0
-field,"calendar.todo-calendar.category,rec_name",0,Name,Nombre,0
-field,"calendar.todo-calendar.category,todo",0,To-Do,,0
-field,"calendar.todo,calendar_owner",0,Owner,Propietario,0
-field,"calendar.todo,calendar_read_users",0,Read Users,Leer Usuarios,0
-field,"calendar.todo,calendar_write_users",0,Write Users,Escribir Usuarios,0
-field,"calendar.todo,categories",0,Categories,Categorías,0
-field,"calendar.todo,classification",0,Classification,Clasificación,0
-field,"calendar.todo,classification_public",0,Classification Public,Clasificación Pública,0
-field,"calendar.todo,completed",0,Completed,,0
-field,"calendar.todo,description",0,Description,Descripción,0
-field,"calendar.todo,dtstart",0,Start Date,Fecha Inicio,0
-field,"calendar.todo,due",0,Due Date,,0
-field,"calendar.todo.exdate,calendar_rdate",0,Calendar RDate,,0
-field,"calendar.todo.exdate,rec_name",0,Name,Nombre,0
-field,"calendar.todo,exdates",0,Exception Dates,Fechas de Excepción,0
-field,"calendar.todo.exdate,todo",0,Todo,,0
-field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,,0
-field,"calendar.todo.exrule,rec_name",0,Name,Nombre,0
-field,"calendar.todo,exrules",0,Exception Rules,Reglas de Excepción,0
-field,"calendar.todo.exrule,todo",0,Todo,,0
-field,"calendar.todo,location",0,Location,Lugar,0
-field,"calendar.todo,occurences",0,Occurences,Ocurrencias,0
-field,"calendar.todo,organizer",0,Organizer,Organizador,0
-field,"calendar.todo,parent",0,Parent,Padre,0
-field,"calendar.todo,percent_complete",0,Percent complete,,0
-field,"calendar.todo.rdate,calendar_rdate",0,Calendar RDate,,0
-field,"calendar.todo.rdate,rec_name",0,Name,Nombre,0
-field,"calendar.todo,rdates",0,Recurrence Dates,Fechas de Repetición,0
-field,"calendar.todo.rdate,todo",0,Todo,,0
-field,"calendar.todo,rec_name",0,Name,Nombre,0
-field,"calendar.todo,recurrence",0,Recurrence,Repetición,0
-field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,,0
-field,"calendar.todo.rrule,rec_name",0,Name,Nombre,0
-field,"calendar.todo,rrules",0,Recurrence Rules,Reglas de Repetición,0
-field,"calendar.todo.rrule,todo",0,Todo,,0
-field,"calendar.todo,sequence",0,Sequence,Secuencia,0
-field,"calendar.todo,status",0,Status,Estado,0
-field,"calendar.todo,summary",0,Summary,Resumen,0
-field,"calendar.todo,timezone",0,Timezone,Zona horaria,0
-field,"calendar.todo,uuid",0,UUID,UUID,0
-field,"calendar.todo,vtodo",0,vtodo,,0
-help,"calendar.todo,uuid",0,Universally Unique Identifier,Identificador Único Universal,0
-model,"calendar.todo.alarm,name",0,Alarm,Alarma,0
-model,"calendar.todo.attendee,name",0,Attendee,Asistente,0
-model,"calendar.todo-calendar.category,name",0,Todo - Category,,0
-model,"calendar.todo.exdate,name",0,Exception Date,Fecha de Excepción,0
-model,"calendar.todo.exrule,name",0,Exception Rule,Regla de Excepción,0
-model,"calendar.todo,name",0,Todo,,0
-model,"calendar.todo.rdate,name",0,Recurrence Date,Fecha de Repetición,0
-model,"calendar.todo.rrule,name",0,Recurrence Rule,Regla de Repetición,0
-model,"ir.action,name",act_todo_form,Todos,,0
-model,"ir.action,name",act_todo_form2,Todos,Por Hacer,0
-model,"ir.action,name",act_todo_form3,Todos,Por hacer,0
-model,"ir.ui.menu,name",menu_todo_form2,New Todo,Nuevo Por Hacer,0
-model,"ir.ui.menu,name",menu_todo_form,Todos,,0
-selection,"calendar.todo,classification",0,Confidential,Confidencial,0
-selection,"calendar.todo,classification",0,Private,Privado,0
-selection,"calendar.todo,classification",0,Public,Público,0
-selection,"calendar.todo,status",0,,,0
-selection,"calendar.todo,status",0,Cancelled,Cancelado,0
-selection,"calendar.todo,status",0,Completed,,0
-selection,"calendar.todo,status",0,In-Process,,0
-selection,"calendar.todo,status",0,Needs-Action,,0
-view,calendar.todo,0,Attendees,Asistentes,0
-view,calendar.todo,0,Categories,Categorías,0
-view,calendar.todo,0,General,General,0
-view,calendar.todo,0,Occurences,Ocurrencias,0
-view,calendar.todo,0,Recurrences,Repeticiones,0
-view,calendar.todo,0,Todo,,0
-view,calendar.todo,0,Todos,,0
-view,calendar.todo.attendee,0,Attendee,Asistente,0
-view,calendar.todo.attendee,0,Attendees,Asistentes,0
-view,calendar.todo.exdate,0,Exception Date,Fecha de Excepción,0
-view,calendar.todo.exdate,0,Exception Dates,Fechas de Excepción,0
-view,calendar.todo.exrule,0,Exception Rule,Regla de Excepción,0
-view,calendar.todo.exrule,0,Exception Rules,Reglas de Excepción,0
-view,calendar.todo.rdate,0,Recurrence Date,Fecha de Repetición,0
-view,calendar.todo.rdate,0,Recurrence Dates,Fechas de Repetición,0
-view,calendar.todo.rrule,0,Recurrence Rule,Regla de Repetición,0
-view,calendar.todo.rrule,0,Recurrence Rules,Reglas de Repetición,0
diff --git a/es_ES.csv b/es_ES.csv
deleted file mode 100644
index 5c5af3b..0000000
--- a/es_ES.csv
+++ /dev/null
@@ -1,89 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.todo,0,Recurrence can not be recurrent!,Una recurrencia no puede ser recurrente,0
-error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,UUID y recurrencia deben ser únicos en un calendario,0
-field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Alarma del calendario,0
-field,"calendar.todo.alarm,rec_name",0,Name,Nombre,0
-field,"calendar.todo,alarms",0,Alarms,Alarmas,0
-field,"calendar.todo.alarm,todo",0,Todo,Tarea,0
-field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Calendario de asistentes,0
-field,"calendar.todo.attendee,rec_name",0,Name,Nombre,0
-field,"calendar.todo,attendees",0,Attendees,Asistentes,0
-field,"calendar.todo.attendee,todo",0,Todo,Tarea,0
-field,"calendar.todo,calendar",0,Calendar,Calendario,0
-field,"calendar.todo-calendar.category,category",0,Category,Categoría,0
-field,"calendar.todo-calendar.category,rec_name",0,Name,Nombre,0
-field,"calendar.todo-calendar.category,todo",0,To-Do,Por hacer,0
-field,"calendar.todo,calendar_owner",0,Owner,Dueño,0
-field,"calendar.todo,calendar_read_users",0,Read Users,Usuarios con lectura,0
-field,"calendar.todo,calendar_write_users",0,Write Users,Usuarios con escritura,0
-field,"calendar.todo,categories",0,Categories,Categorías,0
-field,"calendar.todo,classification",0,Classification,Clasificación,0
-field,"calendar.todo,classification_public",0,Classification Public,Clasificación pública,0
-field,"calendar.todo,completed",0,Completed,Completada,0
-field,"calendar.todo,description",0,Description,Descripción,0
-field,"calendar.todo,dtstart",0,Start Date,Fecha inicio,0
-field,"calendar.todo,due",0,Due Date,Fecha de vencimiento,0
-field,"calendar.todo.exdate,calendar_rdate",0,Calendar RDate,Fecha de recurrencia,0
-field,"calendar.todo.exdate,rec_name",0,Name,Nombre,0
-field,"calendar.todo,exdates",0,Exception Dates,Fechas excluidas,0
-field,"calendar.todo.exdate,todo",0,Todo,Tarea,0
-field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Regla de recurrencia,0
-field,"calendar.todo.exrule,rec_name",0,Name,Nombre,0
-field,"calendar.todo,exrules",0,Exception Rules,Reglas de excepciones,0
-field,"calendar.todo.exrule,todo",0,Todo,Tarea,0
-field,"calendar.todo,location",0,Location,Ubicación,0
-field,"calendar.todo,organizer",0,Organizer,Organizador,0
-field,"calendar.todo,parent",0,Parent,Padre,0
-field,"calendar.todo,percent_complete",0,Percent complete,Porcentaje total,0
-field,"calendar.todo.rdate,calendar_rdate",0,Calendar RDate,Fecha de recurrencia,0
-field,"calendar.todo.rdate,rec_name",0,Name,Nombre,0
-field,"calendar.todo,rdates",0,Recurrence Dates,Fechas de recurrencia,0
-field,"calendar.todo.rdate,todo",0,Todo,Tarea,0
-field,"calendar.todo,rec_name",0,Name,Nombre,0
-field,"calendar.todo,recurrence",0,Recurrence,Recurrencia,0
-field,"calendar.todo,recurrences",0,Recurrences,Recurrencias,0
-field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Regla de recurrencia,0
-field,"calendar.todo.rrule,rec_name",0,Name,Nombre,0
-field,"calendar.todo,rrules",0,Recurrence Rules,Reglas de recurrencia,0
-field,"calendar.todo.rrule,todo",0,Todo,Tarea,0
-field,"calendar.todo,sequence",0,Sequence,Secuencia,0
-field,"calendar.todo,status",0,Status,Estado,0
-field,"calendar.todo,summary",0,Summary,Resumen,0
-field,"calendar.todo,timezone",0,Timezone,Zona horaria,0
-field,"calendar.todo,uuid",0,UUID,UUID,0
-field,"calendar.todo,vtodo",0,vtodo,vtodo,0
-help,"calendar.todo,uuid",0,Universally Unique Identifier,Identificador universal único,0
-model,"calendar.todo.alarm,name",0,Alarm,Alarma,0
-model,"calendar.todo.attendee,name",0,Attendee,Asistentes,0
-model,"calendar.todo-calendar.category,name",0,Todo - Category,Tarea - Categoría,0
-model,"calendar.todo.exdate,name",0,Exception Date,Fecha excluida,0
-model,"calendar.todo.exrule,name",0,Exception Rule,Regla de excepción,0
-model,"calendar.todo,name",0,Todo,Tarea,0
-model,"calendar.todo.rdate,name",0,Recurrence Date,Fecha de recurrencia,0
-model,"calendar.todo.rrule,name",0,Recurrence Rule,Regla de recurrencia,0
-model,"ir.action,name",act_todo_form,Todos,Tareas,0
-model,"ir.ui.menu,name",menu_todo_form,Todos,Tareas,0
-selection,"calendar.todo,classification",0,Confidential,Confidencial,0
-selection,"calendar.todo,classification",0,Private,Privado,0
-selection,"calendar.todo,classification",0,Public,Público,0
-selection,"calendar.todo,status",0,,,0
-selection,"calendar.todo,status",0,Cancelled,Cancelada,0
-selection,"calendar.todo,status",0,Completed,Completado,0
-selection,"calendar.todo,status",0,In-Process,En proceso,0
-selection,"calendar.todo,status",0,Needs-Action,Necesita una acción,0
-view,calendar.todo,0,Attendees,Asistentes,0
-view,calendar.todo,0,Categories,Categorías,0
-view,calendar.todo,0,General,General,0
-view,calendar.todo,0,Recurrences,Recurrencias,0
-view,calendar.todo,0,Todo,Tarea,0
-view,calendar.todo,0,Todos,Tareas,0
-view,calendar.todo.attendee,0,Attendee,Asistentes,0
-view,calendar.todo.attendee,0,Attendees,Asistentes,0
-view,calendar.todo.exdate,0,Exception Date,Fecha excluida,0
-view,calendar.todo.exdate,0,Exception Dates,Fechas excluidas,0
-view,calendar.todo.exrule,0,Exception Rule,Regla de excepción,0
-view,calendar.todo.exrule,0,Exception Rules,Reglas de excepciones,0
-view,calendar.todo.rdate,0,Recurrence Date,Fecha de recurrencia,0
-view,calendar.todo.rdate,0,Recurrence Dates,Fechas de recurrencia,0
-view,calendar.todo.rrule,0,Recurrence Rule,Regla de recurrencia,0
-view,calendar.todo.rrule,0,Recurrence Rules,Reglas de recurrencia,0
diff --git a/fr_FR.csv b/fr_FR.csv
deleted file mode 100644
index 47863e2..0000000
--- a/fr_FR.csv
+++ /dev/null
@@ -1,92 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.todo,0,Recurrence can not be recurrent!,Une récurrence ne peut pas être récurrente !,0
-error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,UUID et récurrence doivent être uniques sur un calendrier !,0
-field,"calendar.todo,alarms",0,Alarms,Alarmes,0
-field,"calendar.todo,attendees",0,Attendees,Participants,0
-field,"calendar.todo,calendar",0,Calendar,Calendrier,0
-field,"calendar.todo,calendar_owner",0,Owner,Propriétaire,0
-field,"calendar.todo,calendar_read_users",0,Read Users,Utilisateurs en lecture,0
-field,"calendar.todo,calendar_write_users",0,Write Users,Utilisateurs en écriture,0
-field,"calendar.todo,categories",0,Categories,Catégories,0
-field,"calendar.todo,classification",0,Classification,Classification,0
-field,"calendar.todo,completed",0,Completed,Complété,0
-field,"calendar.todo,description",0,Description,Description,0
-field,"calendar.todo,dtstart",0,Start Date,Date de début,0
-field,"calendar.todo,due",0,Due Date,Date d'échéance,0
-field,"calendar.todo,exdates",0,Exception Dates,Dates d'exception,0
-field,"calendar.todo,exrules",0,Exception Rules,Règles d'exception,0
-field,"calendar.todo,location",0,Location,Emplacement,0
-field,"calendar.todo,occurences",0,Occurences,Occurrences,0
-field,"calendar.todo,organizer",0,Organizer,Organisateur,0
-field,"calendar.todo,parent",0,Parent,Parent,0
-field,"calendar.todo,percent_complete",0,Percent complete,Pourcentage effectué,0
-field,"calendar.todo,rdates",0,Recurrence Dates,Dates de récurrence,0
-field,"calendar.todo,rec_name",0,Name,Nom,0
-field,"calendar.todo,recurrence",0,Recurrence,Récurrence,0
-field,"calendar.todo,rrules",0,Recurrence Rules,Règles de récurrence,0
-field,"calendar.todo,sequence",0,Sequence,Séquence,0
-field,"calendar.todo,status",0,Status,Statut,0
-field,"calendar.todo,summary",0,Summary,Résumé,0
-field,"calendar.todo,timezone",0,Timezone,Fuseau Horaire,0
-field,"calendar.todo,uuid",0,UUID,UUID,0
-field,"calendar.todo,vtodo",0,vtodo,vtodo,0
-field,"calendar.todo-calendar.category,category",0,Category,Catégorie,0
-field,"calendar.todo-calendar.category,rec_name",0,Name,Nom,0
-field,"calendar.todo-calendar.category,todo",0,To-Do,Tâche,0
-field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Alarme calendrier,0
-field,"calendar.todo.alarm,rec_name",0,Name,Nom,0
-field,"calendar.todo.alarm,todo",0,Todo,Tâche,0
-field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Participant calendrier,0
-field,"calendar.todo.attendee,rec_name",0,Name,Nom,0
-field,"calendar.todo.attendee,todo",0,Todo,Tâche,0
-field,"calendar.todo.exdate,calendar_date",0,Calendar Date,Date calendrier,0
-field,"calendar.todo.exdate,rec_name",0,Name,Nom,0
-field,"calendar.todo.exdate,todo",0,Todo,Tâche,0
-field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
-field,"calendar.todo.exrule,rec_name",0,Name,Nom,0
-field,"calendar.todo.exrule,todo",0,Todo,Tâche,0
-field,"calendar.todo.rdate,calendar_date",0,Calendar Date,Date calendrier,0
-field,"calendar.todo.rdate,rec_name",0,Name,Nom,0
-field,"calendar.todo.rdate,todo",0,Todo,Tâche,0
-field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
-field,"calendar.todo.rrule,rec_name",0,Name,Nom,0
-field,"calendar.todo.rrule,todo",0,Todo,Tâche,0
-help,"calendar.todo,uuid",0,Universally Unique Identifier,Identificateur unique universel,0
-model,"calendar.todo,name",0,Todo,Tâche,0
-model,"calendar.todo-calendar.category,name",0,Todo - Category,Todo - Catégorie,0
-model,"calendar.todo.alarm,name",0,Alarm,Alarme,0
-model,"calendar.todo.attendee,name",0,Attendee,Participant,0
-model,"calendar.todo.exdate,name",0,Exception Date,Date d'exception,0
-model,"calendar.todo.exrule,name",0,Exception Rule,Règle d'exception,0
-model,"calendar.todo.rdate,name",0,Todo Recurrence Date,Date de récurrence,0
-model,"calendar.todo.rrule,name",0,Recurrence Rule,Règle de récurrence,0
-model,"ir.action,name",act_todo_form,Todos,Tâches,0
-model,"ir.action,name",act_todo_form2,Todos,Tâches,0
-model,"ir.action,name",act_todo_form3,Todos,Tâches,0
-model,"ir.ui.menu,name",menu_todo_form,Todos,Tâches,0
-model,"ir.ui.menu,name",menu_todo_form2,New Todo,Nouvelle tâche,0
-selection,"calendar.todo,classification",0,Confidential,Confidentiel,0
-selection,"calendar.todo,classification",0,Private,Privé,0
-selection,"calendar.todo,classification",0,Public,Publique,0
-selection,"calendar.todo,status",0,,,0
-selection,"calendar.todo,status",0,Cancelled,Annulé,0
-selection,"calendar.todo,status",0,Completed,Complété,0
-selection,"calendar.todo,status",0,In-Process,En court,0
-selection,"calendar.todo,status",0,Needs-Action,Nécessite une action,0
-view,calendar.todo,0,Attendees,Participants,0
-view,calendar.todo,0,Categories,Catégories,0
-view,calendar.todo,0,General,Général,0
-view,calendar.todo,0,Occurences,Occurrences,0
-view,calendar.todo,0,Recurrences,Récurrences,0
-view,calendar.todo,0,Todo,Tâche,0
-view,calendar.todo,0,Todos,Tâches,0
-view,calendar.todo.attendee,0,Attendee,Participant,0
-view,calendar.todo.attendee,0,Attendees,Participants,0
-view,calendar.todo.exdate,0,Exception Date,Date d'exception,0
-view,calendar.todo.exdate,0,Exception Dates,Dates d'exception,0
-view,calendar.todo.exrule,0,Exception Rule,Règle d'exception,0
-view,calendar.todo.exrule,0,Exception Rules,Règles d'exception,0
-view,calendar.todo.rdate,0,Recurrence Date,Date de récurrence,0
-view,calendar.todo.rdate,0,Recurrence Dates,Dates de récurrence,0
-view,calendar.todo.rrule,0,Recurrence Rule,Règle de récurrence,0
-view,calendar.todo.rrule,0,Recurrence Rules,Règles de récurrence,0
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
new file mode 100644
index 0000000..ca18ebd
--- /dev/null
+++ b/locale/bg_BG.po
@@ -0,0 +1,355 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.todo:0"
+msgid "Recurrence can not be recurrent!"
+msgstr "Повторението не може да е периодично!"
+
+msgctxt "error:calendar.todo:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "UUID и взаимна вложеност трябва да са уникални в календар!"
+
+msgctxt "field:calendar.todo,alarms:0"
+msgid "Alarms"
+msgstr "Аларми"
+
+msgctxt "field:calendar.todo,attendees:0"
+msgid "Attendees"
+msgstr "Присъстващи"
+
+msgctxt "field:calendar.todo,calendar:0"
+msgid "Calendar"
+msgstr "Календар"
+
+msgctxt "field:calendar.todo,calendar_owner:0"
+msgid "Owner"
+msgstr "Собственик"
+
+msgctxt "field:calendar.todo,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Потребители с права за четене"
+
+msgctxt "field:calendar.todo,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Записване на потребители"
+
+msgctxt "field:calendar.todo,categories:0"
+msgid "Categories"
+msgstr "Категории"
+
+msgctxt "field:calendar.todo,classification:0"
+msgid "Classification"
+msgstr "Класификация"
+
+msgctxt "field:calendar.todo,completed:0"
+msgid "Completed"
+msgstr "Изпълнен"
+
+msgctxt "field:calendar.todo,description:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:calendar.todo,dtstart:0"
+msgid "Start Date"
+msgstr "Начална дата"
+
+msgctxt "field:calendar.todo,due:0"
+msgid "Due Date"
+msgstr "Дата на изпълнение"
+
+msgctxt "field:calendar.todo,exdates:0"
+msgid "Exception Dates"
+msgstr "Дати на грешките"
+
+msgctxt "field:calendar.todo,exrules:0"
+msgid "Exception Rules"
+msgstr "Правила при грешка"
+
+msgctxt "field:calendar.todo,location:0"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "field:calendar.todo,occurences:0"
+msgid "Occurences"
+msgstr "Събития"
+
+msgctxt "field:calendar.todo,organizer:0"
+msgid "Organizer"
+msgstr "Организатор"
+
+msgctxt "field:calendar.todo,parent:0"
+msgid "Parent"
+msgstr "Родител"
+
+msgctxt "field:calendar.todo,percent_complete:0"
+msgid "Percent complete"
+msgstr "Процент изпълнено"
+
+msgctxt "field:calendar.todo,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Дати на повторяемост"
+
+msgctxt "field:calendar.todo,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.todo,recurrence:0"
+msgid "Recurrence"
+msgstr "Повторение"
+
+msgctxt "field:calendar.todo,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Правила за повторяемост"
+
+msgctxt "field:calendar.todo,sequence:0"
+msgid "Sequence"
+msgstr "Последователност"
+
+msgctxt "field:calendar.todo,status:0"
+msgid "Status"
+msgstr "Състояние"
+
+msgctxt "field:calendar.todo,summary:0"
+msgid "Summary"
+msgstr "Обобщено"
+
+msgctxt "field:calendar.todo,timezone:0"
+msgid "Timezone"
+msgstr "Времева зона"
+
+msgctxt "field:calendar.todo,uuid:0"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.todo,vtodo:0"
+msgid "vtodo"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,category:0"
+msgid "Category"
+msgstr "Категория"
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgid "To-Do"
+msgstr "Задача"
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr "Аларма на календар"
+
+msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.todo.alarm,todo:0"
+msgid "Todo"
+msgstr "Задача"
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr "Присъстващ на календар"
+
+msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.todo.attendee,todo:0"
+msgid "Todo"
+msgstr "Задача"
+
+msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Дата от календар"
+
+msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.todo.exdate,todo:0"
+msgid "Todo"
+msgstr "Задача"
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.todo.exrule,todo:0"
+msgid "Todo"
+msgstr "Задача"
+
+msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Дата от календар"
+
+msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.todo.rdate,todo:0"
+msgid "Todo"
+msgstr "Задача"
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.todo.rrule,todo:0"
+msgid "Todo"
+msgstr "Задача"
+
+msgctxt "help:calendar.todo,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Универсален иникален идентификатор"
+
+msgctxt "model:calendar.todo,name:0"
+msgid "Todo"
+msgstr "Задача"
+
+msgctxt "model:calendar.todo-calendar.category,name:0"
+msgid "Todo - Category"
+msgstr "Задача - Категория"
+
+msgctxt "model:calendar.todo.alarm,name:0"
+msgid "Alarm"
+msgstr "Аларма"
+
+msgctxt "model:calendar.todo.attendee,name:0"
+msgid "Attendee"
+msgstr "Присъстващ"
+
+msgctxt "model:calendar.todo.exdate,name:0"
+msgid "Exception Date"
+msgstr "Дата на грешка"
+
+msgctxt "model:calendar.todo.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Правило при грешка"
+
+msgctxt "model:calendar.todo.rdate,name:0"
+msgid "Todo Recurrence Date"
+msgstr "Дата на повторение на задача"
+
+msgctxt "model:calendar.todo.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Правило за повторение"
+
+msgctxt "model:ir.action,name:act_todo_form"
+msgid "Todos"
+msgstr "Задачи"
+
+msgctxt "model:ir.action,name:act_todo_form3"
+msgid "Todos"
+msgstr "Задачи"
+
+msgctxt "model:ir.ui.menu,name:menu_todo_form"
+msgid "Todos"
+msgstr "Задачи"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Confidential"
+msgstr "Поверителен"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Private"
+msgstr "Частен"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Public"
+msgstr "Публичен"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Cancelled"
+msgstr "Отказан"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Completed"
+msgstr "Изпълнен"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "In-Process"
+msgstr "Обработва се"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Needs-Action"
+msgstr "Необходимо е действие"
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendee"
+msgstr "Присъстващ"
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendees"
+msgstr "Присъстващи"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Date"
+msgstr "Дата на грешка"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Dates"
+msgstr "Дати на грешките"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rule"
+msgstr "Правило при грешка"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rules"
+msgstr "Правила при грешка"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Date"
+msgstr "Повтаряща се дата"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Дати на повторяемост"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Правило за повторение"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Правила за повторяемост"
+
+msgctxt "view:calendar.todo:0"
+msgid "Attendees"
+msgstr "Присъстващи"
+
+msgctxt "view:calendar.todo:0"
+msgid "Categories"
+msgstr "Категории"
+
+msgctxt "view:calendar.todo:0"
+msgid "General"
+msgstr "Основен"
+
+msgctxt "view:calendar.todo:0"
+msgid "Occurences"
+msgstr "Събития"
+
+msgctxt "view:calendar.todo:0"
+msgid "Todo"
+msgstr "Задача"
+
+msgctxt "view:calendar.todo:0"
+msgid "Todos"
+msgstr "Задачи"
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
new file mode 100644
index 0000000..952cc84
--- /dev/null
+++ b/locale/cs_CZ.po
@@ -0,0 +1,355 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.todo:0"
+msgid "Recurrence can not be recurrent!"
+msgstr ""
+
+msgctxt "error:calendar.todo:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr ""
+
+msgctxt "field:calendar.todo,alarms:0"
+msgid "Alarms"
+msgstr ""
+
+msgctxt "field:calendar.todo,attendees:0"
+msgid "Attendees"
+msgstr ""
+
+msgctxt "field:calendar.todo,calendar:0"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "field:calendar.todo,calendar_owner:0"
+msgid "Owner"
+msgstr ""
+
+msgctxt "field:calendar.todo,calendar_read_users:0"
+msgid "Read Users"
+msgstr ""
+
+msgctxt "field:calendar.todo,calendar_write_users:0"
+msgid "Write Users"
+msgstr ""
+
+msgctxt "field:calendar.todo,categories:0"
+msgid "Categories"
+msgstr ""
+
+msgctxt "field:calendar.todo,classification:0"
+msgid "Classification"
+msgstr ""
+
+msgctxt "field:calendar.todo,completed:0"
+msgid "Completed"
+msgstr ""
+
+msgctxt "field:calendar.todo,description:0"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:calendar.todo,dtstart:0"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,due:0"
+msgid "Due Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,exdates:0"
+msgid "Exception Dates"
+msgstr ""
+
+msgctxt "field:calendar.todo,exrules:0"
+msgid "Exception Rules"
+msgstr ""
+
+msgctxt "field:calendar.todo,location:0"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:calendar.todo,occurences:0"
+msgid "Occurences"
+msgstr ""
+
+msgctxt "field:calendar.todo,organizer:0"
+msgid "Organizer"
+msgstr ""
+
+msgctxt "field:calendar.todo,parent:0"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:calendar.todo,percent_complete:0"
+msgid "Percent complete"
+msgstr ""
+
+msgctxt "field:calendar.todo,rdates:0"
+msgid "Recurrence Dates"
+msgstr ""
+
+msgctxt "field:calendar.todo,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.todo,recurrence:0"
+msgid "Recurrence"
+msgstr ""
+
+msgctxt "field:calendar.todo,rrules:0"
+msgid "Recurrence Rules"
+msgstr ""
+
+msgctxt "field:calendar.todo,sequence:0"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "field:calendar.todo,status:0"
+msgid "Status"
+msgstr ""
+
+msgctxt "field:calendar.todo,summary:0"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:calendar.todo,timezone:0"
+msgid "Timezone"
+msgstr ""
+
+msgctxt "field:calendar.todo,uuid:0"
+msgid "UUID"
+msgstr ""
+
+msgctxt "field:calendar.todo,vtodo:0"
+msgid "vtodo"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,category:0"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgid "To-Do"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "help:calendar.todo,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr ""
+
+msgctxt "model:calendar.todo,name:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "model:calendar.todo-calendar.category,name:0"
+msgid "Todo - Category"
+msgstr ""
+
+msgctxt "model:calendar.todo.alarm,name:0"
+msgid "Alarm"
+msgstr ""
+
+msgctxt "model:calendar.todo.attendee,name:0"
+msgid "Attendee"
+msgstr ""
+
+msgctxt "model:calendar.todo.exdate,name:0"
+msgid "Exception Date"
+msgstr ""
+
+msgctxt "model:calendar.todo.exrule,name:0"
+msgid "Exception Rule"
+msgstr ""
+
+msgctxt "model:calendar.todo.rdate,name:0"
+msgid "Todo Recurrence Date"
+msgstr ""
+
+msgctxt "model:calendar.todo.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_todo_form"
+msgid "Todos"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_todo_form3"
+msgid "Todos"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_todo_form"
+msgid "Todos"
+msgstr ""
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Confidential"
+msgstr ""
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Private"
+msgstr ""
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Public"
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Completed"
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "In-Process"
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Needs-Action"
+msgstr ""
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendee"
+msgstr ""
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendees"
+msgstr ""
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Date"
+msgstr ""
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Dates"
+msgstr ""
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rule"
+msgstr ""
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rules"
+msgstr ""
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Date"
+msgstr ""
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Dates"
+msgstr ""
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rule"
+msgstr ""
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rules"
+msgstr ""
+
+msgctxt "view:calendar.todo:0"
+msgid "Attendees"
+msgstr ""
+
+msgctxt "view:calendar.todo:0"
+msgid "Categories"
+msgstr ""
+
+msgctxt "view:calendar.todo:0"
+msgid "General"
+msgstr ""
+
+msgctxt "view:calendar.todo:0"
+msgid "Occurences"
+msgstr ""
+
+msgctxt "view:calendar.todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "view:calendar.todo:0"
+msgid "Todos"
+msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
new file mode 100644
index 0000000..e83f5d4
--- /dev/null
+++ b/locale/de_DE.po
@@ -0,0 +1,361 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.todo:0"
+msgid "Recurrence can not be recurrent!"
+msgstr "Wiederholungen können nicht rekursiv sein!"
+
+msgctxt "error:calendar.todo:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr ""
+"UUID und Wiederholung können in einem Kalender nicht mehrfach vergeben "
+"werden!"
+
+msgctxt "field:calendar.todo,alarms:0"
+msgid "Alarms"
+msgstr "Alarm"
+
+msgctxt "field:calendar.todo,attendees:0"
+msgid "Attendees"
+msgstr "Teilnehmer"
+
+msgctxt "field:calendar.todo,calendar:0"
+msgid "Calendar"
+msgstr "Kalender"
+
+msgctxt "field:calendar.todo,calendar_owner:0"
+msgid "Owner"
+msgstr "Besitzer"
+
+msgctxt "field:calendar.todo,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Benutzer mit Leseberechtigung"
+
+msgctxt "field:calendar.todo,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Benutzer mit Schreibberechtigung"
+
+msgctxt "field:calendar.todo,categories:0"
+msgid "Categories"
+msgstr "Kategorien"
+
+msgctxt "field:calendar.todo,classification:0"
+msgid "Classification"
+msgstr "Klassifizierung"
+
+msgctxt "field:calendar.todo,completed:0"
+msgid "Completed"
+msgstr "Abgeschlossen"
+
+msgctxt "field:calendar.todo,description:0"
+msgid "Description"
+msgstr "Bezeichnung"
+
+msgctxt "field:calendar.todo,dtstart:0"
+msgid "Start Date"
+msgstr "Anfangsdatum"
+
+msgctxt "field:calendar.todo,due:0"
+msgid "Due Date"
+msgstr "Fälligkeitsdatum"
+
+msgctxt "field:calendar.todo,exdates:0"
+msgid "Exception Dates"
+msgstr "Ausnahmedaten"
+
+msgctxt "field:calendar.todo,exrules:0"
+msgid "Exception Rules"
+msgstr "Ausnahmeregeln"
+
+msgctxt "field:calendar.todo,location:0"
+msgid "Location"
+msgstr "Ort"
+
+msgctxt "field:calendar.todo,occurences:0"
+msgid "Occurences"
+msgstr "Ereignisse"
+
+msgctxt "field:calendar.todo,organizer:0"
+msgid "Organizer"
+msgstr "Organisator"
+
+msgctxt "field:calendar.todo,parent:0"
+msgid "Parent"
+msgstr "Übergeordnet (Aufgabe)"
+
+msgctxt "field:calendar.todo,percent_complete:0"
+msgid "Percent complete"
+msgstr "% erledigt"
+
+msgctxt "field:calendar.todo,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Wiederholungsdaten"
+
+msgctxt "field:calendar.todo,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.todo,recurrence:0"
+msgid "Recurrence"
+msgstr "Wiederholung"
+
+msgctxt "field:calendar.todo,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Wiederholungsregeln"
+
+msgctxt "field:calendar.todo,sequence:0"
+msgid "Sequence"
+msgstr "Revision"
+
+msgctxt "field:calendar.todo,status:0"
+msgid "Status"
+msgstr "Status"
+
+msgctxt "field:calendar.todo,summary:0"
+msgid "Summary"
+msgstr "Zusammenfassung"
+
+msgctxt "field:calendar.todo,timezone:0"
+msgid "Timezone"
+msgstr "Zeitzone"
+
+msgctxt "field:calendar.todo,uuid:0"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.todo,vtodo:0"
+msgid "vtodo"
+msgstr "vtodo"
+
+msgctxt "field:calendar.todo-calendar.category,category:0"
+msgid "Category"
+msgstr "Kategorie"
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgid "To-Do"
+msgstr "Aufgabe"
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr "Kalender Alarm"
+
+msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.todo.alarm,todo:0"
+msgid "Todo"
+msgstr "Aufgabe"
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr "Kalender Teilnehmer"
+
+msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.todo.attendee,todo:0"
+msgid "Todo"
+msgstr "Aufgabe"
+
+msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Kalender Datum"
+
+msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.todo.exdate,todo:0"
+msgid "Todo"
+msgstr "Aufgabe"
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Kalender WRegel"
+
+msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.todo.exrule,todo:0"
+msgid "Todo"
+msgstr "Aufgabe"
+
+msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Kalender Datum"
+
+msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.todo.rdate,todo:0"
+msgid "Todo"
+msgstr "Aufgabe"
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Kalender WRegel"
+
+msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.todo.rrule,todo:0"
+msgid "Todo"
+msgstr "Aufgabe"
+
+msgctxt "help:calendar.todo,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Universally Unique Identifier"
+
+msgctxt "model:calendar.todo,name:0"
+msgid "Todo"
+msgstr "Aufgabe"
+
+msgctxt "model:calendar.todo-calendar.category,name:0"
+msgid "Todo - Category"
+msgstr "Aufgabe - Kategorie"
+
+msgctxt "model:calendar.todo.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarm"
+
+msgctxt "model:calendar.todo.attendee,name:0"
+msgid "Attendee"
+msgstr "Teilnehmer"
+
+msgctxt "model:calendar.todo.exdate,name:0"
+msgid "Exception Date"
+msgstr "Ausnahmedatum"
+
+msgctxt "model:calendar.todo.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Ausnahmeregel"
+
+msgctxt "model:calendar.todo.rdate,name:0"
+msgid "Todo Recurrence Date"
+msgstr "Aufgabe Wiederholungsdatum"
+
+msgctxt "model:calendar.todo.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Wiederholungsregel"
+
+msgctxt "model:ir.action,name:act_todo_form"
+msgid "Todos"
+msgstr "Aufgaben"
+
+msgctxt "model:ir.action,name:act_todo_form3"
+msgid "Todos"
+msgstr "Aufgaben"
+
+msgctxt "model:ir.ui.menu,name:menu_todo_form"
+msgid "Todos"
+msgstr "Aufgaben"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Confidential"
+msgstr "Vertraulich"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Private"
+msgstr "Privat"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Public"
+msgstr "Öffentlich"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Cancelled"
+msgstr "Abgesagt"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Completed"
+msgstr "Abgeschlossen"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "In-Process"
+msgstr "In Arbeit"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Needs-Action"
+msgstr "Benötigt Eingriff"
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendee"
+msgstr "Teilnehmer"
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendees"
+msgstr "Teilnehmer"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Date"
+msgstr "Ausnahmedatum"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Dates"
+msgstr "Ausnahmedaten"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rule"
+msgstr "Ausnahmeregel"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rules"
+msgstr "Ausnahmeregeln"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Date"
+msgstr "Wiederholungsdatum"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Wiederholungsdaten"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Wiederholungsregel"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Wiederholungsregeln"
+
+msgctxt "view:calendar.todo:0"
+msgid "Attendees"
+msgstr "Teilnehmer"
+
+msgctxt "view:calendar.todo:0"
+msgid "Categories"
+msgstr "Kategorien"
+
+msgctxt "view:calendar.todo:0"
+msgid "General"
+msgstr "Allgemein"
+
+msgctxt "view:calendar.todo:0"
+msgid "Occurences"
+msgstr "Ereignisse"
+
+msgctxt "view:calendar.todo:0"
+msgid "Recurrences"
+msgstr "Wiederholungen"
+
+msgctxt "view:calendar.todo:0"
+msgid "Todo"
+msgstr "Aufgabe"
+
+msgctxt "view:calendar.todo:0"
+msgid "Todos"
+msgstr "Aufgaben"
diff --git a/locale/es_CO.po b/locale/es_CO.po
new file mode 100644
index 0000000..90e30ea
--- /dev/null
+++ b/locale/es_CO.po
@@ -0,0 +1,365 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.todo:0"
+msgid "Recurrence can not be recurrent!"
+msgstr "¡La repetición no puede repetirse!"
+
+msgctxt "error:calendar.todo:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "¡El UUID y la recurrencia deben ser únicos por calendario! "
+
+msgctxt "field:calendar.todo,alarms:0"
+msgid "Alarms"
+msgstr "Alarmas"
+
+msgctxt "field:calendar.todo,attendees:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "field:calendar.todo,calendar:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.todo,calendar_owner:0"
+msgid "Owner"
+msgstr "Propietario"
+
+msgctxt "field:calendar.todo,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Leer Usuarios"
+
+msgctxt "field:calendar.todo,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Escribir Usuarios"
+
+msgctxt "field:calendar.todo,categories:0"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "field:calendar.todo,classification:0"
+msgid "Classification"
+msgstr "Clasificación"
+
+msgctxt "field:calendar.todo,completed:0"
+msgid "Completed"
+msgstr ""
+
+msgctxt "field:calendar.todo,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:calendar.todo,dtstart:0"
+msgid "Start Date"
+msgstr "Fecha Inicio"
+
+msgctxt "field:calendar.todo,due:0"
+msgid "Due Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,exdates:0"
+msgid "Exception Dates"
+msgstr "Fechas de Excepción"
+
+msgctxt "field:calendar.todo,exrules:0"
+msgid "Exception Rules"
+msgstr "Reglas de Excepción"
+
+msgctxt "field:calendar.todo,location:0"
+msgid "Location"
+msgstr "Lugar"
+
+msgctxt "field:calendar.todo,occurences:0"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "field:calendar.todo,organizer:0"
+msgid "Organizer"
+msgstr "Organizador"
+
+msgctxt "field:calendar.todo,parent:0"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:calendar.todo,percent_complete:0"
+msgid "Percent complete"
+msgstr ""
+
+msgctxt "field:calendar.todo,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Fechas de Repetición"
+
+msgctxt "field:calendar.todo,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo,recurrence:0"
+msgid "Recurrence"
+msgstr "Repetición"
+
+msgctxt "field:calendar.todo,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Reglas de Repetición"
+
+msgctxt "field:calendar.todo,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:calendar.todo,status:0"
+msgid "Status"
+msgstr "Estado"
+
+msgctxt "field:calendar.todo,summary:0"
+msgid "Summary"
+msgstr "Resumen"
+
+msgctxt "field:calendar.todo,timezone:0"
+msgid "Timezone"
+msgstr "Zona horaria"
+
+msgctxt "field:calendar.todo,uuid:0"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.todo,vtodo:0"
+msgid "vtodo"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,category:0"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgid "To-Do"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.alarm,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.attendee,todo:0"
+msgid "Todo"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Fecha Calendario"
+
+msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.exdate,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.exrule,todo:0"
+msgid "Todo"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Fecha Calendario"
+
+msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.rdate,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.rrule,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "help:calendar.todo,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Identificador Único Universal"
+
+msgctxt "model:calendar.todo,name:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "model:calendar.todo-calendar.category,name:0"
+msgid "Todo - Category"
+msgstr ""
+
+msgctxt "model:calendar.todo.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.todo.attendee,name:0"
+msgid "Attendee"
+msgstr "Asistente"
+
+msgctxt "model:calendar.todo.exdate,name:0"
+msgid "Exception Date"
+msgstr "Fecha de Excepción"
+
+msgctxt "model:calendar.todo.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Regla de Excepción"
+
+#, fuzzy
+msgctxt "model:calendar.todo.rdate,name:0"
+msgid "Todo Recurrence Date"
+msgstr "Fecha de Repetición"
+
+msgctxt "model:calendar.todo.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Regla de Repetición"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_todo_form"
+msgid "Todos"
+msgstr "Por hacer"
+
+msgctxt "model:ir.action,name:act_todo_form3"
+msgid "Todos"
+msgstr "Por hacer"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_todo_form"
+msgid "Todos"
+msgstr "Por hacer"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Confidential"
+msgstr "Confidencial"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Private"
+msgstr "Privado"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Public"
+msgstr "Público"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Completed"
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "In-Process"
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Needs-Action"
+msgstr ""
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendee"
+msgstr "Asistente"
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Date"
+msgstr "Fecha de Excepción"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Dates"
+msgstr "Fechas de Excepción"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rule"
+msgstr "Regla de Excepción"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rules"
+msgstr "Reglas de Excepción"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Date"
+msgstr "Fecha de Repetición"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Fechas de Repetición"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Regla de Repetición"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Reglas de Repetición"
+
+msgctxt "view:calendar.todo:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.todo:0"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "view:calendar.todo:0"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:calendar.todo:0"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "view:calendar.todo:0"
+msgid "Recurrences"
+msgstr "Repeticiones"
+
+msgctxt "view:calendar.todo:0"
+msgid "Todo"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:calendar.todo:0"
+msgid "Todos"
+msgstr "Por hacer"
diff --git a/locale/es_ES.po b/locale/es_ES.po
new file mode 100644
index 0000000..26b3e1f
--- /dev/null
+++ b/locale/es_ES.po
@@ -0,0 +1,363 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.todo:0"
+msgid "Recurrence can not be recurrent!"
+msgstr "Una recurrencia no puede ser recurrente"
+
+msgctxt "error:calendar.todo:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "UUID y recurrencia deben ser únicos en un calendario"
+
+msgctxt "field:calendar.todo,alarms:0"
+msgid "Alarms"
+msgstr "Alarmas"
+
+msgctxt "field:calendar.todo,attendees:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "field:calendar.todo,calendar:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.todo,calendar_owner:0"
+msgid "Owner"
+msgstr "Dueño"
+
+msgctxt "field:calendar.todo,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Usuarios con lectura"
+
+msgctxt "field:calendar.todo,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Usuarios con escritura"
+
+msgctxt "field:calendar.todo,categories:0"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "field:calendar.todo,classification:0"
+msgid "Classification"
+msgstr "Clasificación"
+
+msgctxt "field:calendar.todo,completed:0"
+msgid "Completed"
+msgstr "Completada"
+
+msgctxt "field:calendar.todo,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:calendar.todo,dtstart:0"
+msgid "Start Date"
+msgstr "Fecha inicio"
+
+msgctxt "field:calendar.todo,due:0"
+msgid "Due Date"
+msgstr "Fecha de vencimiento"
+
+msgctxt "field:calendar.todo,exdates:0"
+msgid "Exception Dates"
+msgstr "Fechas excluidas"
+
+msgctxt "field:calendar.todo,exrules:0"
+msgid "Exception Rules"
+msgstr "Reglas de excepciones"
+
+msgctxt "field:calendar.todo,location:0"
+msgid "Location"
+msgstr "Ubicación"
+
+#, fuzzy
+msgctxt "field:calendar.todo,occurences:0"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "field:calendar.todo,organizer:0"
+msgid "Organizer"
+msgstr "Organizador"
+
+msgctxt "field:calendar.todo,parent:0"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:calendar.todo,percent_complete:0"
+msgid "Percent complete"
+msgstr "Porcentaje total"
+
+msgctxt "field:calendar.todo,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Fechas de recurrencia"
+
+msgctxt "field:calendar.todo,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo,recurrence:0"
+msgid "Recurrence"
+msgstr "Recurrencia"
+
+msgctxt "field:calendar.todo,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Reglas de recurrencia"
+
+msgctxt "field:calendar.todo,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:calendar.todo,status:0"
+msgid "Status"
+msgstr "Estado"
+
+msgctxt "field:calendar.todo,summary:0"
+msgid "Summary"
+msgstr "Resumen"
+
+msgctxt "field:calendar.todo,timezone:0"
+msgid "Timezone"
+msgstr "Zona horaria"
+
+msgctxt "field:calendar.todo,uuid:0"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.todo,vtodo:0"
+msgid "vtodo"
+msgstr "vtodo"
+
+msgctxt "field:calendar.todo-calendar.category,category:0"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgid "To-Do"
+msgstr "Por hacer"
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr "Alarma del calendario"
+
+msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.alarm,todo:0"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr "Calendario de asistentes"
+
+msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.attendee,todo:0"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.exdate,todo:0"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Regla de recurrencia"
+
+msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.exrule,todo:0"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.rdate,todo:0"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Regla de recurrencia"
+
+msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.rrule,todo:0"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "help:calendar.todo,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Identificador universal único"
+
+msgctxt "model:calendar.todo,name:0"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "model:calendar.todo-calendar.category,name:0"
+msgid "Todo - Category"
+msgstr "Tarea - Categoría"
+
+msgctxt "model:calendar.todo.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.todo.attendee,name:0"
+msgid "Attendee"
+msgstr "Asistentes"
+
+msgctxt "model:calendar.todo.exdate,name:0"
+msgid "Exception Date"
+msgstr "Fecha excluida"
+
+msgctxt "model:calendar.todo.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Regla de excepción"
+
+#, fuzzy
+msgctxt "model:calendar.todo.rdate,name:0"
+msgid "Todo Recurrence Date"
+msgstr "Fecha de recurrencia"
+
+msgctxt "model:calendar.todo.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "model:ir.action,name:act_todo_form"
+msgid "Todos"
+msgstr "Tareas"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_todo_form3"
+msgid "Todos"
+msgstr "Tareas"
+
+msgctxt "model:ir.ui.menu,name:menu_todo_form"
+msgid "Todos"
+msgstr "Tareas"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Confidential"
+msgstr "Confidencial"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Private"
+msgstr "Privado"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Public"
+msgstr "Público"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Cancelled"
+msgstr "Cancelada"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Completed"
+msgstr "Completado"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "In-Process"
+msgstr "En proceso"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Needs-Action"
+msgstr "Necesita una acción"
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendee"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Date"
+msgstr "Fecha excluida"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Dates"
+msgstr "Fechas excluidas"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rule"
+msgstr "Regla de excepción"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rules"
+msgstr "Reglas de excepciones"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Date"
+msgstr "Fecha de recurrencia"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Fechas de recurrencia"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Reglas de recurrencia"
+
+msgctxt "view:calendar.todo:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.todo:0"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "view:calendar.todo:0"
+msgid "General"
+msgstr "General"
+
+#, fuzzy
+msgctxt "view:calendar.todo:0"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "view:calendar.todo:0"
+msgid "Recurrences"
+msgstr "Recurrencias"
+
+msgctxt "view:calendar.todo:0"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "view:calendar.todo:0"
+msgid "Todos"
+msgstr "Tareas"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
new file mode 100644
index 0000000..bbe3ff4
--- /dev/null
+++ b/locale/fr_FR.po
@@ -0,0 +1,359 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.todo:0"
+msgid "Recurrence can not be recurrent!"
+msgstr "Une récurrence ne peut pas être récurrente !"
+
+msgctxt "error:calendar.todo:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "UUID et récurrence doivent être uniques sur un calendrier !"
+
+msgctxt "field:calendar.todo,alarms:0"
+msgid "Alarms"
+msgstr "Alarmes"
+
+msgctxt "field:calendar.todo,attendees:0"
+msgid "Attendees"
+msgstr "Participants"
+
+msgctxt "field:calendar.todo,calendar:0"
+msgid "Calendar"
+msgstr "Calendrier"
+
+msgctxt "field:calendar.todo,calendar_owner:0"
+msgid "Owner"
+msgstr "Propriétaire"
+
+msgctxt "field:calendar.todo,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Utilisateurs en lecture"
+
+msgctxt "field:calendar.todo,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Utilisateurs en écriture"
+
+msgctxt "field:calendar.todo,categories:0"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "field:calendar.todo,classification:0"
+msgid "Classification"
+msgstr "Classification"
+
+msgctxt "field:calendar.todo,completed:0"
+msgid "Completed"
+msgstr "Complété"
+
+msgctxt "field:calendar.todo,description:0"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "field:calendar.todo,dtstart:0"
+msgid "Start Date"
+msgstr "Date de début"
+
+msgctxt "field:calendar.todo,due:0"
+msgid "Due Date"
+msgstr "Date d'échéance"
+
+msgctxt "field:calendar.todo,exdates:0"
+msgid "Exception Dates"
+msgstr "Dates d'exception"
+
+msgctxt "field:calendar.todo,exrules:0"
+msgid "Exception Rules"
+msgstr "Règles d'exception"
+
+msgctxt "field:calendar.todo,location:0"
+msgid "Location"
+msgstr "Emplacement"
+
+msgctxt "field:calendar.todo,occurences:0"
+msgid "Occurences"
+msgstr "Occurrences"
+
+msgctxt "field:calendar.todo,organizer:0"
+msgid "Organizer"
+msgstr "Organisateur"
+
+msgctxt "field:calendar.todo,parent:0"
+msgid "Parent"
+msgstr "Parent"
+
+msgctxt "field:calendar.todo,percent_complete:0"
+msgid "Percent complete"
+msgstr "Pourcentage effectué"
+
+msgctxt "field:calendar.todo,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Dates de récurrence"
+
+msgctxt "field:calendar.todo,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo,recurrence:0"
+msgid "Recurrence"
+msgstr "Récurrence"
+
+msgctxt "field:calendar.todo,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Règles de récurrence"
+
+msgctxt "field:calendar.todo,sequence:0"
+msgid "Sequence"
+msgstr "Séquence"
+
+msgctxt "field:calendar.todo,status:0"
+msgid "Status"
+msgstr "Statut"
+
+msgctxt "field:calendar.todo,summary:0"
+msgid "Summary"
+msgstr "Résumé"
+
+msgctxt "field:calendar.todo,timezone:0"
+msgid "Timezone"
+msgstr "Fuseau Horaire"
+
+msgctxt "field:calendar.todo,uuid:0"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.todo,vtodo:0"
+msgid "vtodo"
+msgstr "vtodo"
+
+msgctxt "field:calendar.todo-calendar.category,category:0"
+msgid "Category"
+msgstr "Catégorie"
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgid "To-Do"
+msgstr "Tâche"
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr "Alarme calendrier"
+
+msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.alarm,todo:0"
+msgid "Todo"
+msgstr "Tâche"
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr "Participant calendrier"
+
+msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.attendee,todo:0"
+msgid "Todo"
+msgstr "Tâche"
+
+msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Date calendrier"
+
+msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.exdate,todo:0"
+msgid "Todo"
+msgstr "Tâche"
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Règle de récurrence"
+
+msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.exrule,todo:0"
+msgid "Todo"
+msgstr "Tâche"
+
+msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Date calendrier"
+
+msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.rdate,todo:0"
+msgid "Todo"
+msgstr "Tâche"
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Règle de récurrence"
+
+msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.rrule,todo:0"
+msgid "Todo"
+msgstr "Tâche"
+
+msgctxt "help:calendar.todo,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Identificateur unique universel"
+
+msgctxt "model:calendar.todo,name:0"
+msgid "Todo"
+msgstr "Tâche"
+
+msgctxt "model:calendar.todo-calendar.category,name:0"
+msgid "Todo - Category"
+msgstr "Todo - Catégorie"
+
+msgctxt "model:calendar.todo.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarme"
+
+msgctxt "model:calendar.todo.attendee,name:0"
+msgid "Attendee"
+msgstr "Participant"
+
+msgctxt "model:calendar.todo.exdate,name:0"
+msgid "Exception Date"
+msgstr "Date d'exception"
+
+msgctxt "model:calendar.todo.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Règle d'exception"
+
+msgctxt "model:calendar.todo.rdate,name:0"
+msgid "Todo Recurrence Date"
+msgstr "Date de récurrence"
+
+msgctxt "model:calendar.todo.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Règle de récurrence"
+
+msgctxt "model:ir.action,name:act_todo_form"
+msgid "Todos"
+msgstr "Tâches"
+
+msgctxt "model:ir.action,name:act_todo_form3"
+msgid "Todos"
+msgstr "Tâches"
+
+msgctxt "model:ir.ui.menu,name:menu_todo_form"
+msgid "Todos"
+msgstr "Tâches"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Confidential"
+msgstr "Confidentiel"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Private"
+msgstr "Privé"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Public"
+msgstr "Publique"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Cancelled"
+msgstr "Annulé"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Completed"
+msgstr "Complété"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "In-Process"
+msgstr "En court"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Needs-Action"
+msgstr "Nécessite une action"
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendee"
+msgstr "Participant"
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendees"
+msgstr "Participants"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Date"
+msgstr "Date d'exception"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Dates"
+msgstr "Dates d'exception"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rule"
+msgstr "Règle d'exception"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rules"
+msgstr "Règles d'exception"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Date"
+msgstr "Date de récurrence"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Dates de récurrence"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Règle de récurrence"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Règles de récurrence"
+
+msgctxt "view:calendar.todo:0"
+msgid "Attendees"
+msgstr "Participants"
+
+msgctxt "view:calendar.todo:0"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "view:calendar.todo:0"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:calendar.todo:0"
+msgid "Occurences"
+msgstr "Occurrences"
+
+msgctxt "view:calendar.todo:0"
+msgid "Recurrences"
+msgstr "Récurrences"
+
+msgctxt "view:calendar.todo:0"
+msgid "Todo"
+msgstr "Tâche"
+
+msgctxt "view:calendar.todo:0"
+msgid "Todos"
+msgstr "Tâches"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
new file mode 100644
index 0000000..d98d936
--- /dev/null
+++ b/locale/nl_NL.po
@@ -0,0 +1,371 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.todo:0"
+msgid "Recurrence can not be recurrent!"
+msgstr ""
+
+msgctxt "error:calendar.todo:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr ""
+
+msgctxt "field:calendar.todo,alarms:0"
+msgid "Alarms"
+msgstr ""
+
+msgctxt "field:calendar.todo,attendees:0"
+msgid "Attendees"
+msgstr ""
+
+msgctxt "field:calendar.todo,calendar:0"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "field:calendar.todo,calendar_owner:0"
+msgid "Owner"
+msgstr ""
+
+msgctxt "field:calendar.todo,calendar_read_users:0"
+msgid "Read Users"
+msgstr ""
+
+msgctxt "field:calendar.todo,calendar_write_users:0"
+msgid "Write Users"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo,categories:0"
+msgid "Categories"
+msgstr "Categorieën"
+
+msgctxt "field:calendar.todo,classification:0"
+msgid "Classification"
+msgstr ""
+
+msgctxt "field:calendar.todo,completed:0"
+msgid "Completed"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo,description:0"
+msgid "Description"
+msgstr "Specificatie"
+
+#, fuzzy
+msgctxt "field:calendar.todo,dtstart:0"
+msgid "Start Date"
+msgstr "Start datum"
+
+msgctxt "field:calendar.todo,due:0"
+msgid "Due Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,exdates:0"
+msgid "Exception Dates"
+msgstr ""
+
+msgctxt "field:calendar.todo,exrules:0"
+msgid "Exception Rules"
+msgstr ""
+
+msgctxt "field:calendar.todo,location:0"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:calendar.todo,occurences:0"
+msgid "Occurences"
+msgstr ""
+
+msgctxt "field:calendar.todo,organizer:0"
+msgid "Organizer"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo,parent:0"
+msgid "Parent"
+msgstr "Bovenliggend niveau"
+
+msgctxt "field:calendar.todo,percent_complete:0"
+msgid "Percent complete"
+msgstr ""
+
+msgctxt "field:calendar.todo,rdates:0"
+msgid "Recurrence Dates"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.todo,recurrence:0"
+msgid "Recurrence"
+msgstr ""
+
+msgctxt "field:calendar.todo,rrules:0"
+msgid "Recurrence Rules"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo,sequence:0"
+msgid "Sequence"
+msgstr "Reeks"
+
+msgctxt "field:calendar.todo,status:0"
+msgid "Status"
+msgstr ""
+
+msgctxt "field:calendar.todo,summary:0"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:calendar.todo,timezone:0"
+msgid "Timezone"
+msgstr ""
+
+msgctxt "field:calendar.todo,uuid:0"
+msgid "UUID"
+msgstr ""
+
+msgctxt "field:calendar.todo,vtodo:0"
+msgid "vtodo"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo-calendar.category,category:0"
+msgid "Category"
+msgstr "Categorie"
+
+#, fuzzy
+msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgid "To-Do"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.todo.alarm,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.todo.attendee,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.todo.exdate,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.todo.exrule,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.todo.rdate,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.todo.rrule,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "help:calendar.todo,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr ""
+
+msgctxt "model:calendar.todo,name:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "model:calendar.todo-calendar.category,name:0"
+msgid "Todo - Category"
+msgstr ""
+
+msgctxt "model:calendar.todo.alarm,name:0"
+msgid "Alarm"
+msgstr ""
+
+msgctxt "model:calendar.todo.attendee,name:0"
+msgid "Attendee"
+msgstr ""
+
+msgctxt "model:calendar.todo.exdate,name:0"
+msgid "Exception Date"
+msgstr ""
+
+msgctxt "model:calendar.todo.exrule,name:0"
+msgid "Exception Rule"
+msgstr ""
+
+msgctxt "model:calendar.todo.rdate,name:0"
+msgid "Todo Recurrence Date"
+msgstr ""
+
+msgctxt "model:calendar.todo.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_todo_form"
+msgid "Todos"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_todo_form3"
+msgid "Todos"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_todo_form"
+msgid "Todos"
+msgstr ""
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Confidential"
+msgstr ""
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Private"
+msgstr ""
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Public"
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Completed"
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "In-Process"
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Needs-Action"
+msgstr ""
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendee"
+msgstr ""
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendees"
+msgstr ""
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Date"
+msgstr ""
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Dates"
+msgstr ""
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rule"
+msgstr ""
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rules"
+msgstr ""
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Date"
+msgstr ""
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Dates"
+msgstr ""
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rule"
+msgstr ""
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rules"
+msgstr ""
+
+msgctxt "view:calendar.todo:0"
+msgid "Attendees"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:calendar.todo:0"
+msgid "Categories"
+msgstr "Categorieën"
+
+#, fuzzy
+msgctxt "view:calendar.todo:0"
+msgid "General"
+msgstr "Algemeen"
+
+msgctxt "view:calendar.todo:0"
+msgid "Occurences"
+msgstr ""
+
+msgctxt "view:calendar.todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "view:calendar.todo:0"
+msgid "Todos"
+msgstr ""
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
new file mode 100644
index 0000000..ca4dbea
--- /dev/null
+++ b/locale/ru_RU.po
@@ -0,0 +1,358 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.todo:0"
+msgid "Recurrence can not be recurrent!"
+msgstr ""
+
+msgctxt "error:calendar.todo:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr ""
+
+msgctxt "field:calendar.todo,alarms:0"
+msgid "Alarms"
+msgstr "Вызов"
+
+msgctxt "field:calendar.todo,attendees:0"
+msgid "Attendees"
+msgstr "Участники"
+
+msgctxt "field:calendar.todo,calendar:0"
+msgid "Calendar"
+msgstr "Календарь"
+
+msgctxt "field:calendar.todo,calendar_owner:0"
+msgid "Owner"
+msgstr "Владелец"
+
+msgctxt "field:calendar.todo,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Пользователи могут читать"
+
+msgctxt "field:calendar.todo,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Пользователи могут писать"
+
+msgctxt "field:calendar.todo,categories:0"
+msgid "Categories"
+msgstr "Категория"
+
+msgctxt "field:calendar.todo,classification:0"
+msgid "Classification"
+msgstr "Классификация"
+
+msgctxt "field:calendar.todo,completed:0"
+msgid "Completed"
+msgstr "Выполнен"
+
+msgctxt "field:calendar.todo,description:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:calendar.todo,dtstart:0"
+msgid "Start Date"
+msgstr "Дата начала"
+
+msgctxt "field:calendar.todo,due:0"
+msgid "Due Date"
+msgstr "Срок сдачи"
+
+msgctxt "field:calendar.todo,exdates:0"
+msgid "Exception Dates"
+msgstr "Дата исключения"
+
+msgctxt "field:calendar.todo,exrules:0"
+msgid "Exception Rules"
+msgstr "Правила исключения"
+
+msgctxt "field:calendar.todo,location:0"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "field:calendar.todo,occurences:0"
+msgid "Occurences"
+msgstr "Дополнительные задачи"
+
+msgctxt "field:calendar.todo,organizer:0"
+msgid "Organizer"
+msgstr "Организатор"
+
+msgctxt "field:calendar.todo,parent:0"
+msgid "Parent"
+msgstr "Основной"
+
+msgctxt "field:calendar.todo,percent_complete:0"
+msgid "Percent complete"
+msgstr "Процент выполнения"
+
+msgctxt "field:calendar.todo,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Даты повторения"
+
+msgctxt "field:calendar.todo,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.todo,recurrence:0"
+msgid "Recurrence"
+msgstr "Повторение"
+
+msgctxt "field:calendar.todo,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Правила повторения"
+
+msgctxt "field:calendar.todo,sequence:0"
+msgid "Sequence"
+msgstr "Последовательность"
+
+msgctxt "field:calendar.todo,status:0"
+msgid "Status"
+msgstr "Состояние"
+
+msgctxt "field:calendar.todo,summary:0"
+msgid "Summary"
+msgstr "Резюме"
+
+msgctxt "field:calendar.todo,timezone:0"
+msgid "Timezone"
+msgstr "Зона времени"
+
+msgctxt "field:calendar.todo,uuid:0"
+msgid "UUID"
+msgstr ""
+
+msgctxt "field:calendar.todo,vtodo:0"
+msgid "vtodo"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,category:0"
+msgid "Category"
+msgstr "Категории"
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgid "To-Do"
+msgstr "Дела"
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr "Сигнала календаря"
+
+msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.todo.alarm,todo:0"
+msgid "Todo"
+msgstr "Дело"
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr "Календарь участников"
+
+msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.todo.attendee,todo:0"
+msgid "Todo"
+msgstr "Дело"
+
+msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "День календаря"
+
+msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.todo.exdate,todo:0"
+msgid "Todo"
+msgstr "Дело"
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Правила календаря"
+
+msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.todo.exrule,todo:0"
+msgid "Todo"
+msgstr "Дело"
+
+msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "День календаря"
+
+msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.todo.rdate,todo:0"
+msgid "Todo"
+msgstr "Дело"
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Правила календаря"
+
+msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.todo.rrule,todo:0"
+msgid "Todo"
+msgstr "Дело"
+
+msgctxt "help:calendar.todo,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Универсальный уникальный идентификатор"
+
+msgctxt "model:calendar.todo,name:0"
+msgid "Todo"
+msgstr "Дело"
+
+msgctxt "model:calendar.todo-calendar.category,name:0"
+msgid "Todo - Category"
+msgstr "Категории - Дел"
+
+msgctxt "model:calendar.todo.alarm,name:0"
+msgid "Alarm"
+msgstr "Вызов"
+
+msgctxt "model:calendar.todo.attendee,name:0"
+msgid "Attendee"
+msgstr "Участник"
+
+msgctxt "model:calendar.todo.exdate,name:0"
+msgid "Exception Date"
+msgstr "Дата исключения"
+
+msgctxt "model:calendar.todo.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Правило исключения"
+
+msgctxt "model:calendar.todo.rdate,name:0"
+msgid "Todo Recurrence Date"
+msgstr "Дела повторяющиеся по дате"
+
+msgctxt "model:calendar.todo.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Правила повторения"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_todo_form"
+msgid "Todos"
+msgstr "Задачи"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_todo_form3"
+msgid "Todos"
+msgstr "Задачи"
+
+msgctxt "model:ir.ui.menu,name:menu_todo_form"
+msgid "Todos"
+msgstr "Задачи"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Confidential"
+msgstr "Конфиденциальное"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Private"
+msgstr "Личное"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Public"
+msgstr "Публичное"
+
+#, fuzzy
+msgctxt "selection:calendar.todo,status:0"
+msgid ""
+msgstr "Резервный счет"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Cancelled"
+msgstr "Отмененно"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Completed"
+msgstr "Выполнен"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "In-Process"
+msgstr "В процессе"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Needs-Action"
+msgstr "Требуется действие"
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendee"
+msgstr "Участник"
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendees"
+msgstr "Участники"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Date"
+msgstr "Дата исключения"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Dates"
+msgstr "Дата исключения"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rule"
+msgstr "Правило исключения"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rules"
+msgstr "Правила исключения"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Date"
+msgstr "Даты повторения"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Даты повторения"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Правила повторения"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Правила повторения"
+
+msgctxt "view:calendar.todo:0"
+msgid "Attendees"
+msgstr "Участники"
+
+msgctxt "view:calendar.todo:0"
+msgid "Categories"
+msgstr "Категория"
+
+msgctxt "view:calendar.todo:0"
+msgid "General"
+msgstr "Основной"
+
+msgctxt "view:calendar.todo:0"
+msgid "Occurences"
+msgstr "Повторение"
+
+msgctxt "view:calendar.todo:0"
+msgid "Todo"
+msgstr "Дело"
+
+msgctxt "view:calendar.todo:0"
+msgid "Todos"
+msgstr "Дела"
diff --git a/ru_RU.csv b/ru_RU.csv
deleted file mode 100644
index ebc669f..0000000
--- a/ru_RU.csv
+++ /dev/null
@@ -1,95 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.todo,0,Recurrence can not be recurrent!,,0
-error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,,0
-field,"calendar.todo,alarms",0,Alarms,Вызов,0
-field,"calendar.todo,attendees",0,Attendees,Участники,0
-field,"calendar.todo,calendar",0,Calendar,Календарь,0
-field,"calendar.todo,calendar_owner",0,Owner,Владелец,0
-field,"calendar.todo,calendar_read_users",0,Read Users,Пользователи могут читать,0
-field,"calendar.todo,calendar_write_users",0,Write Users,Пользователи могут писать,0
-field,"calendar.todo,categories",0,Categories,Категория,0
-field,"calendar.todo,classification",0,Classification,Классификация,0
-field,"calendar.todo,classification_public",0,Classification Public,Классификация общая,0
-field,"calendar.todo,completed",0,Completed,Выполнен,0
-field,"calendar.todo,description",0,Description,Описание,0
-field,"calendar.todo,dtstart",0,Start Date,Дата начала,0
-field,"calendar.todo,due",0,Due Date,Срок сдачи,0
-field,"calendar.todo,exdates",0,Exception Dates,Дата исключения,0
-field,"calendar.todo,exrules",0,Exception Rules,Правила исключения,0
-field,"calendar.todo,location",0,Location,Местоположение,0
-field,"calendar.todo,occurences",0,Occurences,Дополнительные задачи,0
-field,"calendar.todo,organizer",0,Organizer,Организатор,0
-field,"calendar.todo,parent",0,Parent,Основной,0
-field,"calendar.todo,percent_complete",0,Percent complete,Процент выполнения,0
-field,"calendar.todo,rdates",0,Recurrence Dates,Даты повторения,0
-field,"calendar.todo,rec_name",0,Name,Наименование,0
-field,"calendar.todo,recurrence",0,Recurrence,Повторение,0
-field,"calendar.todo,recurrences",0,Recurrences,Повторения,0
-field,"calendar.todo,rrules",0,Recurrence Rules,Правила повторения,0
-field,"calendar.todo,sequence",0,Sequence,Последовательность,0
-field,"calendar.todo,status",0,Status,Состояние,0
-field,"calendar.todo,summary",0,Summary,Резюме,0
-field,"calendar.todo,timezone",0,Timezone,Зона времени,0
-field,"calendar.todo,uuid",0,UUID,,0
-field,"calendar.todo,vtodo",0,vtodo,,0
-field,"calendar.todo-calendar.category,category",0,Category,Категории,0
-field,"calendar.todo-calendar.category,rec_name",0,Name,Наименование,0
-field,"calendar.todo-calendar.category,todo",0,To-Do,Дела,0
-field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Сигнала календаря,0
-field,"calendar.todo.alarm,rec_name",0,Name,Наименование,0
-field,"calendar.todo.alarm,todo",0,Todo,Дело,0
-field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Календарь участников,0
-field,"calendar.todo.attendee,rec_name",0,Name,Наименование,0
-field,"calendar.todo.attendee,todo",0,Todo,Дело,0
-field,"calendar.todo.exdate,calendar_date",0,Calendar Date,День календаря,0
-field,"calendar.todo.exdate,calendar_rdate",0,Calendar RDate,День календаря,0
-field,"calendar.todo.exdate,rec_name",0,Name,Наименование,0
-field,"calendar.todo.exdate,todo",0,Todo,Дело,0
-field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Правила календаря,0
-field,"calendar.todo.exrule,rec_name",0,Name,Наименование,0
-field,"calendar.todo.exrule,todo",0,Todo,Дело,0
-field,"calendar.todo.rdate,calendar_date",0,Calendar Date,День календаря,0
-field,"calendar.todo.rdate,calendar_rdate",0,Calendar RDate,День календаря,0
-field,"calendar.todo.rdate,rec_name",0,Name,Наименование,0
-field,"calendar.todo.rdate,todo",0,Todo,Дело,0
-field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Правила календаря,0
-field,"calendar.todo.rrule,rec_name",0,Name,Наименование,0
-field,"calendar.todo.rrule,todo",0,Todo,Дело,0
-help,"calendar.todo,uuid",0,Universally Unique Identifier,Универсальный уникальный идентификатор,0
-model,"calendar.todo,name",0,Todo,Дело,0
-model,"calendar.todo-calendar.category,name",0,Todo - Category,Категории - Дел,0
-model,"calendar.todo.alarm,name",0,Alarm,Вызов,0
-model,"calendar.todo.attendee,name",0,Attendee,Участник,0
-model,"calendar.todo.exdate,name",0,Exception Date,Дата исключения,0
-model,"calendar.todo.exrule,name",0,Exception Rule,Правило исключения,0
-model,"calendar.todo.rdate,name",0,Todo Recurrence Date,Дела повторяющиеся по дате,0
-model,"calendar.todo.rrule,name",0,Recurrence Rule,Правила повторения,0
-model,"ir.action,name",act_todo_form,Todos,,0
-model,"ir.action,name",act_todo_form2,Todos,,0
-model,"ir.action,name",act_todo_form3,Todos,,0
-model,"ir.ui.menu,name",menu_todo_form,Todos,Задачи,0
-model,"ir.ui.menu,name",menu_todo_form2,New Todo,Новая задача,0
-selection,"calendar.todo,classification",0,Confidential,Конфиденциальное,0
-selection,"calendar.todo,classification",0,Private,Личное,0
-selection,"calendar.todo,classification",0,Public,Публичное,0
-selection,"calendar.todo,status",0,,,0
-selection,"calendar.todo,status",0,Cancelled,Отмененно,0
-selection,"calendar.todo,status",0,Completed,Выполнен,0
-selection,"calendar.todo,status",0,In-Process,В процессе,0
-selection,"calendar.todo,status",0,Needs-Action,Требуется действие,0
-view,calendar.todo,0,Attendees,Участники,0
-view,calendar.todo,0,Categories,Категория,0
-view,calendar.todo,0,General,Основной,0
-view,calendar.todo,0,Occurences,Повторение,0
-view,calendar.todo,0,Todo,Дело,0
-view,calendar.todo,0,Todos,Дела,0
-view,calendar.todo.attendee,0,Attendee,Участник,0
-view,calendar.todo.attendee,0,Attendees,Участники,0
-view,calendar.todo.exdate,0,Exception Date,Дата исключения,0
-view,calendar.todo.exdate,0,Exception Dates,Дата исключения,0
-view,calendar.todo.exrule,0,Exception Rule,Правило исключения,0
-view,calendar.todo.exrule,0,Exception Rules,Правила исключения,0
-view,calendar.todo.rdate,0,Recurrence Date,Даты повторения,0
-view,calendar.todo.rdate,0,Recurrence Dates,Даты повторения,0
-view,calendar.todo.rrule,0,Recurrence Rule,Правила повторения,0
-view,calendar.todo.rrule,0,Recurrence Rules,Правила повторения,0
diff --git a/setup.py b/setup.py
index 7948e48..65d89f1 100644
--- a/setup.py
+++ b/setup.py
@@ -39,19 +39,21 @@ setup(name='trytond_calendar_todo',
classifiers=[
'Development Status :: 5 - Production/Stable',
'Environment :: Plugins',
+ 'Framework :: Tryton',
'Intended Audience :: Developers',
'Intended Audience :: Financial and Insurance Industry',
'Intended Audience :: Legal Industry',
'Intended Audience :: Manufacturing',
'License :: OSI Approved :: GNU General Public License (GPL)',
'Natural Language :: Bulgarian',
+ 'Natural Language :: Czech',
+ 'Natural Language :: Dutch',
'Natural Language :: English',
'Natural Language :: French',
'Natural Language :: German',
'Natural Language :: Russian',
'Natural Language :: Spanish',
'Operating System :: OS Independent',
- 'Programming Language :: Python :: 2.5',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7',
'Topic :: Office/Business',
diff --git a/tests/test_calendar_todo.py b/tests/test_calendar_todo.py
index 16ecb7b..de92dd8 100644
--- a/tests/test_calendar_todo.py
+++ b/tests/test_calendar_todo.py
@@ -10,7 +10,7 @@ if os.path.isdir(DIR):
import unittest
import trytond.tests.test_tryton
-from trytond.tests.test_tryton import test_view
+from trytond.tests.test_tryton import test_view, test_depends
class CalendarTodoTestCase(unittest.TestCase):
@@ -27,6 +27,12 @@ class CalendarTodoTestCase(unittest.TestCase):
'''
test_view('calendar_todo')
+ def test0006depends(self):
+ '''
+ Test depends.
+ '''
+ test_depends()
+
def suite():
suite = trytond.tests.test_tryton.suite()
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
diff --git a/todo.py b/todo.py
index 1dfe1bd..6226af9 100644
--- a/todo.py
+++ b/todo.py
@@ -1,6 +1,5 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import uuid
import vobject
import dateutil.tz
@@ -10,8 +9,9 @@ import xml.dom.minidom
from trytond.model import ModelSQL, ModelView, fields
from trytond.tools import reduce_ids
from trytond.backend import TableHandler
-from trytond.pyson import Not, Equal, Eval, If, Bool, In
+from trytond.pyson import Eval, If, Bool
from trytond.transaction import Transaction
+from trytond.pool import Pool
tzlocal = dateutil.tz.tzlocal()
tzutc = dateutil.tz.tzutc()
@@ -34,23 +34,21 @@ class Todo(ModelSQL, ModelView):
('confidential', 'Confidential'),
], 'Classification', required=True)
completed = fields.DateTime('Completed',
- states={
- 'readonly': Not(Equal(Eval('status'), 'completed')),
+ states={
+ 'readonly': Eval('status') != 'completed',
}, depends=['status'])
description = fields.Text('Description')
dtstart = fields.DateTime('Start Date', select=1)
location = fields.Many2One('calendar.location', 'Location')
organizer = fields.Char('Organizer', states={
- 'required': If(Bool(Eval('attendees')),
- Not(Bool(Eval('parent'))),
- False),
- }, depends=['attendees', 'parent'])
+ 'required': If(Bool(Eval('attendees')),
+ ~Eval('parent'), False),
+ }, depends=['attendees', 'parent'])
attendees = fields.One2Many('calendar.todo.attendee', 'todo',
'Attendees')
percent_complete = fields.Integer('Percent complete',
- states={
- 'readonly': Not(In(Eval('status'),
- ['needs-action', 'in-process'])),
+ states={
+ 'readonly': ~Eval('status').in_(['needs-action', 'in-process']),
}, depends=['status'])
occurences = fields.One2Many('calendar.todo', 'parent', 'Occurences',
domain=[
@@ -61,9 +59,9 @@ class Todo(ModelSQL, ModelView):
'invisible': Bool(Eval('parent')),
}, depends=['uuid', 'calendar', 'parent'])
recurrence = fields.DateTime('Recurrence', select=1, states={
- 'invisible': Not(Bool(Eval('_parent_parent'))),
- 'required': Bool(Eval('_parent_parent')),
- }, depends=['parent'])
+ 'invisible': ~Eval('_parent_parent'),
+ 'required': Bool(Eval('_parent_parent')),
+ }, depends=['parent'])
sequence = fields.Integer('Sequence')
parent = fields.Many2One('calendar.todo', 'Parent',
domain=[
@@ -125,8 +123,8 @@ class Todo(ModelSQL, ModelView):
def init(self, module_name):
# Migrate from 1.4: remove classification_public
- model_data_obj = self.pool.get('ir.model.data')
- rule_obj = self.pool.get('ir.rule')
+ model_data_obj = Pool().get('ir.model.data')
+ rule_obj = Pool().get('ir.rule')
with Transaction().set_user(0):
model_data_ids = model_data_obj.search([
('fs_id', '=', 'rule_group_read_todo_line3'),
@@ -148,7 +146,7 @@ class Todo(ModelSQL, ModelView):
return 'public'
def default_timezone(self):
- user_obj = self.pool.get('res.user')
+ user_obj = Pool().get('res.user')
user = user_obj.browse(Transaction().user)
return user.timezone
@@ -197,8 +195,8 @@ class Todo(ModelSQL, ModelView):
return True
def create(self, values):
- calendar_obj = self.pool.get('calendar.calendar')
- collection_obj = self.pool.get('webdav.collection')
+ calendar_obj = Pool().get('calendar.calendar')
+ collection_obj = Pool().get('webdav.collection')
res = super(Todo, self).create(values)
todo = self.browse(res)
@@ -247,10 +245,11 @@ class Todo(ModelSQL, ModelView):
return res
def _todo2update(self, todo):
- rdate_obj = self.pool.get('calendar.todo.rdate')
- exdate_obj = self.pool.get('calendar.todo.exdate')
- rrule_obj = self.pool.get('calendar.todo.rrule')
- exrule_obj = self.pool.get('calendar.todo.exrule')
+ pool = Pool()
+ rdate_obj = pool.get('calendar.todo.rdate')
+ exdate_obj = pool.get('calendar.todo.exdate')
+ rrule_obj = pool.get('calendar.todo.rrule')
+ exrule_obj = pool.get('calendar.todo.exrule')
res = {}
res['summary'] = todo.summary
@@ -280,8 +279,8 @@ class Todo(ModelSQL, ModelView):
return res
def write(self, ids, values):
- calendar_obj = self.pool.get('calendar.calendar')
- collection_obj = self.pool.get('webdav.collection')
+ calendar_obj = Pool().get('calendar.calendar')
+ collection_obj = Pool().get('webdav.collection')
cursor = Transaction().cursor
@@ -360,8 +359,8 @@ class Todo(ModelSQL, ModelView):
return res
def delete(self, ids):
- attendee_obj = self.pool.get('calendar.todo.attendee')
- collection_obj = self.pool.get('webdav.collection')
+ attendee_obj = Pool().get('calendar.todo.attendee')
+ collection_obj = Pool().get('webdav.collection')
if isinstance(ids, (int, long)):
ids = [ids]
@@ -420,15 +419,16 @@ class Todo(ModelSQL, ModelView):
:param vtodo: the vtodo of the ical to use if None use the first one
:return: a dictionary with values
'''
- category_obj = self.pool.get('calendar.category')
- location_obj = self.pool.get('calendar.location')
- user_obj = self.pool.get('res.user')
- alarm_obj = self.pool.get('calendar.todo.alarm')
- attendee_obj = self.pool.get('calendar.todo.attendee')
- rdate_obj = self.pool.get('calendar.todo.rdate')
- exdate_obj = self.pool.get('calendar.todo.exdate')
- rrule_obj = self.pool.get('calendar.todo.rrule')
- exrule_obj = self.pool.get('calendar.todo.exrule')
+ pool = Pool()
+ category_obj = pool.get('calendar.category')
+ location_obj = pool.get('calendar.location')
+ user_obj = pool.get('res.user')
+ alarm_obj = pool.get('calendar.todo.alarm')
+ attendee_obj = pool.get('calendar.todo.attendee')
+ rdate_obj = pool.get('calendar.todo.rdate')
+ exdate_obj = pool.get('calendar.todo.exdate')
+ rrule_obj = pool.get('calendar.todo.rrule')
+ exrule_obj = pool.get('calendar.todo.exrule')
vtodos = []
if not vtodo:
@@ -664,13 +664,14 @@ class Todo(ModelSQL, ModelView):
or a calendar.todo id
:return: an iCalendar instance of vobject
'''
- user_obj = self.pool.get('res.user')
- alarm_obj = self.pool.get('calendar.todo.alarm')
- attendee_obj = self.pool.get('calendar.todo.attendee')
- rdate_obj = self.pool.get('calendar.todo.rdate')
- exdate_obj = self.pool.get('calendar.todo.exdate')
- rrule_obj = self.pool.get('calendar.todo.rrule')
- exrule_obj = self.pool.get('calendar.todo.exrule')
+ pool = Pool()
+ user_obj = pool.get('res.user')
+ alarm_obj = pool.get('calendar.todo.alarm')
+ attendee_obj = pool.get('calendar.todo.attendee')
+ rdate_obj = pool.get('calendar.todo.rdate')
+ exdate_obj = pool.get('calendar.todo.exdate')
+ rrule_obj = pool.get('calendar.todo.rrule')
+ exrule_obj = pool.get('calendar.todo.exrule')
if isinstance(todo, (int, long)):
todo = self.browse(todo)
@@ -862,14 +863,14 @@ class TodoRDate(ModelSQL, ModelView):
return super(TodoRDate, self).init(module_name)
def create(self, values):
- todo_obj = self.pool.get('calendar.todo')
+ todo_obj = Pool().get('calendar.todo')
if values.get('todo'):
# Update write_date of todo
todo_obj.write(values['todo'], {})
return super(TodoRDate, self).create(values)
def write(self, ids, values):
- todo_obj = self.pool.get('calendar.todo')
+ todo_obj = Pool().get('calendar.todo')
if isinstance(ids, (int, long)):
ids = [ids]
todo_ids = [x.todo.id for x in self.browse(ids)]
@@ -881,8 +882,8 @@ class TodoRDate(ModelSQL, ModelView):
return super(TodoRDate, self).write(ids, values)
def delete(self, ids):
- todo_obj = self.pool.get('calendar.todo')
- rdate_obj = self.pool.get('calendar.date')
+ todo_obj = Pool().get('calendar.todo')
+ rdate_obj = Pool().get('calendar.date')
if isinstance(ids, (int, long)):
ids = [ids]
todo_rdates = self.browse(ids)
@@ -897,15 +898,15 @@ class TodoRDate(ModelSQL, ModelView):
return res
def _date2update(self, date):
- date_obj = self.pool.get('calendar.date')
+ date_obj = Pool().get('calendar.date')
return date_obj._date2update(date)
def date2values(self, date):
- date_obj = self.pool.get('calendar.date')
+ date_obj = Pool().get('calendar.date')
return date_obj.date2values(date)
def date2date(self, date):
- date_obj = self.pool.get('calendar.date')
+ date_obj = Pool().get('calendar.date')
return date_obj.date2date(date)
TodoRDate()
@@ -924,14 +925,14 @@ class TodoRRule(ModelSQL, ModelView):
select=1, required=True)
def create(self, values):
- todo_obj = self.pool.get('calendar.todo')
+ todo_obj = Pool().get('calendar.todo')
if values.get('todo'):
# Update write_date of todo
todo_obj.write(values['todo'], {})
return super(TodoRRule, self).create(values)
def write(self, ids, values):
- todo_obj = self.pool.get('calendar.todo')
+ todo_obj = Pool().get('calendar.todo')
if isinstance(ids, (int, long)):
ids = [ids]
todo_ids = [x.todo.id for x in self.browse(ids)]
@@ -943,8 +944,8 @@ class TodoRRule(ModelSQL, ModelView):
return super(TodoRRule, self).write(ids, values)
def delete(self, ids):
- todo_obj = self.pool.get('calendar.todo')
- rrule_obj = self.pool.get('calendar.rrule')
+ todo_obj = Pool().get('calendar.todo')
+ rrule_obj = Pool().get('calendar.rrule')
if isinstance(ids, (int, long)):
ids = [ids]
todo_rrules = self.browse(ids)
@@ -959,15 +960,15 @@ class TodoRRule(ModelSQL, ModelView):
return res
def _rule2update(self, rule):
- rule_obj = self.pool.get('calendar.rrule')
+ rule_obj = Pool().get('calendar.rrule')
return rule_obj._rule2update(rule)
def rule2values(self, rule):
- rule_obj = self.pool.get('calendar.rrule')
+ rule_obj = Pool().get('calendar.rrule')
return rule_obj.rule2values(rule)
def rule2rule(self, rule):
- rule_obj = self.pool.get('calendar.rrule')
+ rule_obj = Pool().get('calendar.rrule')
return rule_obj.rule2rule(rule)
TodoRRule()
@@ -1001,7 +1002,7 @@ class TodoAttendee(ModelSQL, ModelView):
required=True, select=1)
def create(self, values):
- todo_obj = self.pool.get('calendar.todo')
+ todo_obj = Pool().get('calendar.todo')
if values.get('todo'):
# Update write_date of todo
@@ -1034,7 +1035,7 @@ class TodoAttendee(ModelSQL, ModelView):
return res
def write(self, ids, values):
- todo_obj = self.pool.get('calendar.todo')
+ todo_obj = Pool().get('calendar.todo')
if isinstance(ids, (int, long)):
ids = [ids]
@@ -1078,8 +1079,8 @@ class TodoAttendee(ModelSQL, ModelView):
return res
def delete(self, ids):
- todo_obj = self.pool.get('calendar.todo')
- attendee_obj = self.pool.get('calendar.attendee')
+ todo_obj = Pool().get('calendar.todo')
+ attendee_obj = Pool().get('calendar.attendee')
if isinstance(ids, (int, long)):
ids = [ids]
@@ -1140,7 +1141,7 @@ class TodoAttendee(ModelSQL, ModelView):
return res
def copy(self, ids, default=None):
- attendee_obj = self.pool.get('calendar.attendee')
+ attendee_obj = Pool().get('calendar.attendee')
int_id = False
if isinstance(ids, (int, long)):
@@ -1161,15 +1162,15 @@ class TodoAttendee(ModelSQL, ModelView):
return new_ids
def _attendee2update(self, attendee):
- attendee_obj = self.pool.get('calendar.attendee')
+ attendee_obj = Pool().get('calendar.attendee')
return attendee_obj._attendee2update(attendee)
def attendee2values(self, attendee):
- attendee_obj = self.pool.get('calendar.attendee')
+ attendee_obj = Pool().get('calendar.attendee')
return attendee_obj.attendee2values(attendee)
def attendee2attendee(self, attendee):
- attendee_obj = self.pool.get('calendar.attendee')
+ attendee_obj = Pool().get('calendar.attendee')
return attendee_obj.attendee2attendee(attendee)
TodoAttendee()
@@ -1187,14 +1188,14 @@ class TodoAlarm(ModelSQL):
required=True, select=1)
def create(self, values):
- todo_obj = self.pool.get('calendar.todo')
+ todo_obj = Pool().get('calendar.todo')
if values.get('todo'):
# Update write_date of todo
todo_obj.write(values['todo'], {})
return super(TodoAlarm, self).create(values)
def write(self, ids, values):
- todo_obj = self.pool.get('calendar.todo')
+ todo_obj = Pool().get('calendar.todo')
if isinstance(ids, (int, long)):
ids = [ids]
todo_ids = [x.todo.id for x in self.browse(ids)]
@@ -1206,8 +1207,8 @@ class TodoAlarm(ModelSQL):
return super(TodoAlarm, self).write(ids, values)
def delete(self, ids):
- todo_obj = self.pool.get('calendar.todo')
- alarm_obj = self.pool.get('calendar.alarm')
+ todo_obj = Pool().get('calendar.todo')
+ alarm_obj = Pool().get('calendar.alarm')
if isinstance(ids, (int, long)):
ids = [ids]
todo_alarms = self.browse(ids)
@@ -1222,11 +1223,11 @@ class TodoAlarm(ModelSQL):
return res
def valarm2values(self, alarm):
- alarm_obj = self.pool.get('calendar.alarm')
+ alarm_obj = Pool().get('calendar.alarm')
return alarm_obj.valarm2values(alarm)
def alarm2valarm(self, alarm):
- alarm_obj = self.pool.get('calendar.alarm')
+ alarm_obj = Pool().get('calendar.alarm')
return alarm_obj.alarm2valarm(alarm)
TodoAlarm()
diff --git a/todo.xml b/todo.xml
index fbc4aef..71a9d41 100644
--- a/todo.xml
+++ b/todo.xml
@@ -10,12 +10,12 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Todos">
- <field name="calendar" select="1"/>
- <field name="summary" select="1"/>
- <field name="dtstart" select="1"/>
- <field name="due" select="1"/>
- <field name="status" select="2"/>
- <field name="percent_complete" select="2"/>
+ <field name="calendar"/>
+ <field name="summary"/>
+ <field name="dtstart"/>
+ <field name="due"/>
+ <field name="status"/>
+ <field name="percent_complete"/>
</tree>
]]>
</field>
@@ -53,7 +53,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="description" colspan="4"/>
</page>
<page string="Categories" id="categories">
- <separator name="categories" colspan="4"/>
<field name="categories" colspan="4"/>
</page>
<page string="Attendees" id="attendees">
@@ -69,12 +68,12 @@ this repository contains the full copyright notices and license terms. -->
<field name="exdates" colspan="2"/>
<field name="occurences" colspan="4">
<tree string="Todos">
- <field name="summary" select="1"/>
- <field name="recurrence" select="1"/>
- <field name="dtstart" select="2"/>
- <field name="due" select="2"/>
- <field name="status" select="2"/>
- <field name="percent_complete" select="2"/>
+ <field name="summary"/>
+ <field name="recurrence"/>
+ <field name="dtstart"/>
+ <field name="due"/>
+ <field name="status"/>
+ <field name="percent_complete"/>
</tree>
</field>
</page>
@@ -101,23 +100,6 @@ this repository contains the full copyright notices and license terms. -->
</record>
<menuitem parent="calendar.menu_calendar_form" sequence="30"
action="act_todo_form" id="menu_todo_form"/>
- <record model="ir.action.act_window" id="act_todo_form2">
- <field name="name">Todos</field>
- <field name="res_model">calendar.todo</field>
- <field name="domain">[('parent', '=', False)]</field>
- </record>
- <record model="ir.action.act_window.view" id="act_todo_form2_view1">
- <field name="sequence" eval="10"/>
- <field name="view" ref="todo_view_form"/>
- <field name="act_window" ref="act_todo_form2"/>
- </record>
- <record model="ir.action.act_window.view" id="act_todo_form2_view2">
- <field name="sequence" eval="20"/>
- <field name="view" ref="todo_view_tree"/>
- <field name="act_window" ref="act_todo_form2"/>
- </record>
- <menuitem name="New Todo" parent="menu_todo_form" sequence="10"
- action="act_todo_form2" id="menu_todo_form2"/>
<record model="ir.action.act_window" id="act_todo_form3">
<field name="name">Todos</field>
@@ -137,7 +119,7 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.keyword"
id="act_open_todo_keyword1">
<field name="keyword">form_relate</field>
- <field name="model">calendar.calendar,0</field>
+ <field name="model">calendar.calendar,-1</field>
<field name="action" ref="act_todo_form3"/>
</record>
@@ -191,9 +173,9 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Attendees">
- <field name="todo" select="1"/>
- <field name="email" select="1"/>
- <field name="status" select="1"/>
+ <field name="todo"/>
+ <field name="email"/>
+ <field name="status"/>
</tree>
]]>
</field>
@@ -222,9 +204,9 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Recurrence Dates">
- <field name="todo" select="1"/>
- <field name="datetime" select="1"/>
- <field name="date" select="2"/>
+ <field name="todo"/>
+ <field name="datetime"/>
+ <field name="date"/>
</tree>
]]>
</field>
@@ -253,9 +235,9 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Exception Dates">
- <field name="todo" select="1"/>
- <field name="datetime" select="1"/>
- <field name="date" select="2"/>
+ <field name="todo"/>
+ <field name="datetime"/>
+ <field name="date"/>
</tree>
]]>
</field>
@@ -284,8 +266,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Recurrence Rules">
- <field name="todo" select="1"/>
- <field name="freq" select="1"/>
+ <field name="todo"/>
+ <field name="freq"/>
</tree>
]]>
</field>
@@ -340,8 +322,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Exception Rules">
- <field name="todo" select="1"/>
- <field name="freq" select="1"/>
+ <field name="todo"/>
+ <field name="freq"/>
</tree>
]]>
</field>
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index 5168095..41e6827 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,29 +1,31 @@
Metadata-Version: 1.0
Name: trytond-calendar-todo
-Version: 2.0.0
+Version: 2.2.0
Summary: Add Todo support on CalDAV
Home-page: http://www.tryton.org/
Author: B2CK
Author-email: info at b2ck.com
License: GPL-3
-Download-URL: http://downloads.tryton.org/2.0/
+Download-URL: http://downloads.tryton.org/2.2/
Description: UNKNOWN
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Plugins
+Classifier: Framework :: Tryton
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Financial and Insurance Industry
Classifier: Intended Audience :: Legal Industry
Classifier: Intended Audience :: Manufacturing
Classifier: License :: OSI Approved :: GNU General Public License (GPL)
Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Czech
+Classifier: Natural Language :: Dutch
Classifier: Natural Language :: English
Classifier: Natural Language :: French
Classifier: Natural Language :: German
Classifier: Natural Language :: Russian
Classifier: Natural Language :: Spanish
Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 2.5
Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Topic :: Office/Business
diff --git a/trytond_calendar_todo.egg-info/SOURCES.txt b/trytond_calendar_todo.egg-info/SOURCES.txt
index 6621296..bb326df 100644
--- a/trytond_calendar_todo.egg-info/SOURCES.txt
+++ b/trytond_calendar_todo.egg-info/SOURCES.txt
@@ -4,12 +4,6 @@ INSTALL
LICENSE
MANIFEST.in
README
-bg_BG.csv
-de_DE.csv
-es_CO.csv
-es_ES.csv
-fr_FR.csv
-ru_RU.csv
setup.py
todo.xml
./__init__.py
@@ -19,6 +13,14 @@ todo.xml
./webdav.py
./tests/__init__.py
./tests/test_calendar_todo.py
+locale/bg_BG.po
+locale/cs_CZ.po
+locale/de_DE.po
+locale/es_CO.po
+locale/es_ES.po
+locale/fr_FR.po
+locale/nl_NL.po
+locale/ru_RU.po
trytond_calendar_todo.egg-info/PKG-INFO
trytond_calendar_todo.egg-info/SOURCES.txt
trytond_calendar_todo.egg-info/dependency_links.txt
diff --git a/trytond_calendar_todo.egg-info/requires.txt b/trytond_calendar_todo.egg-info/requires.txt
index 4c76c9b..f881d88 100644
--- a/trytond_calendar_todo.egg-info/requires.txt
+++ b/trytond_calendar_todo.egg-info/requires.txt
@@ -2,5 +2,5 @@ vobject >= 0.8.0
PyWebDAV >= 0.9.3
python-dateutil
pytz
-trytond_calendar >= 2.0, < 2.1
-trytond >= 2.0, < 2.1
\ No newline at end of file
+trytond_calendar >= 2.2, < 2.3
+trytond >= 2.2, < 2.3
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index 8350d45..e7db419 100644
--- a/webdav.py
+++ b/webdav.py
@@ -7,6 +7,7 @@ from trytond.model import ModelView, ModelSQL
from trytond.tools import reduce_ids
from trytond.transaction import Transaction
from trytond.cache import Cache
+from trytond.pool import Pool
class Collection(ModelSQL, ModelView):
@@ -23,7 +24,7 @@ class Collection(ModelSQL, ModelView):
:return: todo id
or False if there is no todo
'''
- todo_obj = self.pool.get('calendar.todo')
+ todo_obj = Pool().get('calendar.todo')
if uri and uri.startswith('Calendars/'):
calendar, todo_uri = (uri[10:].split('/', 1) + [None])[0:2]
@@ -105,8 +106,8 @@ class Collection(ModelSQL, ModelView):
return res
def get_childs(self, uri, filter=None, cache=None):
- calendar_obj = self.pool.get('calendar.calendar')
- todo_obj = self.pool.get('calendar.todo')
+ calendar_obj = Pool().get('calendar.calendar')
+ todo_obj = Pool().get('calendar.todo')
res = super(Collection, self).get_childs(uri, filter=filter,
cache=cache)
@@ -151,8 +152,8 @@ class Collection(ModelSQL, ModelView):
return super(Collection, self).get_contenttype(uri, cache=cache)
def get_creationdate(self, uri, cache=None):
- calendar_obj = self.pool.get('calendar.calendar')
- todo_obj = self.pool.get('calendar.todo')
+ calendar_obj = Pool().get('calendar.calendar')
+ todo_obj = Pool().get('calendar.todo')
cursor = Transaction().cursor
@@ -197,8 +198,8 @@ class Collection(ModelSQL, ModelView):
return super(Collection, self).get_creationdate(uri, cache=cache)
def get_lastmodified(self, uri, cache=None):
- calendar_obj = self.pool.get('calendar.calendar')
- todo_obj = self.pool.get('calendar.todo')
+ calendar_obj = Pool().get('calendar.calendar')
+ todo_obj = Pool().get('calendar.todo')
cursor = Transaction().cursor
@@ -245,8 +246,8 @@ class Collection(ModelSQL, ModelView):
return super(Collection, self).get_lastmodified(uri, cache=cache)
def get_data(self, uri, cache=None):
- todo_obj = self.pool.get('calendar.todo')
- calendar_obj = self.pool.get('calendar.calendar')
+ todo_obj = Pool().get('calendar.todo')
+ calendar_obj = Pool().get('calendar.calendar')
calendar_id = self.calendar(uri)
if calendar_id:
@@ -261,8 +262,8 @@ class Collection(ModelSQL, ModelView):
return super(Collection, self).get_data(uri, cache=cache)
def put(self, uri, data, content_type, cache=None):
- todo_obj = self.pool.get('calendar.todo')
- calendar_obj = self.pool.get('calendar.calendar')
+ todo_obj = Pool().get('calendar.todo')
+ calendar_obj = Pool().get('calendar.calendar')
calendar_id = self.calendar(uri)
if calendar_id:
@@ -289,7 +290,7 @@ class Collection(ModelSQL, ModelView):
return super(Collection, self).put(uri, data, content_type)
def rm(self, uri, cache=None):
- todo_obj = self.pool.get('calendar.todo')
+ todo_obj = Pool().get('calendar.todo')
calendar_id = self.calendar(uri)
if calendar_id:
commit 40dc4778f568186f827dd42aa30f87a409179af5
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Fri Jul 22 12:26:57 2011 +0200
Removing deprecated XB-Python-Version for dh_python2.
diff --git a/debian/control b/debian/control
index 28528f1..5370307 100644
--- a/debian/control
+++ b/debian/control
@@ -17,7 +17,6 @@ Depends:
${misc:Depends}, ${python:Depends}, tryton-server (>= 2.0),
tryton-modules-calendar (>= 2.0), python-dateutil, python-tz, python-vobject,
python-webdav, python-pkg-resources
-XB-Python-Version: ${python:Versions}
Description: Tryton Application Platform (Calendar Todo Module)
Tryton is a high-level general purpose application platform written in Python
and using PostgreSQL as database engine. It is the core base of a complete
commit 52a3f69e9e628aa293e484065670e586a9fb1a4b
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Thu Jul 14 01:13:53 2011 +0200
Releasing debian version 2.0.0-2.
diff --git a/debian/changelog b/debian/changelog
index 791e2a0..a6d4593 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,16 @@
+tryton-modules-calendar-todo (2.0.0-2) unstable; urgency=low
+
+ [ Daniel Baumann ]
+ * Removing for new source package version obsoleted README.source file.
+ * Adding options for source package.
+ * Compacting copyright file.
+ * Not wrapping uploaders field, it does not exceed 80 chars.
+
+ [ Mathias Behrle ]
+ * Moving from deprecated python-support to dh_python2.
+
+ -- Mathias Behrle <mathiasb at m9s.biz> Thu, 14 Jul 2011 01:13:48 +0200
+
tryton-modules-calendar-todo (2.0.0-1) unstable; urgency=low
* Updating to standards version 3.9.2.
commit 6426a9e0e206517c87115823f15ce3634fa0f0db
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Wed Jul 13 20:06:44 2011 +0200
Moving from deprecated python-support to dh_python2.
diff --git a/debian/control b/debian/control
index cb3c298..28528f1 100644
--- a/debian/control
+++ b/debian/control
@@ -4,11 +4,12 @@ Priority: optional
Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
Dm-Upload-Allowed: yes
-Build-Depends: debhelper (>= 8), python, python-setuptools, python-support
+Build-Depends: debhelper (>= 8), python (>= 2.6.6-3~), python-setuptools
Standards-Version: 3.9.2
Homepage: http://www.tryton.org/
Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-calendar-todo.git
Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-todo.git
+X-Python-Version: >= 2.5
Package: tryton-modules-calendar-todo
Architecture: all
diff --git a/debian/pycompat b/debian/pycompat
deleted file mode 100644
index 0cfbf08..0000000
--- a/debian/pycompat
+++ /dev/null
@@ -1 +0,0 @@
-2
diff --git a/debian/pydist-overrides b/debian/pydist-overrides
new file mode 100644
index 0000000..9aad9d3
--- /dev/null
+++ b/debian/pydist-overrides
@@ -0,0 +1,5 @@
+python_dateutil python-dateutil
+vobject python-vobject
+PyWebDAV python-webdav
+pytz python-tz
+
diff --git a/debian/pyversions b/debian/pyversions
deleted file mode 100644
index b3dc41e..0000000
--- a/debian/pyversions
+++ /dev/null
@@ -1 +0,0 @@
-2.5-
diff --git a/debian/rules b/debian/rules
index 000210b..e32b791 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,4 +1,9 @@
#!/usr/bin/make -f
%:
- dh ${@}
+ dh ${@} --with python2
+
+override_dh_auto_clean:
+ dh_auto_clean
+
+ rm -rf *.egg-info
commit 9b7458e854d53feb63a37f04e85fbc63e6321842
Author: Daniel Baumann <daniel at debian.org>
Date: Sun Jul 10 16:01:11 2011 +0200
Not wrapping uploaders field, it does not exceed 80 chars.
diff --git a/debian/control b/debian/control
index a5afa3e..cb3c298 100644
--- a/debian/control
+++ b/debian/control
@@ -2,9 +2,7 @@ Source: tryton-modules-calendar-todo
Section: python
Priority: optional
Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
-Uploaders:
- Daniel Baumann <daniel at debian.org>,
- Mathias Behrle <mathiasb at m9s.biz>
+Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
Dm-Upload-Allowed: yes
Build-Depends: debhelper (>= 8), python, python-setuptools, python-support
Standards-Version: 3.9.2
commit fac072fc4da30989bbbd808bfb0083f14a56392d
Author: Daniel Baumann <daniel at debian.org>
Date: Sun Jul 10 15:54:39 2011 +0200
Compacting copyright file.
diff --git a/debian/copyright b/debian/copyright
index 04f8161..6da6058 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -1,33 +1,15 @@
-Upstream-Contact: Tryton project <tryton at googlegroups.com>
-Upstream-Homepage: http://downloads.tryton.org/
-Maintainer-Contact: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
-Maintainer-Homepage: http://tryton.debian-maintainers.org/
-
Files: *
Copyright:
(C) 2009-2011 Cedric Krier
(C) 2009-2011 Bertrand Chenal
(C) 2009-2011 B2CK SPRL
License: GPL-3+
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- .
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- .
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- .
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
Files: debian/*
Copyright: (C) 2009-2011 Daniel Baumann <daniel at debian.org>
License: GPL-3+
+
+License: GPL-3+
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
@@ -41,5 +23,5 @@ License: GPL-3+
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
.
- On Debian systems, the complete text of the GNU General Public License
+ The complete text of the GNU General Public License
can be found in /usr/share/common-licenses/GPL-3 file.
commit 9b3551bc822c35a385269c9a20363d894499a878
Author: Daniel Baumann <daniel at debian.org>
Date: Sun Jul 10 15:38:54 2011 +0200
Adding options for source package.
diff --git a/debian/source/options b/debian/source/options
new file mode 100644
index 0000000..d053b65
--- /dev/null
+++ b/debian/source/options
@@ -0,0 +1,2 @@
+compression = gzip
+compression-level = 9
commit bc65032b5763a988cb074639c62e5710e49b7605
Author: Daniel Baumann <daniel at debian.org>
Date: Sun Jul 10 15:38:02 2011 +0200
Removing for new source package version obsoleted README.source file.
diff --git a/debian/README.source b/debian/README.source
deleted file mode 100644
index 18b6b24..0000000
--- a/debian/README.source
+++ /dev/null
@@ -1,37 +0,0 @@
-Package Repositories
---------------------
-
-Backports for the current stable debian distribution as well as snapshots of
-unreleased versions may be available in repositories listed on the maintainers
-homepage. The current URL of the maintainer homepage can be seen in
-debian/copyright.
-
-
-Source Access
--------------
-
-You can obtain the sources of this package with:
-
- $ apt-get source ${PACKAGE}
-
-whereas '${PACKAGE}' has to be replaced with the actual name of the package.
-
-This package is maintained with the Git version control system. The current git
-source tree can be obtained with:
-
- $ git clone ${GIT_URI}
-
-whereas '${GIT_URI}' has to be replaced with the actual URI for the Git
-repository. The current Git URI can be seen in debian/control in the extracted
-package sources.
-
-More information about Git can be found in the git-core package.
-
-This package may use the Quilt patch system to manage all modifications to the
-upstream source. Changes, if any, are stored in the source package as diffs in
-debian/diff and are applied during the build. Current modifications can be
-applied to the source tree with:
-
- $ QUILT_PATCHES=debian/patches quilt push -a
-
-More information about Quilt can be found in the quilt package.
commit d3e2026268ee9d594d4e9bb68a5897aaa96330d5
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue May 24 21:40:01 2011 +0200
Releasing debian version 2.0.0-1.
diff --git a/debian/changelog b/debian/changelog
index 0093e55..791e2a0 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+tryton-modules-calendar-todo (2.0.0-1) unstable; urgency=low
+
+ * Updating to standards version 3.9.2.
+ * Merging upstream version 2.0.0.
+ * Updating Copyright.
+ * Updating versioned tryton depends to 2.0.
+
+ -- Mathias Behrle <mathiasb at m9s.biz> Tue, 24 May 2011 21:32:55 +0200
+
tryton-modules-calendar-todo (1.8.0-2) unstable; urgency=low
* Changing my email address.
commit 1610a1812e25a38a5cea99f0afc1e45961694beb
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue May 24 21:21:34 2011 +0200
Updating versioned tryton depends to 2.0.
diff --git a/debian/control b/debian/control
index a6834cd..a5afa3e 100644
--- a/debian/control
+++ b/debian/control
@@ -15,8 +15,8 @@ Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-tod
Package: tryton-modules-calendar-todo
Architecture: all
Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server (>= 1.8),
- tryton-modules-calendar (>= 1.8), python-dateutil, python-tz, python-vobject,
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.0),
+ tryton-modules-calendar (>= 2.0), python-dateutil, python-tz, python-vobject,
python-webdav, python-pkg-resources
XB-Python-Version: ${python:Versions}
Description: Tryton Application Platform (Calendar Todo Module)
commit b308ed040d5b33c596aa11fc4ee0d6ba375d91c8
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue May 24 20:40:03 2011 +0200
Updating Copyright.
diff --git a/debian/copyright b/debian/copyright
index 213e426..04f8161 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -5,9 +5,9 @@ Maintainer-Homepage: http://tryton.debian-maintainers.org/
Files: *
Copyright:
- (C) 2009-2010 Cedric Krier
- (C) 2009-2010 Bertrand Chenal
- (C) 2009-2010 B2CK SPRL
+ (C) 2009-2011 Cedric Krier
+ (C) 2009-2011 Bertrand Chenal
+ (C) 2009-2011 B2CK SPRL
License: GPL-3+
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
commit 8a3a86d5ffd90061751004e6ac07cbf9ae80ad0d
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue May 24 19:12:45 2011 +0200
Merging upstream version 2.0.0.
diff --git a/CHANGELOG b/CHANGELOG
index 5ad4130..8d69511 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.0.0 - 2011-04-27
+* Bug fixes (see mercurial logs for details)
+
Version 1.8.0 - 2010-11-01
* Bug fixes (see mercurial logs for details)
diff --git a/COPYRIGHT b/COPYRIGHT
index 6e6811c..1245dd5 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,6 +1,6 @@
-Copyright (C) 2009-2010 Cédric Krier.
-Copyright (C) 2009-2010 Bertrand Chenal.
-Copyright (C) 2009-2010 B2CK SPRL.
+Copyright (C) 2009-2011 Cédric Krier.
+Copyright (C) 2009-2011 Bertrand Chenal.
+Copyright (C) 2009-2011 B2CK SPRL.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
diff --git a/PKG-INFO b/PKG-INFO
index 1af6f43..744dd33 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.0
Name: trytond_calendar_todo
-Version: 1.8.0
+Version: 2.0.0
Summary: Add Todo support on CalDAV
Home-page: http://www.tryton.org/
Author: B2CK
Author-email: info at b2ck.com
License: GPL-3
-Download-URL: http://downloads.tryton.org/1.8/
+Download-URL: http://downloads.tryton.org/2.0/
Description: UNKNOWN
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
@@ -16,10 +16,14 @@ Classifier: Intended Audience :: Financial and Insurance Industry
Classifier: Intended Audience :: Legal Industry
Classifier: Intended Audience :: Manufacturing
Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Natural Language :: Bulgarian
Classifier: Natural Language :: English
Classifier: Natural Language :: French
Classifier: Natural Language :: German
+Classifier: Natural Language :: Russian
Classifier: Natural Language :: Spanish
Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2.5
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
Classifier: Topic :: Office/Business
diff --git a/__tryton__.py b/__tryton__.py
index 59480e6..f04e3f8 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -3,19 +3,23 @@
#this repository contains the full copyright notices and license terms.
{
'name' : 'Calendar Todo',
+ 'name_bg_BG' : 'Задачи за календар',
'name_de_DE' : 'Kalender Aufgaben',
'name_es_CO': 'Calendario de tareas',
'name_es_ES': 'Calendario de tareas',
'name_fr_FR' : 'Tâche Calendrier',
- 'version' : '1.8.0',
+ 'name_ru_RU' : 'Задачи для календаря',
+ 'version' : '2.0.0',
'author' : 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
'description': 'Add Todo support on CalDAV',
+ 'description_bg_BG' : 'Добавя поддръжка на задачи в CalDAV',
'description_de_DE' : 'Fügt Unterstützung für Aufgaben in CalDAV hinzu',
'description_es_CO': 'Añade soporte de tareas sobre CalDAV',
'description_es_ES': 'Añade soporte de tareas sobre CalDAV',
'description_fr_FR': 'Ajoute la gestion des tâches au CalDAV',
+ 'description_ru_RU' : 'Добавление поддержки задач для CalDAV',
'depends' : [
'ir',
'res',
@@ -26,9 +30,11 @@
'todo.xml',
],
'translation': [
+ 'bg_BG.csv',
'de_DE.csv',
'es_CO.csv',
'es_ES.csv',
'fr_FR.csv',
+ 'ru_RU.csv',
],
}
diff --git a/bg_BG.csv b/bg_BG.csv
new file mode 100644
index 0000000..0446c93
--- /dev/null
+++ b/bg_BG.csv
@@ -0,0 +1,91 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.todo,0,Recurrence can not be recurrent!,Повторението не може да е периодично!,0
+error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,UUID и взаимна вложеност трябва да са уникални в календар!,0
+field,"calendar.todo,alarms",0,Alarms,Аларми,0
+field,"calendar.todo,attendees",0,Attendees,Присъстващи,0
+field,"calendar.todo,calendar",0,Calendar,Календар,0
+field,"calendar.todo,calendar_owner",0,Owner,Собственик,0
+field,"calendar.todo,calendar_read_users",0,Read Users,Потребители с права за четене,0
+field,"calendar.todo,calendar_write_users",0,Write Users,Записване на потребители,0
+field,"calendar.todo,categories",0,Categories,Категории,0
+field,"calendar.todo,classification",0,Classification,Класификация,0
+field,"calendar.todo,completed",0,Completed,Изпълнен,0
+field,"calendar.todo,description",0,Description,Описание,0
+field,"calendar.todo,dtstart",0,Start Date,Начална дата,0
+field,"calendar.todo,due",0,Due Date,Дата на изпълнение,0
+field,"calendar.todo,exdates",0,Exception Dates,Дати на грешките,0
+field,"calendar.todo,exrules",0,Exception Rules,Правила при грешка,0
+field,"calendar.todo,location",0,Location,Местоположение,0
+field,"calendar.todo,occurences",0,Occurences,Събития,0
+field,"calendar.todo,organizer",0,Organizer,Организатор,0
+field,"calendar.todo,parent",0,Parent,Родител,0
+field,"calendar.todo,percent_complete",0,Percent complete,Процент изпълнено,0
+field,"calendar.todo,rdates",0,Recurrence Dates,Дати на повторяемост,0
+field,"calendar.todo,rec_name",0,Name,Име,0
+field,"calendar.todo,recurrence",0,Recurrence,Повторение,0
+field,"calendar.todo,rrules",0,Recurrence Rules,Правила за повторяемост,0
+field,"calendar.todo,sequence",0,Sequence,Последователност,0
+field,"calendar.todo,status",0,Status,Състояние,0
+field,"calendar.todo,summary",0,Summary,Обобщено,0
+field,"calendar.todo,timezone",0,Timezone,Времева зона,0
+field,"calendar.todo,uuid",0,UUID,UUID,0
+field,"calendar.todo,vtodo",0,vtodo,,0
+field,"calendar.todo-calendar.category,category",0,Category,Категория,0
+field,"calendar.todo-calendar.category,rec_name",0,Name,Име,0
+field,"calendar.todo-calendar.category,todo",0,To-Do,Задача,0
+field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Аларма на календар,0
+field,"calendar.todo.alarm,rec_name",0,Name,Име,0
+field,"calendar.todo.alarm,todo",0,Todo,Задача,0
+field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Присъстващ на календар,0
+field,"calendar.todo.attendee,rec_name",0,Name,Име,0
+field,"calendar.todo.attendee,todo",0,Todo,Задача,0
+field,"calendar.todo.exdate,calendar_date",0,Calendar Date,Дата от календар,0
+field,"calendar.todo.exdate,rec_name",0,Name,Име,0
+field,"calendar.todo.exdate,todo",0,Todo,Задача,0
+field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,,0
+field,"calendar.todo.exrule,rec_name",0,Name,Име,0
+field,"calendar.todo.exrule,todo",0,Todo,Задача,0
+field,"calendar.todo.rdate,calendar_date",0,Calendar Date,Дата от календар,0
+field,"calendar.todo.rdate,rec_name",0,Name,Име,0
+field,"calendar.todo.rdate,todo",0,Todo,Задача,0
+field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,,0
+field,"calendar.todo.rrule,rec_name",0,Name,Име,0
+field,"calendar.todo.rrule,todo",0,Todo,Задача,0
+help,"calendar.todo,uuid",0,Universally Unique Identifier,Универсален иникален идентификатор,0
+model,"calendar.todo,name",0,Todo,Задача,0
+model,"calendar.todo-calendar.category,name",0,Todo - Category,Задача - Категория,0
+model,"calendar.todo.alarm,name",0,Alarm,Аларма,0
+model,"calendar.todo.attendee,name",0,Attendee,Присъстващ,0
+model,"calendar.todo.exdate,name",0,Exception Date,Дата на грешка,0
+model,"calendar.todo.exrule,name",0,Exception Rule,Правило при грешка,0
+model,"calendar.todo.rdate,name",0,Todo Recurrence Date,Дата на повторение на задача,0
+model,"calendar.todo.rrule,name",0,Recurrence Rule,Правило за повторение,0
+model,"ir.action,name",act_todo_form,Todos,Задачи,0
+model,"ir.action,name",act_todo_form2,Todos,Задачи,0
+model,"ir.action,name",act_todo_form3,Todos,Задачи,0
+model,"ir.ui.menu,name",menu_todo_form,Todos,Задачи,0
+model,"ir.ui.menu,name",menu_todo_form2,New Todo,Нова задача,0
+selection,"calendar.todo,classification",0,Confidential,Поверителен,0
+selection,"calendar.todo,classification",0,Private,Частен,0
+selection,"calendar.todo,classification",0,Public,Публичен,0
+selection,"calendar.todo,status",0,,,0
+selection,"calendar.todo,status",0,Cancelled,Отказан,0
+selection,"calendar.todo,status",0,Completed,Изпълнен,0
+selection,"calendar.todo,status",0,In-Process,Обработва се,0
+selection,"calendar.todo,status",0,Needs-Action,Необходимо е действие,0
+view,calendar.todo,0,Attendees,Присъстващи,0
+view,calendar.todo,0,Categories,Категории,0
+view,calendar.todo,0,General,Основен,0
+view,calendar.todo,0,Occurences,Събития,0
+view,calendar.todo,0,Todo,Задача,0
+view,calendar.todo,0,Todos,Задачи,0
+view,calendar.todo.attendee,0,Attendee,Присъстващ,0
+view,calendar.todo.attendee,0,Attendees,Присъстващи,0
+view,calendar.todo.exdate,0,Exception Date,Дата на грешка,0
+view,calendar.todo.exdate,0,Exception Dates,Дати на грешките,0
+view,calendar.todo.exrule,0,Exception Rule,Правило при грешка,0
+view,calendar.todo.exrule,0,Exception Rules,Правила при грешка,0
+view,calendar.todo.rdate,0,Recurrence Date,Повтаряща се дата,0
+view,calendar.todo.rdate,0,Recurrence Dates,Дати на повторяемост,0
+view,calendar.todo.rrule,0,Recurrence Rule,Правило за повторение,0
+view,calendar.todo.rrule,0,Recurrence Rules,Правила за повторяемост,0
diff --git a/ru_RU.csv b/ru_RU.csv
new file mode 100644
index 0000000..ebc669f
--- /dev/null
+++ b/ru_RU.csv
@@ -0,0 +1,95 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.todo,0,Recurrence can not be recurrent!,,0
+error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,,0
+field,"calendar.todo,alarms",0,Alarms,Вызов,0
+field,"calendar.todo,attendees",0,Attendees,Участники,0
+field,"calendar.todo,calendar",0,Calendar,Календарь,0
+field,"calendar.todo,calendar_owner",0,Owner,Владелец,0
+field,"calendar.todo,calendar_read_users",0,Read Users,Пользователи могут читать,0
+field,"calendar.todo,calendar_write_users",0,Write Users,Пользователи могут писать,0
+field,"calendar.todo,categories",0,Categories,Категория,0
+field,"calendar.todo,classification",0,Classification,Классификация,0
+field,"calendar.todo,classification_public",0,Classification Public,Классификация общая,0
+field,"calendar.todo,completed",0,Completed,Выполнен,0
+field,"calendar.todo,description",0,Description,Описание,0
+field,"calendar.todo,dtstart",0,Start Date,Дата начала,0
+field,"calendar.todo,due",0,Due Date,Срок сдачи,0
+field,"calendar.todo,exdates",0,Exception Dates,Дата исключения,0
+field,"calendar.todo,exrules",0,Exception Rules,Правила исключения,0
+field,"calendar.todo,location",0,Location,Местоположение,0
+field,"calendar.todo,occurences",0,Occurences,Дополнительные задачи,0
+field,"calendar.todo,organizer",0,Organizer,Организатор,0
+field,"calendar.todo,parent",0,Parent,Основной,0
+field,"calendar.todo,percent_complete",0,Percent complete,Процент выполнения,0
+field,"calendar.todo,rdates",0,Recurrence Dates,Даты повторения,0
+field,"calendar.todo,rec_name",0,Name,Наименование,0
+field,"calendar.todo,recurrence",0,Recurrence,Повторение,0
+field,"calendar.todo,recurrences",0,Recurrences,Повторения,0
+field,"calendar.todo,rrules",0,Recurrence Rules,Правила повторения,0
+field,"calendar.todo,sequence",0,Sequence,Последовательность,0
+field,"calendar.todo,status",0,Status,Состояние,0
+field,"calendar.todo,summary",0,Summary,Резюме,0
+field,"calendar.todo,timezone",0,Timezone,Зона времени,0
+field,"calendar.todo,uuid",0,UUID,,0
+field,"calendar.todo,vtodo",0,vtodo,,0
+field,"calendar.todo-calendar.category,category",0,Category,Категории,0
+field,"calendar.todo-calendar.category,rec_name",0,Name,Наименование,0
+field,"calendar.todo-calendar.category,todo",0,To-Do,Дела,0
+field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Сигнала календаря,0
+field,"calendar.todo.alarm,rec_name",0,Name,Наименование,0
+field,"calendar.todo.alarm,todo",0,Todo,Дело,0
+field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Календарь участников,0
+field,"calendar.todo.attendee,rec_name",0,Name,Наименование,0
+field,"calendar.todo.attendee,todo",0,Todo,Дело,0
+field,"calendar.todo.exdate,calendar_date",0,Calendar Date,День календаря,0
+field,"calendar.todo.exdate,calendar_rdate",0,Calendar RDate,День календаря,0
+field,"calendar.todo.exdate,rec_name",0,Name,Наименование,0
+field,"calendar.todo.exdate,todo",0,Todo,Дело,0
+field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Правила календаря,0
+field,"calendar.todo.exrule,rec_name",0,Name,Наименование,0
+field,"calendar.todo.exrule,todo",0,Todo,Дело,0
+field,"calendar.todo.rdate,calendar_date",0,Calendar Date,День календаря,0
+field,"calendar.todo.rdate,calendar_rdate",0,Calendar RDate,День календаря,0
+field,"calendar.todo.rdate,rec_name",0,Name,Наименование,0
+field,"calendar.todo.rdate,todo",0,Todo,Дело,0
+field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Правила календаря,0
+field,"calendar.todo.rrule,rec_name",0,Name,Наименование,0
+field,"calendar.todo.rrule,todo",0,Todo,Дело,0
+help,"calendar.todo,uuid",0,Universally Unique Identifier,Универсальный уникальный идентификатор,0
+model,"calendar.todo,name",0,Todo,Дело,0
+model,"calendar.todo-calendar.category,name",0,Todo - Category,Категории - Дел,0
+model,"calendar.todo.alarm,name",0,Alarm,Вызов,0
+model,"calendar.todo.attendee,name",0,Attendee,Участник,0
+model,"calendar.todo.exdate,name",0,Exception Date,Дата исключения,0
+model,"calendar.todo.exrule,name",0,Exception Rule,Правило исключения,0
+model,"calendar.todo.rdate,name",0,Todo Recurrence Date,Дела повторяющиеся по дате,0
+model,"calendar.todo.rrule,name",0,Recurrence Rule,Правила повторения,0
+model,"ir.action,name",act_todo_form,Todos,,0
+model,"ir.action,name",act_todo_form2,Todos,,0
+model,"ir.action,name",act_todo_form3,Todos,,0
+model,"ir.ui.menu,name",menu_todo_form,Todos,Задачи,0
+model,"ir.ui.menu,name",menu_todo_form2,New Todo,Новая задача,0
+selection,"calendar.todo,classification",0,Confidential,Конфиденциальное,0
+selection,"calendar.todo,classification",0,Private,Личное,0
+selection,"calendar.todo,classification",0,Public,Публичное,0
+selection,"calendar.todo,status",0,,,0
+selection,"calendar.todo,status",0,Cancelled,Отмененно,0
+selection,"calendar.todo,status",0,Completed,Выполнен,0
+selection,"calendar.todo,status",0,In-Process,В процессе,0
+selection,"calendar.todo,status",0,Needs-Action,Требуется действие,0
+view,calendar.todo,0,Attendees,Участники,0
+view,calendar.todo,0,Categories,Категория,0
+view,calendar.todo,0,General,Основной,0
+view,calendar.todo,0,Occurences,Повторение,0
+view,calendar.todo,0,Todo,Дело,0
+view,calendar.todo,0,Todos,Дела,0
+view,calendar.todo.attendee,0,Attendee,Участник,0
+view,calendar.todo.attendee,0,Attendees,Участники,0
+view,calendar.todo.exdate,0,Exception Date,Дата исключения,0
+view,calendar.todo.exdate,0,Exception Dates,Дата исключения,0
+view,calendar.todo.exrule,0,Exception Rule,Правило исключения,0
+view,calendar.todo.exrule,0,Exception Rules,Правила исключения,0
+view,calendar.todo.rdate,0,Recurrence Date,Даты повторения,0
+view,calendar.todo.rdate,0,Recurrence Dates,Даты повторения,0
+view,calendar.todo.rrule,0,Recurrence Rule,Правила повторения,0
+view,calendar.todo.rrule,0,Recurrence Rules,Правила повторения,0
diff --git a/setup.py b/setup.py
index 42102b3..7948e48 100644
--- a/setup.py
+++ b/setup.py
@@ -44,12 +44,16 @@ setup(name='trytond_calendar_todo',
'Intended Audience :: Legal Industry',
'Intended Audience :: Manufacturing',
'License :: OSI Approved :: GNU General Public License (GPL)',
+ 'Natural Language :: Bulgarian',
'Natural Language :: English',
'Natural Language :: French',
'Natural Language :: German',
+ 'Natural Language :: Russian',
'Natural Language :: Spanish',
'Operating System :: OS Independent',
- 'Programming Language :: Python',
+ 'Programming Language :: Python :: 2.5',
+ 'Programming Language :: Python :: 2.6',
+ 'Programming Language :: Python :: 2.7',
'Topic :: Office/Business',
],
license='GPL-3',
diff --git a/todo.xml b/todo.xml
index 0994181..fbc4aef 100644
--- a/todo.xml
+++ b/todo.xml
@@ -87,7 +87,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_todo_form">
<field name="name">Todos</field>
<field name="res_model">calendar.todo</field>
- <field name="view_type">form</field>
<field name="domain">[('parent', '=', False)]</field>
</record>
<record model="ir.action.act_window.view" id="act_todo_form_view1">
@@ -105,7 +104,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_todo_form2">
<field name="name">Todos</field>
<field name="res_model">calendar.todo</field>
- <field name="view_type">form</field>
<field name="domain">[('parent', '=', False)]</field>
</record>
<record model="ir.action.act_window.view" id="act_todo_form2_view1">
@@ -124,7 +122,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_todo_form3">
<field name="name">Todos</field>
<field name="res_model">calendar.todo</field>
- <field name="view_type">form</field>
<field name="domain">[('parent', '=', False), ('calendar', '=', Eval('active_id'))]</field>
</record>
<record model="ir.action.act_window.view" id="act_todo_form3_view1">
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index 93cb712..5168095 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.0
Name: trytond-calendar-todo
-Version: 1.8.0
+Version: 2.0.0
Summary: Add Todo support on CalDAV
Home-page: http://www.tryton.org/
Author: B2CK
Author-email: info at b2ck.com
License: GPL-3
-Download-URL: http://downloads.tryton.org/1.8/
+Download-URL: http://downloads.tryton.org/2.0/
Description: UNKNOWN
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
@@ -16,10 +16,14 @@ Classifier: Intended Audience :: Financial and Insurance Industry
Classifier: Intended Audience :: Legal Industry
Classifier: Intended Audience :: Manufacturing
Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Natural Language :: Bulgarian
Classifier: Natural Language :: English
Classifier: Natural Language :: French
Classifier: Natural Language :: German
+Classifier: Natural Language :: Russian
Classifier: Natural Language :: Spanish
Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2.5
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
Classifier: Topic :: Office/Business
diff --git a/trytond_calendar_todo.egg-info/SOURCES.txt b/trytond_calendar_todo.egg-info/SOURCES.txt
index e25e4da..6621296 100644
--- a/trytond_calendar_todo.egg-info/SOURCES.txt
+++ b/trytond_calendar_todo.egg-info/SOURCES.txt
@@ -4,10 +4,12 @@ INSTALL
LICENSE
MANIFEST.in
README
+bg_BG.csv
de_DE.csv
es_CO.csv
es_ES.csv
fr_FR.csv
+ru_RU.csv
setup.py
todo.xml
./__init__.py
diff --git a/trytond_calendar_todo.egg-info/requires.txt b/trytond_calendar_todo.egg-info/requires.txt
index b032e9a..4c76c9b 100644
--- a/trytond_calendar_todo.egg-info/requires.txt
+++ b/trytond_calendar_todo.egg-info/requires.txt
@@ -2,5 +2,5 @@ vobject >= 0.8.0
PyWebDAV >= 0.9.3
python-dateutil
pytz
-trytond_calendar >= 1.8, < 1.9
-trytond >= 1.8, < 1.9
\ No newline at end of file
+trytond_calendar >= 2.0, < 2.1
+trytond >= 2.0, < 2.1
\ No newline at end of file
commit aadff102ef976b062f63ed2894cde0a927a71a69
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Apr 26 21:08:53 2011 +0200
Updating to standards version 3.9.2.
diff --git a/debian/control b/debian/control
index f26ea4c..a6834cd 100644
--- a/debian/control
+++ b/debian/control
@@ -7,7 +7,7 @@ Uploaders:
Mathias Behrle <mathiasb at m9s.biz>
Dm-Upload-Allowed: yes
Build-Depends: debhelper (>= 8), python, python-setuptools, python-support
-Standards-Version: 3.9.1
+Standards-Version: 3.9.2
Homepage: http://www.tryton.org/
Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-calendar-todo.git
Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-todo.git
commit 6440eb168d2ee24efbeb2c5c8ecb9f2b46185f62
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Feb 15 13:08:53 2011 +0100
Releasing debian version 1.8.0-2.
diff --git a/debian/changelog b/debian/changelog
index 2b869c9..0093e55 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+tryton-modules-calendar-todo (1.8.0-2) unstable; urgency=low
+
+ * Changing my email address.
+ * Updating Copyright.
+
+ -- Mathias Behrle <mathiasb at m9s.biz> Tue, 15 Feb 2011 13:08:31 +0100
+
tryton-modules-calendar-todo (1.8.0-1) experimental; urgency=low
* Wrapping depends.
commit a028edfbe193423cb2a8beb687cd2048e9190b20
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Feb 15 12:38:41 2011 +0100
Updating Copyright.
diff --git a/debian/copyright b/debian/copyright
index 489b0a2..213e426 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -26,7 +26,7 @@ License: GPL-3+
can be found in /usr/share/common-licenses/GPL-3 file.
Files: debian/*
-Copyright: (C) 2009-2010 Daniel Baumann <daniel at debian.org>
+Copyright: (C) 2009-2011 Daniel Baumann <daniel at debian.org>
License: GPL-3+
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
commit 5fdd9cd69b6ac47e239014b9b54a8cc9894eb97a
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Sat Nov 20 11:48:53 2010 +0100
Changing my email address.
diff --git a/debian/control b/debian/control
index 43a0cc2..f26ea4c 100644
--- a/debian/control
+++ b/debian/control
@@ -4,7 +4,7 @@ Priority: optional
Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
Uploaders:
Daniel Baumann <daniel at debian.org>,
- Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
+ Mathias Behrle <mathiasb at m9s.biz>
Dm-Upload-Allowed: yes
Build-Depends: debhelper (>= 8), python, python-setuptools, python-support
Standards-Version: 3.9.1
commit cfabdf1bf1d1b9e7b2b90e2b4e90dfd6c49cf70a
Author: Daniel Baumann <daniel at debian.org>
Date: Fri Nov 12 12:58:01 2010 +0100
Releasing debian version 1.8.0-1.
diff --git a/debian/changelog b/debian/changelog
index d976e72..2b869c9 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,15 @@
+tryton-modules-calendar-todo (1.8.0-1) experimental; urgency=low
+
+ * Wrapping depends.
+ * Updating standards version to 3.9.0.
+ * Updating to debhelper version 8.
+ * Updating to standards version 3.9.1.
+ * Switching to source format 3.0 (quilt).
+ * Merging upstream version 1.8.0.
+ * Updating versioned tryton depends to 1.8.
+
+ -- Daniel Baumann <daniel at debian.org> Fri, 12 Nov 2010 12:57:53 +0100
+
tryton-modules-calendar-todo (1.6.0-1) unstable; urgency=low
[ Daniel Baumann ]
commit e302f3222ba5e65d4b922672e2aa7da51af87036
Author: Daniel Baumann <daniel at debian.org>
Date: Thu Nov 4 20:16:01 2010 +0100
Updating versioned tryton depends to 1.8.
diff --git a/debian/control b/debian/control
index 81b8ebd..43a0cc2 100644
--- a/debian/control
+++ b/debian/control
@@ -15,8 +15,8 @@ Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-tod
Package: tryton-modules-calendar-todo
Architecture: all
Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server (>= 1.6),
- tryton-modules-calendar (>= 1.6), python-dateutil, python-tz, python-vobject,
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= 1.8),
+ tryton-modules-calendar (>= 1.8), python-dateutil, python-tz, python-vobject,
python-webdav, python-pkg-resources
XB-Python-Version: ${python:Versions}
Description: Tryton Application Platform (Calendar Todo Module)
commit 0e130da29549e1817c2d216feec3ed4a87b6e4cd
Author: Daniel Baumann <daniel at debian.org>
Date: Thu Nov 4 20:13:24 2010 +0100
Merging upstream version 1.8.0.
diff --git a/CHANGELOG b/CHANGELOG
index 515da05..5ad4130 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 1.8.0 - 2010-11-01
+* Bug fixes (see mercurial logs for details)
+
Version 1.6.0 - 2010-05-10
* Bug fixes (see mercurial logs for details)
* Remove classification_public
diff --git a/PKG-INFO b/PKG-INFO
index 7987827..1af6f43 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.0
Name: trytond_calendar_todo
-Version: 1.6.0
+Version: 1.8.0
Summary: Add Todo support on CalDAV
Home-page: http://www.tryton.org/
Author: B2CK
Author-email: info at b2ck.com
License: GPL-3
-Download-URL: http://downloads.tryton.org/1.6/
+Download-URL: http://downloads.tryton.org/1.8/
Description: UNKNOWN
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
diff --git a/__tryton__.py b/__tryton__.py
index 6cace63..59480e6 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
'name_es_CO': 'Calendario de tareas',
'name_es_ES': 'Calendario de tareas',
'name_fr_FR' : 'Tâche Calendrier',
- 'version' : '1.6.0',
+ 'version' : '1.8.0',
'author' : 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
diff --git a/de_DE.csv b/de_DE.csv
index 18347c8..d9bb158 100644
--- a/de_DE.csv
+++ b/de_DE.csv
@@ -1,18 +1,9 @@
type,name,res_id,src,value,fuzzy
error,calendar.todo,0,Recurrence can not be recurrent!,Wiederholungen können nicht rekursiv sein!,0
error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,UUID und Wiederholung können in einem Kalender nicht mehrfach vergeben werden!,0
-field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Kalender Alarm,0
-field,"calendar.todo.alarm,rec_name",0,Name,Name,0
field,"calendar.todo,alarms",0,Alarms,Alarm,0
-field,"calendar.todo.alarm,todo",0,Todo,Aufgabe,0
-field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Kalender Teilnehmer,0
-field,"calendar.todo.attendee,rec_name",0,Name,Name,0
field,"calendar.todo,attendees",0,Attendees,Teilnehmer,0
-field,"calendar.todo.attendee,todo",0,Todo,Aufgabe,0
field,"calendar.todo,calendar",0,Calendar,Kalender,0
-field,"calendar.todo-calendar.category,category",0,Category,Kategorie,0
-field,"calendar.todo-calendar.category,rec_name",0,Name,Name,0
-field,"calendar.todo-calendar.category,todo",0,To-Do,Aufgabe,0
field,"calendar.todo,calendar_owner",0,Owner,Besitzer,0
field,"calendar.todo,calendar_read_users",0,Read Users,Benutzer mit Leseberechtigung,0
field,"calendar.todo,calendar_write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
@@ -22,49 +13,58 @@ field,"calendar.todo,completed",0,Completed,Abgeschlossen,0
field,"calendar.todo,description",0,Description,Bezeichnung,0
field,"calendar.todo,dtstart",0,Start Date,Anfangsdatum,0
field,"calendar.todo,due",0,Due Date,Fälligkeitsdatum,0
-field,"calendar.todo.exdate,calendar_date",0,Calendar Date,Kalender Datum,0
-field,"calendar.todo.exdate,rec_name",0,Name,Name,0
field,"calendar.todo,exdates",0,Exception Dates,Ausnahmedaten,0
-field,"calendar.todo.exdate,todo",0,Todo,Aufgabe,0
-field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
-field,"calendar.todo.exrule,rec_name",0,Name,Name,0
field,"calendar.todo,exrules",0,Exception Rules,Ausnahmeregeln,0
-field,"calendar.todo.exrule,todo",0,Todo,Aufgabe,0
field,"calendar.todo,location",0,Location,Ort,0
field,"calendar.todo,occurences",0,Occurences,Ereignisse,0
field,"calendar.todo,organizer",0,Organizer,Organisator,0
field,"calendar.todo,parent",0,Parent,Übergeordnet (Aufgabe),0
field,"calendar.todo,percent_complete",0,Percent complete,% erledigt,0
-field,"calendar.todo.rdate,calendar_date",0,Calendar Date,Kalender Datum,0
-field,"calendar.todo.rdate,rec_name",0,Name,Name,0
field,"calendar.todo,rdates",0,Recurrence Dates,Wiederholungsdaten,0
-field,"calendar.todo.rdate,todo",0,Todo,Aufgabe,0
field,"calendar.todo,rec_name",0,Name,Name,0
field,"calendar.todo,recurrence",0,Recurrence,Wiederholung,0
-field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
-field,"calendar.todo.rrule,rec_name",0,Name,Name,0
field,"calendar.todo,rrules",0,Recurrence Rules,Wiederholungsregeln,0
-field,"calendar.todo.rrule,todo",0,Todo,Aufgabe,0
field,"calendar.todo,sequence",0,Sequence,Revision,0
field,"calendar.todo,status",0,Status,Status,0
field,"calendar.todo,summary",0,Summary,Zusammenfassung,0
field,"calendar.todo,timezone",0,Timezone,Zeitzone,0
field,"calendar.todo,uuid",0,UUID,UUID,0
field,"calendar.todo,vtodo",0,vtodo,vtodo,0
+field,"calendar.todo-calendar.category,category",0,Category,Kategorie,0
+field,"calendar.todo-calendar.category,rec_name",0,Name,Name,0
+field,"calendar.todo-calendar.category,todo",0,To-Do,Aufgabe,0
+field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Kalender Alarm,0
+field,"calendar.todo.alarm,rec_name",0,Name,Name,0
+field,"calendar.todo.alarm,todo",0,Todo,Aufgabe,0
+field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Kalender Teilnehmer,0
+field,"calendar.todo.attendee,rec_name",0,Name,Name,0
+field,"calendar.todo.attendee,todo",0,Todo,Aufgabe,0
+field,"calendar.todo.exdate,calendar_date",0,Calendar Date,Kalender Datum,0
+field,"calendar.todo.exdate,rec_name",0,Name,Name,0
+field,"calendar.todo.exdate,todo",0,Todo,Aufgabe,0
+field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
+field,"calendar.todo.exrule,rec_name",0,Name,Name,0
+field,"calendar.todo.exrule,todo",0,Todo,Aufgabe,0
+field,"calendar.todo.rdate,calendar_date",0,Calendar Date,Kalender Datum,0
+field,"calendar.todo.rdate,rec_name",0,Name,Name,0
+field,"calendar.todo.rdate,todo",0,Todo,Aufgabe,0
+field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
+field,"calendar.todo.rrule,rec_name",0,Name,Name,0
+field,"calendar.todo.rrule,todo",0,Todo,Aufgabe,0
help,"calendar.todo,uuid",0,Universally Unique Identifier,Universally Unique Identifier,0
+model,"calendar.todo,name",0,Todo,Aufgabe,0
+model,"calendar.todo-calendar.category,name",0,Todo - Category,Aufgabe - Kategorie,0
model,"calendar.todo.alarm,name",0,Alarm,Alarm,0
model,"calendar.todo.attendee,name",0,Attendee,Teilnehmer,0
-model,"calendar.todo-calendar.category,name",0,Todo - Category,Aufgabe - Kategorie,0
model,"calendar.todo.exdate,name",0,Exception Date,Ausnahmedatum,0
model,"calendar.todo.exrule,name",0,Exception Rule,Ausnahmeregel,0
-model,"calendar.todo,name",0,Todo,Aufgabe,0
model,"calendar.todo.rdate,name",0,Todo Recurrence Date,Aufgabe Wiederholungsdatum,0
model,"calendar.todo.rrule,name",0,Recurrence Rule,Wiederholungsregel,0
model,"ir.action,name",act_todo_form,Todos,Aufgaben,0
model,"ir.action,name",act_todo_form2,Todos,Aufgaben,0
model,"ir.action,name",act_todo_form3,Todos,Aufgaben,0
-model,"ir.ui.menu,name",menu_todo_form2,New Todo,Neue Aufgabe,0
model,"ir.ui.menu,name",menu_todo_form,Todos,Aufgaben,0
+model,"ir.ui.menu,name",menu_todo_form2,New Todo,Neue Aufgabe,0
selection,"calendar.todo,classification",0,Confidential,Vertraulich,0
selection,"calendar.todo,classification",0,Private,Privat,0
selection,"calendar.todo,classification",0,Public,Öffentlich,0
diff --git a/fr_FR.csv b/fr_FR.csv
index 4459c8b..47863e2 100644
--- a/fr_FR.csv
+++ b/fr_FR.csv
@@ -1,18 +1,9 @@
type,name,res_id,src,value,fuzzy
error,calendar.todo,0,Recurrence can not be recurrent!,Une récurrence ne peut pas être récurrente !,0
error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,UUID et récurrence doivent être uniques sur un calendrier !,0
-field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Alarme calendrier,0
-field,"calendar.todo.alarm,rec_name",0,Name,Nom,0
field,"calendar.todo,alarms",0,Alarms,Alarmes,0
-field,"calendar.todo.alarm,todo",0,Todo,Tâche,0
-field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Participant calendrier,0
-field,"calendar.todo.attendee,rec_name",0,Name,Nom,0
field,"calendar.todo,attendees",0,Attendees,Participants,0
-field,"calendar.todo.attendee,todo",0,Todo,Tâche,0
field,"calendar.todo,calendar",0,Calendar,Calendrier,0
-field,"calendar.todo-calendar.category,category",0,Category,Catégorie,0
-field,"calendar.todo-calendar.category,rec_name",0,Name,Nom,0
-field,"calendar.todo-calendar.category,todo",0,To-Do,Tâche,0
field,"calendar.todo,calendar_owner",0,Owner,Propriétaire,0
field,"calendar.todo,calendar_read_users",0,Read Users,Utilisateurs en lecture,0
field,"calendar.todo,calendar_write_users",0,Write Users,Utilisateurs en écriture,0
@@ -22,49 +13,58 @@ field,"calendar.todo,completed",0,Completed,Complété,0
field,"calendar.todo,description",0,Description,Description,0
field,"calendar.todo,dtstart",0,Start Date,Date de début,0
field,"calendar.todo,due",0,Due Date,Date d'échéance,0
-field,"calendar.todo.exdate,calendar_date",0,Calendar Date,Date calendrier,0
-field,"calendar.todo.exdate,rec_name",0,Name,Nom,0
field,"calendar.todo,exdates",0,Exception Dates,Dates d'exception,0
-field,"calendar.todo.exdate,todo",0,Todo,Tâche,0
-field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
-field,"calendar.todo.exrule,rec_name",0,Name,Nom,0
field,"calendar.todo,exrules",0,Exception Rules,Règles d'exception,0
-field,"calendar.todo.exrule,todo",0,Todo,Tâche,0
field,"calendar.todo,location",0,Location,Emplacement,0
field,"calendar.todo,occurences",0,Occurences,Occurrences,0
field,"calendar.todo,organizer",0,Organizer,Organisateur,0
field,"calendar.todo,parent",0,Parent,Parent,0
field,"calendar.todo,percent_complete",0,Percent complete,Pourcentage effectué,0
-field,"calendar.todo.rdate,calendar_date",0,Calendar Date,Date calendrier,0
-field,"calendar.todo.rdate,rec_name",0,Name,Nom,0
field,"calendar.todo,rdates",0,Recurrence Dates,Dates de récurrence,0
-field,"calendar.todo.rdate,todo",0,Todo,Tâche,0
field,"calendar.todo,rec_name",0,Name,Nom,0
field,"calendar.todo,recurrence",0,Recurrence,Récurrence,0
-field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
-field,"calendar.todo.rrule,rec_name",0,Name,Nom,0
field,"calendar.todo,rrules",0,Recurrence Rules,Règles de récurrence,0
-field,"calendar.todo.rrule,todo",0,Todo,Tâche,0
field,"calendar.todo,sequence",0,Sequence,Séquence,0
field,"calendar.todo,status",0,Status,Statut,0
field,"calendar.todo,summary",0,Summary,Résumé,0
field,"calendar.todo,timezone",0,Timezone,Fuseau Horaire,0
field,"calendar.todo,uuid",0,UUID,UUID,0
field,"calendar.todo,vtodo",0,vtodo,vtodo,0
+field,"calendar.todo-calendar.category,category",0,Category,Catégorie,0
+field,"calendar.todo-calendar.category,rec_name",0,Name,Nom,0
+field,"calendar.todo-calendar.category,todo",0,To-Do,Tâche,0
+field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Alarme calendrier,0
+field,"calendar.todo.alarm,rec_name",0,Name,Nom,0
+field,"calendar.todo.alarm,todo",0,Todo,Tâche,0
+field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Participant calendrier,0
+field,"calendar.todo.attendee,rec_name",0,Name,Nom,0
+field,"calendar.todo.attendee,todo",0,Todo,Tâche,0
+field,"calendar.todo.exdate,calendar_date",0,Calendar Date,Date calendrier,0
+field,"calendar.todo.exdate,rec_name",0,Name,Nom,0
+field,"calendar.todo.exdate,todo",0,Todo,Tâche,0
+field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
+field,"calendar.todo.exrule,rec_name",0,Name,Nom,0
+field,"calendar.todo.exrule,todo",0,Todo,Tâche,0
+field,"calendar.todo.rdate,calendar_date",0,Calendar Date,Date calendrier,0
+field,"calendar.todo.rdate,rec_name",0,Name,Nom,0
+field,"calendar.todo.rdate,todo",0,Todo,Tâche,0
+field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
+field,"calendar.todo.rrule,rec_name",0,Name,Nom,0
+field,"calendar.todo.rrule,todo",0,Todo,Tâche,0
help,"calendar.todo,uuid",0,Universally Unique Identifier,Identificateur unique universel,0
+model,"calendar.todo,name",0,Todo,Tâche,0
+model,"calendar.todo-calendar.category,name",0,Todo - Category,Todo - Catégorie,0
model,"calendar.todo.alarm,name",0,Alarm,Alarme,0
model,"calendar.todo.attendee,name",0,Attendee,Participant,0
-model,"calendar.todo-calendar.category,name",0,Todo - Category,Todo - Catégorie,0
model,"calendar.todo.exdate,name",0,Exception Date,Date d'exception,0
model,"calendar.todo.exrule,name",0,Exception Rule,Règle d'exception,0
-model,"calendar.todo,name",0,Todo,Tâche,0
model,"calendar.todo.rdate,name",0,Todo Recurrence Date,Date de récurrence,0
model,"calendar.todo.rrule,name",0,Recurrence Rule,Règle de récurrence,0
model,"ir.action,name",act_todo_form,Todos,Tâches,0
model,"ir.action,name",act_todo_form2,Todos,Tâches,0
model,"ir.action,name",act_todo_form3,Todos,Tâches,0
-model,"ir.ui.menu,name",menu_todo_form2,New Todo,Nouvelle tâche,0
model,"ir.ui.menu,name",menu_todo_form,Todos,Tâches,0
+model,"ir.ui.menu,name",menu_todo_form2,New Todo,Nouvelle tâche,0
selection,"calendar.todo,classification",0,Confidential,Confidentiel,0
selection,"calendar.todo,classification",0,Private,Privé,0
selection,"calendar.todo,classification",0,Public,Publique,0
diff --git a/tests/test_calendar_todo.py b/tests/test_calendar_todo.py
index dc39509..16ecb7b 100644
--- a/tests/test_calendar_todo.py
+++ b/tests/test_calendar_todo.py
@@ -25,7 +25,7 @@ class CalendarTodoTestCase(unittest.TestCase):
'''
Test views.
'''
- self.assertRaises(Exception, test_view('calendar_todo'))
+ test_view('calendar_todo')
def suite():
suite = trytond.tests.test_tryton.suite()
diff --git a/todo.py b/todo.py
index d3e188b..1dfe1bd 100644
--- a/todo.py
+++ b/todo.py
@@ -1,17 +1,21 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from trytond.model import ModelSQL, ModelView, fields
-from trytond.tools import reduce_ids
-from trytond.backend import TableHandler
-from trytond.pyson import Not, Equal, Eval, If, Bool, In
+from __future__ import with_statement
import uuid
import vobject
import dateutil.tz
-tzlocal = dateutil.tz.tzlocal()
-tzutc = dateutil.tz.tzutc()
import pytz
import datetime
import xml.dom.minidom
+from trytond.model import ModelSQL, ModelView, fields
+from trytond.tools import reduce_ids
+from trytond.backend import TableHandler
+from trytond.pyson import Not, Equal, Eval, If, Bool, In
+from trytond.transaction import Transaction
+
+tzlocal = dateutil.tz.tzlocal()
+tzutc = dateutil.tz.tzutc()
+
domimpl = xml.dom.minidom.getDOMImplementation()
@@ -119,35 +123,36 @@ class Todo(ModelSQL, ModelView):
'invalid_recurrence': 'Recurrence can not be recurrent!',
})
- def init(self, cursor, module_name):
+ def init(self, module_name):
# Migrate from 1.4: remove classification_public
model_data_obj = self.pool.get('ir.model.data')
rule_obj = self.pool.get('ir.rule')
- model_data_ids = model_data_obj.search(cursor, 0, [
- ('fs_id', '=', 'rule_group_read_todo_line3'),
- ('module', '=', module_name),
- ('inherit', '=', False),
- ], limit=1)
- if model_data_ids:
- model_data = model_data_obj.browse(cursor, 0, model_data_ids[0])
- rule_obj.delete(cursor, 0, model_data.db_id)
- return super(Todo, self).init(cursor, module_name)
-
- def default_uuid(self, cursor, user, context=None):
+ with Transaction().set_user(0):
+ model_data_ids = model_data_obj.search([
+ ('fs_id', '=', 'rule_group_read_todo_line3'),
+ ('module', '=', module_name),
+ ('inherit', '=', False),
+ ], limit=1)
+ if model_data_ids:
+ model_data = model_data_obj.browse(model_data_ids[0])
+ rule_obj.delete(model_data.db_id)
+ return super(Todo, self).init(module_name)
+
+ def default_uuid(self):
return str(uuid.uuid4())
- def default_sequence(self, cursor, user, context=None):
+ def default_sequence(self):
return 0
- def default_classification(self, cursor, user, context=None):
+ def default_classification(self):
return 'public'
- def default_timezone(self, cursor, user, context=None):
+ def default_timezone(self):
user_obj = self.pool.get('res.user')
- user_ = user_obj.browse(cursor, user, user, context=context)
- return user_.timezone
+ user = user_obj.browse(Transaction().user)
+ return user.timezone
- def on_change_status(self, cursor, user, vals, context=None):
+ def on_change_status(self, vals):
res = {}
if 'status' not in vals:
return res
@@ -158,14 +163,14 @@ class Todo(ModelSQL, ModelView):
return res
- def timezones(self, cursor, user, context=None):
+ def timezones(self):
return [(x, x) for x in pytz.common_timezones] + [('', '')]
- def get_calendar_field(self, cursor, user, ids, name, context=None):
+ def get_calendar_field(self, ids, name):
assert name in ('calendar_owner', 'calendar_read_users',
'calendar_write_users'), 'Invalid name'
res = {}
- for todo in self.browse(cursor, user, ids, context=context):
+ for todo in self.browse(ids):
name = name[9:]
if name in ('read_users', 'write_users'):
res[todo.id] = [x.id for x in todo.calendar[name]]
@@ -173,14 +178,14 @@ class Todo(ModelSQL, ModelView):
res[todo.id] = todo.calendar[name].id
return res
- def search_calendar_field(self, cursor, user, name, clause, context=None):
+ def search_calendar_field(self, name, clause):
return [('calendar.' + name[9:],) + clause[1:]]
- def check_recurrence(self, cursor, user, ids):
+ def check_recurrence(self, ids):
'''
Check the recurrence is not recurrent.
'''
- for todo in self.browse(cursor, user, ids):
+ for todo in self.browse(ids):
if not todo.parent:
continue
if todo.rdates \
@@ -191,12 +196,12 @@ class Todo(ModelSQL, ModelView):
return False
return True
- def create(self, cursor, user, values, context=None):
+ def create(self, values):
calendar_obj = self.pool.get('calendar.calendar')
collection_obj = self.pool.get('webdav.collection')
- res = super(Todo, self).create(cursor, user, values, context=context)
- todo = self.browse(cursor, user, res, context=context)
+ res = super(Todo, self).create(values)
+ todo = self.browse(res)
if todo.calendar.owner \
and (todo.organizer == todo.calendar.owner.email \
or (todo.parent \
@@ -210,38 +215,38 @@ class Todo(ModelSQL, ModelView):
if x.status != 'declined'
and x.email != todo.parent.organizer]
if attendee_emails:
- calendar_ids = calendar_obj.search(cursor, 0, [
- ('owner.email', 'in', attendee_emails),
- ], context=context)
- if not todo.recurrence:
- for calendar_id in calendar_ids:
- new_id = self.copy(cursor, 0, todo.id, default={
- 'calendar': calendar_id,
- 'occurences': False,
- }, context=context)
- for occurence in todo.occurences:
- self.copy(cursor, 0, occurence.id, default={
+ with Transaction().set_user(0):
+ calendar_ids = calendar_obj.search([
+ ('owner.email', 'in', attendee_emails),
+ ])
+ if not todo.recurrence:
+ for calendar_id in calendar_ids:
+ new_id = self.copy(todo.id, default={
'calendar': calendar_id,
- 'parent': new_id,
- }, context=context)
- else:
- parent_ids = self.search(cursor, 0, [
- ('uuid', '=', todo.uuid),
- ('calendar.owner.email', 'in', attendee_emails),
- ('id', '!=', todo.id),
- ('recurrence', '=', False),
- ], context=context)
- for parent in self.browse(cursor, 0, parent_ids,
- context=context):
- self.copy(cursor, 0, todo.id, default={
- 'calendar': parent.calendar.id,
- 'parent': parent.id,
- }, context=context)
+ 'occurences': False,
+ })
+ for occurence in todo.occurences:
+ self.copy(occurence.id, default={
+ 'calendar': calendar_id,
+ 'parent': new_id,
+ })
+ else:
+ parent_ids = self.search([
+ ('uuid', '=', todo.uuid),
+ ('calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', todo.id),
+ ('recurrence', '=', False),
+ ])
+ for parent in self.browse(parent_ids):
+ self.copy(todo.id, default={
+ 'calendar': parent.calendar.id,
+ 'parent': parent.id,
+ })
# Restart the cache for todo
- collection_obj.todo(cursor.dbname)
+ collection_obj.todo.reset()
return res
- def _todo2update(self, cursor, user, todo, context=None):
+ def _todo2update(self, todo):
rdate_obj = self.pool.get('calendar.todo.rdate')
exdate_obj = self.pool.get('calendar.todo.exdate')
rrule_obj = self.pool.get('calendar.todo.rrule')
@@ -258,32 +263,33 @@ class Todo(ModelSQL, ModelView):
res['organizer'] = todo.organizer
res['rdates'] = [('delete_all',)]
for rdate in todo.rdates:
- vals = rdate_obj._date2update(cursor, user, rdate, context=context)
+ vals = rdate_obj._date2update(rdate)
res['rdates'].append(('create', vals))
res['exdates'] = [('delete_all',)]
for exdate in todo.exdates:
- vals = exdate_obj._date2update(cursor, user, exdate, context=context)
+ vals = exdate_obj._date2update(exdate)
res['exdates'].append(('create', vals))
res['rrules'] = [('delete_all',)]
for rrule in todo.rrules:
- vals = rrule_obj._rule2update(cursor, user, rrule, context=context)
+ vals = rrule_obj._rule2update(rrule)
res['rrules'].append(('create', vals))
res['exrules'] = [('delete_all',)]
for exrule in todo.exrules:
- vals = exrule_obj._rule2update(cursor, user, exrule, context=context)
+ vals = exrule_obj._rule2update(exrule)
res['exrules'].append(('create', vals))
return res
- def write(self, cursor, user, ids, values, context=None):
+ def write(self, ids, values):
calendar_obj = self.pool.get('calendar.calendar')
collection_obj = self.pool.get('webdav.collection')
+ cursor = Transaction().cursor
+
values = values.copy()
if 'sequence' in values:
del values['sequence']
- res = super(Todo, self).write(cursor, user, ids, values,
- context=context)
+ res = super(Todo, self).write(ids, values)
if isinstance(ids, (int, long)):
ids = [ids]
@@ -295,7 +301,7 @@ class Todo(ModelSQL, ModelView):
'SET sequence = sequence + 1 ' \
'WHERE ' + red_sql, red_ids)
- for todo in self.browse(cursor, user, ids, context=context):
+ for todo in self.browse(ids):
if todo.calendar.owner \
and (todo.organizer == todo.calendar.owner.email \
or (todo.parent \
@@ -309,57 +315,57 @@ class Todo(ModelSQL, ModelView):
if x.status != 'declined'
and x.email != todo.parent.organizer]
if attendee_emails:
- todo_ids = self.search(cursor, 0, [
- ('uuid', '=', todo.uuid),
- ('calendar.owner.email', 'in', attendee_emails),
- ('id', '!=', todo.id),
- ('recurrence', '=', todo.recurrence or False),
- ], context=context)
- for todo2 in self.browse(cursor, user, todo_ids,
- context=context):
+ with Transaction().set_user(0):
+ todo_ids = self.search([
+ ('uuid', '=', todo.uuid),
+ ('calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', todo.id),
+ ('recurrence', '=', todo.recurrence or False),
+ ])
+ for todo2 in self.browse(todo_ids):
if todo2.calendar.owner.email in attendee_emails:
attendee_emails.remove(todo2.calendar.owner.email)
- self.write(cursor, 0, todo_ids, self._todo2update(
- cursor, user, todo, context=context), context=context)
+ with Transaction().set_user(0):
+ self.write(todo_ids, self._todo2update(todo))
if attendee_emails:
- calendar_ids = calendar_obj.search(cursor, 0, [
- ('owner.email', 'in', attendee_emails),
- ], context=context)
- if not todo.recurrence:
- for calendar_id in calendar_ids:
- new_id = self.copy(cursor, 0, todo.id, default={
- 'calendar': calendar_id,
- 'occurences': False,
- }, context=context)
- for occurence in todo.occurences:
- self.copy(cursor, 0, occurence.id, default={
+ with Transaction().set_user(0):
+ calendar_ids = calendar_obj.search([
+ ('owner.email', 'in', attendee_emails),
+ ])
+ if not todo.recurrence:
+ for calendar_id in calendar_ids:
+ new_id = self.copy(todo.id, default={
'calendar': calendar_id,
- 'parent': new_id,
- }, context=context)
- else:
- parent_ids = self.search(cursor, 0, [
- ('uuid', '=', todo.uuid),
- ('calendar.owner.email', 'in', attendee_emails),
- ('id', '!=', todo.id),
- ('recurrence', '=', False),
- ], context=context)
- for parent in self.browse(cursor, 0, parent_ids,
- context=context):
- self.copy(cursor, 0, todo.id, default={
- 'calendar': parent.calendar.id,
- 'parent': parent.id,
- }, context=context)
+ 'occurences': False,
+ })
+ for occurence in todo.occurences:
+ self.copy(occurence.id, default={
+ 'calendar': calendar_id,
+ 'parent': new_id,
+ })
+ else:
+ parent_ids = self.search([
+ ('uuid', '=', todo.uuid),
+ ('calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', todo.id),
+ ('recurrence', '=', False),
+ ])
+ for parent in self.browse(parent_ids):
+ self.copy(todo.id, default={
+ 'calendar': parent.calendar.id,
+ 'parent': parent.id,
+ })
# Restart the cache for todo
- collection_obj.todo(cursor.dbname)
+ collection_obj.todo.reset()
return res
- def delete(self, cursor, user, ids, context=None):
+ def delete(self, ids):
attendee_obj = self.pool.get('calendar.todo.attendee')
collection_obj = self.pool.get('webdav.collection')
if isinstance(ids, (int, long)):
ids = [ids]
- for todo in self.browse(cursor, user, ids, context=context):
+ for todo in self.browse(ids):
if todo.calendar.owner \
and (todo.organizer == todo.calendar.owner.email \
or (todo.parent \
@@ -371,50 +377,47 @@ class Todo(ModelSQL, ModelView):
attendee_emails = [x.email for x in todo.parent.attendees
if x.email != todo.parent.organizer]
if attendee_emails:
- todo_ids = self.search(cursor, 0, [
- ('uuid', '=', todo.uuid),
- ('calendar.owner.email', 'in', attendee_emails),
- ('id', '!=', todo.id),
- ('recurrence', '=', todo.recurrence or False),
- ], context=context)
- self.delete(cursor, 0, todo_ids, context=context)
+ with Transaction().set_user(0):
+ todo_ids = self.search([
+ ('uuid', '=', todo.uuid),
+ ('calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', todo.id),
+ ('recurrence', '=', todo.recurrence or False),
+ ])
+ self.delete(todo_ids)
elif todo.organizer \
or (todo.parent and todo.parent.organizer):
if todo.organizer:
organizer = todo.organizer
else:
organizer = todo.parent.organizer
- todo_ids = self.search(cursor, 0, [
- ('uuid', '=', todo.uuid),
- ('calendar.owner.email', '=', organizer),
- ('id', '!=', todo.id),
- ('recurrence', '=', todo.recurrence or False),
- ], context=context, limit=1)
- if todo_ids:
- todo2 = self.browse(cursor, 0, todo_ids[0],
- context=context)
- for attendee in todo2.attendees:
- if attendee.email == todo.calendar.owner.email:
- attendee_obj.write(cursor, 0, attendee.id, {
- 'status': 'declined',
- }, context=context)
- res = super(Todo, self).delete(cursor, user, ids, context=context)
+ with Transaction().set_user(0):
+ todo_ids = self.search([
+ ('uuid', '=', todo.uuid),
+ ('calendar.owner.email', '=', organizer),
+ ('id', '!=', todo.id),
+ ('recurrence', '=', todo.recurrence or False),
+ ], limit=1)
+ if todo_ids:
+ todo2 = self.browse(todo_ids[0])
+ for attendee in todo2.attendees:
+ if attendee.email == todo.calendar.owner.email:
+ attendee_obj.write(attendee.id, {
+ 'status': 'declined',
+ })
+ res = super(Todo, self).delete(ids)
# Restart the cache for todo
- collection_obj.todo(cursor.dbname)
+ collection_obj.todo.reset()
return res
- def ical2values(self, cursor, user, todo_id, ical, calendar_id,
- vtodo=None, context=None):
+ def ical2values(self, todo_id, ical, calendar_id, vtodo=None):
'''
Convert iCalendar to values for create or write
- :param cursor: the database cursor
- :param user: the user id
:param todo_id: the todo id for write or None for create
:param ical: a ical instance of vobject
:param calendar_id: the calendar id of the todo
:param vtodo: the vtodo of the ical to use if None use the first one
- :param context: the context
:return: a dictionary with values
'''
category_obj = self.pool.get('calendar.category')
@@ -438,7 +441,7 @@ class Todo(ModelSQL, ModelView):
todo = None
if todo_id:
- todo = self.browse(cursor, user, todo_id, context=context)
+ todo = self.browse(todo_id)
res = {}
if not todo:
if hasattr(vtodo, 'uid'):
@@ -505,19 +508,18 @@ class Todo(ModelSQL, ModelView):
else:
res['status'] = ''
if hasattr(vtodo, 'categories'):
- category_ids = category_obj.search(cursor, user, [
+ category_ids = category_obj.search([
('name', 'in', [x for x in vtodo.categories.value]),
- ], context=context)
- categories = category_obj.browse(cursor, user, category_ids,
- context=context)
+ ])
+ categories = category_obj.browse(category_ids)
category_names2ids = {}
for category in categories:
category_names2ids[category.name] = category.id
for category in vtodo.categories.value:
if category not in category_names2ids:
- category_ids.append(category_obj.create(cursor, user, {
+ category_ids.append(category_obj.create({
'name': category,
- }, context=context))
+ }))
res['categories'] = [('set', category_ids)]
else:
res['categories'] = [('unlink_all',)]
@@ -530,13 +532,13 @@ class Todo(ModelSQL, ModelView):
else:
res['classification'] = 'public'
if hasattr(vtodo, 'location'):
- location_ids = location_obj.search(cursor, user, [
+ location_ids = location_obj.search([
('name', '=', vtodo.location.value),
- ], limit=1, context=context)
+ ], limit=1)
if not location_ids:
- location_id = location_obj.create(cursor, user, {
+ location_id = location_obj.create({
'name': vtodo.location.value,
- }, context=context)
+ })
else:
location_id = location_ids[0]
res['location'] = location_id
@@ -561,8 +563,7 @@ class Todo(ModelSQL, ModelView):
if hasattr(vtodo, 'attendee'):
while vtodo.attendee_list:
attendee = vtodo.attendee_list.pop()
- vals = attendee_obj.attendee2values(cursor, user, attendee,
- context=context)
+ vals = attendee_obj.attendee2values(attendee)
if vals['email'] in attendees_todel:
res['attendees'].append(('write',
attendees_todel[vals['email']], vals))
@@ -578,8 +579,7 @@ class Todo(ModelSQL, ModelView):
while vtodo.rdate_list:
rdate = vtodo.rdate_list.pop()
for date in rdate.value:
- vals = rdate_obj.date2values(cursor, user, date,
- context=context)
+ vals = rdate_obj.date2values(date)
res['rdates'].append(('create', vals))
res['exdates'] = []
@@ -589,8 +589,7 @@ class Todo(ModelSQL, ModelView):
while vtodo.exdate_list:
exdate = vtodo.exdate_list.pop()
for date in exdate.value:
- vals = exdate_obj.date2values(cursor, user, date,
- context=context)
+ vals = exdate_obj.date2values(date)
res['exdates'].append(('create', vals))
res['rrules'] = []
@@ -599,8 +598,7 @@ class Todo(ModelSQL, ModelView):
if hasattr(vtodo, 'rrule'):
while vtodo.rrule_list:
rrule = vtodo.rrule_list.pop()
- vals = rrule_obj.rule2values(cursor, user, rrule,
- context=context)
+ vals = rrule_obj.rule2values(rrule)
res['rrules'].append(('create', vals))
res['exrules'] = []
@@ -609,8 +607,7 @@ class Todo(ModelSQL, ModelView):
if hasattr(vtodo, 'exrule'):
while vtodo.exrule_list:
exrule = vtodo.exrule_list.pop()
- vals = exrule_obj.rule2values(cursor, user, exrule,
- context=context)
+ vals = exrule_obj.rule2values(exrule)
res['exrules'].append(('create', vals))
if todo:
@@ -620,8 +617,7 @@ class Todo(ModelSQL, ModelView):
res.setdefault('alarms', [])
while vtodo.valarm_list:
valarm = vtodo.valarm_list.pop()
- vals = alarm_obj.valarm2values(cursor, user, valarm,
- context=context)
+ vals = alarm_obj.valarm2values(valarm)
res['alarms'].append(('create', vals))
if hasattr(ical, 'vtimezone'):
@@ -645,8 +641,7 @@ class Todo(ModelSQL, ModelView):
== vtodo.recurrence_id.value:
todo_id = occurence.id
occurences_todel.remove(occurence.id)
- vals = self.ical2values(cursor, user, todo_id, ical,
- calendar_id, vtodo=vtodo, context=context)
+ vals = self.ical2values(todo_id, ical, calendar_id, vtodo=vtodo)
if todo:
vals['uuid'] = todo.uuid
else:
@@ -661,17 +656,12 @@ class Todo(ModelSQL, ModelView):
res['occurences'].append(('delete', occurences_todel))
return res
- def todo2ical(self, cursor, user, todo, context=None):
+ def todo2ical(self, todo):
'''
Return an iCalendar instance of vobject for todo
- :param cursor: the database cursor
- :param user: the user id
:param todo: a BrowseRecord of calendar.todo
or a calendar.todo id
- :param calendar: a BrowseRecord of calendar.calendar
- or a calendar.calendar id
- :param context: the context
:return: an iCalendar instance of vobject
'''
user_obj = self.pool.get('res.user')
@@ -683,13 +673,13 @@ class Todo(ModelSQL, ModelView):
exrule_obj = self.pool.get('calendar.todo.exrule')
if isinstance(todo, (int, long)):
- todo = self.browse(cursor, user, todo, context=context)
+ todo = self.browse(todo)
- user_ = user_obj.browse(cursor, user, user, context=context)
+ user = user_obj.browse(Transaction().user)
if todo.timezone:
tztodo = pytz.timezone(todo.timezone)
- elif user_.timezone:
- tztodo = pytz.timezone(user_.timezone)
+ elif user.timezone:
+ tztodo = pytz.timezone(user.timezone)
else:
tztodo = tzlocal
@@ -800,42 +790,36 @@ class Todo(ModelSQL, ModelView):
vtodo.attendee_list = []
for attendee in todo.attendees:
- vtodo.attendee_list.append(attendee_obj.attendee2attendee(
- cursor, user, attendee, context=context))
+ vtodo.attendee_list.append(attendee_obj.attendee2attendee(attendee))
if todo.rdates:
vtodo.add('rdate')
vtodo.rdate.value = []
for rdate in todo.rdates:
- vtodo.rdate.value.append(rdate_obj.date2date(cursor, user,
- rdate, context=context))
+ vtodo.rdate.value.append(rdate_obj.date2date(rdate))
if todo.exdates:
vtodo.add('exdate')
vtodo.exdate.value = []
for exdate in todo.exdates:
- vtodo.exdate.value.append(exdate_obj.date2date(cursor, user,
- exdate, context=context))
+ vtodo.exdate.value.append(exdate_obj.date2date(exdate))
if todo.rrules:
for rrule in todo.rrules:
- vtodo.add('rrule').value = rrule_obj.rule2rule(cursor, user,
- rrule, context=context)
+ vtodo.add('rrule').value = rrule_obj.rule2rule(rrule)
if todo.exrules:
for exrule in todo.exrules:
- vtodo.add('exrule').value = exrule_obj.rule2rule(cursor, user,
- exrule, context=context)
+ vtodo.add('exrule').value = exrule_obj.rule2rule(exrule)
vtodo.valarm_list = []
for alarm in todo.alarms:
- valarm = alarm_obj.alarm2valarm(cursor, user, alarm,
- context=context)
+ valarm = alarm_obj.alarm2valarm(alarm)
if valarm:
vtodo.valarm_list.append(valarm)
for occurence in todo.occurences:
- rical = self.todo2ical(cursor, user, occurence, context=context)
+ rical = self.todo2ical(occurence)
ical.vtodo_list.append(rical.vtodo)
return ical
@@ -867,64 +851,62 @@ class TodoRDate(ModelSQL, ModelView):
todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
select=1, required=True)
- def init(self, cursor, module_name):
+ def init(self, module_name):
+ cursor = Transaction().cursor
# Migration from 1.4: calendar_rdate renamed to calendar_date
table = TableHandler(cursor, self, module_name)
old_column = 'calendar_rdate'
if table.column_exist(old_column):
table.column_rename(old_column, 'calendar_date')
- return super(TodoRDate, self).init(cursor, module_name)
+ return super(TodoRDate, self).init(module_name)
- def create(self, cursor, user, values, context=None):
+ def create(self, values):
todo_obj = self.pool.get('calendar.todo')
if values.get('todo'):
# Update write_date of todo
- todo_obj.write(cursor, user, values['todo'], {}, context=context)
- return super(TodoRDate, self).create(cursor, user, values,
- context=context)
+ todo_obj.write(values['todo'], {})
+ return super(TodoRDate, self).create(values)
- def write(self, cursor, user, ids, values, context=None):
+ def write(self, ids, values):
todo_obj = self.pool.get('calendar.todo')
if isinstance(ids, (int, long)):
ids = [ids]
- todo_ids = [x.todo.id for x in self.browse(cursor, user, ids,
- context=context)]
+ todo_ids = [x.todo.id for x in self.browse(ids)]
if values.get('todo'):
todo_ids.append(values['todo'])
if todo_ids:
# Update write_date of todo
- todo_obj.write(cursor, user, todo_ids, {}, context=context)
- return super(TodoRDate, self).write(cursor, user, ids, values,
- context=context)
+ todo_obj.write(todo_ids, {})
+ return super(TodoRDate, self).write(ids, values)
- def delete(self, cursor, user, ids, context=None):
+ def delete(self, ids):
todo_obj = self.pool.get('calendar.todo')
rdate_obj = self.pool.get('calendar.date')
if isinstance(ids, (int, long)):
ids = [ids]
- todo_rdates = self.browse(cursor, user, ids, context=context)
+ todo_rdates = self.browse(ids)
rdate_ids = [a.calendar_date.id for a in todo_rdates]
todo_ids = [x.todo.id for x in todo_rdates]
if todo_ids:
# Update write_date of todo
- todo_obj.write(cursor, user, todo_ids, {}, context=context)
- res = super(TodoRDate, self).delete(cursor, user, ids, context=context)
+ todo_obj.write(todo_ids, {})
+ res = super(TodoRDate, self).delete(ids)
if rdate_ids:
- rdate_obj.delete(cursor, user, rdate_ids, context=context)
+ rdate_obj.delete(rdate_ids)
return res
- def _date2update(self, cursor, user, date, context=None):
+ def _date2update(self, date):
date_obj = self.pool.get('calendar.date')
- return date_obj._date2update(cursor, user, date, context=context)
+ return date_obj._date2update(date)
- def date2values(self, cursor, user, date, context=None):
+ def date2values(self, date):
date_obj = self.pool.get('calendar.date')
- return date_obj.date2values(cursor, user, date, context=context)
+ return date_obj.date2values(date)
- def date2date(self, cursor, user, date, context=None):
+ def date2date(self, date):
date_obj = self.pool.get('calendar.date')
- return date_obj.date2date(cursor, user, date, context=context)
+ return date_obj.date2date(date)
TodoRDate()
@@ -941,53 +923,52 @@ class TodoRRule(ModelSQL, ModelView):
todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
select=1, required=True)
- def create(self, cursor, user, values, context=None):
+ def create(self, values):
todo_obj = self.pool.get('calendar.todo')
if values.get('todo'):
# Update write_date of todo
- todo_obj.write(cursor, user, values['todo'], {}, context=context)
- return super(TodoRRule, self).create(cursor, user, values, context=context)
+ todo_obj.write(values['todo'], {})
+ return super(TodoRRule, self).create(values)
- def write(self, cursor, user, ids, values, context=None):
+ def write(self, ids, values):
todo_obj = self.pool.get('calendar.todo')
if isinstance(ids, (int, long)):
ids = [ids]
- todo_ids = [x.todo.id for x in self.browse(cursor, user, ids,
- context=context)]
+ todo_ids = [x.todo.id for x in self.browse(ids)]
if values.get('todo'):
todo_ids.append(values['todo'])
if todo_ids:
# Update write_date of todo
- todo_obj.write(cursor, user, todo_ids, {}, context=context)
- return super(TodoRRule, self).write(cursor, user, ids, values, context=context)
+ todo_obj.write(todo_ids, {})
+ return super(TodoRRule, self).write(ids, values)
- def delete(self, cursor, user, ids, context=None):
+ def delete(self, ids):
todo_obj = self.pool.get('calendar.todo')
rrule_obj = self.pool.get('calendar.rrule')
if isinstance(ids, (int, long)):
ids = [ids]
- todo_rrules = self.browse(cursor, user, ids, context=context)
+ todo_rrules = self.browse(ids)
rrule_ids = [a.calendar_rrule.id for a in todo_rrules]
todo_ids = [x.todo.id for x in todo_rrules]
if todo_ids:
# Update write_date of todo
- todo_obj.write(cursor, user, todo_ids, {}, context=context)
- res = super(TodoRRule, self).delete(cursor, user, ids, context=context)
+ todo_obj.write(todo_ids, {})
+ res = super(TodoRRule, self).delete(ids)
if rrule_ids:
- rrule_obj.delete(cursor, user, rrule_ids, context=context)
+ rrule_obj.delete(rrule_ids)
return res
- def _rule2update(self, cursor, user, rule, context=None):
+ def _rule2update(self, rule):
rule_obj = self.pool.get('calendar.rrule')
- return rule_obj._rule2update(cursor, user, rule, context=context)
+ return rule_obj._rule2update(rule)
- def rule2values(self, cursor, user, rule, context=None):
+ def rule2values(self, rule):
rule_obj = self.pool.get('calendar.rrule')
- return rule_obj.rule2values(cursor, user, rule, context=context)
+ return rule_obj.rule2values(rule)
- def rule2rule(self, cursor, user, rule, context=None):
+ def rule2rule(self, rule):
rule_obj = self.pool.get('calendar.rrule')
- return rule_obj.rule2rule(cursor, user, rule, context=context)
+ return rule_obj.rule2rule(rule)
TodoRRule()
@@ -1019,15 +1000,14 @@ class TodoAttendee(ModelSQL, ModelView):
todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
required=True, select=1)
- def create(self, cursor, user, values, context=None):
+ def create(self, values):
todo_obj = self.pool.get('calendar.todo')
if values.get('todo'):
# Update write_date of todo
- todo_obj.write(cursor, user, values['todo'], {}, context=context)
- res = super(TodoAttendee, self).create(cursor, user, values,
- context=context)
- attendee = self.browse(cursor, user, res, context=context)
+ todo_obj.write(values['todo'], {})
+ res = super(TodoAttendee, self).create(values)
+ attendee = self.browse(res)
todo = attendee.todo
if todo.calendar.owner \
and (todo.organizer == todo.calendar.owner.email \
@@ -1040,38 +1020,37 @@ class TodoAttendee(ModelSQL, ModelView):
attendee_emails = [x.email for x in todo.parent.attendees
if x.email != todo.parent.organizer]
if attendee_emails:
- todo_ids = todo_obj.search(cursor, 0, [
- ('uuid', '=', todo.uuid),
- ('calendar.owner.email', 'in', attendee_emails),
- ('id', '!=', todo.id),
- ('recurrence', '=', todo.recurrence or False),
- ], context=context)
- for todo_id in todo_ids:
- self.copy(cursor, 0, res, default={
- 'todo': todo_id,
- }, context=context)
+ with Transaction().set_user(0):
+ todo_ids = todo_obj.search([
+ ('uuid', '=', todo.uuid),
+ ('calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', todo.id),
+ ('recurrence', '=', todo.recurrence or False),
+ ])
+ for todo_id in todo_ids:
+ self.copy(res, default={
+ 'todo': todo_id,
+ })
return res
- def write(self, cursor, user, ids, values, context=None):
+ def write(self, ids, values):
todo_obj = self.pool.get('calendar.todo')
if isinstance(ids, (int, long)):
ids = [ids]
- todo_ids = [x.todo.id for x in self.browse(cursor, user, ids,
- context=context)]
+ todo_ids = [x.todo.id for x in self.browse(ids)]
if values.get('todo'):
todo_ids.append(values['todo'])
if todo_ids:
# Update write_date of todo
- todo_obj.write(cursor, user, todo_ids, {}, context=context)
+ todo_obj.write(todo_ids, {})
if 'email' in values:
values = values.copy()
del values['email']
- res = super(TodoAttendee, self).write(cursor, user, ids, values,
- context=context)
- attendees = self.browse(cursor, user, ids, context=context)
+ res = super(TodoAttendee, self).write(ids, values)
+ attendees = self.browse(ids)
for attendee in attendees:
todo = attendee.todo
if todo.calendar.owner \
@@ -1085,32 +1064,34 @@ class TodoAttendee(ModelSQL, ModelView):
attendee_emails = [x.email for x in todo.parent.attendees
if x.email != todo.parent.organizer]
if attendee_emails:
- attendee_ids = self.search(cursor, 0, [
- ('todo.uuid', '=', todo.uuid),
- ('todo.calendar.owner.email', 'in', attendee_emails),
- ('id', '!=', attendee.id),
- ('todo.recurrence', '=', todo.recurrence or False),
- ('email', '=', attendee.email),
- ], context=context)
- self.write(cursor, 0, attendee_ids, self._attendee2update(
- cursor, user, attendee, context=context), context=context)
+ with Transaction().set_user(0):
+ attendee_ids = self.search([
+ ('todo.uuid', '=', todo.uuid),
+ ('todo.calendar.owner.email', 'in',
+ attendee_emails),
+ ('id', '!=', attendee.id),
+ ('todo.recurrence', '=', todo.recurrence or False),
+ ('email', '=', attendee.email),
+ ])
+ self.write(attendee_ids, self._attendee2update(
+ attendee))
return res
- def delete(self, cursor, user, ids, context=None):
+ def delete(self, ids):
todo_obj = self.pool.get('calendar.todo')
attendee_obj = self.pool.get('calendar.attendee')
if isinstance(ids, (int, long)):
ids = [ids]
- todo_attendees = self.browse(cursor, user, ids, context=context)
+ todo_attendees = self.browse(ids)
calendar_attendee_ids = [a.calendar_attendee.id \
for a in todo_attendees]
todo_ids = [x.todo.id for x in todo_attendees]
if todo_ids:
# Update write_date of todo
- todo_obj.write(cursor, user, todo_ids, {}, context=context)
+ todo_obj.write(todo_ids, {})
- for attendee in self.browse(cursor, user, ids, context=context):
+ for attendee in self.browse(ids):
todo = attendee.todo
if todo.calendar.owner \
and (todo.organizer == todo.calendar.owner.email \
@@ -1123,14 +1104,16 @@ class TodoAttendee(ModelSQL, ModelView):
attendee_emails = [x.email for x in todo.attendees
if x.email != todo.parent.organizer]
if attendee_emails:
- attendee_ids = self.search(cursor, 0, [
- ('todo.uuid', '=', todo.uuid),
- ('todo.calendar.owner.email', 'in', attendee_emails),
- ('id', '!=', attendee.id),
- ('todo.recurrence', '=', todo.recurrence or False),
- ('email', '=', attendee.email),
- ], context=context)
- self.delete(cursor, 0, attendee_ids, context=context)
+ with Transaction().set_user(0):
+ attendee_ids = self.search([
+ ('todo.uuid', '=', todo.uuid),
+ ('todo.calendar.owner.email', 'in',
+ attendee_emails),
+ ('id', '!=', attendee.id),
+ ('todo.recurrence', '=', todo.recurrence or False),
+ ('email', '=', attendee.email),
+ ])
+ self.delete(attendee_ids)
elif todo.calendar.organizer \
and ((todo.organizer \
or (todo.parent and todo.parent.organizer)) \
@@ -1139,24 +1122,24 @@ class TodoAttendee(ModelSQL, ModelView):
organizer = todo.organizer
else:
organizer = todo.parent.organizer
- attendee_ids = self.search(cursor, 0, [
- ('todo.uuid', '=', todo.uuid),
- ('todo.calendar.owner.email', '=', organizer),
- ('id', '!=', attendee.id),
- ('todo.recurrence', '=', todo.recurrence or False),
- ('email', '=', attendee.email),
- ], context=context)
- if attendee_ids:
- self.write(cursor, 0, attendee_ids, {
- 'status': 'declined',
- }, context=context)
- res = super(TodoAttendee, self).delete(cursor, user, ids, context=context)
+ with Transaction().set_user(0):
+ attendee_ids = self.search([
+ ('todo.uuid', '=', todo.uuid),
+ ('todo.calendar.owner.email', '=', organizer),
+ ('id', '!=', attendee.id),
+ ('todo.recurrence', '=', todo.recurrence or False),
+ ('email', '=', attendee.email),
+ ])
+ if attendee_ids:
+ self.write(attendee_ids, {
+ 'status': 'declined',
+ })
+ res = super(TodoAttendee, self).delete(ids)
if calendar_attendee_ids:
- attendee_obj.delete(cursor, user, calendar_attendee_ids,
- context=context)
+ attendee_obj.delete(calendar_attendee_ids)
return res
- def copy(self, cursor, user, ids, default=None, context=None):
+ def copy(self, ids, default=None):
attendee_obj = self.pool.get('calendar.attendee')
int_id = False
@@ -1167,30 +1150,27 @@ class TodoAttendee(ModelSQL, ModelView):
default = {}
default = default.copy()
new_ids = []
- for attendee in self.browse(cursor, user, ids, context=context):
- default['calendar_attendee'] = attendee_obj.copy(cursor, user,
- attendee.calendar_attendee.id, context=context)
- new_id = super(TodoAttendee, self).copy(cursor, user, attendee.id,
- default=default, context=context)
+ for attendee in self.browse(ids):
+ default['calendar_attendee'] = attendee_obj.copy(
+ attendee.calendar_attendee.id)
+ new_id = super(TodoAttendee, self).copy(attendee.id,
+ default=default)
new_ids.append(new_id)
if int_id:
return new_ids[0]
return new_ids
- def _attendee2update(self, cursor, user, attendee, context=None):
+ def _attendee2update(self, attendee):
attendee_obj = self.pool.get('calendar.attendee')
- return attendee_obj._attendee2update(cursor, user, attendee,
- context=context)
+ return attendee_obj._attendee2update(attendee)
- def attendee2values(self, cursor, user, attendee, context=None):
+ def attendee2values(self, attendee):
attendee_obj = self.pool.get('calendar.attendee')
- return attendee_obj.attendee2values(cursor, user, attendee,
- context=context)
+ return attendee_obj.attendee2values(attendee)
- def attendee2attendee(self, cursor, user, attendee, context=None):
+ def attendee2attendee(self, attendee):
attendee_obj = self.pool.get('calendar.attendee')
- return attendee_obj.attendee2attendee(cursor, user, attendee,
- context=context)
+ return attendee_obj.attendee2attendee(attendee)
TodoAttendee()
@@ -1206,49 +1186,47 @@ class TodoAlarm(ModelSQL):
todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
required=True, select=1)
- def create(self, cursor, user, values, context=None):
+ def create(self, values):
todo_obj = self.pool.get('calendar.todo')
if values.get('todo'):
# Update write_date of todo
- todo_obj.write(cursor, user, values['todo'], {}, context=context)
- return super(TodoAlarm, self).create(cursor, user, values, context=context)
+ todo_obj.write(values['todo'], {})
+ return super(TodoAlarm, self).create(values)
- def write(self, cursor, user, ids, values, context=None):
+ def write(self, ids, values):
todo_obj = self.pool.get('calendar.todo')
if isinstance(ids, (int, long)):
ids = [ids]
- todo_ids = [x.todo.id for x in self.browse(cursor, user, ids,
- context=context)]
+ todo_ids = [x.todo.id for x in self.browse(ids)]
if values.get('todo'):
todo_ids.append(values['todo'])
if todo_ids:
# Update write_date of todo
- todo_obj.write(cursor, user, todo_ids, {}, context=context)
- return super(TodoAlarm, self).write(cursor, user, ids, values,
- context=context)
+ todo_obj.write(todo_ids, {})
+ return super(TodoAlarm, self).write(ids, values)
- def delete(self, cursor, user, ids, context=None):
+ def delete(self, ids):
todo_obj = self.pool.get('calendar.todo')
alarm_obj = self.pool.get('calendar.alarm')
if isinstance(ids, (int, long)):
ids = [ids]
- todo_alarms = self.browse(cursor, user, ids, context=context)
+ todo_alarms = self.browse(ids)
alarm_ids = [a.calendar_alarm.id for a in todo_alarms]
todo_ids = [x.todo.id for x in todo_alarms]
if todo_ids:
# Update write_date of todo
- todo_obj.write(cursor, user, todo_ids, {}, context=context)
- res = super(TodoAlarm, self).delete(cursor, user, ids, context=context)
+ todo_obj.write(todo_ids, {})
+ res = super(TodoAlarm, self).delete(ids)
if alarm_ids:
- alarm_obj.delete(cursor, user, alarm_ids, context=context)
+ alarm_obj.delete(alarm_ids)
return res
- def valarm2values(self, cursor, user, alarm, context=None):
+ def valarm2values(self, alarm):
alarm_obj = self.pool.get('calendar.alarm')
- return alarm_obj.valarm2values(cursor, user, alarm, context=context)
+ return alarm_obj.valarm2values(alarm)
- def alarm2valarm(self, cursor, user, alarm, context=None):
+ def alarm2valarm(self, alarm):
alarm_obj = self.pool.get('calendar.alarm')
- return alarm_obj.alarm2valarm(cursor, user, alarm, context=context)
+ return alarm_obj.alarm2valarm(alarm)
TodoAlarm()
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index 2333195..93cb712 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.0
Name: trytond-calendar-todo
-Version: 1.6.0
+Version: 1.8.0
Summary: Add Todo support on CalDAV
Home-page: http://www.tryton.org/
Author: B2CK
Author-email: info at b2ck.com
License: GPL-3
-Download-URL: http://downloads.tryton.org/1.6/
+Download-URL: http://downloads.tryton.org/1.8/
Description: UNKNOWN
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
diff --git a/trytond_calendar_todo.egg-info/requires.txt b/trytond_calendar_todo.egg-info/requires.txt
index 159b890..b032e9a 100644
--- a/trytond_calendar_todo.egg-info/requires.txt
+++ b/trytond_calendar_todo.egg-info/requires.txt
@@ -2,5 +2,5 @@ vobject >= 0.8.0
PyWebDAV >= 0.9.3
python-dateutil
pytz
-trytond_calendar >= 1.6, < 1.7
-trytond >= 1.6, < 1.7
\ No newline at end of file
+trytond_calendar >= 1.8, < 1.9
+trytond >= 1.8, < 1.9
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index c4fbc06..8350d45 100644
--- a/webdav.py
+++ b/webdav.py
@@ -1,10 +1,12 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from trytond.model import ModelView, ModelSQL
-from trytond.tools import Cache, reduce_ids
-from DAV.errors import DAV_NotFound, DAV_Forbidden
import vobject
import urllib
+from DAV.errors import DAV_NotFound, DAV_Forbidden
+from trytond.model import ModelView, ModelSQL
+from trytond.tools import reduce_ids
+from trytond.transaction import Transaction
+from trytond.cache import Cache
class Collection(ModelSQL, ModelView):
@@ -12,15 +14,12 @@ class Collection(ModelSQL, ModelView):
_name = "webdav.collection"
@Cache('webdav_collection.todo')
- def todo(self, cursor, user, uri, calendar_id=False, context=None):
+ def todo(self, uri, calendar_id=False):
'''
Return the todo id in the uri or False
- :param cursor: the database cursor
- :param user: the user id
:param uri: the uri
:param calendar_id: the calendar id
- :param context: the context
:return: todo id
or False if there is no todo
'''
@@ -29,26 +28,23 @@ class Collection(ModelSQL, ModelView):
if uri and uri.startswith('Calendars/'):
calendar, todo_uri = (uri[10:].split('/', 1) + [None])[0:2]
if not calendar_id:
- calendar_id = self.calendar(cursor, user, uri, context=context)
+ calendar_id = self.calendar(uri)
if not calendar_id:
return False
- todo_ids = todo_obj.search(cursor, user, [
+ todo_ids = todo_obj.search([
('calendar', '=', calendar_id),
('uuid', '=', todo_uri[:-4]),
('parent', '=', False),
- ], limit=1, context=context)
+ ], limit=1)
if todo_ids:
return todo_ids[0]
return False
- def _caldav_filter_domain_todo(self, cursor, user, filter, context=None):
+ def _caldav_filter_domain_todo(self, filter):
'''
Return a domain for caldav filter on todo
- :param cursor: the database cursor
- :param user: the user id
:param filter: the DOM Element of filter
- :param context: the context
:return: a list for domain
'''
res = []
@@ -98,36 +94,33 @@ class Collection(ModelSQL, ModelView):
if not dbname:
continue
dbname == urllib.unquote_plus(dbname)
- if dbname != cursor.database_name:
+ if dbname != Transaction().cursor.database_name:
continue
if uri:
uri = urllib.unquote_plus(uri)
- todo_id = self.todo(cursor, user, uri, context=context)
+ todo_id = self.todo(uri)
if todo_id:
ids.append(todo_id)
return [('id', 'in', ids)]
return res
- def get_childs(self, cursor, user, uri, filter=None, context=None,
- cache=None):
+ def get_childs(self, uri, filter=None, cache=None):
calendar_obj = self.pool.get('calendar.calendar')
todo_obj = self.pool.get('calendar.todo')
- res = super(Collection, self).get_childs(cursor, user, uri,
- filter=filter, context=context, cache=cache)
+ res = super(Collection, self).get_childs(uri, filter=filter,
+ cache=cache)
if uri and (uri not in ('Calendars', 'Calendars/')) and \
uri.startswith('Calendars/'):
- calendar_id = self.calendar(cursor, user, uri, context=context)
+ calendar_id = self.calendar(uri)
if calendar_id and not (uri[10:].split('/', 1) + [None])[1]:
- domain = self._caldav_filter_domain_todo(cursor, user, filter,
- context=context)
- todo_ids = todo_obj.search(cursor, user, [
+ domain = self._caldav_filter_domain_todo(filter)
+ todo_ids = todo_obj.search([
('calendar', '=', calendar_id),
domain,
- ], context=context)
- todos = todo_obj.browse(cursor, user, todo_ids,
- context=context)
+ ])
+ todos = todo_obj.browse(todo_ids)
if cache is not None:
cache.setdefault('_calendar', {})
cache['_calendar'].setdefault(todo_obj._name, {})
@@ -137,41 +130,38 @@ class Collection(ModelSQL, ModelView):
return res
- def get_resourcetype(self, cursor, user, uri, context=None, cache=None):
+ def get_resourcetype(self, uri, cache=None):
from DAV.constants import COLLECTION, OBJECT
if uri in ('Calendars', 'Calendars/'):
return COLLECTION
- calendar_id = self.calendar(cursor, user, uri, context=context)
+ calendar_id = self.calendar(uri)
if calendar_id:
if not (uri[10:].split('/', 1) + [None])[1]:
return COLLECTION
- if self.todo(cursor, user, uri, calendar_id=calendar_id,
- context=context):
+ if self.todo(uri, calendar_id=calendar_id):
return OBJECT
- elif self.calendar(cursor, user, uri, ics=True, context=context):
+ elif self.calendar(uri, ics=True):
return OBJECT
- return super(Collection, self).get_resourcetype(cursor, user, uri,
- context=context, cache=cache)
+ return super(Collection, self).get_resourcetype(uri, cache=cache)
- def get_contenttype(self, cursor, user, uri, context=None, cache=None):
- if self.todo(cursor, user, uri, context=context) \
- or self.calendar(cursor, user, uri, ics=True, context=context):
+ def get_contenttype(self, uri, cache=None):
+ if self.todo(uri) \
+ or self.calendar(uri, ics=True):
return 'text/calendar'
- return super(Collection, self).get_contenttype(cursor, user, uri,
- context=context, cache=cache)
+ return super(Collection, self).get_contenttype(uri, cache=cache)
- def get_creationdate(self, cursor, user, uri, context=None, cache=None):
+ def get_creationdate(self, uri, cache=None):
calendar_obj = self.pool.get('calendar.calendar')
todo_obj = self.pool.get('calendar.todo')
- calendar_id = self.calendar(cursor, user, uri, context=context)
+ cursor = Transaction().cursor
+
+ calendar_id = self.calendar(uri)
if not calendar_id:
- calendar_id = self.calendar(cursor, user, uri, ics=True,
- context=context)
+ calendar_id = self.calendar(uri, ics=True)
if calendar_id and (uri[10:].split('/', 1) + [None])[1]:
- todo_id = self.todo(cursor, user, uri, calendar_id=calendar_id,
- context=context)
+ todo_id = self.todo(uri, calendar_id=calendar_id)
if todo_id:
if cache is not None:
cache.setdefault('_calendar', {})
@@ -204,17 +194,17 @@ class Collection(ModelSQL, ModelView):
if res is not None:
return res
- return super(Collection, self).get_creationdate(cursor, user, uri,
- context=context, cache=cache)
+ return super(Collection, self).get_creationdate(uri, cache=cache)
- def get_lastmodified(self, cursor, user, uri, context=None, cache=None):
+ def get_lastmodified(self, uri, cache=None):
calendar_obj = self.pool.get('calendar.calendar')
todo_obj = self.pool.get('calendar.todo')
- calendar_id = self.calendar(cursor, user, uri, context=context)
+ cursor = Transaction().cursor
+
+ calendar_id = self.calendar(uri)
if calendar_id and (uri[10:].split('/', 1) + [None])[1]:
- todo_id = self.todo(cursor, user, uri, calendar_id=calendar_id,
- context=context)
+ todo_id = self.todo(uri, calendar_id=calendar_id)
if todo_id:
if cache is not None:
cache.setdefault('_calendar', {})
@@ -252,95 +242,77 @@ class Collection(ModelSQL, ModelView):
if res is not None:
return res
- return super(Collection, self).get_lastmodified(cursor, user, uri,
- context=context, cache=cache)
+ return super(Collection, self).get_lastmodified(uri, cache=cache)
- def get_data(self, cursor, user, uri, context=None, cache=None):
+ def get_data(self, uri, cache=None):
todo_obj = self.pool.get('calendar.todo')
calendar_obj = self.pool.get('calendar.calendar')
- calendar_id = self.calendar(cursor, user, uri, context=context)
+ calendar_id = self.calendar(uri)
if calendar_id:
if not (uri[10:].split('/', 1) + [None])[1]:
raise DAV_NotFound
- todo_id = self.todo(cursor, user, uri, calendar_id=calendar_id,
- context=context)
+ todo_id = self.todo(uri, calendar_id=calendar_id)
if not todo_id:
- return super(Collection, self).get_data(cursor, user, uri,
- context=context, cache=cache)
- ical = todo_obj.todo2ical(cursor, user, todo_id, context=context)
+ return super(Collection, self).get_data(uri, cache=cache)
+ ical = todo_obj.todo2ical(todo_id)
return ical.serialize()
- return super(Collection, self).get_data(cursor, user, uri,
- context=context, cache=cache)
+ return super(Collection, self).get_data(uri, cache=cache)
- def put(self, cursor, user, uri, data, content_type, context=None,
- cache=None):
+ def put(self, uri, data, content_type, cache=None):
todo_obj = self.pool.get('calendar.todo')
calendar_obj = self.pool.get('calendar.calendar')
- calendar_id = self.calendar(cursor, user, uri, context=context)
+ calendar_id = self.calendar(uri)
if calendar_id:
if not (uri[10:].split('/', 1) + [None])[1]:
raise DAV_Forbidden
- todo_id = self.todo(cursor, user, uri, calendar_id=calendar_id,
- context=context)
+ todo_id = self.todo(uri, calendar_id=calendar_id)
ical = vobject.readOne(data)
if not hasattr(ical, 'vtodo'):
- return super(Collection, self).put(cursor, user, uri, data,
- content_type, context=context)
+ return super(Collection, self).put(uri, data, content_type)
if not todo_id:
- values = todo_obj.ical2values(cursor, user, None, ical,
- calendar_id, context=context)
- todo_id = todo_obj.create(cursor, user, values,
- context=context)
- todo = todo_obj.browse(cursor, user, todo_id,
- context=context)
- calendar = calendar_obj.browse(cursor, user, calendar_id,
- context=context)
- return cursor.database_name + '/Calendars/' + calendar.name + \
- '/' + todo.uuid + '.ics'
+ values = todo_obj.ical2values(None, ical, calendar_id)
+ todo_id = todo_obj.create(values)
+ todo = todo_obj.browse(todo_id)
+ calendar = calendar_obj.browse(calendar_id)
+ return Transaction().cursor.database_name + '/Calendars/' + \
+ calendar.name + '/' + todo.uuid + '.ics'
else:
- values = todo_obj.ical2values(cursor, user, todo_id, ical,
- calendar_id, context=context)
- todo_obj.write(cursor, user, todo_id, values,
- context=context)
+ values = todo_obj.ical2values(todo_id, ical, calendar_id)
+ todo_obj.write(todo_id, values)
return
- return super(Collection, self).put(cursor, user, uri, data,
- content_type, context=context)
+ return super(Collection, self).put(uri, data, content_type)
- def rm(self, cursor, user, uri, context=None, cache=None):
+ def rm(self, uri, cache=None):
todo_obj = self.pool.get('calendar.todo')
- calendar_id = self.calendar(cursor, user, uri, context=context)
+ calendar_id = self.calendar(uri)
if calendar_id:
if not (uri[10:].split('/', 1) + [None])[1]:
raise DAV_Forbidden
- todo_id = self.todo(cursor, user, uri, calendar_id=calendar_id,
- context=context)
+ todo_id = self.todo(uri, calendar_id=calendar_id)
if todo_id:
try:
- todo_obj.delete(cursor, user, todo_id, context=context)
- except:
+ todo_obj.delete(todo_id)
+ except Exception:
raise DAV_Forbidden
return 200
- return super(Collection, self).rm(cursor, user, uri, context=context,
- cache=cache)
+ return super(Collection, self).rm(uri, cache=cache)
- def exists(self, cursor, user, uri, context=None, cache=None):
+ def exists(self, uri, cache=None):
if uri in ('Calendars', 'Calendars/'):
return 1
- calendar_id = self.calendar(cursor, user, uri, context=context)
+ calendar_id = self.calendar(uri)
if calendar_id:
if not (uri[10:].split('/', 1) + [None])[1]:
return 1
- if self.todo(cursor, user, uri, calendar_id=calendar_id,
- context=context):
+ if self.todo(uri, calendar_id=calendar_id):
return 1
- return super(Collection, self).exists(cursor, user, uri, context=context,
- cache=cache)
+ return super(Collection, self).exists(uri, cache=cache)
Collection()
commit c837f477919a757f93fc060a5273f5e74b5a5d78
Author: Daniel Baumann <daniel at debian.org>
Date: Tue Nov 2 14:26:35 2010 +0100
Switching to source format 3.0 (quilt).
diff --git a/debian/source/format b/debian/source/format
index d3827e7..163aaf8 100644
--- a/debian/source/format
+++ b/debian/source/format
@@ -1 +1 @@
-1.0
+3.0 (quilt)
commit 56434a837223ed467582f173a13fc1e9bc00419d
Author: Daniel Baumann <daniel at debian.org>
Date: Thu Sep 30 01:05:32 2010 +0200
Updating to standards version 3.9.1.
diff --git a/debian/control b/debian/control
index b96bd2d..81b8ebd 100644
--- a/debian/control
+++ b/debian/control
@@ -7,7 +7,7 @@ Uploaders:
Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Dm-Upload-Allowed: yes
Build-Depends: debhelper (>= 8), python, python-setuptools, python-support
-Standards-Version: 3.9.0
+Standards-Version: 3.9.1
Homepage: http://www.tryton.org/
Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-calendar-todo.git
Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-todo.git
commit f76cae058b735b44574d28bd496834b4482d5f58
Author: Daniel Baumann <daniel at debian.org>
Date: Thu Sep 30 01:04:04 2010 +0200
Updating to debhelper version 8.
diff --git a/debian/compat b/debian/compat
index 7f8f011..45a4fb7 100644
--- a/debian/compat
+++ b/debian/compat
@@ -1 +1 @@
-7
+8
diff --git a/debian/control b/debian/control
index 0183d3e..b96bd2d 100644
--- a/debian/control
+++ b/debian/control
@@ -6,7 +6,7 @@ Uploaders:
Daniel Baumann <daniel at debian.org>,
Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Dm-Upload-Allowed: yes
-Build-Depends: debhelper (>= 7), python, python-setuptools, python-support
+Build-Depends: debhelper (>= 8), python, python-setuptools, python-support
Standards-Version: 3.9.0
Homepage: http://www.tryton.org/
Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-calendar-todo.git
commit 22dca12380e7b845451d34282d9f0ec9ed7c390e
Author: Daniel Baumann <daniel at debian.org>
Date: Mon Jun 28 20:35:30 2010 +0200
Updating standards version to 3.9.0.
diff --git a/debian/control b/debian/control
index a349818..0183d3e 100644
--- a/debian/control
+++ b/debian/control
@@ -7,7 +7,7 @@ Uploaders:
Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Dm-Upload-Allowed: yes
Build-Depends: debhelper (>= 7), python, python-setuptools, python-support
-Standards-Version: 3.8.4
+Standards-Version: 3.9.0
Homepage: http://www.tryton.org/
Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-calendar-todo.git
Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-todo.git
commit 859524063bea33b174a8ac01098a5c6757abbae5
Author: Daniel Baumann <daniel at debian.org>
Date: Sat May 15 12:52:37 2010 +0200
Wrapping depends.
diff --git a/debian/control b/debian/control
index 710ed3c..a349818 100644
--- a/debian/control
+++ b/debian/control
@@ -16,8 +16,8 @@ Package: tryton-modules-calendar-todo
Architecture: all
Depends:
${misc:Depends}, ${python:Depends}, tryton-server (>= 1.6),
- tryton-modules-calendar (>= 1.6), python-dateutil, python-tz,
- python-vobject, python-webdav, python-pkg-resources
+ tryton-modules-calendar (>= 1.6), python-dateutil, python-tz, python-vobject,
+ python-webdav, python-pkg-resources
XB-Python-Version: ${python:Versions}
Description: Tryton Application Platform (Calendar Todo Module)
Tryton is a high-level general purpose application platform written in Python
commit aff5dac13a0de7dfdd547d038709a9f00068c2a3
Author: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Date: Thu May 13 12:00:31 2010 +0200
Releasing debian version 1.6.0-1.
diff --git a/debian/changelog b/debian/changelog
index 4dc67ce..d976e72 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,15 @@
+tryton-modules-calendar-todo (1.6.0-1) unstable; urgency=low
+
+ [ Daniel Baumann ]
+ * Adding Dm-Upload-Allowed in control in preparation for Mathias.
+
+ [ Mathias Behrle ]
+ * Merging upstream version 1.6.0.
+ * Updating copyright.
+ * Updating depends.
+
+ -- Mathias Behrle <mathiasb at mbsolutions.selfip.biz> Thu, 13 May 2010 12:00:13 +0200
+
tryton-modules-calendar-todo (1.4.2-1) unstable; urgency=low
* Updating year in copyright file.
commit 3312f262d3b3f4d60eca7b236516fa744c8f507d
Author: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Date: Thu May 13 12:00:02 2010 +0200
Updating depends.
diff --git a/debian/control b/debian/control
index 50cdcc7..710ed3c 100644
--- a/debian/control
+++ b/debian/control
@@ -15,9 +15,9 @@ Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-tod
Package: tryton-modules-calendar-todo
Architecture: all
Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server (>= 1.4),
- tryton-modules-calendar (>= 1.4), python-dateutil, python-tz,
- python-vobject (>= 0.8.1c-1), python-webdav, python-pkg-resources
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= 1.6),
+ tryton-modules-calendar (>= 1.6), python-dateutil, python-tz,
+ python-vobject, python-webdav, python-pkg-resources
XB-Python-Version: ${python:Versions}
Description: Tryton Application Platform (Calendar Todo Module)
Tryton is a high-level general purpose application platform written in Python
commit 7601af2d8eab316b5b336ada656d567c5c0d14ef
Author: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Date: Thu May 13 11:59:57 2010 +0200
Updating copyright.
diff --git a/debian/copyright b/debian/copyright
index dad4d26..489b0a2 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -5,9 +5,9 @@ Maintainer-Homepage: http://tryton.debian-maintainers.org/
Files: *
Copyright:
- (C) 2009 Cedric Krier
- (C) 2009 Bertrand Chenal
- (C) 2009 B2CK SPRL
+ (C) 2009-2010 Cedric Krier
+ (C) 2009-2010 Bertrand Chenal
+ (C) 2009-2010 B2CK SPRL
License: GPL-3+
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
commit 8a0a73fe67a842e283b466a6b4334e885ad8cc5c
Author: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Date: Thu May 13 11:29:01 2010 +0200
Merging upstream version 1.6.0.
diff --git a/CHANGELOG b/CHANGELOG
index 035fbe7..515da05 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,8 +1,7 @@
-Version 1.4.2 - 2010-02-16
-* Some bug fixes (see mercurial logs for details)
-
-Version 1.4.1 - 2009-11-23
-* Some bug fixes (see mercurial logs for details)
+Version 1.6.0 - 2010-05-10
+* Bug fixes (see mercurial logs for details)
+* Remove classification_public
+* Rename recurrences into occurences on calendar.todo
Version 1.4.0 - 2009-10-19
* Initial release
diff --git a/MANIFEST.in b/MANIFEST.in
index 23bd33a..5343ad8 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -7,5 +7,3 @@ include LICENSE
include *.xml
include *.odt
include *.csv
-include tests/*
-
diff --git a/PKG-INFO b/PKG-INFO
index 639e6a0..7987827 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.0
Name: trytond_calendar_todo
-Version: 1.4.2
+Version: 1.6.0
Summary: Add Todo support on CalDAV
Home-page: http://www.tryton.org/
Author: B2CK
Author-email: info at b2ck.com
License: GPL-3
-Download-URL: http://downloads.tryton.org/1.4/
+Download-URL: http://downloads.tryton.org/1.6/
Description: UNKNOWN
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
diff --git a/__tryton__.py b/__tryton__.py
index 5555d90..6cace63 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
'name_es_CO': 'Calendario de tareas',
'name_es_ES': 'Calendario de tareas',
'name_fr_FR' : 'Tâche Calendrier',
- 'version' : '1.4.2',
+ 'version' : '1.6.0',
'author' : 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
diff --git a/de_DE.csv b/de_DE.csv
index 1c38542..18347c8 100644
--- a/de_DE.csv
+++ b/de_DE.csv
@@ -18,12 +18,11 @@ field,"calendar.todo,calendar_read_users",0,Read Users,Benutzer mit Leseberechti
field,"calendar.todo,calendar_write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
field,"calendar.todo,categories",0,Categories,Kategorien,0
field,"calendar.todo,classification",0,Classification,Klassifizierung,0
-field,"calendar.todo,classification_public",0,Classification Public,Öffentliche Klassifizierung,0
field,"calendar.todo,completed",0,Completed,Abgeschlossen,0
field,"calendar.todo,description",0,Description,Bezeichnung,0
field,"calendar.todo,dtstart",0,Start Date,Anfangsdatum,0
field,"calendar.todo,due",0,Due Date,Fälligkeitsdatum,0
-field,"calendar.todo.exdate,calendar_rdate",0,Calendar RDate,Kalender WDatum,0
+field,"calendar.todo.exdate,calendar_date",0,Calendar Date,Kalender Datum,0
field,"calendar.todo.exdate,rec_name",0,Name,Name,0
field,"calendar.todo,exdates",0,Exception Dates,Ausnahmedaten,0
field,"calendar.todo.exdate,todo",0,Todo,Aufgabe,0
@@ -32,21 +31,21 @@ field,"calendar.todo.exrule,rec_name",0,Name,Name,0
field,"calendar.todo,exrules",0,Exception Rules,Ausnahmeregeln,0
field,"calendar.todo.exrule,todo",0,Todo,Aufgabe,0
field,"calendar.todo,location",0,Location,Ort,0
+field,"calendar.todo,occurences",0,Occurences,Ereignisse,0
field,"calendar.todo,organizer",0,Organizer,Organisator,0
field,"calendar.todo,parent",0,Parent,Übergeordnet (Aufgabe),0
field,"calendar.todo,percent_complete",0,Percent complete,% erledigt,0
-field,"calendar.todo.rdate,calendar_rdate",0,Calendar RDate,Kalender WDatum,0
+field,"calendar.todo.rdate,calendar_date",0,Calendar Date,Kalender Datum,0
field,"calendar.todo.rdate,rec_name",0,Name,Name,0
field,"calendar.todo,rdates",0,Recurrence Dates,Wiederholungsdaten,0
field,"calendar.todo.rdate,todo",0,Todo,Aufgabe,0
field,"calendar.todo,rec_name",0,Name,Name,0
field,"calendar.todo,recurrence",0,Recurrence,Wiederholung,0
-field,"calendar.todo,recurrences",0,Recurrences,Wiederholungen,0
field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
field,"calendar.todo.rrule,rec_name",0,Name,Name,0
field,"calendar.todo,rrules",0,Recurrence Rules,Wiederholungsregeln,0
field,"calendar.todo.rrule,todo",0,Todo,Aufgabe,0
-field,"calendar.todo,sequence",0,Sequence,Sequenz,0
+field,"calendar.todo,sequence",0,Sequence,Revision,0
field,"calendar.todo,status",0,Status,Status,0
field,"calendar.todo,summary",0,Summary,Zusammenfassung,0
field,"calendar.todo,timezone",0,Timezone,Zeitzone,0
@@ -59,9 +58,12 @@ model,"calendar.todo-calendar.category,name",0,Todo - Category,Aufgabe - Kategor
model,"calendar.todo.exdate,name",0,Exception Date,Ausnahmedatum,0
model,"calendar.todo.exrule,name",0,Exception Rule,Ausnahmeregel,0
model,"calendar.todo,name",0,Todo,Aufgabe,0
-model,"calendar.todo.rdate,name",0,Recurrence Date,Wiederholungsdatum,0
+model,"calendar.todo.rdate,name",0,Todo Recurrence Date,Aufgabe Wiederholungsdatum,0
model,"calendar.todo.rrule,name",0,Recurrence Rule,Wiederholungsregel,0
model,"ir.action,name",act_todo_form,Todos,Aufgaben,0
+model,"ir.action,name",act_todo_form2,Todos,Aufgaben,0
+model,"ir.action,name",act_todo_form3,Todos,Aufgaben,0
+model,"ir.ui.menu,name",menu_todo_form2,New Todo,Neue Aufgabe,0
model,"ir.ui.menu,name",menu_todo_form,Todos,Aufgaben,0
selection,"calendar.todo,classification",0,Confidential,Vertraulich,0
selection,"calendar.todo,classification",0,Private,Privat,0
@@ -74,6 +76,7 @@ selection,"calendar.todo,status",0,Needs-Action,Benötigt Eingriff,0
view,calendar.todo,0,Attendees,Teilnehmer,0
view,calendar.todo,0,Categories,Kategorien,0
view,calendar.todo,0,General,Allgemein,0
+view,calendar.todo,0,Occurences,Ereignisse,0
view,calendar.todo,0,Recurrences,Wiederholungen,0
view,calendar.todo,0,Todo,Aufgabe,0
view,calendar.todo,0,Todos,Aufgaben,0
diff --git a/es_CO.csv b/es_CO.csv
index 554124d..c49cab3 100644
--- a/es_CO.csv
+++ b/es_CO.csv
@@ -32,6 +32,7 @@ field,"calendar.todo.exrule,rec_name",0,Name,Nombre,0
field,"calendar.todo,exrules",0,Exception Rules,Reglas de Excepción,0
field,"calendar.todo.exrule,todo",0,Todo,,0
field,"calendar.todo,location",0,Location,Lugar,0
+field,"calendar.todo,occurences",0,Occurences,Ocurrencias,0
field,"calendar.todo,organizer",0,Organizer,Organizador,0
field,"calendar.todo,parent",0,Parent,Padre,0
field,"calendar.todo,percent_complete",0,Percent complete,,0
@@ -41,7 +42,6 @@ field,"calendar.todo,rdates",0,Recurrence Dates,Fechas de Repetición,0
field,"calendar.todo.rdate,todo",0,Todo,,0
field,"calendar.todo,rec_name",0,Name,Nombre,0
field,"calendar.todo,recurrence",0,Recurrence,Repetición,0
-field,"calendar.todo,recurrences",0,Recurrences,Repeticiones,0
field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,,0
field,"calendar.todo.rrule,rec_name",0,Name,Nombre,0
field,"calendar.todo,rrules",0,Recurrence Rules,Reglas de Repetición,0
@@ -62,6 +62,9 @@ model,"calendar.todo,name",0,Todo,,0
model,"calendar.todo.rdate,name",0,Recurrence Date,Fecha de Repetición,0
model,"calendar.todo.rrule,name",0,Recurrence Rule,Regla de Repetición,0
model,"ir.action,name",act_todo_form,Todos,,0
+model,"ir.action,name",act_todo_form2,Todos,Por Hacer,0
+model,"ir.action,name",act_todo_form3,Todos,Por hacer,0
+model,"ir.ui.menu,name",menu_todo_form2,New Todo,Nuevo Por Hacer,0
model,"ir.ui.menu,name",menu_todo_form,Todos,,0
selection,"calendar.todo,classification",0,Confidential,Confidencial,0
selection,"calendar.todo,classification",0,Private,Privado,0
@@ -74,6 +77,7 @@ selection,"calendar.todo,status",0,Needs-Action,,0
view,calendar.todo,0,Attendees,Asistentes,0
view,calendar.todo,0,Categories,Categorías,0
view,calendar.todo,0,General,General,0
+view,calendar.todo,0,Occurences,Ocurrencias,0
view,calendar.todo,0,Recurrences,Repeticiones,0
view,calendar.todo,0,Todo,,0
view,calendar.todo,0,Todos,,0
diff --git a/fr_FR.csv b/fr_FR.csv
index e2d1eee..4459c8b 100644
--- a/fr_FR.csv
+++ b/fr_FR.csv
@@ -18,12 +18,11 @@ field,"calendar.todo,calendar_read_users",0,Read Users,Utilisateurs en lecture,0
field,"calendar.todo,calendar_write_users",0,Write Users,Utilisateurs en écriture,0
field,"calendar.todo,categories",0,Categories,Catégories,0
field,"calendar.todo,classification",0,Classification,Classification,0
-field,"calendar.todo,classification_public",0,Classification Public,Classification publique,0
field,"calendar.todo,completed",0,Completed,Complété,0
field,"calendar.todo,description",0,Description,Description,0
field,"calendar.todo,dtstart",0,Start Date,Date de début,0
field,"calendar.todo,due",0,Due Date,Date d'échéance,0
-field,"calendar.todo.exdate,calendar_rdate",0,Calendar RDate,Date de récurrence,0
+field,"calendar.todo.exdate,calendar_date",0,Calendar Date,Date calendrier,0
field,"calendar.todo.exdate,rec_name",0,Name,Nom,0
field,"calendar.todo,exdates",0,Exception Dates,Dates d'exception,0
field,"calendar.todo.exdate,todo",0,Todo,Tâche,0
@@ -32,16 +31,16 @@ field,"calendar.todo.exrule,rec_name",0,Name,Nom,0
field,"calendar.todo,exrules",0,Exception Rules,Règles d'exception,0
field,"calendar.todo.exrule,todo",0,Todo,Tâche,0
field,"calendar.todo,location",0,Location,Emplacement,0
+field,"calendar.todo,occurences",0,Occurences,Occurrences,0
field,"calendar.todo,organizer",0,Organizer,Organisateur,0
field,"calendar.todo,parent",0,Parent,Parent,0
field,"calendar.todo,percent_complete",0,Percent complete,Pourcentage effectué,0
-field,"calendar.todo.rdate,calendar_rdate",0,Calendar RDate,Date de récurrence,0
+field,"calendar.todo.rdate,calendar_date",0,Calendar Date,Date calendrier,0
field,"calendar.todo.rdate,rec_name",0,Name,Nom,0
field,"calendar.todo,rdates",0,Recurrence Dates,Dates de récurrence,0
field,"calendar.todo.rdate,todo",0,Todo,Tâche,0
field,"calendar.todo,rec_name",0,Name,Nom,0
field,"calendar.todo,recurrence",0,Recurrence,Récurrence,0
-field,"calendar.todo,recurrences",0,Recurrences,Récurrences,0
field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
field,"calendar.todo.rrule,rec_name",0,Name,Nom,0
field,"calendar.todo,rrules",0,Recurrence Rules,Règles de récurrence,0
@@ -59,9 +58,12 @@ model,"calendar.todo-calendar.category,name",0,Todo - Category,Todo - Catégorie
model,"calendar.todo.exdate,name",0,Exception Date,Date d'exception,0
model,"calendar.todo.exrule,name",0,Exception Rule,Règle d'exception,0
model,"calendar.todo,name",0,Todo,Tâche,0
-model,"calendar.todo.rdate,name",0,Recurrence Date,Date de récurrence,0
+model,"calendar.todo.rdate,name",0,Todo Recurrence Date,Date de récurrence,0
model,"calendar.todo.rrule,name",0,Recurrence Rule,Règle de récurrence,0
model,"ir.action,name",act_todo_form,Todos,Tâches,0
+model,"ir.action,name",act_todo_form2,Todos,Tâches,0
+model,"ir.action,name",act_todo_form3,Todos,Tâches,0
+model,"ir.ui.menu,name",menu_todo_form2,New Todo,Nouvelle tâche,0
model,"ir.ui.menu,name",menu_todo_form,Todos,Tâches,0
selection,"calendar.todo,classification",0,Confidential,Confidentiel,0
selection,"calendar.todo,classification",0,Private,Privé,0
@@ -74,6 +76,7 @@ selection,"calendar.todo,status",0,Needs-Action,Nécessite une action,0
view,calendar.todo,0,Attendees,Participants,0
view,calendar.todo,0,Categories,Catégories,0
view,calendar.todo,0,General,Général,0
+view,calendar.todo,0,Occurences,Occurrences,0
view,calendar.todo,0,Recurrences,Récurrences,0
view,calendar.todo,0,Todo,Tâche,0
view,calendar.todo,0,Todos,Tâches,0
diff --git a/setup.py b/setup.py
index fab69c6..42102b3 100644
--- a/setup.py
+++ b/setup.py
@@ -2,19 +2,22 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from setuptools import setup, find_packages
+from setuptools import setup
import re
-info = eval(file('__tryton__.py').read())
+info = eval(open('__tryton__.py').read())
+major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
+major_version = int(major_version)
+minor_version = int(minor_version)
requires = ['vobject >= 0.8.0', 'PyWebDAV >= 0.9.3', 'python-dateutil', 'pytz']
for dep in info.get('depends', []):
if not re.match(r'(ir|res|workflow|webdav)(\W|$)', dep):
- requires.append('trytond_' + dep)
-
-major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
-requires.append('trytond >= %s.%s' % (major_version, minor_version))
-requires.append('trytond < %s.%s' % (major_version, int(minor_version) + 1))
+ requires.append('trytond_%s >= %s.%s, < %s.%s' %
+ (dep, major_version, minor_version, major_version,
+ minor_version + 1))
+requires.append('trytond >= %s.%s, < %s.%s' %
+ (major_version, minor_version, major_version, minor_version + 1))
setup(name='trytond_calendar_todo',
version=info.get('version', '0.0.1'),
@@ -27,6 +30,7 @@ setup(name='trytond_calendar_todo',
package_dir={'trytond.modules.calendar_todo': '.'},
packages=[
'trytond.modules.calendar_todo',
+ 'trytond.modules.calendar_todo.tests',
],
package_data={
'trytond.modules.calendar_todo': info.get('xml', []) \
@@ -55,4 +59,6 @@ setup(name='trytond_calendar_todo',
[trytond.modules]
calendar_todo = trytond.modules.calendar_todo
""",
+ test_suite='tests',
+ test_loader='trytond.test_loader:Loader',
)
diff --git a/tests/__init__.py b/tests/__init__.py
index ce85354..4dad3ab 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -1,4 +1,4 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from test_calendar_todo import *
+from test_calendar_todo import suite
diff --git a/tests/test_calendar_todo.py b/tests/test_calendar_todo.py
index d9661c5..dc39509 100644
--- a/tests/test_calendar_todo.py
+++ b/tests/test_calendar_todo.py
@@ -10,7 +10,7 @@ if os.path.isdir(DIR):
import unittest
import trytond.tests.test_tryton
-from trytond.tests.test_tryton import RPCProxy, CONTEXT, SOCK, test_view
+from trytond.tests.test_tryton import test_view
class CalendarTodoTestCase(unittest.TestCase):
@@ -28,11 +28,10 @@ class CalendarTodoTestCase(unittest.TestCase):
self.assertRaises(Exception, test_view('calendar_todo'))
def suite():
- return unittest.TestLoader().loadTestsFromTestCase(CalendarTodoTestCase)
+ suite = trytond.tests.test_tryton.suite()
+ suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
+ CalendarTodoTestCase))
+ return suite
if __name__ == '__main__':
- suiteTrytond = trytond.tests.test_tryton.suite()
- suiteCalendarTodo = suite()
- alltests = unittest.TestSuite([suiteTrytond, suiteCalendarTodo])
- unittest.TextTestRunner(verbosity=2).run(alltests)
- SOCK.disconnect()
+ unittest.TextTestRunner(verbosity=2).run(suite())
diff --git a/todo.py b/todo.py
index 3c02485..d3e188b 100644
--- a/todo.py
+++ b/todo.py
@@ -1,7 +1,9 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
from trytond.model import ModelSQL, ModelView, fields
-from trytond.tools import Cache, reduce_ids
+from trytond.tools import reduce_ids
+from trytond.backend import TableHandler
+from trytond.pyson import Not, Equal, Eval, If, Bool, In
import uuid
import vobject
import dateutil.tz
@@ -20,7 +22,7 @@ class Todo(ModelSQL, ModelView):
_rec_name = 'uuid'
calendar = fields.Many2One('calendar.calendar', 'Calendar',
- required=True, select=1)
+ required=True, select=1, ondelete="CASCADE")
alarms = fields.One2Many('calendar.todo.alarm', 'todo', 'Alarms')
classification = fields.Selection([
('public', 'Public'),
@@ -29,35 +31,42 @@ class Todo(ModelSQL, ModelView):
], 'Classification', required=True)
completed = fields.DateTime('Completed',
states={
- 'readonly': "(status != 'completed')",
+ 'readonly': Not(Equal(Eval('status'), 'completed')),
}, depends=['status'])
description = fields.Text('Description')
dtstart = fields.DateTime('Start Date', select=1)
location = fields.Many2One('calendar.location', 'Location')
organizer = fields.Char('Organizer', states={
- 'required': "bool(attendees) and not bool(parent)",
+ 'required': If(Bool(Eval('attendees')),
+ Not(Bool(Eval('parent'))),
+ False),
}, depends=['attendees', 'parent'])
attendees = fields.One2Many('calendar.todo.attendee', 'todo',
'Attendees')
percent_complete = fields.Integer('Percent complete',
states={
- 'readonly': "(status not in ('needs-action', 'in-process'))",
+ 'readonly': Not(In(Eval('status'),
+ ['needs-action', 'in-process'])),
}, depends=['status'])
- recurrences = fields.One2Many('calendar.todo', 'parent', 'Recurrences',
- domain=["('uuid', '=', uuid)",
- "('calendar', '=', calendar)"],
+ occurences = fields.One2Many('calendar.todo', 'parent', 'Occurences',
+ domain=[
+ ('uuid', '=', Eval('uuid')),
+ ('calendar', '=', Eval('calendar')),
+ ],
states={
- 'invisible': "bool(parent)",
+ 'invisible': Bool(Eval('parent')),
}, depends=['uuid', 'calendar', 'parent'])
recurrence = fields.DateTime('Recurrence', select=1, states={
- 'invisible': "not bool(globals().get('_parent_parent'))",
- 'required': "bool(globals().get('_parent_parent'))",
+ 'invisible': Not(Bool(Eval('_parent_parent'))),
+ 'required': Bool(Eval('_parent_parent')),
}, depends=['parent'])
sequence = fields.Integer('Sequence')
parent = fields.Many2One('calendar.todo', 'Parent',
- domain=["('uuid', '=', uuid)",
- "('parent', '=', False)",
- "('calendar', '=', calendar)"],
+ domain=[
+ ('uuid', '=', Eval('uuid')),
+ ('parent', '=', False),
+ ('calendar', '=', Eval('calendar'))
+ ],
ondelete='CASCADE', depends=['uuid', 'calendar'])
timezone = fields.Selection('timezones', 'Timezone')
status = fields.Selection([
@@ -75,32 +84,26 @@ class Todo(ModelSQL, ModelView):
'todo', 'category', 'Categories')
exdates = fields.One2Many('calendar.todo.exdate', 'todo', 'Exception Dates',
states={
- 'invisible': "bool(parent)",
+ 'invisible': Bool(Eval('parent')),
}, depends=['parent'])
exrules = fields.One2Many('calendar.todo.exrule', 'todo', 'Exception Rules',
states={
- 'invisible': "bool(parent)",
+ 'invisible': Bool(Eval('parent')),
}, depends=['parent'])
rdates = fields.One2Many('calendar.todo.rdate', 'todo', 'Recurrence Dates',
states={
- 'invisible': "bool(parent)",
+ 'invisible': Bool(Eval('parent')),
}, depends=['parent'])
rrules = fields.One2Many('calendar.todo.rrule', 'todo', 'Recurrence Rules',
states={
- 'invisible': "bool(parent)",
+ 'invisible': Bool(Eval('parent')),
}, depends=['parent'])
- calendar_owner = fields.Function('get_calendar_field',
- type='many2one', relation='res.user', string='Owner',
- fnct_search='search_calendar_field')
- calendar_read_users = fields.Function('get_calendar_field',
- type='many2many', relation='res.user', string='Read Users',
- fnct_search='search_calendar_field')
- calendar_write_users = fields.Function('get_calendar_field',
- type='many2many', relation='res.user', string='Write Users',
- fnct_search='search_calendar_field')
- classification_public = fields.Function('get_classification_public',
- type='boolean', string='Classification Public',
- fnct_search='search_classification_public')
+ calendar_owner = fields.Function(fields.Many2One('res.user', 'Owner'),
+ 'get_calendar_field', searcher='search_calendar_field')
+ calendar_read_users = fields.Function(fields.One2Many('res.user', None,
+ 'Read Users'), 'get_calendar_field', searcher='search_calendar_field')
+ calendar_write_users = fields.Function(fields.One2Many('res.user', None,
+ 'Write Users'), 'get_calendar_field', searcher='search_calendar_field')
vtodo = fields.Binary('vtodo')
def __init__(self):
@@ -116,6 +119,20 @@ class Todo(ModelSQL, ModelView):
'invalid_recurrence': 'Recurrence can not be recurrent!',
})
+ def init(self, cursor, module_name):
+ # Migrate from 1.4: remove classification_public
+ model_data_obj = self.pool.get('ir.model.data')
+ rule_obj = self.pool.get('ir.rule')
+ model_data_ids = model_data_obj.search(cursor, 0, [
+ ('fs_id', '=', 'rule_group_read_todo_line3'),
+ ('module', '=', module_name),
+ ('inherit', '=', False),
+ ], limit=1)
+ if model_data_ids:
+ model_data = model_data_obj.browse(cursor, 0, model_data_ids[0])
+ rule_obj.delete(cursor, 0, model_data.db_id)
+ return super(Todo, self).init(cursor, module_name)
+
def default_uuid(self, cursor, user, context=None):
return str(uuid.uuid4())
@@ -130,7 +147,7 @@ class Todo(ModelSQL, ModelView):
user_ = user_obj.browse(cursor, user, user, context=context)
return user_.timezone
- def on_change_status(self, cursor, user, ids, vals, context=None):
+ def on_change_status(self, cursor, user, vals, context=None):
res = {}
if 'status' not in vals:
return res
@@ -144,7 +161,7 @@ class Todo(ModelSQL, ModelView):
def timezones(self, cursor, user, context=None):
return [(x, x) for x in pytz.common_timezones] + [('', '')]
- def get_calendar_field(self, cursor, user, ids, name, arg, context=None):
+ def get_calendar_field(self, cursor, user, ids, name, context=None):
assert name in ('calendar_owner', 'calendar_read_users',
'calendar_write_users'), 'Invalid name'
res = {}
@@ -156,35 +173,8 @@ class Todo(ModelSQL, ModelView):
res[todo.id] = todo.calendar[name].id
return res
- def search_calendar_field(self, cursor, user, name, args, context=None):
- args2 = []
- i = 0
- while i < len(args):
- field = args[i][0][9:]
- args2.append(tuple(['calendar.' + field] + list(args[i])[1:]))
- i += 1
- return args2
-
- def get_classification_public(self, cursor, user, ids, name, arg,
- context=None):
- res = {}
- for todo in self.browse(cursor, user, ids, context=context):
- res[todo.id] = False
- if todo.classification == 'public':
- res[todo.id] = True
- return res
-
- def search_classification_public(self, cursor, user, name, args,
- context=None):
- args2 = []
- i = 0
- while i < len(args):
- if args[i][2]:
- args2.append(('classification', '=', 'public'))
- else:
- args2.append(('classification', '!=', 'public'))
- i += 1
- return args2
+ def search_calendar_field(self, cursor, user, name, clause, context=None):
+ return [('calendar.' + name[9:],) + clause[1:]]
def check_recurrence(self, cursor, user, ids):
'''
@@ -197,7 +187,7 @@ class Todo(ModelSQL, ModelView):
or todo.rrules \
or todo.exdates \
or todo.exrules \
- or todo.recurrences:
+ or todo.occurences:
return False
return True
@@ -227,10 +217,10 @@ class Todo(ModelSQL, ModelView):
for calendar_id in calendar_ids:
new_id = self.copy(cursor, 0, todo.id, default={
'calendar': calendar_id,
- 'recurrences': False,
+ 'occurences': False,
}, context=context)
- for recurrence in todo.recurrences:
- self.copy(cursor, 0, recurrence.id, default={
+ for occurence in todo.occurences:
+ self.copy(cursor, 0, occurence.id, default={
'calendar': calendar_id,
'parent': new_id,
}, context=context)
@@ -339,10 +329,10 @@ class Todo(ModelSQL, ModelView):
for calendar_id in calendar_ids:
new_id = self.copy(cursor, 0, todo.id, default={
'calendar': calendar_id,
- 'recurrences': False,
+ 'occurences': False,
}, context=context)
- for recurrence in todo.recurrences:
- self.copy(cursor, 0, recurrence.id, default={
+ for occurence in todo.occurences:
+ self.copy(cursor, 0, occurence.id, default={
'calendar': calendar_id,
'parent': new_id,
}, context=context)
@@ -644,31 +634,31 @@ class Todo(ModelSQL, ModelView):
res['vtodo'] = vtodo.serialize()
- recurrences_todel = []
+ occurences_todel = []
if todo:
- recurrences_todel = [x.id for x in todo.recurrences]
+ occurences_todel = [x.id for x in todo.occurences]
for vtodo in vtodos:
todo_id = None
if todo:
- for recurrence in todo.recurrences:
- if recurrence.recurrence.replace(tzinfo=tzlocal) \
+ for occurence in todo.occurences:
+ if occurence.recurrence.replace(tzinfo=tzlocal) \
== vtodo.recurrence_id.value:
- todo_id = recurrence.id
- recurrences_todel.remove(recurrence.id)
+ todo_id = occurence.id
+ occurences_todel.remove(occurence.id)
vals = self.ical2values(cursor, user, todo_id, ical,
calendar_id, vtodo=vtodo, context=context)
if todo:
vals['uuid'] = todo.uuid
else:
vals['uuid'] = res['uuid']
- res.setdefault('recurrences', [])
+ res.setdefault('occurences', [])
if todo_id:
- res['recurrences'].append(('write', todo_id, vals))
+ res['occurences'].append(('write', todo_id, vals))
else:
- res['recurrences'].append(('create', vals))
- if recurrences_todel:
- res.setdefault('recurrences', [])
- res['recurrences'].append(('delete', recurrences_todel))
+ res['occurences'].append(('create', vals))
+ if occurences_todel:
+ res.setdefault('occurences', [])
+ res['occurences'].append(('delete', occurences_todel))
return res
def todo2ical(self, cursor, user, todo, context=None):
@@ -766,11 +756,8 @@ class Todo(ModelSQL, ModelView):
if todo.recurrence and todo.parent:
if not hasattr(vtodo, 'recurrence-id'):
vtodo.add('recurrence-id')
- if todo.all_day:
- vtodo.recurrence_id.value = todo.recurrence.date()
- else:
- vtodo.recurrence_id.value = todo.recurrence\
- .replace(tzinfo=tzlocal).astimezone(tztodo)
+ vtodo.recurrence_id.value = todo.recurrence\
+ .replace(tzinfo=tzlocal).astimezone(tztodo)
elif hasattr(vtodo, 'recurrence-id'):
del vtodo.recurrence_id
if todo.status:
@@ -847,8 +834,8 @@ class Todo(ModelSQL, ModelView):
if valarm:
vtodo.valarm_list.append(valarm)
- for recurrence in todo.recurrences:
- rical = self.todo2ical(cursor, user, recurrence, context=context)
+ for occurence in todo.occurences:
+ rical = self.todo2ical(cursor, user, occurence, context=context)
ical.vtodo_list.append(rical.vtodo)
return ical
@@ -869,17 +856,26 @@ TodoCategory()
class TodoRDate(ModelSQL, ModelView):
- 'Recurrence Date'
+ 'Todo Recurrence Date'
_description = __doc__
_name = 'calendar.todo.rdate'
- _inherits = {'calendar.rdate': 'calendar_rdate'}
+ _inherits = {'calendar.date': 'calendar_date'}
_rec_name = 'datetime'
- calendar_rdate = fields.Many2One('calendar.rdate', 'Calendar RDate',
+ calendar_date = fields.Many2One('calendar.date', 'Calendar Date',
required=True, ondelete='CASCADE', select=1)
todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
select=1, required=True)
+ def init(self, cursor, module_name):
+ # Migration from 1.4: calendar_rdate renamed to calendar_date
+ table = TableHandler(cursor, self, module_name)
+ old_column = 'calendar_rdate'
+ if table.column_exist(old_column):
+ table.column_rename(old_column, 'calendar_date')
+
+ return super(TodoRDate, self).init(cursor, module_name)
+
def create(self, cursor, user, values, context=None):
todo_obj = self.pool.get('calendar.todo')
if values.get('todo'):
@@ -904,11 +900,11 @@ class TodoRDate(ModelSQL, ModelView):
def delete(self, cursor, user, ids, context=None):
todo_obj = self.pool.get('calendar.todo')
- rdate_obj = self.pool.get('calendar.rdate')
+ rdate_obj = self.pool.get('calendar.date')
if isinstance(ids, (int, long)):
ids = [ids]
todo_rdates = self.browse(cursor, user, ids, context=context)
- rdate_ids = [a.calendar_rdate.id for a in todo_rdates]
+ rdate_ids = [a.calendar_date.id for a in todo_rdates]
todo_ids = [x.todo.id for x in todo_rdates]
if todo_ids:
# Update write_date of todo
@@ -919,15 +915,15 @@ class TodoRDate(ModelSQL, ModelView):
return res
def _date2update(self, cursor, user, date, context=None):
- date_obj = self.pool.get('calendar.rdate')
+ date_obj = self.pool.get('calendar.date')
return date_obj._date2update(cursor, user, date, context=context)
def date2values(self, cursor, user, date, context=None):
- date_obj = self.pool.get('calendar.rdate')
+ date_obj = self.pool.get('calendar.date')
return date_obj.date2values(cursor, user, date, context=context)
def date2date(self, cursor, user, date, context=None):
- date_obj = self.pool.get('calendar.rdate')
+ date_obj = self.pool.get('calendar.date')
return date_obj.date2date(cursor, user, date, context=context)
TodoRDate()
diff --git a/todo.xml b/todo.xml
index 5d80374..0994181 100644
--- a/todo.xml
+++ b/todo.xml
@@ -61,13 +61,13 @@ this repository contains the full copyright notices and license terms. -->
<field name="organizer"/>
<field name="attendees" colspan="4"/>
</page>
- <page string="Recurrences" id="recurrences"
- states="{'invisible': '''bool(globals().get('_parent_parent'))'''}">
+ <page string="Occurences" id="occurences"
+ states="{'invisible': Bool(Eval('_parent_parent'))}">
<field name="rrules" colspan="2"/>
<field name="rdates" colspan="2"/>
<field name="exrules" colspan="2"/>
<field name="exdates" colspan="2"/>
- <field name="recurrences" colspan="4">
+ <field name="occurences" colspan="4">
<tree string="Todos">
<field name="summary" select="1"/>
<field name="recurrence" select="1"/>
@@ -100,8 +100,49 @@ this repository contains the full copyright notices and license terms. -->
<field name="view" ref="todo_view_form"/>
<field name="act_window" ref="act_todo_form"/>
</record>
- <menuitem parent="calendar.menu_calendar_form" sequence="1"
+ <menuitem parent="calendar.menu_calendar_form" sequence="30"
action="act_todo_form" id="menu_todo_form"/>
+ <record model="ir.action.act_window" id="act_todo_form2">
+ <field name="name">Todos</field>
+ <field name="res_model">calendar.todo</field>
+ <field name="view_type">form</field>
+ <field name="domain">[('parent', '=', False)]</field>
+ </record>
+ <record model="ir.action.act_window.view" id="act_todo_form2_view1">
+ <field name="sequence" eval="10"/>
+ <field name="view" ref="todo_view_form"/>
+ <field name="act_window" ref="act_todo_form2"/>
+ </record>
+ <record model="ir.action.act_window.view" id="act_todo_form2_view2">
+ <field name="sequence" eval="20"/>
+ <field name="view" ref="todo_view_tree"/>
+ <field name="act_window" ref="act_todo_form2"/>
+ </record>
+ <menuitem name="New Todo" parent="menu_todo_form" sequence="10"
+ action="act_todo_form2" id="menu_todo_form2"/>
+
+ <record model="ir.action.act_window" id="act_todo_form3">
+ <field name="name">Todos</field>
+ <field name="res_model">calendar.todo</field>
+ <field name="view_type">form</field>
+ <field name="domain">[('parent', '=', False), ('calendar', '=', Eval('active_id'))]</field>
+ </record>
+ <record model="ir.action.act_window.view" id="act_todo_form3_view1">
+ <field name="sequence" eval="10"/>
+ <field name="view" ref="todo_view_tree"/>
+ <field name="act_window" ref="act_todo_form3"/>
+ </record>
+ <record model="ir.action.act_window.view" id="act_todo_form3_view2">
+ <field name="sequence" eval="20"/>
+ <field name="view" ref="todo_view_form"/>
+ <field name="act_window" ref="act_todo_form3"/>
+ </record>
+ <record model="ir.action.keyword"
+ id="act_open_todo_keyword1">
+ <field name="keyword">form_relate</field>
+ <field name="model">calendar.calendar,0</field>
+ <field name="action" ref="act_todo_form3"/>
+ </record>
<record model="ir.rule.group" id="rule_group_read_todo">
<field name="model" search="[('model', '=', 'calendar.todo')]"/>
@@ -124,12 +165,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="operand">User</field>
<field name="rule_group" ref="rule_group_read_todo"/>
</record>
- <record model="ir.rule" id="rule_group_read_todo_line3">
- <field name="field" search="[('name', '=', 'classification_public'), ('model.model', '=', 'calendar.todo')]"/>
- <field name="operator">=</field>
- <field name="operand">True</field>
- <field name="rule_group" ref="rule_group_read_todo"/>
- </record>
<record model="ir.rule.group" id="rule_group_write_todo">
<field name="model" search="[('model', '=', 'calendar.todo')]"/>
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index cf08cc5..2333195 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.0
Name: trytond-calendar-todo
-Version: 1.4.2
+Version: 1.6.0
Summary: Add Todo support on CalDAV
Home-page: http://www.tryton.org/
Author: B2CK
Author-email: info at b2ck.com
License: GPL-3
-Download-URL: http://downloads.tryton.org/1.4/
+Download-URL: http://downloads.tryton.org/1.6/
Description: UNKNOWN
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
diff --git a/trytond_calendar_todo.egg-info/SOURCES.txt b/trytond_calendar_todo.egg-info/SOURCES.txt
index b3321ab..e25e4da 100644
--- a/trytond_calendar_todo.egg-info/SOURCES.txt
+++ b/trytond_calendar_todo.egg-info/SOURCES.txt
@@ -15,8 +15,8 @@ todo.xml
./caldav.py
./todo.py
./webdav.py
-tests/__init__.py
-tests/test_calendar_todo.py
+./tests/__init__.py
+./tests/test_calendar_todo.py
trytond_calendar_todo.egg-info/PKG-INFO
trytond_calendar_todo.egg-info/SOURCES.txt
trytond_calendar_todo.egg-info/dependency_links.txt
diff --git a/trytond_calendar_todo.egg-info/requires.txt b/trytond_calendar_todo.egg-info/requires.txt
index 59de83b..159b890 100644
--- a/trytond_calendar_todo.egg-info/requires.txt
+++ b/trytond_calendar_todo.egg-info/requires.txt
@@ -2,6 +2,5 @@ vobject >= 0.8.0
PyWebDAV >= 0.9.3
python-dateutil
pytz
-trytond_calendar
-trytond >= 1.4
-trytond < 1.5
\ No newline at end of file
+trytond_calendar >= 1.6, < 1.7
+trytond >= 1.6, < 1.7
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index 636f25d..c4fbc06 100644
--- a/webdav.py
+++ b/webdav.py
@@ -11,6 +11,7 @@ class Collection(ModelSQL, ModelView):
_name = "webdav.collection"
+ @Cache('webdav_collection.todo')
def todo(self, cursor, user, uri, calendar_id=False, context=None):
'''
Return the todo id in the uri or False
@@ -40,8 +41,6 @@ class Collection(ModelSQL, ModelView):
return todo_ids[0]
return False
- todo = Cache('webdav_collection.todo')(todo)
-
def _caldav_filter_domain_todo(self, cursor, user, filter, context=None):
'''
Return a domain for caldav filter on todo
commit c6b98a687596401d1653db8b09d3b563a1348b8b
Author: Daniel Baumann <daniel at debian.org>
Date: Fri Apr 9 14:31:33 2010 +0200
Adding Dm-Upload-Allowed in control in preparation for Mathias.
diff --git a/debian/control b/debian/control
index 00a9739..50cdcc7 100644
--- a/debian/control
+++ b/debian/control
@@ -5,6 +5,7 @@ Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
Uploaders:
Daniel Baumann <daniel at debian.org>,
Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
+Dm-Upload-Allowed: yes
Build-Depends: debhelper (>= 7), python, python-setuptools, python-support
Standards-Version: 3.8.4
Homepage: http://www.tryton.org/
commit bb9e3f1e1375887163129c64a0f263e674a3096a
Author: Daniel Baumann <daniel at debian.org>
Date: Sat Feb 20 10:21:22 2010 +0100
Releasing debian version 1.4.2-1.
diff --git a/debian/changelog b/debian/changelog
index ec727c2..4dc67ce 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+tryton-modules-calendar-todo (1.4.2-1) unstable; urgency=low
+
+ * Updating year in copyright file.
+ * Removing unneeded python-all-dev from build-depends.
+ * Updating to standards 3.8.4.
+ * Merging upstream version 1.4.2.
+
+ -- Daniel Baumann <daniel at debian.org> Sat, 20 Feb 2010 10:21:16 +0100
+
tryton-modules-calendar-todo (1.4.1-1) unstable; urgency=low
[ Daniel Baumann ]
commit 44fc76581090bab55af107eab4dca90f77c562af
Author: Daniel Baumann <daniel at debian.org>
Date: Sat Feb 20 10:20:33 2010 +0100
Merging upstream version 1.4.2.
diff --git a/CHANGELOG b/CHANGELOG
index f0a3015..035fbe7 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 1.4.2 - 2010-02-16
+* Some bug fixes (see mercurial logs for details)
+
Version 1.4.1 - 2009-11-23
* Some bug fixes (see mercurial logs for details)
diff --git a/COPYRIGHT b/COPYRIGHT
index 3a474ed..6e6811c 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,6 +1,6 @@
-Copyright (C) 2009 Cédric Krier.
-Copyright (C) 2009 Bertrand Chenal.
-Copyright (C) 2009 B2CK SPRL.
+Copyright (C) 2009-2010 Cédric Krier.
+Copyright (C) 2009-2010 Bertrand Chenal.
+Copyright (C) 2009-2010 B2CK SPRL.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
diff --git a/PKG-INFO b/PKG-INFO
index 7877d27..639e6a0 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond_calendar_todo
-Version: 1.4.1
+Version: 1.4.2
Summary: Add Todo support on CalDAV
Home-page: http://www.tryton.org/
Author: B2CK
diff --git a/__tryton__.py b/__tryton__.py
index db78023..5555d90 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
'name_es_CO': 'Calendario de tareas',
'name_es_ES': 'Calendario de tareas',
'name_fr_FR' : 'Tâche Calendrier',
- 'version' : '1.4.1',
+ 'version' : '1.4.2',
'author' : 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
diff --git a/todo.py b/todo.py
index fae2911..3c02485 100644
--- a/todo.py
+++ b/todo.py
@@ -50,7 +50,8 @@ class Todo(ModelSQL, ModelView):
'invisible': "bool(parent)",
}, depends=['uuid', 'calendar', 'parent'])
recurrence = fields.DateTime('Recurrence', select=1, states={
- 'invisible': "not bool(parent)",
+ 'invisible': "not bool(globals().get('_parent_parent'))",
+ 'required': "bool(globals().get('_parent_parent'))",
}, depends=['parent'])
sequence = fields.Integer('Sequence')
parent = fields.Many2One('calendar.todo', 'Parent',
@@ -762,7 +763,7 @@ class Todo(ModelSQL, ModelView):
if not hasattr(vtodo, 'last-modified'):
vtodo.add('last-modified')
vtodo.last_modified.value = date.replace(tzinfo=tzlocal).astimezone(tztodo)
- if todo.recurrence:
+ if todo.recurrence and todo.parent:
if not hasattr(vtodo, 'recurrence-id'):
vtodo.add('recurrence-id')
if todo.all_day:
@@ -770,6 +771,8 @@ class Todo(ModelSQL, ModelView):
else:
vtodo.recurrence_id.value = todo.recurrence\
.replace(tzinfo=tzlocal).astimezone(tztodo)
+ elif hasattr(vtodo, 'recurrence-id'):
+ del vtodo.recurrence_id
if todo.status:
if not hasattr(vtodo, 'status'):
vtodo.add('status')
diff --git a/todo.xml b/todo.xml
index ae6349d..5d80374 100644
--- a/todo.xml
+++ b/todo.xml
@@ -62,7 +62,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="attendees" colspan="4"/>
</page>
<page string="Recurrences" id="recurrences"
- states="{'invisible': '''bool(parent)'''}">
+ states="{'invisible': '''bool(globals().get('_parent_parent'))'''}">
<field name="rrules" colspan="2"/>
<field name="rdates" colspan="2"/>
<field name="exrules" colspan="2"/>
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index 9bbf22c..cf08cc5 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond-calendar-todo
-Version: 1.4.1
+Version: 1.4.2
Summary: Add Todo support on CalDAV
Home-page: http://www.tryton.org/
Author: B2CK
commit 3d48a69ea52fac1b564a17a501dc43df933c7587
Author: Daniel Baumann <daniel at debian.org>
Date: Thu Jan 28 07:53:21 2010 +0100
Updating to standards 3.8.4.
diff --git a/debian/control b/debian/control
index 0fd396b..00a9739 100644
--- a/debian/control
+++ b/debian/control
@@ -6,7 +6,7 @@ Uploaders:
Daniel Baumann <daniel at debian.org>,
Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Build-Depends: debhelper (>= 7), python, python-setuptools, python-support
-Standards-Version: 3.8.3
+Standards-Version: 3.8.4
Homepage: http://www.tryton.org/
Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-calendar-todo.git
Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-todo.git
commit bc71b0bbc47df9d9584c816538e286928dd2aea1
Author: Daniel Baumann <daniel at debian.org>
Date: Mon Jan 25 10:12:27 2010 +0100
Removing unneeded python-all-dev from build-depends.
diff --git a/debian/control b/debian/control
index c742de2..0fd396b 100644
--- a/debian/control
+++ b/debian/control
@@ -5,8 +5,7 @@ Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
Uploaders:
Daniel Baumann <daniel at debian.org>,
Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
-Build-Depends:
- debhelper (>= 7), python, python-all-dev, python-setuptools, python-support
+Build-Depends: debhelper (>= 7), python, python-setuptools, python-support
Standards-Version: 3.8.3
Homepage: http://www.tryton.org/
Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-calendar-todo.git
commit e755a86a9b4baa8933944a00f7a805d5ede157ed
Author: Daniel Baumann <daniel at debian.org>
Date: Sat Jan 2 11:35:12 2010 +0100
Updating year in copyright file.
diff --git a/debian/copyright b/debian/copyright
index 2eed23b..dad4d26 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -26,7 +26,7 @@ License: GPL-3+
can be found in /usr/share/common-licenses/GPL-3 file.
Files: debian/*
-Copyright: (C) 2009 Daniel Baumann <daniel at debian.org>
+Copyright: (C) 2009-2010 Daniel Baumann <daniel at debian.org>
License: GPL-3+
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
commit 8ea656e4ee1419d7158893eb70b2494eceb58c84
Author: Daniel Baumann <daniel at debian.org>
Date: Wed Nov 25 13:02:29 2009 +0100
Releasing debian version 1.4.1-1.
diff --git a/debian/changelog b/debian/changelog
index fb6e052..ec727c2 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,18 @@
+tryton-modules-calendar-todo (1.4.1-1) unstable; urgency=low
+
+ [ Daniel Baumann ]
+ * Making depends versioned for tryton 1.4.
+
+ [ Mathias Behrle ]
+ * Adding versioned depend for python-vobject.
+
+ [ Daniel Baumann ]
+ * Merging upstream version 1.4.1.
+ * Updating README.source.
+ * Adding explicit debian source version 1.0 until switch to 3.0.
+
+ -- Daniel Baumann <daniel at debian.org> Wed, 25 Nov 2009 13:02:20 +0100
+
tryton-modules-calendar-todo (1.4.0-1) unstable; urgency=low
* Initial release.
commit d1275c3fa802420a6fba0b2269e8ef2879a06bab
Author: Daniel Baumann <daniel at debian.org>
Date: Wed Nov 25 13:02:05 2009 +0100
Adding explicit debian source version 1.0 until switch to 3.0.
diff --git a/debian/source/format b/debian/source/format
new file mode 100644
index 0000000..d3827e7
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1 @@
+1.0
commit 31530c1dba6072cbf1870090d29e7e972d9374fe
Author: Daniel Baumann <daniel at debian.org>
Date: Wed Nov 25 13:01:58 2009 +0100
Updating README.source.
diff --git a/debian/README.source b/debian/README.source
index dcc7ba3..18b6b24 100644
--- a/debian/README.source
+++ b/debian/README.source
@@ -32,6 +32,6 @@ upstream source. Changes, if any, are stored in the source package as diffs in
debian/diff and are applied during the build. Current modifications can be
applied to the source tree with:
- $ quilt push -a
+ $ QUILT_PATCHES=debian/patches quilt push -a
More information about Quilt can be found in the quilt package.
commit 980f4b38aa7a8a31d571a85f1b56f19c8013a1d4
Author: Daniel Baumann <daniel at debian.org>
Date: Wed Nov 25 13:01:38 2009 +0100
Merging upstream version 1.4.1.
diff --git a/CHANGELOG b/CHANGELOG
index 931601e..f0a3015 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,2 +1,5 @@
+Version 1.4.1 - 2009-11-23
+* Some bug fixes (see mercurial logs for details)
+
Version 1.4.0 - 2009-10-19
* Initial release
diff --git a/INSTALL b/INSTALL
index 27a8558..6577bda 100644
--- a/INSTALL
+++ b/INSTALL
@@ -6,8 +6,8 @@ Prerequisites
* Python 2.5 or later (http://www.python.org/)
* trytond (http://www.tryton.org/)
- * vobject (http://vobject.skyhouseconsulting.com/)
- * pywebdav (http://sourceforge.net/projects/pywebdav/)
+ * vobject 0.8.0 or later (http://vobject.skyhouseconsulting.com/)
+ * pywebdav 0.9.3 or later (http://sourceforge.net/projects/pywebdav/)
* python-dateutil (http://labix.org/python-dateutil)
* pytz (http://pytz.sourceforge.net/)
* trytond_calendar (http://www.tryton.org/)
diff --git a/PKG-INFO b/PKG-INFO
index c25f548..7877d27 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond_calendar_todo
-Version: 1.4.0
+Version: 1.4.1
Summary: Add Todo support on CalDAV
Home-page: http://www.tryton.org/
Author: B2CK
diff --git a/__tryton__.py b/__tryton__.py
index a27c01d..db78023 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
'name_es_CO': 'Calendario de tareas',
'name_es_ES': 'Calendario de tareas',
'name_fr_FR' : 'Tâche Calendrier',
- 'version' : '1.4.0',
+ 'version' : '1.4.1',
'author' : 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
diff --git a/caldav.py b/caldav.py
index 82d5241..2d2fe00 100644
--- a/caldav.py
+++ b/caldav.py
@@ -14,12 +14,13 @@ def mk_prop_response(self, uri, good_props, bad_props, doc):
if not parent_uri:
return res
dbname, parent_uri = TrytonDAVInterface.get_dburi(parent_uri)
- if parent_uri in ('Calendars', 'Calendars/'):
- vc = doc.createElement('vtodo-collection')
- vc.setAttribute('xmlns', 'http://groupdav.org/')
- cols = res.getElementsByTagName('D:collection')
- if cols:
- cols[0].parentNode.appendChild(vc)
+ #Disable groupdav attribute for iPhone
+ #if parent_uri in ('Calendars', 'Calendars/'):
+ # vc = doc.createElement('vtodo-collection')
+ # vc.setAttribute('xmlns', 'http://groupdav.org/')
+ # cols = res.getElementsByTagName('D:collection')
+ # if cols:
+ # cols[0].parentNode.appendChild(vc)
return res
propfind.PROPFIND.mk_prop_response = mk_prop_response
diff --git a/setup.py b/setup.py
index 94e80dc..fab69c6 100644
--- a/setup.py
+++ b/setup.py
@@ -7,7 +7,7 @@ import re
info = eval(file('__tryton__.py').read())
-requires = ['vobject', 'PyWebDAV', 'python-dateutil', 'pytz']
+requires = ['vobject >= 0.8.0', 'PyWebDAV >= 0.9.3', 'python-dateutil', 'pytz']
for dep in info.get('depends', []):
if not re.match(r'(ir|res|workflow|webdav)(\W|$)', dep):
requires.append('trytond_' + dep)
diff --git a/todo.py b/todo.py
index 566ec9a..fae2911 100644
--- a/todo.py
+++ b/todo.py
@@ -206,15 +206,18 @@ class Todo(ModelSQL, ModelView):
res = super(Todo, self).create(cursor, user, values, context=context)
todo = self.browse(cursor, user, res, context=context)
- if todo.organizer == todo.calendar.owner.email \
+ if todo.calendar.owner \
+ and (todo.organizer == todo.calendar.owner.email \
or (todo.parent \
- and todo.parent.organizer == todo.parent.calendar.owner.email):
+ and todo.parent.organizer == todo.parent.calendar.owner.email)):
if todo.organizer == todo.calendar.owner.email:
attendee_emails = [x.email for x in todo.attendees
- if x.status != 'declined']
+ if x.status != 'declined'
+ and x.email != todo.organizer]
else:
attendee_emails = [x.email for x in todo.parent.attendees
- if x.status != 'declined']
+ if x.status != 'declined'
+ and x.email != todo.parent.organizer]
if attendee_emails:
calendar_ids = calendar_obj.search(cursor, 0, [
('owner.email', 'in', attendee_emails),
@@ -302,15 +305,18 @@ class Todo(ModelSQL, ModelView):
'WHERE ' + red_sql, red_ids)
for todo in self.browse(cursor, user, ids, context=context):
- if todo.organizer == todo.calendar.owner.email \
+ if todo.calendar.owner \
+ and (todo.organizer == todo.calendar.owner.email \
or (todo.parent \
- and todo.parent.organizer == todo.calendar.owner.email):
+ and todo.parent.organizer == todo.calendar.owner.email)):
if todo.organizer == todo.calendar.owner.email:
attendee_emails = [x.email for x in todo.attendees
- if x.status != 'declined']
+ if x.status != 'declined'
+ and x.email != todo.organizer]
else:
attendee_emails = [x.email for x in todo.parent.attendees
- if x.status != 'declined']
+ if x.status != 'declined'
+ and x.email != todo.parent.organizer]
if attendee_emails:
todo_ids = self.search(cursor, 0, [
('uuid', '=', todo.uuid),
@@ -363,13 +369,16 @@ class Todo(ModelSQL, ModelView):
if isinstance(ids, (int, long)):
ids = [ids]
for todo in self.browse(cursor, user, ids, context=context):
- if todo.organizer == todo.calendar.owner.email \
+ if todo.calendar.owner \
+ and (todo.organizer == todo.calendar.owner.email \
or (todo.parent \
- and todo.parent.organizer == todo.calendar.owner.email):
+ and todo.parent.organizer == todo.calendar.owner.email)):
if todo.organizer == todo.calendar.owner.email:
- attendee_emails = [x.email for x in todo.attendees]
+ attendee_emails = [x.email for x in todo.attendees
+ if x.email != todo.organizer]
else:
- attendee_emails = [x.email for x in todo.parent.attendees]
+ attendee_emails = [x.email for x in todo.parent.attendees
+ if x.email != todo.parent.organizer]
if attendee_emails:
todo_ids = self.search(cursor, 0, [
('uuid', '=', todo.uuid),
@@ -398,9 +407,10 @@ class Todo(ModelSQL, ModelView):
attendee_obj.write(cursor, 0, attendee.id, {
'status': 'declined',
}, context=context)
+ res = super(Todo, self).delete(cursor, user, ids, context=context)
# Restart the cache for todo
collection_obj.todo(cursor.dbname)
- return super(Todo, self).delete(cursor, user, ids, context=context)
+ return res
def ical2values(self, cursor, user, todo_id, ical, calendar_id,
vtodo=None, context=None):
@@ -1020,19 +1030,22 @@ class TodoAttendee(ModelSQL, ModelView):
context=context)
attendee = self.browse(cursor, user, res, context=context)
todo = attendee.todo
- if todo.organizer == todo.calendar.owner.email \
+ if todo.calendar.owner \
+ and (todo.organizer == todo.calendar.owner.email \
or (todo.parent \
- and todo.parent.organizer == todo.parent.calendar.owner.email):
+ and todo.parent.organizer == todo.parent.calendar.owner.email)):
if todo.organizer == todo.calendar.owner.email:
- attendee_emails = [x.email for x in todo.attendees]
+ attendee_emails = [x.email for x in todo.attendees
+ if x.email != todo.organizer]
else:
- attendee_emails = [x.email for x in todo.parent.attendees]
+ attendee_emails = [x.email for x in todo.parent.attendees
+ if x.email != todo.parent.organizer]
if attendee_emails:
- todo_ids = self.search(cursor, 0, [
- ('todo.uuid', '=', todo.uuid),
- ('todo.calendar.owner.email', 'in', attendee_emails),
+ todo_ids = todo_obj.search(cursor, 0, [
+ ('uuid', '=', todo.uuid),
+ ('calendar.owner.email', 'in', attendee_emails),
('id', '!=', todo.id),
- ('todo.recurrence', '=', todo.recurrence or False),
+ ('recurrence', '=', todo.recurrence or False),
], context=context)
for todo_id in todo_ids:
self.copy(cursor, 0, res, default={
@@ -1062,13 +1075,16 @@ class TodoAttendee(ModelSQL, ModelView):
attendees = self.browse(cursor, user, ids, context=context)
for attendee in attendees:
todo = attendee.todo
- if todo.organizer == todo.calendar.owner.email \
+ if todo.calendar.owner \
+ and (todo.organizer == todo.calendar.owner.email \
or (todo.parent \
- and todo.parent.organizer == todo.calendar.owner.email):
+ and todo.parent.organizer == todo.calendar.owner.email)):
if todo.organizer == todo.calendar.owner.email:
- attendee_emails = [x.email for x in todo.attendees]
+ attendee_emails = [x.email for x in todo.attendees
+ if x.email != todo.organizer]
else:
- attendee_emails = [x.email for x in todo.parent.attendees]
+ attendee_emails = [x.email for x in todo.parent.attendees
+ if x.email != todo.parent.organizer]
if attendee_emails:
attendee_ids = self.search(cursor, 0, [
('todo.uuid', '=', todo.uuid),
@@ -1097,13 +1113,16 @@ class TodoAttendee(ModelSQL, ModelView):
for attendee in self.browse(cursor, user, ids, context=context):
todo = attendee.todo
- if todo.organizer == todo.calendar.owner.email \
+ if todo.calendar.owner \
+ and (todo.organizer == todo.calendar.owner.email \
or (todo.parent \
- and todo.parent.organizer == todo.calendar.owner.email):
+ and todo.parent.organizer == todo.calendar.owner.email)):
if todo.organizer == todo.calendar.owner.email:
- attendee_emails = [x.email for x in todo.attendees]
+ attendee_emails = [x.email for x in todo.attendees
+ if x.email != todo.organizer]
else:
- attendee_emails = [x.email for x in todo.attendees]
+ attendee_emails = [x.email for x in todo.attendees
+ if x.email != todo.parent.organizer]
if attendee_emails:
attendee_ids = self.search(cursor, 0, [
('todo.uuid', '=', todo.uuid),
@@ -1113,9 +1132,10 @@ class TodoAttendee(ModelSQL, ModelView):
('email', '=', attendee.email),
], context=context)
self.delete(cursor, 0, attendee_ids, context=context)
- elif (todo.organizer \
+ elif todo.calendar.organizer \
+ and ((todo.organizer \
or (todo.parent and todo.parent.organizer)) \
- and attendee.email == todo.calendar.owner.email:
+ and attendee.email == todo.calendar.owner.email):
if todo.organizer:
organizer = todo.organizer
else:
@@ -1137,6 +1157,27 @@ class TodoAttendee(ModelSQL, ModelView):
context=context)
return res
+ def copy(self, cursor, user, ids, default=None, context=None):
+ attendee_obj = self.pool.get('calendar.attendee')
+
+ int_id = False
+ if isinstance(ids, (int, long)):
+ int_id = True
+ ids = [ids]
+ if default is None:
+ default = {}
+ default = default.copy()
+ new_ids = []
+ for attendee in self.browse(cursor, user, ids, context=context):
+ default['calendar_attendee'] = attendee_obj.copy(cursor, user,
+ attendee.calendar_attendee.id, context=context)
+ new_id = super(TodoAttendee, self).copy(cursor, user, attendee.id,
+ default=default, context=context)
+ new_ids.append(new_id)
+ if int_id:
+ return new_ids[0]
+ return new_ids
+
def _attendee2update(self, cursor, user, attendee, context=None):
attendee_obj = self.pool.get('calendar.attendee')
return attendee_obj._attendee2update(cursor, user, attendee,
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index 23dd6de..9bbf22c 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond-calendar-todo
-Version: 1.4.0
+Version: 1.4.1
Summary: Add Todo support on CalDAV
Home-page: http://www.tryton.org/
Author: B2CK
diff --git a/trytond_calendar_todo.egg-info/requires.txt b/trytond_calendar_todo.egg-info/requires.txt
index 7627a53..59de83b 100644
--- a/trytond_calendar_todo.egg-info/requires.txt
+++ b/trytond_calendar_todo.egg-info/requires.txt
@@ -1,5 +1,5 @@
-vobject
-PyWebDAV
+vobject >= 0.8.0
+PyWebDAV >= 0.9.3
python-dateutil
pytz
trytond_calendar
commit 138f89ffb10aa6cf533f0acf1fc1593db6714fe8
Author: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Date: Thu Jan 7 07:25:05 2010 +0100
Adding versioned depend for python-vobject.
diff --git a/debian/control b/debian/control
index 2b44d29..c742de2 100644
--- a/debian/control
+++ b/debian/control
@@ -16,8 +16,8 @@ Package: tryton-modules-calendar-todo
Architecture: all
Depends:
${misc:Depends}, ${python:Depends}, tryton-server (>= 1.4),
- tryton-modules-calendar (>= 1.4), python-dateutil, python-tz, python-vobject,
- python-webdav, python-pkg-resources
+ tryton-modules-calendar (>= 1.4), python-dateutil, python-tz,
+ python-vobject (>= 0.8.1c-1), python-webdav, python-pkg-resources
XB-Python-Version: ${python:Versions}
Description: Tryton Application Platform (Calendar Todo Module)
Tryton is a high-level general purpose application platform written in Python
commit 2e0159dead799ad81dd953c75343018c54459aac
Author: Daniel Baumann <daniel at debian.org>
Date: Thu Jan 7 07:24:37 2010 +0100
Making depends versioned for tryton 1.4.
diff --git a/debian/control b/debian/control
index 192f737..2b44d29 100644
--- a/debian/control
+++ b/debian/control
@@ -15,9 +15,9 @@ Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-tod
Package: tryton-modules-calendar-todo
Architecture: all
Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server, tryton-modules-calendar,
- python-dateutil, python-tz, python-vobject, python-webdav,
- python-pkg-resources
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= 1.4),
+ tryton-modules-calendar (>= 1.4), python-dateutil, python-tz, python-vobject,
+ python-webdav, python-pkg-resources
XB-Python-Version: ${python:Versions}
Description: Tryton Application Platform (Calendar Todo Module)
Tryton is a high-level general purpose application platform written in Python
commit 460872c12e23f41d81ff999d308a69c269c5f3eb
Author: Daniel Baumann <daniel at debian.org>
Date: Mon Oct 19 22:54:45 2009 +0200
Adding debian version 1.4.0-1.
diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644
index 0000000..931601e
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,2 @@
+Version 1.4.0 - 2009-10-19
+* Initial release
diff --git a/COPYRIGHT b/COPYRIGHT
new file mode 100644
index 0000000..3a474ed
--- /dev/null
+++ b/COPYRIGHT
@@ -0,0 +1,16 @@
+Copyright (C) 2009 Cédric Krier.
+Copyright (C) 2009 Bertrand Chenal.
+Copyright (C) 2009 B2CK SPRL.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..27a8558
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,34 @@
+Installing trytond_calendar_todo
+=================================
+
+Prerequisites
+-------------
+
+ * Python 2.5 or later (http://www.python.org/)
+ * trytond (http://www.tryton.org/)
+ * vobject (http://vobject.skyhouseconsulting.com/)
+ * pywebdav (http://sourceforge.net/projects/pywebdav/)
+ * python-dateutil (http://labix.org/python-dateutil)
+ * pytz (http://pytz.sourceforge.net/)
+ * trytond_calendar (http://www.tryton.org/)
+
+Installation
+------------
+
+Once you've downloaded and unpacked the trytond_calendar_todo source
+release, enter the directory where the archive was unpacked, and run:
+
+ python setup.py install
+
+Note that you may need administrator/root privileges for this step, as
+this command will by default attempt to install module to the Python
+site-packages directory on your system.
+
+For advanced options, please refer to the easy_install and/or the distutils
+documentation:
+
+ http://peak.telecommunity.com/DevCenter/EasyInstall
+ http://docs.python.org/inst/inst.html
+
+To use without installation, extract the archive into ``trytond/modules`` with
+the directory name calendar_todo.
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..23bd33a
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,11 @@
+include INSTALL
+include README
+include TODO
+include COPYRIGHT
+include CHANGELOG
+include LICENSE
+include *.xml
+include *.odt
+include *.csv
+include tests/*
+
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..c25f548
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,25 @@
+Metadata-Version: 1.0
+Name: trytond_calendar_todo
+Version: 1.4.0
+Summary: Add Todo support on CalDAV
+Home-page: http://www.tryton.org/
+Author: B2CK
+Author-email: info at b2ck.com
+License: GPL-3
+Download-URL: http://downloads.tryton.org/1.4/
+Description: UNKNOWN
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Plugins
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: Financial and Insurance Industry
+Classifier: Intended Audience :: Legal Industry
+Classifier: Intended Audience :: Manufacturing
+Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Natural Language :: English
+Classifier: Natural Language :: French
+Classifier: Natural Language :: German
+Classifier: Natural Language :: Spanish
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Office/Business
diff --git a/README b/README
new file mode 100644
index 0000000..c5ca2f9
--- /dev/null
+++ b/README
@@ -0,0 +1,36 @@
+trytond_calendar_todo
+=====================
+
+The calendar_todo module of the Tryton application platform. See
+__tryton__.py
+
+Installing
+----------
+
+See INSTALL
+
+Support
+-------
+
+If you encounter any problems with Tryton, please don't hesitate to ask
+questions on the Tryton bug tracker, mailing list, wiki or IRC channel:
+
+ http://bugs.tryton.org/
+ http://groups.tryton.org/
+ http://wiki.tryton.org/
+ irc://irc.freenode.net/tryton
+
+License
+-------
+
+See LICENSE
+
+Copyright
+---------
+
+See COPYRIGHT
+
+
+For more information please visit the Tryton web site:
+
+ http://www.tryton.org/
diff --git a/__init__.py b/__init__.py
new file mode 100644
index 0000000..d62d024
--- /dev/null
+++ b/__init__.py
@@ -0,0 +1,6 @@
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+
+import caldav
+from todo import *
+from webdav import *
diff --git a/__tryton__.py b/__tryton__.py
new file mode 100644
index 0000000..a27c01d
--- /dev/null
+++ b/__tryton__.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+{
+ 'name' : 'Calendar Todo',
+ 'name_de_DE' : 'Kalender Aufgaben',
+ 'name_es_CO': 'Calendario de tareas',
+ 'name_es_ES': 'Calendario de tareas',
+ 'name_fr_FR' : 'Tâche Calendrier',
+ 'version' : '1.4.0',
+ 'author' : 'B2CK',
+ 'email': 'info at b2ck.com',
+ 'website': 'http://www.tryton.org/',
+ 'description': 'Add Todo support on CalDAV',
+ 'description_de_DE' : 'Fügt Unterstützung für Aufgaben in CalDAV hinzu',
+ 'description_es_CO': 'Añade soporte de tareas sobre CalDAV',
+ 'description_es_ES': 'Añade soporte de tareas sobre CalDAV',
+ 'description_fr_FR': 'Ajoute la gestion des tâches au CalDAV',
+ 'depends' : [
+ 'ir',
+ 'res',
+ 'webdav',
+ 'calendar',
+ ],
+ 'xml' : [
+ 'todo.xml',
+ ],
+ 'translation': [
+ 'de_DE.csv',
+ 'es_CO.csv',
+ 'es_ES.csv',
+ 'fr_FR.csv',
+ ],
+}
diff --git a/caldav.py b/caldav.py
new file mode 100644
index 0000000..82d5241
--- /dev/null
+++ b/caldav.py
@@ -0,0 +1,25 @@
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+_TRYTON_RELOAD = False
+
+from DAV import propfind
+from DAV.utils import get_uriparentpath
+from trytond.protocols.webdav import TrytonDAVInterface
+
+_mk_prop_response = propfind.PROPFIND.mk_prop_response
+
+def mk_prop_response(self, uri, good_props, bad_props, doc):
+ res = _mk_prop_response(self, uri, good_props, bad_props, doc)
+ parent_uri = get_uriparentpath(uri and uri.strip('/') or '')
+ if not parent_uri:
+ return res
+ dbname, parent_uri = TrytonDAVInterface.get_dburi(parent_uri)
+ if parent_uri in ('Calendars', 'Calendars/'):
+ vc = doc.createElement('vtodo-collection')
+ vc.setAttribute('xmlns', 'http://groupdav.org/')
+ cols = res.getElementsByTagName('D:collection')
+ if cols:
+ cols[0].parentNode.appendChild(vc)
+ return res
+
+propfind.PROPFIND.mk_prop_response = mk_prop_response
diff --git a/de_DE.csv b/de_DE.csv
new file mode 100644
index 0000000..1c38542
--- /dev/null
+++ b/de_DE.csv
@@ -0,0 +1,89 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.todo,0,Recurrence can not be recurrent!,Wiederholungen können nicht rekursiv sein!,0
+error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,UUID und Wiederholung können in einem Kalender nicht mehrfach vergeben werden!,0
+field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Kalender Alarm,0
+field,"calendar.todo.alarm,rec_name",0,Name,Name,0
+field,"calendar.todo,alarms",0,Alarms,Alarm,0
+field,"calendar.todo.alarm,todo",0,Todo,Aufgabe,0
+field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Kalender Teilnehmer,0
+field,"calendar.todo.attendee,rec_name",0,Name,Name,0
+field,"calendar.todo,attendees",0,Attendees,Teilnehmer,0
+field,"calendar.todo.attendee,todo",0,Todo,Aufgabe,0
+field,"calendar.todo,calendar",0,Calendar,Kalender,0
+field,"calendar.todo-calendar.category,category",0,Category,Kategorie,0
+field,"calendar.todo-calendar.category,rec_name",0,Name,Name,0
+field,"calendar.todo-calendar.category,todo",0,To-Do,Aufgabe,0
+field,"calendar.todo,calendar_owner",0,Owner,Besitzer,0
+field,"calendar.todo,calendar_read_users",0,Read Users,Benutzer mit Leseberechtigung,0
+field,"calendar.todo,calendar_write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
+field,"calendar.todo,categories",0,Categories,Kategorien,0
+field,"calendar.todo,classification",0,Classification,Klassifizierung,0
+field,"calendar.todo,classification_public",0,Classification Public,Öffentliche Klassifizierung,0
+field,"calendar.todo,completed",0,Completed,Abgeschlossen,0
+field,"calendar.todo,description",0,Description,Bezeichnung,0
+field,"calendar.todo,dtstart",0,Start Date,Anfangsdatum,0
+field,"calendar.todo,due",0,Due Date,Fälligkeitsdatum,0
+field,"calendar.todo.exdate,calendar_rdate",0,Calendar RDate,Kalender WDatum,0
+field,"calendar.todo.exdate,rec_name",0,Name,Name,0
+field,"calendar.todo,exdates",0,Exception Dates,Ausnahmedaten,0
+field,"calendar.todo.exdate,todo",0,Todo,Aufgabe,0
+field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
+field,"calendar.todo.exrule,rec_name",0,Name,Name,0
+field,"calendar.todo,exrules",0,Exception Rules,Ausnahmeregeln,0
+field,"calendar.todo.exrule,todo",0,Todo,Aufgabe,0
+field,"calendar.todo,location",0,Location,Ort,0
+field,"calendar.todo,organizer",0,Organizer,Organisator,0
+field,"calendar.todo,parent",0,Parent,Übergeordnet (Aufgabe),0
+field,"calendar.todo,percent_complete",0,Percent complete,% erledigt,0
+field,"calendar.todo.rdate,calendar_rdate",0,Calendar RDate,Kalender WDatum,0
+field,"calendar.todo.rdate,rec_name",0,Name,Name,0
+field,"calendar.todo,rdates",0,Recurrence Dates,Wiederholungsdaten,0
+field,"calendar.todo.rdate,todo",0,Todo,Aufgabe,0
+field,"calendar.todo,rec_name",0,Name,Name,0
+field,"calendar.todo,recurrence",0,Recurrence,Wiederholung,0
+field,"calendar.todo,recurrences",0,Recurrences,Wiederholungen,0
+field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
+field,"calendar.todo.rrule,rec_name",0,Name,Name,0
+field,"calendar.todo,rrules",0,Recurrence Rules,Wiederholungsregeln,0
+field,"calendar.todo.rrule,todo",0,Todo,Aufgabe,0
+field,"calendar.todo,sequence",0,Sequence,Sequenz,0
+field,"calendar.todo,status",0,Status,Status,0
+field,"calendar.todo,summary",0,Summary,Zusammenfassung,0
+field,"calendar.todo,timezone",0,Timezone,Zeitzone,0
+field,"calendar.todo,uuid",0,UUID,UUID,0
+field,"calendar.todo,vtodo",0,vtodo,vtodo,0
+help,"calendar.todo,uuid",0,Universally Unique Identifier,Universally Unique Identifier,0
+model,"calendar.todo.alarm,name",0,Alarm,Alarm,0
+model,"calendar.todo.attendee,name",0,Attendee,Teilnehmer,0
+model,"calendar.todo-calendar.category,name",0,Todo - Category,Aufgabe - Kategorie,0
+model,"calendar.todo.exdate,name",0,Exception Date,Ausnahmedatum,0
+model,"calendar.todo.exrule,name",0,Exception Rule,Ausnahmeregel,0
+model,"calendar.todo,name",0,Todo,Aufgabe,0
+model,"calendar.todo.rdate,name",0,Recurrence Date,Wiederholungsdatum,0
+model,"calendar.todo.rrule,name",0,Recurrence Rule,Wiederholungsregel,0
+model,"ir.action,name",act_todo_form,Todos,Aufgaben,0
+model,"ir.ui.menu,name",menu_todo_form,Todos,Aufgaben,0
+selection,"calendar.todo,classification",0,Confidential,Vertraulich,0
+selection,"calendar.todo,classification",0,Private,Privat,0
+selection,"calendar.todo,classification",0,Public,Öffentlich,0
+selection,"calendar.todo,status",0,,,0
+selection,"calendar.todo,status",0,Cancelled,Abgesagt,0
+selection,"calendar.todo,status",0,Completed,Abgeschlossen,0
+selection,"calendar.todo,status",0,In-Process,In Arbeit,0
+selection,"calendar.todo,status",0,Needs-Action,Benötigt Eingriff,0
+view,calendar.todo,0,Attendees,Teilnehmer,0
+view,calendar.todo,0,Categories,Kategorien,0
+view,calendar.todo,0,General,Allgemein,0
+view,calendar.todo,0,Recurrences,Wiederholungen,0
+view,calendar.todo,0,Todo,Aufgabe,0
+view,calendar.todo,0,Todos,Aufgaben,0
+view,calendar.todo.attendee,0,Attendee,Teilnehmer,0
+view,calendar.todo.attendee,0,Attendees,Teilnehmer,0
+view,calendar.todo.exdate,0,Exception Date,Ausnahmedatum,0
+view,calendar.todo.exdate,0,Exception Dates,Ausnahmedaten,0
+view,calendar.todo.exrule,0,Exception Rule,Ausnahmeregel,0
+view,calendar.todo.exrule,0,Exception Rules,Ausnahmeregeln,0
+view,calendar.todo.rdate,0,Recurrence Date,Wiederholungsdatum,0
+view,calendar.todo.rdate,0,Recurrence Dates,Wiederholungsdaten,0
+view,calendar.todo.rrule,0,Recurrence Rule,Wiederholungsregel,0
+view,calendar.todo.rrule,0,Recurrence Rules,Wiederholungsregeln,0
diff --git a/debian/README.source b/debian/README.source
new file mode 100644
index 0000000..dcc7ba3
--- /dev/null
+++ b/debian/README.source
@@ -0,0 +1,37 @@
+Package Repositories
+--------------------
+
+Backports for the current stable debian distribution as well as snapshots of
+unreleased versions may be available in repositories listed on the maintainers
+homepage. The current URL of the maintainer homepage can be seen in
+debian/copyright.
+
+
+Source Access
+-------------
+
+You can obtain the sources of this package with:
+
+ $ apt-get source ${PACKAGE}
+
+whereas '${PACKAGE}' has to be replaced with the actual name of the package.
+
+This package is maintained with the Git version control system. The current git
+source tree can be obtained with:
+
+ $ git clone ${GIT_URI}
+
+whereas '${GIT_URI}' has to be replaced with the actual URI for the Git
+repository. The current Git URI can be seen in debian/control in the extracted
+package sources.
+
+More information about Git can be found in the git-core package.
+
+This package may use the Quilt patch system to manage all modifications to the
+upstream source. Changes, if any, are stored in the source package as diffs in
+debian/diff and are applied during the build. Current modifications can be
+applied to the source tree with:
+
+ $ quilt push -a
+
+More information about Quilt can be found in the quilt package.
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..fb6e052
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,5 @@
+tryton-modules-calendar-todo (1.4.0-1) unstable; urgency=low
+
+ * Initial release.
+
+ -- Daniel Baumann <daniel at debian.org> Mon, 19 Oct 2009 23:39:41 +0200
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..7f8f011
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+7
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..192f737
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,27 @@
+Source: tryton-modules-calendar-todo
+Section: python
+Priority: optional
+Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
+Uploaders:
+ Daniel Baumann <daniel at debian.org>,
+ Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
+Build-Depends:
+ debhelper (>= 7), python, python-all-dev, python-setuptools, python-support
+Standards-Version: 3.8.3
+Homepage: http://www.tryton.org/
+Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-calendar-todo.git
+Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-todo.git
+
+Package: tryton-modules-calendar-todo
+Architecture: all
+Depends:
+ ${misc:Depends}, ${python:Depends}, tryton-server, tryton-modules-calendar,
+ python-dateutil, python-tz, python-vobject, python-webdav,
+ python-pkg-resources
+XB-Python-Version: ${python:Versions}
+Description: Tryton Application Platform (Calendar Todo Module)
+ Tryton is a high-level general purpose application platform written in Python
+ and using PostgreSQL as database engine. It is the core base of a complete
+ business solution.
+ .
+ This module adds Todo support on CalDAV.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..2eed23b
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,45 @@
+Upstream-Contact: Tryton project <tryton at googlegroups.com>
+Upstream-Homepage: http://downloads.tryton.org/
+Maintainer-Contact: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
+Maintainer-Homepage: http://tryton.debian-maintainers.org/
+
+Files: *
+Copyright:
+ (C) 2009 Cedric Krier
+ (C) 2009 Bertrand Chenal
+ (C) 2009 B2CK SPRL
+License: GPL-3+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+ .
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+ .
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ .
+ On Debian systems, the complete text of the GNU General Public License
+ can be found in /usr/share/common-licenses/GPL-3 file.
+
+Files: debian/*
+Copyright: (C) 2009 Daniel Baumann <daniel at debian.org>
+License: GPL-3+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+ .
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+ .
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ .
+ On Debian systems, the complete text of the GNU General Public License
+ can be found in /usr/share/common-licenses/GPL-3 file.
diff --git a/debian/pycompat b/debian/pycompat
new file mode 100644
index 0000000..0cfbf08
--- /dev/null
+++ b/debian/pycompat
@@ -0,0 +1 @@
+2
diff --git a/debian/pyversions b/debian/pyversions
new file mode 100644
index 0000000..b3dc41e
--- /dev/null
+++ b/debian/pyversions
@@ -0,0 +1 @@
+2.5-
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..000210b
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,4 @@
+#!/usr/bin/make -f
+
+%:
+ dh ${@}
diff --git a/es_CO.csv b/es_CO.csv
new file mode 100644
index 0000000..554124d
--- /dev/null
+++ b/es_CO.csv
@@ -0,0 +1,89 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.todo,0,Recurrence can not be recurrent!,¡La repetición no puede repetirse!,0
+error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,¡El UUID y la recurrencia deben ser únicos por calendario! ,0
+field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,,0
+field,"calendar.todo.alarm,rec_name",0,Name,Nombre,0
+field,"calendar.todo,alarms",0,Alarms,Alarmas,0
+field,"calendar.todo.alarm,todo",0,Todo,,0
+field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,,0
+field,"calendar.todo.attendee,rec_name",0,Name,Nombre,0
+field,"calendar.todo,attendees",0,Attendees,Asistentes,0
+field,"calendar.todo.attendee,todo",0,Todo,,0
+field,"calendar.todo,calendar",0,Calendar,Calendario,0
+field,"calendar.todo-calendar.category,category",0,Category,Categoría,0
+field,"calendar.todo-calendar.category,rec_name",0,Name,Nombre,0
+field,"calendar.todo-calendar.category,todo",0,To-Do,,0
+field,"calendar.todo,calendar_owner",0,Owner,Propietario,0
+field,"calendar.todo,calendar_read_users",0,Read Users,Leer Usuarios,0
+field,"calendar.todo,calendar_write_users",0,Write Users,Escribir Usuarios,0
+field,"calendar.todo,categories",0,Categories,Categorías,0
+field,"calendar.todo,classification",0,Classification,Clasificación,0
+field,"calendar.todo,classification_public",0,Classification Public,Clasificación Pública,0
+field,"calendar.todo,completed",0,Completed,,0
+field,"calendar.todo,description",0,Description,Descripción,0
+field,"calendar.todo,dtstart",0,Start Date,Fecha Inicio,0
+field,"calendar.todo,due",0,Due Date,,0
+field,"calendar.todo.exdate,calendar_rdate",0,Calendar RDate,,0
+field,"calendar.todo.exdate,rec_name",0,Name,Nombre,0
+field,"calendar.todo,exdates",0,Exception Dates,Fechas de Excepción,0
+field,"calendar.todo.exdate,todo",0,Todo,,0
+field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,,0
+field,"calendar.todo.exrule,rec_name",0,Name,Nombre,0
+field,"calendar.todo,exrules",0,Exception Rules,Reglas de Excepción,0
+field,"calendar.todo.exrule,todo",0,Todo,,0
+field,"calendar.todo,location",0,Location,Lugar,0
+field,"calendar.todo,organizer",0,Organizer,Organizador,0
+field,"calendar.todo,parent",0,Parent,Padre,0
+field,"calendar.todo,percent_complete",0,Percent complete,,0
+field,"calendar.todo.rdate,calendar_rdate",0,Calendar RDate,,0
+field,"calendar.todo.rdate,rec_name",0,Name,Nombre,0
+field,"calendar.todo,rdates",0,Recurrence Dates,Fechas de Repetición,0
+field,"calendar.todo.rdate,todo",0,Todo,,0
+field,"calendar.todo,rec_name",0,Name,Nombre,0
+field,"calendar.todo,recurrence",0,Recurrence,Repetición,0
+field,"calendar.todo,recurrences",0,Recurrences,Repeticiones,0
+field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,,0
+field,"calendar.todo.rrule,rec_name",0,Name,Nombre,0
+field,"calendar.todo,rrules",0,Recurrence Rules,Reglas de Repetición,0
+field,"calendar.todo.rrule,todo",0,Todo,,0
+field,"calendar.todo,sequence",0,Sequence,Secuencia,0
+field,"calendar.todo,status",0,Status,Estado,0
+field,"calendar.todo,summary",0,Summary,Resumen,0
+field,"calendar.todo,timezone",0,Timezone,Zona horaria,0
+field,"calendar.todo,uuid",0,UUID,UUID,0
+field,"calendar.todo,vtodo",0,vtodo,,0
+help,"calendar.todo,uuid",0,Universally Unique Identifier,Identificador Único Universal,0
+model,"calendar.todo.alarm,name",0,Alarm,Alarma,0
+model,"calendar.todo.attendee,name",0,Attendee,Asistente,0
+model,"calendar.todo-calendar.category,name",0,Todo - Category,,0
+model,"calendar.todo.exdate,name",0,Exception Date,Fecha de Excepción,0
+model,"calendar.todo.exrule,name",0,Exception Rule,Regla de Excepción,0
+model,"calendar.todo,name",0,Todo,,0
+model,"calendar.todo.rdate,name",0,Recurrence Date,Fecha de Repetición,0
+model,"calendar.todo.rrule,name",0,Recurrence Rule,Regla de Repetición,0
+model,"ir.action,name",act_todo_form,Todos,,0
+model,"ir.ui.menu,name",menu_todo_form,Todos,,0
+selection,"calendar.todo,classification",0,Confidential,Confidencial,0
+selection,"calendar.todo,classification",0,Private,Privado,0
+selection,"calendar.todo,classification",0,Public,Público,0
+selection,"calendar.todo,status",0,,,0
+selection,"calendar.todo,status",0,Cancelled,Cancelado,0
+selection,"calendar.todo,status",0,Completed,,0
+selection,"calendar.todo,status",0,In-Process,,0
+selection,"calendar.todo,status",0,Needs-Action,,0
+view,calendar.todo,0,Attendees,Asistentes,0
+view,calendar.todo,0,Categories,Categorías,0
+view,calendar.todo,0,General,General,0
+view,calendar.todo,0,Recurrences,Repeticiones,0
+view,calendar.todo,0,Todo,,0
+view,calendar.todo,0,Todos,,0
+view,calendar.todo.attendee,0,Attendee,Asistente,0
+view,calendar.todo.attendee,0,Attendees,Asistentes,0
+view,calendar.todo.exdate,0,Exception Date,Fecha de Excepción,0
+view,calendar.todo.exdate,0,Exception Dates,Fechas de Excepción,0
+view,calendar.todo.exrule,0,Exception Rule,Regla de Excepción,0
+view,calendar.todo.exrule,0,Exception Rules,Reglas de Excepción,0
+view,calendar.todo.rdate,0,Recurrence Date,Fecha de Repetición,0
+view,calendar.todo.rdate,0,Recurrence Dates,Fechas de Repetición,0
+view,calendar.todo.rrule,0,Recurrence Rule,Regla de Repetición,0
+view,calendar.todo.rrule,0,Recurrence Rules,Reglas de Repetición,0
diff --git a/es_ES.csv b/es_ES.csv
new file mode 100644
index 0000000..5c5af3b
--- /dev/null
+++ b/es_ES.csv
@@ -0,0 +1,89 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.todo,0,Recurrence can not be recurrent!,Una recurrencia no puede ser recurrente,0
+error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,UUID y recurrencia deben ser únicos en un calendario,0
+field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Alarma del calendario,0
+field,"calendar.todo.alarm,rec_name",0,Name,Nombre,0
+field,"calendar.todo,alarms",0,Alarms,Alarmas,0
+field,"calendar.todo.alarm,todo",0,Todo,Tarea,0
+field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Calendario de asistentes,0
+field,"calendar.todo.attendee,rec_name",0,Name,Nombre,0
+field,"calendar.todo,attendees",0,Attendees,Asistentes,0
+field,"calendar.todo.attendee,todo",0,Todo,Tarea,0
+field,"calendar.todo,calendar",0,Calendar,Calendario,0
+field,"calendar.todo-calendar.category,category",0,Category,Categoría,0
+field,"calendar.todo-calendar.category,rec_name",0,Name,Nombre,0
+field,"calendar.todo-calendar.category,todo",0,To-Do,Por hacer,0
+field,"calendar.todo,calendar_owner",0,Owner,Dueño,0
+field,"calendar.todo,calendar_read_users",0,Read Users,Usuarios con lectura,0
+field,"calendar.todo,calendar_write_users",0,Write Users,Usuarios con escritura,0
+field,"calendar.todo,categories",0,Categories,Categorías,0
+field,"calendar.todo,classification",0,Classification,Clasificación,0
+field,"calendar.todo,classification_public",0,Classification Public,Clasificación pública,0
+field,"calendar.todo,completed",0,Completed,Completada,0
+field,"calendar.todo,description",0,Description,Descripción,0
+field,"calendar.todo,dtstart",0,Start Date,Fecha inicio,0
+field,"calendar.todo,due",0,Due Date,Fecha de vencimiento,0
+field,"calendar.todo.exdate,calendar_rdate",0,Calendar RDate,Fecha de recurrencia,0
+field,"calendar.todo.exdate,rec_name",0,Name,Nombre,0
+field,"calendar.todo,exdates",0,Exception Dates,Fechas excluidas,0
+field,"calendar.todo.exdate,todo",0,Todo,Tarea,0
+field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Regla de recurrencia,0
+field,"calendar.todo.exrule,rec_name",0,Name,Nombre,0
+field,"calendar.todo,exrules",0,Exception Rules,Reglas de excepciones,0
+field,"calendar.todo.exrule,todo",0,Todo,Tarea,0
+field,"calendar.todo,location",0,Location,Ubicación,0
+field,"calendar.todo,organizer",0,Organizer,Organizador,0
+field,"calendar.todo,parent",0,Parent,Padre,0
+field,"calendar.todo,percent_complete",0,Percent complete,Porcentaje total,0
+field,"calendar.todo.rdate,calendar_rdate",0,Calendar RDate,Fecha de recurrencia,0
+field,"calendar.todo.rdate,rec_name",0,Name,Nombre,0
+field,"calendar.todo,rdates",0,Recurrence Dates,Fechas de recurrencia,0
+field,"calendar.todo.rdate,todo",0,Todo,Tarea,0
+field,"calendar.todo,rec_name",0,Name,Nombre,0
+field,"calendar.todo,recurrence",0,Recurrence,Recurrencia,0
+field,"calendar.todo,recurrences",0,Recurrences,Recurrencias,0
+field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Regla de recurrencia,0
+field,"calendar.todo.rrule,rec_name",0,Name,Nombre,0
+field,"calendar.todo,rrules",0,Recurrence Rules,Reglas de recurrencia,0
+field,"calendar.todo.rrule,todo",0,Todo,Tarea,0
+field,"calendar.todo,sequence",0,Sequence,Secuencia,0
+field,"calendar.todo,status",0,Status,Estado,0
+field,"calendar.todo,summary",0,Summary,Resumen,0
+field,"calendar.todo,timezone",0,Timezone,Zona horaria,0
+field,"calendar.todo,uuid",0,UUID,UUID,0
+field,"calendar.todo,vtodo",0,vtodo,vtodo,0
+help,"calendar.todo,uuid",0,Universally Unique Identifier,Identificador universal único,0
+model,"calendar.todo.alarm,name",0,Alarm,Alarma,0
+model,"calendar.todo.attendee,name",0,Attendee,Asistentes,0
+model,"calendar.todo-calendar.category,name",0,Todo - Category,Tarea - Categoría,0
+model,"calendar.todo.exdate,name",0,Exception Date,Fecha excluida,0
+model,"calendar.todo.exrule,name",0,Exception Rule,Regla de excepción,0
+model,"calendar.todo,name",0,Todo,Tarea,0
+model,"calendar.todo.rdate,name",0,Recurrence Date,Fecha de recurrencia,0
+model,"calendar.todo.rrule,name",0,Recurrence Rule,Regla de recurrencia,0
+model,"ir.action,name",act_todo_form,Todos,Tareas,0
+model,"ir.ui.menu,name",menu_todo_form,Todos,Tareas,0
+selection,"calendar.todo,classification",0,Confidential,Confidencial,0
+selection,"calendar.todo,classification",0,Private,Privado,0
+selection,"calendar.todo,classification",0,Public,Público,0
+selection,"calendar.todo,status",0,,,0
+selection,"calendar.todo,status",0,Cancelled,Cancelada,0
+selection,"calendar.todo,status",0,Completed,Completado,0
+selection,"calendar.todo,status",0,In-Process,En proceso,0
+selection,"calendar.todo,status",0,Needs-Action,Necesita una acción,0
+view,calendar.todo,0,Attendees,Asistentes,0
+view,calendar.todo,0,Categories,Categorías,0
+view,calendar.todo,0,General,General,0
+view,calendar.todo,0,Recurrences,Recurrencias,0
+view,calendar.todo,0,Todo,Tarea,0
+view,calendar.todo,0,Todos,Tareas,0
+view,calendar.todo.attendee,0,Attendee,Asistentes,0
+view,calendar.todo.attendee,0,Attendees,Asistentes,0
+view,calendar.todo.exdate,0,Exception Date,Fecha excluida,0
+view,calendar.todo.exdate,0,Exception Dates,Fechas excluidas,0
+view,calendar.todo.exrule,0,Exception Rule,Regla de excepción,0
+view,calendar.todo.exrule,0,Exception Rules,Reglas de excepciones,0
+view,calendar.todo.rdate,0,Recurrence Date,Fecha de recurrencia,0
+view,calendar.todo.rdate,0,Recurrence Dates,Fechas de recurrencia,0
+view,calendar.todo.rrule,0,Recurrence Rule,Regla de recurrencia,0
+view,calendar.todo.rrule,0,Recurrence Rules,Reglas de recurrencia,0
diff --git a/fr_FR.csv b/fr_FR.csv
new file mode 100644
index 0000000..e2d1eee
--- /dev/null
+++ b/fr_FR.csv
@@ -0,0 +1,89 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.todo,0,Recurrence can not be recurrent!,Une récurrence ne peut pas être récurrente !,0
+error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,UUID et récurrence doivent être uniques sur un calendrier !,0
+field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Alarme calendrier,0
+field,"calendar.todo.alarm,rec_name",0,Name,Nom,0
+field,"calendar.todo,alarms",0,Alarms,Alarmes,0
+field,"calendar.todo.alarm,todo",0,Todo,Tâche,0
+field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Participant calendrier,0
+field,"calendar.todo.attendee,rec_name",0,Name,Nom,0
+field,"calendar.todo,attendees",0,Attendees,Participants,0
+field,"calendar.todo.attendee,todo",0,Todo,Tâche,0
+field,"calendar.todo,calendar",0,Calendar,Calendrier,0
+field,"calendar.todo-calendar.category,category",0,Category,Catégorie,0
+field,"calendar.todo-calendar.category,rec_name",0,Name,Nom,0
+field,"calendar.todo-calendar.category,todo",0,To-Do,Tâche,0
+field,"calendar.todo,calendar_owner",0,Owner,Propriétaire,0
+field,"calendar.todo,calendar_read_users",0,Read Users,Utilisateurs en lecture,0
+field,"calendar.todo,calendar_write_users",0,Write Users,Utilisateurs en écriture,0
+field,"calendar.todo,categories",0,Categories,Catégories,0
+field,"calendar.todo,classification",0,Classification,Classification,0
+field,"calendar.todo,classification_public",0,Classification Public,Classification publique,0
+field,"calendar.todo,completed",0,Completed,Complété,0
+field,"calendar.todo,description",0,Description,Description,0
+field,"calendar.todo,dtstart",0,Start Date,Date de début,0
+field,"calendar.todo,due",0,Due Date,Date d'échéance,0
+field,"calendar.todo.exdate,calendar_rdate",0,Calendar RDate,Date de récurrence,0
+field,"calendar.todo.exdate,rec_name",0,Name,Nom,0
+field,"calendar.todo,exdates",0,Exception Dates,Dates d'exception,0
+field,"calendar.todo.exdate,todo",0,Todo,Tâche,0
+field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
+field,"calendar.todo.exrule,rec_name",0,Name,Nom,0
+field,"calendar.todo,exrules",0,Exception Rules,Règles d'exception,0
+field,"calendar.todo.exrule,todo",0,Todo,Tâche,0
+field,"calendar.todo,location",0,Location,Emplacement,0
+field,"calendar.todo,organizer",0,Organizer,Organisateur,0
+field,"calendar.todo,parent",0,Parent,Parent,0
+field,"calendar.todo,percent_complete",0,Percent complete,Pourcentage effectué,0
+field,"calendar.todo.rdate,calendar_rdate",0,Calendar RDate,Date de récurrence,0
+field,"calendar.todo.rdate,rec_name",0,Name,Nom,0
+field,"calendar.todo,rdates",0,Recurrence Dates,Dates de récurrence,0
+field,"calendar.todo.rdate,todo",0,Todo,Tâche,0
+field,"calendar.todo,rec_name",0,Name,Nom,0
+field,"calendar.todo,recurrence",0,Recurrence,Récurrence,0
+field,"calendar.todo,recurrences",0,Recurrences,Récurrences,0
+field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
+field,"calendar.todo.rrule,rec_name",0,Name,Nom,0
+field,"calendar.todo,rrules",0,Recurrence Rules,Règles de récurrence,0
+field,"calendar.todo.rrule,todo",0,Todo,Tâche,0
+field,"calendar.todo,sequence",0,Sequence,Séquence,0
+field,"calendar.todo,status",0,Status,Statut,0
+field,"calendar.todo,summary",0,Summary,Résumé,0
+field,"calendar.todo,timezone",0,Timezone,Fuseau Horaire,0
+field,"calendar.todo,uuid",0,UUID,UUID,0
+field,"calendar.todo,vtodo",0,vtodo,vtodo,0
+help,"calendar.todo,uuid",0,Universally Unique Identifier,Identificateur unique universel,0
+model,"calendar.todo.alarm,name",0,Alarm,Alarme,0
+model,"calendar.todo.attendee,name",0,Attendee,Participant,0
+model,"calendar.todo-calendar.category,name",0,Todo - Category,Todo - Catégorie,0
+model,"calendar.todo.exdate,name",0,Exception Date,Date d'exception,0
+model,"calendar.todo.exrule,name",0,Exception Rule,Règle d'exception,0
+model,"calendar.todo,name",0,Todo,Tâche,0
+model,"calendar.todo.rdate,name",0,Recurrence Date,Date de récurrence,0
+model,"calendar.todo.rrule,name",0,Recurrence Rule,Règle de récurrence,0
+model,"ir.action,name",act_todo_form,Todos,Tâches,0
+model,"ir.ui.menu,name",menu_todo_form,Todos,Tâches,0
+selection,"calendar.todo,classification",0,Confidential,Confidentiel,0
+selection,"calendar.todo,classification",0,Private,Privé,0
+selection,"calendar.todo,classification",0,Public,Publique,0
+selection,"calendar.todo,status",0,,,0
+selection,"calendar.todo,status",0,Cancelled,Annulé,0
+selection,"calendar.todo,status",0,Completed,Complété,0
+selection,"calendar.todo,status",0,In-Process,En court,0
+selection,"calendar.todo,status",0,Needs-Action,Nécessite une action,0
+view,calendar.todo,0,Attendees,Participants,0
+view,calendar.todo,0,Categories,Catégories,0
+view,calendar.todo,0,General,Général,0
+view,calendar.todo,0,Recurrences,Récurrences,0
+view,calendar.todo,0,Todo,Tâche,0
+view,calendar.todo,0,Todos,Tâches,0
+view,calendar.todo.attendee,0,Attendee,Participant,0
+view,calendar.todo.attendee,0,Attendees,Participants,0
+view,calendar.todo.exdate,0,Exception Date,Date d'exception,0
+view,calendar.todo.exdate,0,Exception Dates,Dates d'exception,0
+view,calendar.todo.exrule,0,Exception Rule,Règle d'exception,0
+view,calendar.todo.exrule,0,Exception Rules,Règles d'exception,0
+view,calendar.todo.rdate,0,Recurrence Date,Date de récurrence,0
+view,calendar.todo.rdate,0,Recurrence Dates,Dates de récurrence,0
+view,calendar.todo.rrule,0,Recurrence Rule,Règle de récurrence,0
+view,calendar.todo.rrule,0,Recurrence Rules,Règles de récurrence,0
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000..861a9f5
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,5 @@
+[egg_info]
+tag_build =
+tag_date = 0
+tag_svn_revision = 0
+
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..94e80dc
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+
+from setuptools import setup, find_packages
+import re
+
+info = eval(file('__tryton__.py').read())
+
+requires = ['vobject', 'PyWebDAV', 'python-dateutil', 'pytz']
+for dep in info.get('depends', []):
+ if not re.match(r'(ir|res|workflow|webdav)(\W|$)', dep):
+ requires.append('trytond_' + dep)
+
+major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
+requires.append('trytond >= %s.%s' % (major_version, minor_version))
+requires.append('trytond < %s.%s' % (major_version, int(minor_version) + 1))
+
+setup(name='trytond_calendar_todo',
+ version=info.get('version', '0.0.1'),
+ description=info.get('description', ''),
+ author=info.get('author', ''),
+ author_email=info.get('email', ''),
+ url=info.get('website', ''),
+ download_url="http://downloads.tryton.org/" + \
+ info.get('version', '0.0.1').rsplit('.', 1)[0] + '/',
+ package_dir={'trytond.modules.calendar_todo': '.'},
+ packages=[
+ 'trytond.modules.calendar_todo',
+ ],
+ package_data={
+ 'trytond.modules.calendar_todo': info.get('xml', []) \
+ + info.get('translation', []),
+ },
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Environment :: Plugins',
+ 'Intended Audience :: Developers',
+ 'Intended Audience :: Financial and Insurance Industry',
+ 'Intended Audience :: Legal Industry',
+ 'Intended Audience :: Manufacturing',
+ 'License :: OSI Approved :: GNU General Public License (GPL)',
+ 'Natural Language :: English',
+ 'Natural Language :: French',
+ 'Natural Language :: German',
+ 'Natural Language :: Spanish',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ install_requires=requires,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ calendar_todo = trytond.modules.calendar_todo
+ """,
+)
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..ce85354
--- /dev/null
+++ b/tests/__init__.py
@@ -0,0 +1,4 @@
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+
+from test_calendar_todo import *
diff --git a/tests/test_calendar_todo.py b/tests/test_calendar_todo.py
new file mode 100644
index 0000000..d9661c5
--- /dev/null
+++ b/tests/test_calendar_todo.py
@@ -0,0 +1,38 @@
+#!/usr/bin/env python
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+
+import sys, os
+DIR = os.path.abspath(os.path.normpath(os.path.join(__file__,
+ '..', '..', '..', '..', '..', 'trytond')))
+if os.path.isdir(DIR):
+ sys.path.insert(0, os.path.dirname(DIR))
+
+import unittest
+import trytond.tests.test_tryton
+from trytond.tests.test_tryton import RPCProxy, CONTEXT, SOCK, test_view
+
+
+class CalendarTodoTestCase(unittest.TestCase):
+ '''
+ Test Calendar Todo module.
+ '''
+
+ def setUp(self):
+ trytond.tests.test_tryton.install_module('calendar_todo')
+
+ def test0005views(self):
+ '''
+ Test views.
+ '''
+ self.assertRaises(Exception, test_view('calendar_todo'))
+
+def suite():
+ return unittest.TestLoader().loadTestsFromTestCase(CalendarTodoTestCase)
+
+if __name__ == '__main__':
+ suiteTrytond = trytond.tests.test_tryton.suite()
+ suiteCalendarTodo = suite()
+ alltests = unittest.TestSuite([suiteTrytond, suiteCalendarTodo])
+ unittest.TextTestRunner(verbosity=2).run(alltests)
+ SOCK.disconnect()
diff --git a/todo.py b/todo.py
new file mode 100644
index 0000000..566ec9a
--- /dev/null
+++ b/todo.py
@@ -0,0 +1,1214 @@
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+from trytond.model import ModelSQL, ModelView, fields
+from trytond.tools import Cache, reduce_ids
+import uuid
+import vobject
+import dateutil.tz
+tzlocal = dateutil.tz.tzlocal()
+tzutc = dateutil.tz.tzutc()
+import pytz
+import datetime
+import xml.dom.minidom
+domimpl = xml.dom.minidom.getDOMImplementation()
+
+
+class Todo(ModelSQL, ModelView):
+ "Todo"
+ _description = __doc__
+ _name = 'calendar.todo'
+ _rec_name = 'uuid'
+
+ calendar = fields.Many2One('calendar.calendar', 'Calendar',
+ required=True, select=1)
+ alarms = fields.One2Many('calendar.todo.alarm', 'todo', 'Alarms')
+ classification = fields.Selection([
+ ('public', 'Public'),
+ ('private', 'Private'),
+ ('confidential', 'Confidential'),
+ ], 'Classification', required=True)
+ completed = fields.DateTime('Completed',
+ states={
+ 'readonly': "(status != 'completed')",
+ }, depends=['status'])
+ description = fields.Text('Description')
+ dtstart = fields.DateTime('Start Date', select=1)
+ location = fields.Many2One('calendar.location', 'Location')
+ organizer = fields.Char('Organizer', states={
+ 'required': "bool(attendees) and not bool(parent)",
+ }, depends=['attendees', 'parent'])
+ attendees = fields.One2Many('calendar.todo.attendee', 'todo',
+ 'Attendees')
+ percent_complete = fields.Integer('Percent complete',
+ states={
+ 'readonly': "(status not in ('needs-action', 'in-process'))",
+ }, depends=['status'])
+ recurrences = fields.One2Many('calendar.todo', 'parent', 'Recurrences',
+ domain=["('uuid', '=', uuid)",
+ "('calendar', '=', calendar)"],
+ states={
+ 'invisible': "bool(parent)",
+ }, depends=['uuid', 'calendar', 'parent'])
+ recurrence = fields.DateTime('Recurrence', select=1, states={
+ 'invisible': "not bool(parent)",
+ }, depends=['parent'])
+ sequence = fields.Integer('Sequence')
+ parent = fields.Many2One('calendar.todo', 'Parent',
+ domain=["('uuid', '=', uuid)",
+ "('parent', '=', False)",
+ "('calendar', '=', calendar)"],
+ ondelete='CASCADE', depends=['uuid', 'calendar'])
+ timezone = fields.Selection('timezones', 'Timezone')
+ status = fields.Selection([
+ ('', ''),
+ ('needs-action', 'Needs-Action'),
+ ('completed', 'Completed'),
+ ('in-process', 'In-Process'),
+ ('cancelled', 'Cancelled'),
+ ], 'Status', on_change=['status', 'completed', 'percent_complete'])
+ summary = fields.Char('Summary')
+ uuid = fields.Char('UUID', required=True,
+ help='Universally Unique Identifier', select=1)
+ due = fields.DateTime('Due Date', select=1)
+ categories = fields.Many2Many('calendar.todo-calendar.category',
+ 'todo', 'category', 'Categories')
+ exdates = fields.One2Many('calendar.todo.exdate', 'todo', 'Exception Dates',
+ states={
+ 'invisible': "bool(parent)",
+ }, depends=['parent'])
+ exrules = fields.One2Many('calendar.todo.exrule', 'todo', 'Exception Rules',
+ states={
+ 'invisible': "bool(parent)",
+ }, depends=['parent'])
+ rdates = fields.One2Many('calendar.todo.rdate', 'todo', 'Recurrence Dates',
+ states={
+ 'invisible': "bool(parent)",
+ }, depends=['parent'])
+ rrules = fields.One2Many('calendar.todo.rrule', 'todo', 'Recurrence Rules',
+ states={
+ 'invisible': "bool(parent)",
+ }, depends=['parent'])
+ calendar_owner = fields.Function('get_calendar_field',
+ type='many2one', relation='res.user', string='Owner',
+ fnct_search='search_calendar_field')
+ calendar_read_users = fields.Function('get_calendar_field',
+ type='many2many', relation='res.user', string='Read Users',
+ fnct_search='search_calendar_field')
+ calendar_write_users = fields.Function('get_calendar_field',
+ type='many2many', relation='res.user', string='Write Users',
+ fnct_search='search_calendar_field')
+ classification_public = fields.Function('get_classification_public',
+ type='boolean', string='Classification Public',
+ fnct_search='search_classification_public')
+ vtodo = fields.Binary('vtodo')
+
+ def __init__(self):
+ super(Todo, self).__init__()
+ self._sql_constraints = [
+ ('uuid_recurrence_uniq', 'UNIQUE(uuid, calendar, recurrence)',
+ 'UUID and recurrence must be unique in a calendar!'), #XXX should be unique across all componenets
+ ]
+ self._constraints += [
+ ('check_recurrence', 'invalid_recurrence'),
+ ]
+ self._error_messages.update({
+ 'invalid_recurrence': 'Recurrence can not be recurrent!',
+ })
+
+ def default_uuid(self, cursor, user, context=None):
+ return str(uuid.uuid4())
+
+ def default_sequence(self, cursor, user, context=None):
+ return 0
+
+ def default_classification(self, cursor, user, context=None):
+ return 'public'
+
+ def default_timezone(self, cursor, user, context=None):
+ user_obj = self.pool.get('res.user')
+ user_ = user_obj.browse(cursor, user, user, context=context)
+ return user_.timezone
+
+ def on_change_status(self, cursor, user, ids, vals, context=None):
+ res = {}
+ if 'status' not in vals:
+ return res
+ if vals['status'] == 'completed':
+ res['percent_complete'] = 100
+ if not vals.get('completed'):
+ res['completed'] = datetime.datetime.now()
+
+ return res
+
+ def timezones(self, cursor, user, context=None):
+ return [(x, x) for x in pytz.common_timezones] + [('', '')]
+
+ def get_calendar_field(self, cursor, user, ids, name, arg, context=None):
+ assert name in ('calendar_owner', 'calendar_read_users',
+ 'calendar_write_users'), 'Invalid name'
+ res = {}
+ for todo in self.browse(cursor, user, ids, context=context):
+ name = name[9:]
+ if name in ('read_users', 'write_users'):
+ res[todo.id] = [x.id for x in todo.calendar[name]]
+ else:
+ res[todo.id] = todo.calendar[name].id
+ return res
+
+ def search_calendar_field(self, cursor, user, name, args, context=None):
+ args2 = []
+ i = 0
+ while i < len(args):
+ field = args[i][0][9:]
+ args2.append(tuple(['calendar.' + field] + list(args[i])[1:]))
+ i += 1
+ return args2
+
+ def get_classification_public(self, cursor, user, ids, name, arg,
+ context=None):
+ res = {}
+ for todo in self.browse(cursor, user, ids, context=context):
+ res[todo.id] = False
+ if todo.classification == 'public':
+ res[todo.id] = True
+ return res
+
+ def search_classification_public(self, cursor, user, name, args,
+ context=None):
+ args2 = []
+ i = 0
+ while i < len(args):
+ if args[i][2]:
+ args2.append(('classification', '=', 'public'))
+ else:
+ args2.append(('classification', '!=', 'public'))
+ i += 1
+ return args2
+
+ def check_recurrence(self, cursor, user, ids):
+ '''
+ Check the recurrence is not recurrent.
+ '''
+ for todo in self.browse(cursor, user, ids):
+ if not todo.parent:
+ continue
+ if todo.rdates \
+ or todo.rrules \
+ or todo.exdates \
+ or todo.exrules \
+ or todo.recurrences:
+ return False
+ return True
+
+ def create(self, cursor, user, values, context=None):
+ calendar_obj = self.pool.get('calendar.calendar')
+ collection_obj = self.pool.get('webdav.collection')
+
+ res = super(Todo, self).create(cursor, user, values, context=context)
+ todo = self.browse(cursor, user, res, context=context)
+ if todo.organizer == todo.calendar.owner.email \
+ or (todo.parent \
+ and todo.parent.organizer == todo.parent.calendar.owner.email):
+ if todo.organizer == todo.calendar.owner.email:
+ attendee_emails = [x.email for x in todo.attendees
+ if x.status != 'declined']
+ else:
+ attendee_emails = [x.email for x in todo.parent.attendees
+ if x.status != 'declined']
+ if attendee_emails:
+ calendar_ids = calendar_obj.search(cursor, 0, [
+ ('owner.email', 'in', attendee_emails),
+ ], context=context)
+ if not todo.recurrence:
+ for calendar_id in calendar_ids:
+ new_id = self.copy(cursor, 0, todo.id, default={
+ 'calendar': calendar_id,
+ 'recurrences': False,
+ }, context=context)
+ for recurrence in todo.recurrences:
+ self.copy(cursor, 0, recurrence.id, default={
+ 'calendar': calendar_id,
+ 'parent': new_id,
+ }, context=context)
+ else:
+ parent_ids = self.search(cursor, 0, [
+ ('uuid', '=', todo.uuid),
+ ('calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', todo.id),
+ ('recurrence', '=', False),
+ ], context=context)
+ for parent in self.browse(cursor, 0, parent_ids,
+ context=context):
+ self.copy(cursor, 0, todo.id, default={
+ 'calendar': parent.calendar.id,
+ 'parent': parent.id,
+ }, context=context)
+ # Restart the cache for todo
+ collection_obj.todo(cursor.dbname)
+ return res
+
+ def _todo2update(self, cursor, user, todo, context=None):
+ rdate_obj = self.pool.get('calendar.todo.rdate')
+ exdate_obj = self.pool.get('calendar.todo.exdate')
+ rrule_obj = self.pool.get('calendar.todo.rrule')
+ exrule_obj = self.pool.get('calendar.todo.exrule')
+
+ res = {}
+ res['summary'] = todo.summary
+ res['description'] = todo.description
+ res['dtstart'] = todo.dtstart
+ res['percent_complete'] = todo.percent_complete
+ res['completed'] = todo.completed
+ res['location'] = todo.location.id
+ res['status'] = todo.status
+ res['organizer'] = todo.organizer
+ res['rdates'] = [('delete_all',)]
+ for rdate in todo.rdates:
+ vals = rdate_obj._date2update(cursor, user, rdate, context=context)
+ res['rdates'].append(('create', vals))
+ res['exdates'] = [('delete_all',)]
+ for exdate in todo.exdates:
+ vals = exdate_obj._date2update(cursor, user, exdate, context=context)
+ res['exdates'].append(('create', vals))
+ res['rrules'] = [('delete_all',)]
+ for rrule in todo.rrules:
+ vals = rrule_obj._rule2update(cursor, user, rrule, context=context)
+ res['rrules'].append(('create', vals))
+ res['exrules'] = [('delete_all',)]
+ for exrule in todo.exrules:
+ vals = exrule_obj._rule2update(cursor, user, exrule, context=context)
+ res['exrules'].append(('create', vals))
+ return res
+
+ def write(self, cursor, user, ids, values, context=None):
+ calendar_obj = self.pool.get('calendar.calendar')
+ collection_obj = self.pool.get('webdav.collection')
+
+ values = values.copy()
+ if 'sequence' in values:
+ del values['sequence']
+
+ res = super(Todo, self).write(cursor, user, ids, values,
+ context=context)
+
+ if isinstance(ids, (int, long)):
+ ids = [ids]
+
+ for i in range(0, len(ids), cursor.IN_MAX):
+ sub_ids = ids[i:i + cursor.IN_MAX]
+ red_sql, red_ids = reduce_ids('id', sub_ids)
+ cursor.execute('UPDATE "' + self._table + '" ' \
+ 'SET sequence = sequence + 1 ' \
+ 'WHERE ' + red_sql, red_ids)
+
+ for todo in self.browse(cursor, user, ids, context=context):
+ if todo.organizer == todo.calendar.owner.email \
+ or (todo.parent \
+ and todo.parent.organizer == todo.calendar.owner.email):
+ if todo.organizer == todo.calendar.owner.email:
+ attendee_emails = [x.email for x in todo.attendees
+ if x.status != 'declined']
+ else:
+ attendee_emails = [x.email for x in todo.parent.attendees
+ if x.status != 'declined']
+ if attendee_emails:
+ todo_ids = self.search(cursor, 0, [
+ ('uuid', '=', todo.uuid),
+ ('calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', todo.id),
+ ('recurrence', '=', todo.recurrence or False),
+ ], context=context)
+ for todo2 in self.browse(cursor, user, todo_ids,
+ context=context):
+ if todo2.calendar.owner.email in attendee_emails:
+ attendee_emails.remove(todo2.calendar.owner.email)
+ self.write(cursor, 0, todo_ids, self._todo2update(
+ cursor, user, todo, context=context), context=context)
+ if attendee_emails:
+ calendar_ids = calendar_obj.search(cursor, 0, [
+ ('owner.email', 'in', attendee_emails),
+ ], context=context)
+ if not todo.recurrence:
+ for calendar_id in calendar_ids:
+ new_id = self.copy(cursor, 0, todo.id, default={
+ 'calendar': calendar_id,
+ 'recurrences': False,
+ }, context=context)
+ for recurrence in todo.recurrences:
+ self.copy(cursor, 0, recurrence.id, default={
+ 'calendar': calendar_id,
+ 'parent': new_id,
+ }, context=context)
+ else:
+ parent_ids = self.search(cursor, 0, [
+ ('uuid', '=', todo.uuid),
+ ('calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', todo.id),
+ ('recurrence', '=', False),
+ ], context=context)
+ for parent in self.browse(cursor, 0, parent_ids,
+ context=context):
+ self.copy(cursor, 0, todo.id, default={
+ 'calendar': parent.calendar.id,
+ 'parent': parent.id,
+ }, context=context)
+ # Restart the cache for todo
+ collection_obj.todo(cursor.dbname)
+ return res
+
+ def delete(self, cursor, user, ids, context=None):
+ attendee_obj = self.pool.get('calendar.todo.attendee')
+ collection_obj = self.pool.get('webdav.collection')
+
+ if isinstance(ids, (int, long)):
+ ids = [ids]
+ for todo in self.browse(cursor, user, ids, context=context):
+ if todo.organizer == todo.calendar.owner.email \
+ or (todo.parent \
+ and todo.parent.organizer == todo.calendar.owner.email):
+ if todo.organizer == todo.calendar.owner.email:
+ attendee_emails = [x.email for x in todo.attendees]
+ else:
+ attendee_emails = [x.email for x in todo.parent.attendees]
+ if attendee_emails:
+ todo_ids = self.search(cursor, 0, [
+ ('uuid', '=', todo.uuid),
+ ('calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', todo.id),
+ ('recurrence', '=', todo.recurrence or False),
+ ], context=context)
+ self.delete(cursor, 0, todo_ids, context=context)
+ elif todo.organizer \
+ or (todo.parent and todo.parent.organizer):
+ if todo.organizer:
+ organizer = todo.organizer
+ else:
+ organizer = todo.parent.organizer
+ todo_ids = self.search(cursor, 0, [
+ ('uuid', '=', todo.uuid),
+ ('calendar.owner.email', '=', organizer),
+ ('id', '!=', todo.id),
+ ('recurrence', '=', todo.recurrence or False),
+ ], context=context, limit=1)
+ if todo_ids:
+ todo2 = self.browse(cursor, 0, todo_ids[0],
+ context=context)
+ for attendee in todo2.attendees:
+ if attendee.email == todo.calendar.owner.email:
+ attendee_obj.write(cursor, 0, attendee.id, {
+ 'status': 'declined',
+ }, context=context)
+ # Restart the cache for todo
+ collection_obj.todo(cursor.dbname)
+ return super(Todo, self).delete(cursor, user, ids, context=context)
+
+ def ical2values(self, cursor, user, todo_id, ical, calendar_id,
+ vtodo=None, context=None):
+ '''
+ Convert iCalendar to values for create or write
+
+ :param cursor: the database cursor
+ :param user: the user id
+ :param todo_id: the todo id for write or None for create
+ :param ical: a ical instance of vobject
+ :param calendar_id: the calendar id of the todo
+ :param vtodo: the vtodo of the ical to use if None use the first one
+ :param context: the context
+ :return: a dictionary with values
+ '''
+ category_obj = self.pool.get('calendar.category')
+ location_obj = self.pool.get('calendar.location')
+ user_obj = self.pool.get('res.user')
+ alarm_obj = self.pool.get('calendar.todo.alarm')
+ attendee_obj = self.pool.get('calendar.todo.attendee')
+ rdate_obj = self.pool.get('calendar.todo.rdate')
+ exdate_obj = self.pool.get('calendar.todo.exdate')
+ rrule_obj = self.pool.get('calendar.todo.rrule')
+ exrule_obj = self.pool.get('calendar.todo.exrule')
+
+ vtodos = []
+ if not vtodo:
+ vtodo = ical.vtodo
+
+ for i in ical.getChildren():
+ if i.name == 'VTODO' \
+ and i != vtodo:
+ vtodos.append(i)
+
+ todo = None
+ if todo_id:
+ todo = self.browse(cursor, user, todo_id, context=context)
+ res = {}
+ if not todo:
+ if hasattr(vtodo, 'uid'):
+ res['uuid'] = vtodo.uid.value
+ else:
+ res['uuid'] = str(uuid.uuid4())
+ if hasattr(vtodo, 'summary'):
+ res['summary'] = vtodo.summary.value
+ else:
+ res['summary'] = False
+ if hasattr(vtodo, 'description'):
+ res['description'] = vtodo.description.value
+ else:
+ res['description'] = False
+ if hasattr(vtodo, 'percent_complete'):
+ res['percent_complete'] = int(vtodo.percent_complete.value)
+ else:
+ res['percent_complete'] = False
+
+ if hasattr(vtodo, 'completed'):
+ if not isinstance(vtodo.completed.value, datetime.datetime):
+ res['completed'] = datetime.datetime.combine(vtodo.completed.value,
+ datetime.time())
+ else:
+ if vtodo.completed.value.tzinfo:
+ res['completed'] = vtodo.completed.value.astimezone(tzlocal)
+ else:
+ res['completed'] = vtodo.completed.value
+
+ if hasattr(vtodo, 'dtstart'):
+ if not isinstance(vtodo.dtstart.value, datetime.datetime):
+ res['dtstart'] = datetime.datetime.combine(vtodo.dtstart.value,
+ datetime.time())
+ else:
+ if vtodo.dtstart.value.tzinfo:
+ res['dtstart'] = vtodo.dtstart.value.astimezone(tzlocal)
+ else:
+ res['dtstart'] = vtodo.dtstart.value
+
+ if hasattr(vtodo, 'due'):
+ if not isinstance(vtodo.due.value, datetime.datetime):
+ res['due'] = datetime.datetime.combine(vtodo.due.value,
+ datetime.time())
+ else:
+ if vtodo.due.value.tzinfo:
+ res['due'] = vtodo.due.value.astimezone(tzlocal)
+ else:
+ res['due'] = vtodo.due.value
+
+ if hasattr(vtodo, 'recurrence-id'):
+ if not isinstance(vtodo.recurrence_id.value, datetime.datetime):
+ res['recurrence'] = datetime.datetime.combine(
+ vtodo.recurrence_id.value, datetime.time())
+ else:
+ if vtodo.recurrence_id.value.tzinfo:
+ res['recurrence'] = \
+ vtodo.recurrence_id.value.astimezone(tzlocal)
+ else:
+ res['recurrence'] = vtodo.recurrence_id.value
+ else:
+ res['recurrence'] = False
+ if hasattr(vtodo, 'status'):
+ res['status'] = vtodo.status.value.lower()
+ else:
+ res['status'] = ''
+ if hasattr(vtodo, 'categories'):
+ category_ids = category_obj.search(cursor, user, [
+ ('name', 'in', [x for x in vtodo.categories.value]),
+ ], context=context)
+ categories = category_obj.browse(cursor, user, category_ids,
+ context=context)
+ category_names2ids = {}
+ for category in categories:
+ category_names2ids[category.name] = category.id
+ for category in vtodo.categories.value:
+ if category not in category_names2ids:
+ category_ids.append(category_obj.create(cursor, user, {
+ 'name': category,
+ }, context=context))
+ res['categories'] = [('set', category_ids)]
+ else:
+ res['categories'] = [('unlink_all',)]
+ if hasattr(vtodo, 'class'):
+ if getattr(vtodo, 'class').value.lower() in \
+ dict(self.classification.selection):
+ res['classification'] = getattr(vtodo, 'class').value.lower()
+ else:
+ res['classification'] = 'public'
+ else:
+ res['classification'] = 'public'
+ if hasattr(vtodo, 'location'):
+ location_ids = location_obj.search(cursor, user, [
+ ('name', '=', vtodo.location.value),
+ ], limit=1, context=context)
+ if not location_ids:
+ location_id = location_obj.create(cursor, user, {
+ 'name': vtodo.location.value,
+ }, context=context)
+ else:
+ location_id = location_ids[0]
+ res['location'] = location_id
+ else:
+ res['location'] = False
+
+ res['calendar'] = calendar_id
+
+ if hasattr(vtodo, 'organizer'):
+ if vtodo.organizer.value.lower().startswith('mailto:'):
+ res['organizer'] = vtodo.organizer.value[7:]
+ else:
+ res['organizer'] = vtodo.organizer.value
+ else:
+ res['organizer'] = False
+
+ attendees_todel = {}
+ if todo:
+ for attendee in todo.attendees:
+ attendees_todel[attendee.email] = attendee.id
+ res['attendees'] = []
+ if hasattr(vtodo, 'attendee'):
+ while vtodo.attendee_list:
+ attendee = vtodo.attendee_list.pop()
+ vals = attendee_obj.attendee2values(cursor, user, attendee,
+ context=context)
+ if vals['email'] in attendees_todel:
+ res['attendees'].append(('write',
+ attendees_todel[vals['email']], vals))
+ del attendees_todel[vals['email']]
+ else:
+ res['attendees'].append(('create', vals))
+ res['attendees'].append(('delete', attendees_todel.values()))
+
+ res['rdates'] = []
+ if todo:
+ res['rdates'].append(('delete', [x.id for x in todo.rdates]))
+ if hasattr(vtodo, 'rdate'):
+ while vtodo.rdate_list:
+ rdate = vtodo.rdate_list.pop()
+ for date in rdate.value:
+ vals = rdate_obj.date2values(cursor, user, date,
+ context=context)
+ res['rdates'].append(('create', vals))
+
+ res['exdates'] = []
+ if todo:
+ res['exdates'].append(('delete', [x.id for x in todo.exdates]))
+ if hasattr(vtodo, 'exdate'):
+ while vtodo.exdate_list:
+ exdate = vtodo.exdate_list.pop()
+ for date in exdate.value:
+ vals = exdate_obj.date2values(cursor, user, date,
+ context=context)
+ res['exdates'].append(('create', vals))
+
+ res['rrules'] = []
+ if todo:
+ res['rrules'].append(('delete', [x.id for x in todo.rrules]))
+ if hasattr(vtodo, 'rrule'):
+ while vtodo.rrule_list:
+ rrule = vtodo.rrule_list.pop()
+ vals = rrule_obj.rule2values(cursor, user, rrule,
+ context=context)
+ res['rrules'].append(('create', vals))
+
+ res['exrules'] = []
+ if todo:
+ res['exrules'].append(('delete', [x.id for x in todo.exrules]))
+ if hasattr(vtodo, 'exrule'):
+ while vtodo.exrule_list:
+ exrule = vtodo.exrule_list.pop()
+ vals = exrule_obj.rule2values(cursor, user, exrule,
+ context=context)
+ res['exrules'].append(('create', vals))
+
+ if todo:
+ res.setdefault('alarms', [])
+ res['alarms'].append(('delete', [x.id for x in todo.alarms]))
+ if hasattr(vtodo, 'valarm'):
+ res.setdefault('alarms', [])
+ while vtodo.valarm_list:
+ valarm = vtodo.valarm_list.pop()
+ vals = alarm_obj.valarm2values(cursor, user, valarm,
+ context=context)
+ res['alarms'].append(('create', vals))
+
+ if hasattr(ical, 'vtimezone'):
+ if ical.vtimezone.tzid.value in pytz.common_timezones:
+ res['timezone'] = ical.vtimezone.tzid.value
+ else:
+ for timezone in pytz.common_timezones:
+ if ical.vtimezone.tzid.value.endswith(timezone):
+ res['timezone'] = timezone
+
+ res['vtodo'] = vtodo.serialize()
+
+ recurrences_todel = []
+ if todo:
+ recurrences_todel = [x.id for x in todo.recurrences]
+ for vtodo in vtodos:
+ todo_id = None
+ if todo:
+ for recurrence in todo.recurrences:
+ if recurrence.recurrence.replace(tzinfo=tzlocal) \
+ == vtodo.recurrence_id.value:
+ todo_id = recurrence.id
+ recurrences_todel.remove(recurrence.id)
+ vals = self.ical2values(cursor, user, todo_id, ical,
+ calendar_id, vtodo=vtodo, context=context)
+ if todo:
+ vals['uuid'] = todo.uuid
+ else:
+ vals['uuid'] = res['uuid']
+ res.setdefault('recurrences', [])
+ if todo_id:
+ res['recurrences'].append(('write', todo_id, vals))
+ else:
+ res['recurrences'].append(('create', vals))
+ if recurrences_todel:
+ res.setdefault('recurrences', [])
+ res['recurrences'].append(('delete', recurrences_todel))
+ return res
+
+ def todo2ical(self, cursor, user, todo, context=None):
+ '''
+ Return an iCalendar instance of vobject for todo
+
+ :param cursor: the database cursor
+ :param user: the user id
+ :param todo: a BrowseRecord of calendar.todo
+ or a calendar.todo id
+ :param calendar: a BrowseRecord of calendar.calendar
+ or a calendar.calendar id
+ :param context: the context
+ :return: an iCalendar instance of vobject
+ '''
+ user_obj = self.pool.get('res.user')
+ alarm_obj = self.pool.get('calendar.todo.alarm')
+ attendee_obj = self.pool.get('calendar.todo.attendee')
+ rdate_obj = self.pool.get('calendar.todo.rdate')
+ exdate_obj = self.pool.get('calendar.todo.exdate')
+ rrule_obj = self.pool.get('calendar.todo.rrule')
+ exrule_obj = self.pool.get('calendar.todo.exrule')
+
+ if isinstance(todo, (int, long)):
+ todo = self.browse(cursor, user, todo, context=context)
+
+ user_ = user_obj.browse(cursor, user, user, context=context)
+ if todo.timezone:
+ tztodo = pytz.timezone(todo.timezone)
+ elif user_.timezone:
+ tztodo = pytz.timezone(user_.timezone)
+ else:
+ tztodo = tzlocal
+
+ ical = vobject.iCalendar()
+ vtodo = ical.add('vtodo')
+ if todo.vtodo:
+ ical.vtodo = vobject.readOne(todo.vtodo)
+ vtodo = ical.vtodo
+ ical.vtodo.transformToNative()
+ if todo.summary:
+ if not hasattr(vtodo, 'summary'):
+ vtodo.add('summary')
+ vtodo.summary.value = todo.summary
+ elif hasattr(vtodo, 'summary'):
+ del vtodo.summary
+ if todo.percent_complete:
+ if not hasattr(vtodo, 'percent-complete'):
+ vtodo.add('percent-complete')
+ vtodo.percent_complete.value = str(todo.percent_complete)
+ elif hasattr(vtodo, 'percent_complete'):
+ del vtodo.percent_complete
+ if todo.description:
+ if not hasattr(vtodo, 'description'):
+ vtodo.add('description')
+ vtodo.description.value = todo.description
+ elif hasattr(vtodo, 'description'):
+ del vtodo.description
+
+ if todo.completed:
+ if not hasattr(vtodo, 'completed'):
+ vtodo.add('completed')
+ vtodo.completed.value = todo.completed.replace(tzinfo=tzlocal)\
+ .astimezone(tzutc)
+ elif hasattr(vtodo, 'completed'):
+ del vtodo.completed
+
+ if todo.dtstart:
+ if not hasattr(vtodo, 'dtstart'):
+ vtodo.add('dtstart')
+ vtodo.dtstart.value = todo.dtstart.replace(tzinfo=tzlocal)\
+ .astimezone(tztodo)
+ elif hasattr(vtodo, 'dtstart'):
+ del vtodo.dtstart
+
+ if todo.due:
+ if not hasattr(vtodo, 'due'):
+ vtodo.add('due')
+ vtodo.due.value = todo.due.replace(tzinfo=tzlocal)\
+ .astimezone(tztodo)
+ elif hasattr(vtodo, 'due'):
+ del vtodo.due
+
+
+ if not hasattr(vtodo, 'created'):
+ vtodo.add('created')
+ vtodo.created.value = todo.create_date.replace(tzinfo=tzlocal).astimezone(tztodo)
+ if not hasattr(vtodo, 'dtstamp'):
+ vtodo.add('dtstamp')
+ date = todo.write_date or todo.create_date
+ vtodo.dtstamp.value = date.replace(tzinfo=tzlocal).astimezone(tztodo)
+ if not hasattr(vtodo, 'last-modified'):
+ vtodo.add('last-modified')
+ vtodo.last_modified.value = date.replace(tzinfo=tzlocal).astimezone(tztodo)
+ if todo.recurrence:
+ if not hasattr(vtodo, 'recurrence-id'):
+ vtodo.add('recurrence-id')
+ if todo.all_day:
+ vtodo.recurrence_id.value = todo.recurrence.date()
+ else:
+ vtodo.recurrence_id.value = todo.recurrence\
+ .replace(tzinfo=tzlocal).astimezone(tztodo)
+ if todo.status:
+ if not hasattr(vtodo, 'status'):
+ vtodo.add('status')
+ vtodo.status.value = todo.status.upper()
+ elif hasattr(vtodo, 'status'):
+ del vtodo.status
+ if not hasattr(vtodo, 'uid'):
+ vtodo.add('uid')
+ vtodo.uid.value = todo.uuid
+ if not hasattr(vtodo, 'sequence'):
+ vtodo.add('sequence')
+ vtodo.sequence.value = str(todo.sequence) or '0'
+ if todo.categories:
+ if not hasattr(vtodo, 'categories'):
+ vtodo.add('categories')
+ vtodo.categories.value = [x.name for x in todo.categories]
+ elif hasattr(vtodo, 'categories'):
+ del vtodo.categories
+ if not hasattr(vtodo, 'class'):
+ vtodo.add('class')
+ getattr(vtodo, 'class').value = todo.classification.upper()
+ elif getattr(vtodo, 'class').value.lower() in \
+ dict(self.classification.selection):
+ getattr(vtodo, 'class').value = todo.classification.upper()
+ if todo.location:
+ if not hasattr(vtodo, 'location'):
+ vtodo.add('location')
+ vtodo.location.value = todo.location.name
+ elif hasattr(vtodo, 'location'):
+ del vtodo.location
+
+ if todo.organizer:
+ if not hasattr(vtodo, 'organizer'):
+ vtodo.add('organizer')
+ vtodo.organizer.value = 'MAILTO:' + todo.organizer
+ elif hasattr(vtodo, 'organizer'):
+ del vtodo.organizer
+
+ vtodo.attendee_list = []
+ for attendee in todo.attendees:
+ vtodo.attendee_list.append(attendee_obj.attendee2attendee(
+ cursor, user, attendee, context=context))
+
+ if todo.rdates:
+ vtodo.add('rdate')
+ vtodo.rdate.value = []
+ for rdate in todo.rdates:
+ vtodo.rdate.value.append(rdate_obj.date2date(cursor, user,
+ rdate, context=context))
+
+ if todo.exdates:
+ vtodo.add('exdate')
+ vtodo.exdate.value = []
+ for exdate in todo.exdates:
+ vtodo.exdate.value.append(exdate_obj.date2date(cursor, user,
+ exdate, context=context))
+
+ if todo.rrules:
+ for rrule in todo.rrules:
+ vtodo.add('rrule').value = rrule_obj.rule2rule(cursor, user,
+ rrule, context=context)
+
+ if todo.exrules:
+ for exrule in todo.exrules:
+ vtodo.add('exrule').value = exrule_obj.rule2rule(cursor, user,
+ exrule, context=context)
+
+ vtodo.valarm_list = []
+ for alarm in todo.alarms:
+ valarm = alarm_obj.alarm2valarm(cursor, user, alarm,
+ context=context)
+ if valarm:
+ vtodo.valarm_list.append(valarm)
+
+ for recurrence in todo.recurrences:
+ rical = self.todo2ical(cursor, user, recurrence, context=context)
+ ical.vtodo_list.append(rical.vtodo)
+ return ical
+
+Todo()
+
+
+class TodoCategory(ModelSQL):
+ 'Todo - Category'
+ _description = __doc__
+ _name = 'calendar.todo-calendar.category'
+
+ todo = fields.Many2One('calendar.todo', 'To-Do', ondelete='CASCADE',
+ required=True, select=1)
+ category = fields.Many2One('calendar.category', 'Category',
+ ondelete='CASCADE', required=True, select=1)
+
+TodoCategory()
+
+
+class TodoRDate(ModelSQL, ModelView):
+ 'Recurrence Date'
+ _description = __doc__
+ _name = 'calendar.todo.rdate'
+ _inherits = {'calendar.rdate': 'calendar_rdate'}
+ _rec_name = 'datetime'
+
+ calendar_rdate = fields.Many2One('calendar.rdate', 'Calendar RDate',
+ required=True, ondelete='CASCADE', select=1)
+ todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
+ select=1, required=True)
+
+ def create(self, cursor, user, values, context=None):
+ todo_obj = self.pool.get('calendar.todo')
+ if values.get('todo'):
+ # Update write_date of todo
+ todo_obj.write(cursor, user, values['todo'], {}, context=context)
+ return super(TodoRDate, self).create(cursor, user, values,
+ context=context)
+
+ def write(self, cursor, user, ids, values, context=None):
+ todo_obj = self.pool.get('calendar.todo')
+ if isinstance(ids, (int, long)):
+ ids = [ids]
+ todo_ids = [x.todo.id for x in self.browse(cursor, user, ids,
+ context=context)]
+ if values.get('todo'):
+ todo_ids.append(values['todo'])
+ if todo_ids:
+ # Update write_date of todo
+ todo_obj.write(cursor, user, todo_ids, {}, context=context)
+ return super(TodoRDate, self).write(cursor, user, ids, values,
+ context=context)
+
+ def delete(self, cursor, user, ids, context=None):
+ todo_obj = self.pool.get('calendar.todo')
+ rdate_obj = self.pool.get('calendar.rdate')
+ if isinstance(ids, (int, long)):
+ ids = [ids]
+ todo_rdates = self.browse(cursor, user, ids, context=context)
+ rdate_ids = [a.calendar_rdate.id for a in todo_rdates]
+ todo_ids = [x.todo.id for x in todo_rdates]
+ if todo_ids:
+ # Update write_date of todo
+ todo_obj.write(cursor, user, todo_ids, {}, context=context)
+ res = super(TodoRDate, self).delete(cursor, user, ids, context=context)
+ if rdate_ids:
+ rdate_obj.delete(cursor, user, rdate_ids, context=context)
+ return res
+
+ def _date2update(self, cursor, user, date, context=None):
+ date_obj = self.pool.get('calendar.rdate')
+ return date_obj._date2update(cursor, user, date, context=context)
+
+ def date2values(self, cursor, user, date, context=None):
+ date_obj = self.pool.get('calendar.rdate')
+ return date_obj.date2values(cursor, user, date, context=context)
+
+ def date2date(self, cursor, user, date, context=None):
+ date_obj = self.pool.get('calendar.rdate')
+ return date_obj.date2date(cursor, user, date, context=context)
+
+TodoRDate()
+
+
+class TodoRRule(ModelSQL, ModelView):
+ 'Recurrence Rule'
+ _description = __doc__
+ _name = 'calendar.todo.rrule'
+ _inherits = {'calendar.rrule': 'calendar_rrule'}
+ _rec_name = 'freq'
+
+ calendar_rrule = fields.Many2One('calendar.rrule', 'Calendar RRule',
+ required=True, ondelete='CASCADE', select=1)
+ todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
+ select=1, required=True)
+
+ def create(self, cursor, user, values, context=None):
+ todo_obj = self.pool.get('calendar.todo')
+ if values.get('todo'):
+ # Update write_date of todo
+ todo_obj.write(cursor, user, values['todo'], {}, context=context)
+ return super(TodoRRule, self).create(cursor, user, values, context=context)
+
+ def write(self, cursor, user, ids, values, context=None):
+ todo_obj = self.pool.get('calendar.todo')
+ if isinstance(ids, (int, long)):
+ ids = [ids]
+ todo_ids = [x.todo.id for x in self.browse(cursor, user, ids,
+ context=context)]
+ if values.get('todo'):
+ todo_ids.append(values['todo'])
+ if todo_ids:
+ # Update write_date of todo
+ todo_obj.write(cursor, user, todo_ids, {}, context=context)
+ return super(TodoRRule, self).write(cursor, user, ids, values, context=context)
+
+ def delete(self, cursor, user, ids, context=None):
+ todo_obj = self.pool.get('calendar.todo')
+ rrule_obj = self.pool.get('calendar.rrule')
+ if isinstance(ids, (int, long)):
+ ids = [ids]
+ todo_rrules = self.browse(cursor, user, ids, context=context)
+ rrule_ids = [a.calendar_rrule.id for a in todo_rrules]
+ todo_ids = [x.todo.id for x in todo_rrules]
+ if todo_ids:
+ # Update write_date of todo
+ todo_obj.write(cursor, user, todo_ids, {}, context=context)
+ res = super(TodoRRule, self).delete(cursor, user, ids, context=context)
+ if rrule_ids:
+ rrule_obj.delete(cursor, user, rrule_ids, context=context)
+ return res
+
+ def _rule2update(self, cursor, user, rule, context=None):
+ rule_obj = self.pool.get('calendar.rrule')
+ return rule_obj._rule2update(cursor, user, rule, context=context)
+
+ def rule2values(self, cursor, user, rule, context=None):
+ rule_obj = self.pool.get('calendar.rrule')
+ return rule_obj.rule2values(cursor, user, rule, context=context)
+
+ def rule2rule(self, cursor, user, rule, context=None):
+ rule_obj = self.pool.get('calendar.rrule')
+ return rule_obj.rule2rule(cursor, user, rule, context=context)
+
+TodoRRule()
+
+
+class TodoExDate(TodoRDate):
+ 'Exception Date'
+ _description = __doc__
+ _name = 'calendar.todo.exdate'
+
+TodoExDate()
+
+
+class TodoExRule(TodoRRule):
+ 'Exception Rule'
+ _description = __doc__
+ _name = 'calendar.todo.exrule'
+
+TodoExRule()
+
+
+class TodoAttendee(ModelSQL, ModelView):
+ 'Attendee'
+ _description = __doc__
+ _name = 'calendar.todo.attendee'
+ _inherits = {'calendar.attendee': 'calendar_attendee'}
+
+ calendar_attendee = fields.Many2One('calendar.attendee',
+ 'Calendar Attendee', required=True, ondelete='CASCADE', select=1)
+ todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
+ required=True, select=1)
+
+ def create(self, cursor, user, values, context=None):
+ todo_obj = self.pool.get('calendar.todo')
+
+ if values.get('todo'):
+ # Update write_date of todo
+ todo_obj.write(cursor, user, values['todo'], {}, context=context)
+ res = super(TodoAttendee, self).create(cursor, user, values,
+ context=context)
+ attendee = self.browse(cursor, user, res, context=context)
+ todo = attendee.todo
+ if todo.organizer == todo.calendar.owner.email \
+ or (todo.parent \
+ and todo.parent.organizer == todo.parent.calendar.owner.email):
+ if todo.organizer == todo.calendar.owner.email:
+ attendee_emails = [x.email for x in todo.attendees]
+ else:
+ attendee_emails = [x.email for x in todo.parent.attendees]
+ if attendee_emails:
+ todo_ids = self.search(cursor, 0, [
+ ('todo.uuid', '=', todo.uuid),
+ ('todo.calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', todo.id),
+ ('todo.recurrence', '=', todo.recurrence or False),
+ ], context=context)
+ for todo_id in todo_ids:
+ self.copy(cursor, 0, res, default={
+ 'todo': todo_id,
+ }, context=context)
+ return res
+
+ def write(self, cursor, user, ids, values, context=None):
+ todo_obj = self.pool.get('calendar.todo')
+
+ if isinstance(ids, (int, long)):
+ ids = [ids]
+ todo_ids = [x.todo.id for x in self.browse(cursor, user, ids,
+ context=context)]
+ if values.get('todo'):
+ todo_ids.append(values['todo'])
+ if todo_ids:
+ # Update write_date of todo
+ todo_obj.write(cursor, user, todo_ids, {}, context=context)
+
+ if 'email' in values:
+ values = values.copy()
+ del values['email']
+
+ res = super(TodoAttendee, self).write(cursor, user, ids, values,
+ context=context)
+ attendees = self.browse(cursor, user, ids, context=context)
+ for attendee in attendees:
+ todo = attendee.todo
+ if todo.organizer == todo.calendar.owner.email \
+ or (todo.parent \
+ and todo.parent.organizer == todo.calendar.owner.email):
+ if todo.organizer == todo.calendar.owner.email:
+ attendee_emails = [x.email for x in todo.attendees]
+ else:
+ attendee_emails = [x.email for x in todo.parent.attendees]
+ if attendee_emails:
+ attendee_ids = self.search(cursor, 0, [
+ ('todo.uuid', '=', todo.uuid),
+ ('todo.calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', attendee.id),
+ ('todo.recurrence', '=', todo.recurrence or False),
+ ('email', '=', attendee.email),
+ ], context=context)
+ self.write(cursor, 0, attendee_ids, self._attendee2update(
+ cursor, user, attendee, context=context), context=context)
+ return res
+
+ def delete(self, cursor, user, ids, context=None):
+ todo_obj = self.pool.get('calendar.todo')
+ attendee_obj = self.pool.get('calendar.attendee')
+
+ if isinstance(ids, (int, long)):
+ ids = [ids]
+ todo_attendees = self.browse(cursor, user, ids, context=context)
+ calendar_attendee_ids = [a.calendar_attendee.id \
+ for a in todo_attendees]
+ todo_ids = [x.todo.id for x in todo_attendees]
+ if todo_ids:
+ # Update write_date of todo
+ todo_obj.write(cursor, user, todo_ids, {}, context=context)
+
+ for attendee in self.browse(cursor, user, ids, context=context):
+ todo = attendee.todo
+ if todo.organizer == todo.calendar.owner.email \
+ or (todo.parent \
+ and todo.parent.organizer == todo.calendar.owner.email):
+ if todo.organizer == todo.calendar.owner.email:
+ attendee_emails = [x.email for x in todo.attendees]
+ else:
+ attendee_emails = [x.email for x in todo.attendees]
+ if attendee_emails:
+ attendee_ids = self.search(cursor, 0, [
+ ('todo.uuid', '=', todo.uuid),
+ ('todo.calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', attendee.id),
+ ('todo.recurrence', '=', todo.recurrence or False),
+ ('email', '=', attendee.email),
+ ], context=context)
+ self.delete(cursor, 0, attendee_ids, context=context)
+ elif (todo.organizer \
+ or (todo.parent and todo.parent.organizer)) \
+ and attendee.email == todo.calendar.owner.email:
+ if todo.organizer:
+ organizer = todo.organizer
+ else:
+ organizer = todo.parent.organizer
+ attendee_ids = self.search(cursor, 0, [
+ ('todo.uuid', '=', todo.uuid),
+ ('todo.calendar.owner.email', '=', organizer),
+ ('id', '!=', attendee.id),
+ ('todo.recurrence', '=', todo.recurrence or False),
+ ('email', '=', attendee.email),
+ ], context=context)
+ if attendee_ids:
+ self.write(cursor, 0, attendee_ids, {
+ 'status': 'declined',
+ }, context=context)
+ res = super(TodoAttendee, self).delete(cursor, user, ids, context=context)
+ if calendar_attendee_ids:
+ attendee_obj.delete(cursor, user, calendar_attendee_ids,
+ context=context)
+ return res
+
+ def _attendee2update(self, cursor, user, attendee, context=None):
+ attendee_obj = self.pool.get('calendar.attendee')
+ return attendee_obj._attendee2update(cursor, user, attendee,
+ context=context)
+
+ def attendee2values(self, cursor, user, attendee, context=None):
+ attendee_obj = self.pool.get('calendar.attendee')
+ return attendee_obj.attendee2values(cursor, user, attendee,
+ context=context)
+
+ def attendee2attendee(self, cursor, user, attendee, context=None):
+ attendee_obj = self.pool.get('calendar.attendee')
+ return attendee_obj.attendee2attendee(cursor, user, attendee,
+ context=context)
+
+TodoAttendee()
+
+
+class TodoAlarm(ModelSQL):
+ 'Alarm'
+ _description = __doc__
+ _name = 'calendar.todo.alarm'
+ _inherits = {'calendar.alarm': 'calendar_alarm'}
+
+ calendar_alarm = fields.Many2One('calendar.alarm', 'Calendar Alarm',
+ required=True, ondelete='CASCADE', select=1)
+ todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
+ required=True, select=1)
+
+ def create(self, cursor, user, values, context=None):
+ todo_obj = self.pool.get('calendar.todo')
+ if values.get('todo'):
+ # Update write_date of todo
+ todo_obj.write(cursor, user, values['todo'], {}, context=context)
+ return super(TodoAlarm, self).create(cursor, user, values, context=context)
+
+ def write(self, cursor, user, ids, values, context=None):
+ todo_obj = self.pool.get('calendar.todo')
+ if isinstance(ids, (int, long)):
+ ids = [ids]
+ todo_ids = [x.todo.id for x in self.browse(cursor, user, ids,
+ context=context)]
+ if values.get('todo'):
+ todo_ids.append(values['todo'])
+ if todo_ids:
+ # Update write_date of todo
+ todo_obj.write(cursor, user, todo_ids, {}, context=context)
+ return super(TodoAlarm, self).write(cursor, user, ids, values,
+ context=context)
+
+ def delete(self, cursor, user, ids, context=None):
+ todo_obj = self.pool.get('calendar.todo')
+ alarm_obj = self.pool.get('calendar.alarm')
+ if isinstance(ids, (int, long)):
+ ids = [ids]
+ todo_alarms = self.browse(cursor, user, ids, context=context)
+ alarm_ids = [a.calendar_alarm.id for a in todo_alarms]
+ todo_ids = [x.todo.id for x in todo_alarms]
+ if todo_ids:
+ # Update write_date of todo
+ todo_obj.write(cursor, user, todo_ids, {}, context=context)
+ res = super(TodoAlarm, self).delete(cursor, user, ids, context=context)
+ if alarm_ids:
+ alarm_obj.delete(cursor, user, alarm_ids, context=context)
+ return res
+
+ def valarm2values(self, cursor, user, alarm, context=None):
+ alarm_obj = self.pool.get('calendar.alarm')
+ return alarm_obj.valarm2values(cursor, user, alarm, context=context)
+
+ def alarm2valarm(self, cursor, user, alarm, context=None):
+ alarm_obj = self.pool.get('calendar.alarm')
+ return alarm_obj.alarm2valarm(cursor, user, alarm, context=context)
+
+TodoAlarm()
diff --git a/todo.xml b/todo.xml
new file mode 100644
index 0000000..ae6349d
--- /dev/null
+++ b/todo.xml
@@ -0,0 +1,362 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tryton>
+ <data>
+
+ <record model="ir.ui.view" id="todo_view_tree">
+ <field name="model">calendar.todo</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Todos">
+ <field name="calendar" select="1"/>
+ <field name="summary" select="1"/>
+ <field name="dtstart" select="1"/>
+ <field name="due" select="1"/>
+ <field name="status" select="2"/>
+ <field name="percent_complete" select="2"/>
+ </tree>
+ ]]>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="todo_view_form">
+ <field name="model">calendar.todo</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <form string="Todo">
+ <label name="summary"/>
+ <field name="summary"/>
+ <label name="recurrence"/>
+ <field name="recurrence"/>
+ <notebook colspan="4">
+ <page string="General" id="general">
+ <label name="location"/>
+ <field name="location"/>
+ <label name="status"/>
+ <field name="status"/>
+ <label name="classification"/>
+ <field name="classification"/>
+ <label name="calendar"/>
+ <field name="calendar"/>
+ <label name="dtstart"/>
+ <field name="dtstart"/>
+ <label name="due"/>
+ <field name="due"/>
+ <label name="percent_complete"/>
+ <field name="percent_complete"/>
+ <label name="completed"/>
+ <field name="completed"/>
+ <separator name="description" colspan="4"/>
+ <field name="description" colspan="4"/>
+ </page>
+ <page string="Categories" id="categories">
+ <separator name="categories" colspan="4"/>
+ <field name="categories" colspan="4"/>
+ </page>
+ <page string="Attendees" id="attendees">
+ <label name="organizer"/>
+ <field name="organizer"/>
+ <field name="attendees" colspan="4"/>
+ </page>
+ <page string="Recurrences" id="recurrences"
+ states="{'invisible': '''bool(parent)'''}">
+ <field name="rrules" colspan="2"/>
+ <field name="rdates" colspan="2"/>
+ <field name="exrules" colspan="2"/>
+ <field name="exdates" colspan="2"/>
+ <field name="recurrences" colspan="4">
+ <tree string="Todos">
+ <field name="summary" select="1"/>
+ <field name="recurrence" select="1"/>
+ <field name="dtstart" select="2"/>
+ <field name="due" select="2"/>
+ <field name="status" select="2"/>
+ <field name="percent_complete" select="2"/>
+ </tree>
+ </field>
+ </page>
+ </notebook>
+ </form>
+ ]]>
+ </field>
+ </record>
+
+ <record model="ir.action.act_window" id="act_todo_form">
+ <field name="name">Todos</field>
+ <field name="res_model">calendar.todo</field>
+ <field name="view_type">form</field>
+ <field name="domain">[('parent', '=', False)]</field>
+ </record>
+ <record model="ir.action.act_window.view" id="act_todo_form_view1">
+ <field name="sequence" eval="10"/>
+ <field name="view" ref="todo_view_tree"/>
+ <field name="act_window" ref="act_todo_form"/>
+ </record>
+ <record model="ir.action.act_window.view" id="act_todo_form_view2">
+ <field name="sequence" eval="20"/>
+ <field name="view" ref="todo_view_form"/>
+ <field name="act_window" ref="act_todo_form"/>
+ </record>
+ <menuitem parent="calendar.menu_calendar_form" sequence="1"
+ action="act_todo_form" id="menu_todo_form"/>
+
+ <record model="ir.rule.group" id="rule_group_read_todo">
+ <field name="model" search="[('model', '=', 'calendar.todo')]"/>
+ <field name="global_p" eval="False"/>
+ <field name="default_p" eval="True"/>
+ <field name="perm_read" eval="True"/>
+ <field name="perm_write" eval="False"/>
+ <field name="perm_create" eval="False"/>
+ <field name="perm_delete" eval="False"/>
+ </record>
+ <record model="ir.rule" id="rule_group_read_todo_line1">
+ <field name="field" search="[('name', '=', 'calendar_owner'), ('model.model', '=', 'calendar.todo')]"/>
+ <field name="operator">=</field>
+ <field name="operand">User</field>
+ <field name="rule_group" ref="rule_group_read_todo"/>
+ </record>
+ <record model="ir.rule" id="rule_group_read_todo_line2">
+ <field name="field" search="[('name', '=', 'calendar_read_users'), ('model.model', '=', 'calendar.todo')]"/>
+ <field name="operator">=</field>
+ <field name="operand">User</field>
+ <field name="rule_group" ref="rule_group_read_todo"/>
+ </record>
+ <record model="ir.rule" id="rule_group_read_todo_line3">
+ <field name="field" search="[('name', '=', 'classification_public'), ('model.model', '=', 'calendar.todo')]"/>
+ <field name="operator">=</field>
+ <field name="operand">True</field>
+ <field name="rule_group" ref="rule_group_read_todo"/>
+ </record>
+
+ <record model="ir.rule.group" id="rule_group_write_todo">
+ <field name="model" search="[('model', '=', 'calendar.todo')]"/>
+ <field name="global_p" eval="False"/>
+ <field name="default_p" eval="True"/>
+ <field name="perm_read" eval="True"/>
+ <field name="perm_write" eval="True"/>
+ <field name="perm_create" eval="True"/>
+ <field name="perm_delete" eval="True"/>
+ </record>
+ <record model="ir.rule" id="rule_group_write_todo_line1">
+ <field name="field" search="[('name', '=', 'calendar_owner'), ('model.model', '=', 'calendar.todo')]"/>
+ <field name="operator">=</field>
+ <field name="operand">User</field>
+ <field name="rule_group" ref="rule_group_write_todo"/>
+ </record>
+ <record model="ir.rule" id="rule_group_write_todo_line2">
+ <field name="field" search="[('name', '=', 'calendar_write_users'), ('model.model', '=', 'calendar.todo')]"/>
+ <field name="operator">=</field>
+ <field name="operand">User</field>
+ <field name="rule_group" ref="rule_group_write_todo"/>
+ </record>
+
+ <record model="ir.ui.view" id="attendee_view_tree">
+ <field name="model">calendar.todo.attendee</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Attendees">
+ <field name="todo" select="1"/>
+ <field name="email" select="1"/>
+ <field name="status" select="1"/>
+ </tree>
+ ]]>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="attendee_view_form">
+ <field name="model">calendar.todo.attendee</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <form string="Attendee">
+ <label name="todo"/>
+ <field name="todo" colspan="3"/>
+ <label name="email"/>
+ <field name="email"/>
+ <label name="status"/>
+ <field name="status"/>
+ </form>
+ ]]>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="rdate_view_tree">
+ <field name="model">calendar.todo.rdate</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Recurrence Dates">
+ <field name="todo" select="1"/>
+ <field name="datetime" select="1"/>
+ <field name="date" select="2"/>
+ </tree>
+ ]]>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="rdate_view_form">
+ <field name="model">calendar.todo.rdate</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <form string="Recurrence Date">
+ <label name="todo"/>
+ <field name="todo" colspan="3"/>
+ <label name="datetime"/>
+ <field name="datetime"/>
+ <label name="date"/>
+ <field name="date"/>
+ </form>
+ ]]>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="exdate_view_tree">
+ <field name="model">calendar.todo.exdate</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Exception Dates">
+ <field name="todo" select="1"/>
+ <field name="datetime" select="1"/>
+ <field name="date" select="2"/>
+ </tree>
+ ]]>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="exdate_view_form">
+ <field name="model">calendar.todo.exdate</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <form string="Exception Date">
+ <label name="todo"/>
+ <field name="todo" colspan="3"/>
+ <label name="datetime"/>
+ <field name="datetime"/>
+ <label name="date"/>
+ <field name="date"/>
+ </form>
+ ]]>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="rrule_view_tree">
+ <field name="model">calendar.todo.rrule</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Recurrence Rules">
+ <field name="todo" select="1"/>
+ <field name="freq" select="1"/>
+ </tree>
+ ]]>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="rrule_view_form">
+ <field name="model">calendar.todo.rrule</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <form string="Recurrence Rule">
+ <label name="todo"/>
+ <field name="todo" colspan="3"/>
+ <label name="freq"/>
+ <field name="freq" colspan="3"/>
+ <label name="until"/>
+ <field name="until"/>
+ <label name="until_date"/>
+ <field name="until_date"/>
+ <label name="count"/>
+ <field name="count" colspan="3"/>
+ <label name="interval"/>
+ <field name="interval" colspan="3"/>
+ <label name="bysecond"/>
+ <field name="bysecond" colspan="3"/>
+ <label name="byminute"/>
+ <field name="byminute" colspan="3"/>
+ <label name="byhour"/>
+ <field name="byhour" colspan="3"/>
+ <label name="byday"/>
+ <field name="byday" colspan="3"/>
+ <label name="bymonthday"/>
+ <field name="bymonthday" colspan="3"/>
+ <label name="byyearday"/>
+ <field name="byyearday" colspan="3"/>
+ <label name="byweekno"/>
+ <field name="byweekno" colspan="3"/>
+ <label name="bymonth"/>
+ <field name="bymonth" colspan="3"/>
+ <label name="bysetpos"/>
+ <field name="bysetpos" colspan="3"/>
+ <label name="wkst"/>
+ <field name="wkst" colspan="3"/>
+ </form>
+ ]]>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="exrule_view_tree">
+ <field name="model">calendar.todo.exrule</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Exception Rules">
+ <field name="todo" select="1"/>
+ <field name="freq" select="1"/>
+ </tree>
+ ]]>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="exrule_view_form">
+ <field name="model">calendar.todo.exrule</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <form string="Exception Rule">
+ <label name="todo"/>
+ <field name="todo" colspan="3"/>
+ <label name="freq"/>
+ <field name="freq" colspan="3"/>
+ <label name="until"/>
+ <field name="until"/>
+ <label name="until_date"/>
+ <field name="until_date"/>
+ <label name="count"/>
+ <field name="count" colspan="3"/>
+ <label name="interval"/>
+ <field name="interval" colspan="3"/>
+ <label name="bysecond"/>
+ <field name="bysecond" colspan="3"/>
+ <label name="byminute"/>
+ <field name="byminute" colspan="3"/>
+ <label name="byhour"/>
+ <field name="byhour" colspan="3"/>
+ <label name="byday"/>
+ <field name="byday" colspan="3"/>
+ <label name="bymonthday"/>
+ <field name="bymonthday" colspan="3"/>
+ <label name="byyearday"/>
+ <field name="byyearday" colspan="3"/>
+ <label name="byweekno"/>
+ <field name="byweekno" colspan="3"/>
+ <label name="bymonth"/>
+ <field name="bymonth" colspan="3"/>
+ <label name="bysetpos"/>
+ <field name="bysetpos" colspan="3"/>
+ <label name="wkst"/>
+ <field name="wkst" colspan="3"/>
+ </form>
+ ]]>
+ </field>
+ </record>
+
+ </data>
+</tryton>
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
new file mode 100644
index 0000000..23dd6de
--- /dev/null
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -0,0 +1,25 @@
+Metadata-Version: 1.0
+Name: trytond-calendar-todo
+Version: 1.4.0
+Summary: Add Todo support on CalDAV
+Home-page: http://www.tryton.org/
+Author: B2CK
+Author-email: info at b2ck.com
+License: GPL-3
+Download-URL: http://downloads.tryton.org/1.4/
+Description: UNKNOWN
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Plugins
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: Financial and Insurance Industry
+Classifier: Intended Audience :: Legal Industry
+Classifier: Intended Audience :: Manufacturing
+Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Natural Language :: English
+Classifier: Natural Language :: French
+Classifier: Natural Language :: German
+Classifier: Natural Language :: Spanish
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Office/Business
diff --git a/trytond_calendar_todo.egg-info/SOURCES.txt b/trytond_calendar_todo.egg-info/SOURCES.txt
new file mode 100644
index 0000000..b3321ab
--- /dev/null
+++ b/trytond_calendar_todo.egg-info/SOURCES.txt
@@ -0,0 +1,26 @@
+CHANGELOG
+COPYRIGHT
+INSTALL
+LICENSE
+MANIFEST.in
+README
+de_DE.csv
+es_CO.csv
+es_ES.csv
+fr_FR.csv
+setup.py
+todo.xml
+./__init__.py
+./__tryton__.py
+./caldav.py
+./todo.py
+./webdav.py
+tests/__init__.py
+tests/test_calendar_todo.py
+trytond_calendar_todo.egg-info/PKG-INFO
+trytond_calendar_todo.egg-info/SOURCES.txt
+trytond_calendar_todo.egg-info/dependency_links.txt
+trytond_calendar_todo.egg-info/entry_points.txt
+trytond_calendar_todo.egg-info/not-zip-safe
+trytond_calendar_todo.egg-info/requires.txt
+trytond_calendar_todo.egg-info/top_level.txt
\ No newline at end of file
diff --git a/trytond_calendar_todo.egg-info/dependency_links.txt b/trytond_calendar_todo.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/trytond_calendar_todo.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/trytond_calendar_todo.egg-info/entry_points.txt b/trytond_calendar_todo.egg-info/entry_points.txt
new file mode 100644
index 0000000..23ce488
--- /dev/null
+++ b/trytond_calendar_todo.egg-info/entry_points.txt
@@ -0,0 +1,4 @@
+
+ [trytond.modules]
+ calendar_todo = trytond.modules.calendar_todo
+
\ No newline at end of file
diff --git a/trytond_calendar_todo.egg-info/not-zip-safe b/trytond_calendar_todo.egg-info/not-zip-safe
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/trytond_calendar_todo.egg-info/not-zip-safe
@@ -0,0 +1 @@
+
diff --git a/trytond_calendar_todo.egg-info/requires.txt b/trytond_calendar_todo.egg-info/requires.txt
new file mode 100644
index 0000000..7627a53
--- /dev/null
+++ b/trytond_calendar_todo.egg-info/requires.txt
@@ -0,0 +1,7 @@
+vobject
+PyWebDAV
+python-dateutil
+pytz
+trytond_calendar
+trytond >= 1.4
+trytond < 1.5
\ No newline at end of file
diff --git a/trytond_calendar_todo.egg-info/top_level.txt b/trytond_calendar_todo.egg-info/top_level.txt
new file mode 100644
index 0000000..93df119
--- /dev/null
+++ b/trytond_calendar_todo.egg-info/top_level.txt
@@ -0,0 +1 @@
+trytond
diff --git a/webdav.py b/webdav.py
new file mode 100644
index 0000000..636f25d
--- /dev/null
+++ b/webdav.py
@@ -0,0 +1,347 @@
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+from trytond.model import ModelView, ModelSQL
+from trytond.tools import Cache, reduce_ids
+from DAV.errors import DAV_NotFound, DAV_Forbidden
+import vobject
+import urllib
+
+
+class Collection(ModelSQL, ModelView):
+
+ _name = "webdav.collection"
+
+ def todo(self, cursor, user, uri, calendar_id=False, context=None):
+ '''
+ Return the todo id in the uri or False
+
+ :param cursor: the database cursor
+ :param user: the user id
+ :param uri: the uri
+ :param calendar_id: the calendar id
+ :param context: the context
+ :return: todo id
+ or False if there is no todo
+ '''
+ todo_obj = self.pool.get('calendar.todo')
+
+ if uri and uri.startswith('Calendars/'):
+ calendar, todo_uri = (uri[10:].split('/', 1) + [None])[0:2]
+ if not calendar_id:
+ calendar_id = self.calendar(cursor, user, uri, context=context)
+ if not calendar_id:
+ return False
+ todo_ids = todo_obj.search(cursor, user, [
+ ('calendar', '=', calendar_id),
+ ('uuid', '=', todo_uri[:-4]),
+ ('parent', '=', False),
+ ], limit=1, context=context)
+ if todo_ids:
+ return todo_ids[0]
+ return False
+
+ todo = Cache('webdav_collection.todo')(todo)
+
+ def _caldav_filter_domain_todo(self, cursor, user, filter, context=None):
+ '''
+ Return a domain for caldav filter on todo
+
+ :param cursor: the database cursor
+ :param user: the user id
+ :param filter: the DOM Element of filter
+ :param context: the context
+ :return: a list for domain
+ '''
+ res = []
+ if not filter:
+ return []
+ if filter.localName == 'principal-property-search':
+ return [('id', '=', 0)]
+ elif filter.localName == 'calendar-query':
+ calendar_filter = None
+ for e in filter.childNodes:
+ if e.nodeType == e.TEXT_NODE:
+ continue
+ if e.localName == 'filter':
+ calendar_filter = e
+ break
+ if calendar_filter is None:
+ return []
+ for vcalendar_filter in calendar_filter.childNodes:
+ if vcalendar_filter.nodeType == vcalendar_filter.TEXT_NODE:
+ continue
+ if vcalendar_filter.getAttribute('name') != 'VCALENDAR':
+ return [('id', '=', 0)]
+ vtodo_filter = None
+ for vtodo_filter in vcalendar_filter.childNodes:
+ if vtodo_filter.nodeType == vtodo_filter.TEXT_NODE:
+ vtodo_filter = None
+ continue
+ if vtodo_filter.localName == 'comp-filter':
+ if vtodo_filter.getAttribute('name') != 'VTODO':
+ vtodo_filter = None
+ continue
+ break
+ if vtodo_filter is None:
+ return [('id', '=', 0)]
+ break
+ return []
+ elif filter.localName == 'calendar-multiget':
+ ids = []
+ for e in filter.childNodes:
+ if e.nodeType == e.TEXT_NODE:
+ continue
+ if e.localName == 'href':
+ if not e.firstChild:
+ continue
+ uri = e.firstChild.data
+ dbname, uri = (uri.lstrip('/').split('/', 1) + [None])[0:2]
+ if not dbname:
+ continue
+ dbname == urllib.unquote_plus(dbname)
+ if dbname != cursor.database_name:
+ continue
+ if uri:
+ uri = urllib.unquote_plus(uri)
+ todo_id = self.todo(cursor, user, uri, context=context)
+ if todo_id:
+ ids.append(todo_id)
+ return [('id', 'in', ids)]
+ return res
+
+ def get_childs(self, cursor, user, uri, filter=None, context=None,
+ cache=None):
+ calendar_obj = self.pool.get('calendar.calendar')
+ todo_obj = self.pool.get('calendar.todo')
+
+ res = super(Collection, self).get_childs(cursor, user, uri,
+ filter=filter, context=context, cache=cache)
+
+ if uri and (uri not in ('Calendars', 'Calendars/')) and \
+ uri.startswith('Calendars/'):
+ calendar_id = self.calendar(cursor, user, uri, context=context)
+ if calendar_id and not (uri[10:].split('/', 1) + [None])[1]:
+ domain = self._caldav_filter_domain_todo(cursor, user, filter,
+ context=context)
+ todo_ids = todo_obj.search(cursor, user, [
+ ('calendar', '=', calendar_id),
+ domain,
+ ], context=context)
+ todos = todo_obj.browse(cursor, user, todo_ids,
+ context=context)
+ if cache is not None:
+ cache.setdefault('_calendar', {})
+ cache['_calendar'].setdefault(todo_obj._name, {})
+ for todo_id in todo_ids:
+ cache['_calendar'][todo_obj._name][todo_id] = {}
+ return res + [x.uuid + '.ics' for x in todos]
+
+ return res
+
+ def get_resourcetype(self, cursor, user, uri, context=None, cache=None):
+ from DAV.constants import COLLECTION, OBJECT
+ if uri in ('Calendars', 'Calendars/'):
+ return COLLECTION
+ calendar_id = self.calendar(cursor, user, uri, context=context)
+ if calendar_id:
+ if not (uri[10:].split('/', 1) + [None])[1]:
+ return COLLECTION
+ if self.todo(cursor, user, uri, calendar_id=calendar_id,
+ context=context):
+ return OBJECT
+ elif self.calendar(cursor, user, uri, ics=True, context=context):
+ return OBJECT
+ return super(Collection, self).get_resourcetype(cursor, user, uri,
+ context=context, cache=cache)
+
+ def get_contenttype(self, cursor, user, uri, context=None, cache=None):
+ if self.todo(cursor, user, uri, context=context) \
+ or self.calendar(cursor, user, uri, ics=True, context=context):
+ return 'text/calendar'
+ return super(Collection, self).get_contenttype(cursor, user, uri,
+ context=context, cache=cache)
+
+ def get_creationdate(self, cursor, user, uri, context=None, cache=None):
+ calendar_obj = self.pool.get('calendar.calendar')
+ todo_obj = self.pool.get('calendar.todo')
+
+ calendar_id = self.calendar(cursor, user, uri, context=context)
+ if not calendar_id:
+ calendar_id = self.calendar(cursor, user, uri, ics=True,
+ context=context)
+ if calendar_id and (uri[10:].split('/', 1) + [None])[1]:
+
+ todo_id = self.todo(cursor, user, uri, calendar_id=calendar_id,
+ context=context)
+ if todo_id:
+ if cache is not None:
+ cache.setdefault('_calendar', {})
+ cache['_calendar'].setdefault(todo_obj._name, {})
+ ids = cache['_calendar'][todo_obj._name].keys()
+ if todo_id not in ids:
+ ids.append(todo_id)
+ elif 'creationdate' in cache['_calendar']\
+ [todo_obj._name][todo_id]:
+ return cache['_calendar'][todo_obj._name]\
+ [todo_id]['creationdate']
+ else:
+ ids = [todo_id]
+ res = None
+ for i in range(0, len(ids), cursor.IN_MAX):
+ sub_ids = ids[i:i + cursor.IN_MAX]
+ red_sql, red_ids = reduce_ids('id', sub_ids)
+ cursor.execute('SELECT id, ' \
+ 'EXTRACT(epoch FROM create_date) ' \
+ 'FROM "' + todo_obj._table + '" ' \
+ 'WHERE ' + red_sql, red_ids)
+ for todo_id2, date in cursor.fetchall():
+ if todo_id2 == todo_id:
+ res = date
+ if cache is not None:
+ cache['_calendar'][todo_obj._name]\
+ .setdefault(todo_id2, {})
+ cache['_calendar'][todo_obj._name]\
+ [todo_id2]['creationdate'] = date
+ if res is not None:
+ return res
+
+ return super(Collection, self).get_creationdate(cursor, user, uri,
+ context=context, cache=cache)
+
+ def get_lastmodified(self, cursor, user, uri, context=None, cache=None):
+ calendar_obj = self.pool.get('calendar.calendar')
+ todo_obj = self.pool.get('calendar.todo')
+
+ calendar_id = self.calendar(cursor, user, uri, context=context)
+ if calendar_id and (uri[10:].split('/', 1) + [None])[1]:
+ todo_id = self.todo(cursor, user, uri, calendar_id=calendar_id,
+ context=context)
+ if todo_id:
+ if cache is not None:
+ cache.setdefault('_calendar', {})
+ cache['_calendar'].setdefault(todo_obj._name, {})
+ ids = cache['_calendar'][todo_obj._name].keys()
+ if todo_id not in ids:
+ ids.append(todo_id)
+ elif 'lastmodified' in cache['_calendar']\
+ [todo_obj._name][todo_id]:
+ return cache['_calendar'][todo_obj._name]\
+ [todo_id]['lastmodified']
+ else:
+ ids = [todo_id]
+ res = None
+ for i in range(0, len(ids), cursor.IN_MAX/2):
+ sub_ids = ids[i:i + cursor.IN_MAX/2]
+ red_id_sql, red_id_ids = reduce_ids('id', sub_ids)
+ red_parent_sql, red_parent_ids = reduce_ids('parent',
+ sub_ids)
+ cursor.execute('SELECT COALESCE(parent, id), ' \
+ 'MAX(EXTRACT(epoch FROM ' \
+ 'COALESCE(write_date, create_date))) ' \
+ 'FROM "' + todo_obj._table + '" ' \
+ 'WHERE ' + red_id_sql + ' ' \
+ 'OR ' + red_parent_sql + ' ' \
+ 'GROUP BY parent, id', red_id_ids + red_parent_ids)
+ for todo_id2, date in cursor.fetchall():
+ if todo_id2 == todo_id:
+ res = date
+ if cache is not None:
+ cache['_calendar'][todo_obj._name]\
+ .setdefault(todo_id2, {})
+ cache['_calendar'][todo_obj._name]\
+ [todo_id2]['lastmodified'] = date
+ if res is not None:
+ return res
+
+ return super(Collection, self).get_lastmodified(cursor, user, uri,
+ context=context, cache=cache)
+
+ def get_data(self, cursor, user, uri, context=None, cache=None):
+ todo_obj = self.pool.get('calendar.todo')
+ calendar_obj = self.pool.get('calendar.calendar')
+
+ calendar_id = self.calendar(cursor, user, uri, context=context)
+ if calendar_id:
+ if not (uri[10:].split('/', 1) + [None])[1]:
+ raise DAV_NotFound
+ todo_id = self.todo(cursor, user, uri, calendar_id=calendar_id,
+ context=context)
+ if not todo_id:
+ return super(Collection, self).get_data(cursor, user, uri,
+ context=context, cache=cache)
+ ical = todo_obj.todo2ical(cursor, user, todo_id, context=context)
+ return ical.serialize()
+
+ return super(Collection, self).get_data(cursor, user, uri,
+ context=context, cache=cache)
+
+ def put(self, cursor, user, uri, data, content_type, context=None,
+ cache=None):
+ todo_obj = self.pool.get('calendar.todo')
+ calendar_obj = self.pool.get('calendar.calendar')
+
+ calendar_id = self.calendar(cursor, user, uri, context=context)
+ if calendar_id:
+ if not (uri[10:].split('/', 1) + [None])[1]:
+ raise DAV_Forbidden
+ todo_id = self.todo(cursor, user, uri, calendar_id=calendar_id,
+ context=context)
+ ical = vobject.readOne(data)
+ if not hasattr(ical, 'vtodo'):
+ return super(Collection, self).put(cursor, user, uri, data,
+ content_type, context=context)
+
+ if not todo_id:
+
+ values = todo_obj.ical2values(cursor, user, None, ical,
+ calendar_id, context=context)
+ todo_id = todo_obj.create(cursor, user, values,
+ context=context)
+ todo = todo_obj.browse(cursor, user, todo_id,
+ context=context)
+ calendar = calendar_obj.browse(cursor, user, calendar_id,
+ context=context)
+ return cursor.database_name + '/Calendars/' + calendar.name + \
+ '/' + todo.uuid + '.ics'
+ else:
+ values = todo_obj.ical2values(cursor, user, todo_id, ical,
+ calendar_id, context=context)
+ todo_obj.write(cursor, user, todo_id, values,
+ context=context)
+ return
+
+ return super(Collection, self).put(cursor, user, uri, data,
+ content_type, context=context)
+
+ def rm(self, cursor, user, uri, context=None, cache=None):
+ todo_obj = self.pool.get('calendar.todo')
+
+ calendar_id = self.calendar(cursor, user, uri, context=context)
+ if calendar_id:
+ if not (uri[10:].split('/', 1) + [None])[1]:
+ raise DAV_Forbidden
+ todo_id = self.todo(cursor, user, uri, calendar_id=calendar_id,
+ context=context)
+ if todo_id:
+ try:
+ todo_obj.delete(cursor, user, todo_id, context=context)
+ except:
+ raise DAV_Forbidden
+ return 200
+ return super(Collection, self).rm(cursor, user, uri, context=context,
+ cache=cache)
+
+ def exists(self, cursor, user, uri, context=None, cache=None):
+ if uri in ('Calendars', 'Calendars/'):
+ return 1
+ calendar_id = self.calendar(cursor, user, uri, context=context)
+ if calendar_id:
+ if not (uri[10:].split('/', 1) + [None])[1]:
+ return 1
+ if self.todo(cursor, user, uri, calendar_id=calendar_id,
+ context=context):
+ return 1
+ return super(Collection, self).exists(cursor, user, uri, context=context,
+ cache=cache)
+
+Collection()
--
tryton-modules-calendar-todo
More information about the tryton-debian-vcs
mailing list