[tryton-debian-vcs] tryton-modules-calendar branch upstream created. 3d467a3a67c92225487ede5b0f3770a00732477e
Mathias Behrle
tryton-debian-vcs at alioth.debian.org
Wed Nov 27 16:59:30 UTC 2013
The following commit has been merged in the upstream branch:
https://alioth.debian.org/plugins/scmgit/cgi-bin/gitweb.cgi/?p=tryton/tryton-modules-calendar.git;a=commitdiff;h=3d467a3a67c92225487ede5b0f3770a00732477e
commit 3d467a3a67c92225487ede5b0f3770a00732477e
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Sun Nov 24 17:26:33 2013 +0100
Adding upstream version 3.0.0.
diff --git a/CHANGELOG b/CHANGELOG
index 434be38..32778ca 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 81c19d7..6ed7bd6 100644
--- a/INSTALL
+++ b/INSTALL
@@ -10,6 +10,7 @@ Prerequisites
* pywebdav >= 0.9.8 (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/)
Installation
------------
diff --git a/PKG-INFO b/PKG-INFO
index d0ce93a..2845884 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.1
Name: trytond_calendar
-Version: 2.8.0
+Version: 3.0.0
Summary: Tryton module for 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
================
@@ -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/calendar.xml b/calendar.xml
index 535bd17..dbf7e8c 100644
--- a/calendar.xml
+++ b/calendar.xml
@@ -130,7 +130,7 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_event_form">
<field name="name">Events</field>
<field name="res_model">calendar.event</field>
- <field name="domain">[('parent', '=', False)]</field>
+ <field name="domain">[('parent', '=', None)]</field>
</record>
<record model="ir.action.act_window.view" id="act_event_form_view1">
<field name="sequence" eval="10"/>
@@ -148,7 +148,7 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_event_form3">
<field name="name">Events</field>
<field name="res_model">calendar.event</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_event_form3_view1">
<field name="sequence" eval="10"/>
diff --git a/calendar_.py b/calendar_.py
index 4a9c2d3..83fed4f 100644
--- a/calendar_.py
+++ b/calendar_.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 Model, ModelSQL, ModelView, fields
from trytond.tools import reduce_ids
-from trytond.backend import TableHandler
+from trytond import backend
from trytond.pyson import If, Bool, Eval
from trytond.transaction import Transaction
from trytond.cache import Cache
@@ -652,12 +654,14 @@ class Event(ModelSQL, ModelView):
super(Event, cls).write(events, values)
+ table = cls.__table__()
for i in range(0, len(events), cursor.IN_MAX):
sub_ids = map(int, events[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))
if not values:
return
@@ -1230,7 +1234,9 @@ class EventAlarm(AlarmMixin, ModelSQL, ModelView):
@classmethod
def __register__(cls, module_name):
+ TableHandler = backend.get('TableHandler')
cursor = Transaction().cursor
+ sql_table = cls.__table__()
super(EventAlarm, cls).__register__(module_name)
@@ -1238,10 +1244,11 @@ class EventAlarm(AlarmMixin, ModelSQL, ModelView):
# Migration from 2.6: Remove inherits calendar.alarm
if table.column_exist('calendar_alarm'):
- cursor.execute('UPDATE "' + cls._table + '" AS e '
- 'SET valarm = (SELECT a.valarm '
- 'FROM calendar_alarm AS a '
- 'WHERE a.id = e.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
@@ -1352,7 +1359,9 @@ class EventAttendee(AttendeeMixin, ModelSQL, ModelView):
@classmethod
def __register__(cls, module_name):
+ TableHandler = backend.get('TableHandler')
cursor = Transaction().cursor
+ sql_table = cls.__table__()
super(EventAttendee, cls).__register__(module_name)
@@ -1360,13 +1369,14 @@ class EventAttendee(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
@@ -1379,7 +1389,7 @@ class EventAttendee(AttendeeMixin, ModelSQL, ModelView):
to_write.append(values['event'])
if to_write:
- Event.write([Event.browse(to_write)], {})
+ Event.write(Event.browse(to_write), {})
event_attendees = super(EventAttendee, cls).create(vlist)
for event_attendee in event_attendees:
event = event_attendee.event
@@ -1559,7 +1569,9 @@ class EventRDate(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'
@@ -1572,13 +1584,13 @@ class EventRDate(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
@@ -1677,9 +1689,10 @@ class RRuleMixin(Model):
'rule "%s"'),
'invalid_byweekno': ('Invalid "By Week Number" in recurrence '
'rule "%s"'),
- 'invalid_bymonth': 'Invalid "By Month" in recurrence rule "%s"',
- 'invalid_bysetpos': ('Invalid "By Position" in recurrence rule '
- '"%s"'),
+ 'invalid_bymonth': (
+ 'Invalid "By Month" in recurrence rule "%s"'),
+ 'invalid_bysetpos': (
+ 'Invalid "By Position" in recurrence rule "%s"'),
})
@classmethod
@@ -1761,7 +1774,8 @@ class RRuleMixin(Model):
except Exception:
yeardaynum = -1000
if not (abs(yeardaynum) >= 1 and abs(yeardaynum) <= 366):
- self.raise_user_error('invalid_byyearday', (self.rec_name,))
+ self.raise_user_error('invalid_byyearday',
+ (self.rec_name,))
def check_byweekno(self):
if self.byweekno:
@@ -1865,7 +1879,9 @@ class EventRRule(RRuleMixin, ModelSQL, ModelView):
@classmethod
def __register__(cls, module_name):
+ TableHandler = backend.get('TableHandler')
cursor = Transaction().cursor
+ sql_table = cls.__table__()
super(EventRRule, cls).__register__(module_name)
@@ -1873,13 +1889,13 @@ class EventRRule(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
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index 07679c6..30c7902 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -866,7 +866,7 @@ msgstr "Esdeveniments"
msgctxt "model:ir.ui.menu,name:menu_calendar"
msgid "Calendar"
-msgstr "Calendaris"
+msgstr "Calendari"
msgctxt "model:ir.ui.menu,name:menu_calendar_form"
msgid "Calendars"
@@ -894,7 +894,7 @@ msgstr "Públic"
msgctxt "selection:calendar.event,status:"
msgid ""
-msgstr " "
+msgstr ""
msgctxt "selection:calendar.event,status:"
msgid "Cancelled"
@@ -918,7 +918,7 @@ msgstr "Transparent"
msgctxt "selection:calendar.event.attendee,status:"
msgid ""
-msgstr " "
+msgstr ""
msgctxt "selection:calendar.event.attendee,status:"
msgid "Accepted"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index 571f7af..867a4bb 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -886,10 +886,9 @@ msgctxt "selection:calendar.event,classification:"
msgid "Public"
msgstr "Público"
-#, fuzzy
msgctxt "selection:calendar.event,status:"
msgid ""
-msgstr "Punto de Orden"
+msgstr ""
msgctxt "selection:calendar.event,status:"
msgid "Cancelled"
@@ -911,10 +910,9 @@ msgctxt "selection:calendar.event,transp:"
msgid "Transparent"
msgstr "Transparente"
-#, fuzzy
msgctxt "selection:calendar.event.attendee,status:"
msgid ""
-msgstr "Punto de Orden"
+msgstr ""
msgctxt "selection:calendar.event.attendee,status:"
msgid "Accepted"
@@ -1048,7 +1046,6 @@ msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Wednesday"
msgstr "Miércoles"
-#, fuzzy
msgctxt "view:calendar.calendar:"
msgid "Access Permissions"
msgstr "Permisos de Acceso"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index bc47ca4..eb130f3 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -928,15 +928,15 @@ msgstr "Acceptado"
msgctxt "selection:calendar.event.attendee,status:"
msgid "Declined"
-msgstr "Rechazar"
+msgstr "Rechazado"
msgctxt "selection:calendar.event.attendee,status:"
msgid "Delegated"
-msgstr "Delegar"
+msgstr "Delegado"
msgctxt "selection:calendar.event.attendee,status:"
msgid "Needs Action"
-msgstr "Necesidad Acción"
+msgstr "Requiere acción"
msgctxt "selection:calendar.event.attendee,status:"
msgid "Tentative"
@@ -1080,7 +1080,7 @@ msgstr "Categoría"
msgctxt "view:calendar.event.attendee:"
msgid "Attendee"
-msgstr "Asistentes"
+msgstr "Asistente"
msgctxt "view:calendar.event.attendee:"
msgid "Attendees"
@@ -1100,7 +1100,7 @@ msgstr "Regla de excepción"
msgctxt "view:calendar.event.exrule:"
msgid "Exception Rules"
-msgstr "Reglas de excepciones"
+msgstr "Reglas de excepción"
msgctxt "view:calendar.event.rdate:"
msgid "Recurrence Date"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index 7ac841e..3bdb16c 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -875,14 +875,6 @@ msgid "Confidential"
msgstr "Confidentiel"
msgctxt "selection:calendar.event,classification:"
-msgid "Confidential"
-msgstr "Confidentiel"
-
-msgctxt "selection:calendar.event,classification:"
-msgid "Private"
-msgstr "Privé"
-
-msgctxt "selection:calendar.event,classification:"
msgid "Private"
msgstr "Privé"
@@ -890,14 +882,6 @@ msgctxt "selection:calendar.event,classification:"
msgid "Public"
msgstr "Publique"
-msgctxt "selection:calendar.event,classification:"
-msgid "Public"
-msgstr "Publique"
-
-msgctxt "selection:calendar.event,status:"
-msgid ""
-msgstr ""
-
msgctxt "selection:calendar.event,status:"
msgid ""
msgstr ""
@@ -907,14 +891,6 @@ msgid "Cancelled"
msgstr "Annulé"
msgctxt "selection:calendar.event,status:"
-msgid "Cancelled"
-msgstr "Annulé"
-
-msgctxt "selection:calendar.event,status:"
-msgid "Confirmed"
-msgstr "Confirmé"
-
-msgctxt "selection:calendar.event,status:"
msgid "Confirmed"
msgstr "Confirmé"
@@ -922,14 +898,6 @@ msgctxt "selection:calendar.event,status:"
msgid "Tentative"
msgstr "Tentative"
-msgctxt "selection:calendar.event,status:"
-msgid "Tentative"
-msgstr "Tentative"
-
-msgctxt "selection:calendar.event,transp:"
-msgid "Opaque"
-msgstr "Opaque"
-
msgctxt "selection:calendar.event,transp:"
msgid "Opaque"
msgstr "Opaque"
@@ -938,10 +906,6 @@ msgctxt "selection:calendar.event,transp:"
msgid "Transparent"
msgstr "transparent"
-msgctxt "selection:calendar.event,transp:"
-msgid "Transparent"
-msgstr "transparent"
-
msgctxt "selection:calendar.event.attendee,status:"
msgid ""
msgstr ""
@@ -1087,22 +1051,10 @@ msgid "Calendar"
msgstr "Calendrier"
msgctxt "view:calendar.calendar:"
-msgid "Calendar"
-msgstr "Calendrier"
-
-msgctxt "view:calendar.calendar:"
msgid "Calendars"
msgstr "Calendriers"
msgctxt "view:calendar.calendar:"
-msgid "Calendars"
-msgstr "Calendriers"
-
-msgctxt "view:calendar.calendar:"
-msgid "General"
-msgstr "Général"
-
-msgctxt "view:calendar.calendar:"
msgid "General"
msgstr "Général"
@@ -1111,14 +1063,6 @@ msgid "Categories"
msgstr "Catégories"
msgctxt "view:calendar.category:"
-msgid "Categories"
-msgstr "Catégories"
-
-msgctxt "view:calendar.category:"
-msgid "Category"
-msgstr "Catégorie"
-
-msgctxt "view:calendar.category:"
msgid "Category"
msgstr "Catégorie"
@@ -1127,14 +1071,6 @@ msgid "Attendee"
msgstr "Participant"
msgctxt "view:calendar.event.attendee:"
-msgid "Attendee"
-msgstr "Participant"
-
-msgctxt "view:calendar.event.attendee:"
-msgid "Attendees"
-msgstr "Participants"
-
-msgctxt "view:calendar.event.attendee:"
msgid "Attendees"
msgstr "Participants"
@@ -1143,14 +1079,6 @@ msgid "Exception Date"
msgstr "Date d'exception"
msgctxt "view:calendar.event.exdate:"
-msgid "Exception Date"
-msgstr "Date d'exception"
-
-msgctxt "view:calendar.event.exdate:"
-msgid "Exception Dates"
-msgstr "Dates d'exception"
-
-msgctxt "view:calendar.event.exdate:"
msgid "Exception Dates"
msgstr "Dates d'exception"
@@ -1159,14 +1087,6 @@ msgid "Exception Rule"
msgstr "Règle d'exception"
msgctxt "view:calendar.event.exrule:"
-msgid "Exception Rule"
-msgstr "Règle d'exception"
-
-msgctxt "view:calendar.event.exrule:"
-msgid "Exception Rules"
-msgstr "Règles d'exception"
-
-msgctxt "view:calendar.event.exrule:"
msgid "Exception Rules"
msgstr "Règles d'exception"
@@ -1175,14 +1095,6 @@ msgid "Recurrence Date"
msgstr "Date de récurrence"
msgctxt "view:calendar.event.rdate:"
-msgid "Recurrence Date"
-msgstr "Date de récurrence"
-
-msgctxt "view:calendar.event.rdate:"
-msgid "Recurrence Dates"
-msgstr "Dates de récurrence"
-
-msgctxt "view:calendar.event.rdate:"
msgid "Recurrence Dates"
msgstr "Dates de récurrence"
@@ -1191,14 +1103,6 @@ msgid "Recurrence Rule"
msgstr "Règle de récurrence"
msgctxt "view:calendar.event.rrule:"
-msgid "Recurrence Rule"
-msgstr "Règle de récurrence"
-
-msgctxt "view:calendar.event.rrule:"
-msgid "Recurrence Rules"
-msgstr "Règles de récurrence"
-
-msgctxt "view:calendar.event.rrule:"
msgid "Recurrence Rules"
msgstr "Règles de récurrence"
@@ -1207,14 +1111,6 @@ msgid "Attendees"
msgstr "Participants"
msgctxt "view:calendar.event:"
-msgid "Attendees"
-msgstr "Participants"
-
-msgctxt "view:calendar.event:"
-msgid "Categories"
-msgstr "Catégories"
-
-msgctxt "view:calendar.event:"
msgid "Categories"
msgstr "Catégories"
@@ -1223,14 +1119,6 @@ msgid "Event"
msgstr "Événement"
msgctxt "view:calendar.event:"
-msgid "Event"
-msgstr "Événement"
-
-msgctxt "view:calendar.event:"
-msgid "Events"
-msgstr "Événements"
-
-msgctxt "view:calendar.event:"
msgid "Events"
msgstr "Événements"
@@ -1239,14 +1127,6 @@ msgid "General"
msgstr "Général"
msgctxt "view:calendar.event:"
-msgid "General"
-msgstr "Général"
-
-msgctxt "view:calendar.event:"
-msgid "Occurences"
-msgstr "Occurrences"
-
-msgctxt "view:calendar.event:"
msgid "Occurences"
msgstr "Occurrences"
@@ -1255,13 +1135,5 @@ msgid "Location"
msgstr "Emplacement"
msgctxt "view:calendar.location:"
-msgid "Location"
-msgstr "Emplacement"
-
-msgctxt "view:calendar.location:"
-msgid "Locations"
-msgstr "Emplacements"
-
-msgctxt "view:calendar.location:"
msgid "Locations"
msgstr "Emplacements"
diff --git a/locale/es_CO.po b/locale/sl_SI.po
similarity index 72%
copy from locale/es_CO.po
copy to locale/sl_SI.po
index 571f7af..4d76c5b 100644
--- a/locale/es_CO.po
+++ b/locale/sl_SI.po
@@ -4,123 +4,123 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:calendar.calendar:"
msgid "A user can have only one calendar."
-msgstr "Un usuario solo puede tener un calendario."
+msgstr "Uporabnik ima lahko samo en koledar."
msgctxt "error:calendar.calendar:"
msgid "Calendar name \"%s\" can not end with .ics"
-msgstr "El nombre del calendario \"%s\" no puede terminar con .ics"
+msgstr "Ime koledarja \"%s\" se ne sme končati z .ics"
msgctxt "error:calendar.calendar:"
msgid "The name of calendar must be unique."
-msgstr "El nombre de calendario debe ser único."
+msgstr "Ime koledarja mora biti edinstveno."
msgctxt "error:calendar.category:"
msgid "The name of calendar category must be unique."
-msgstr "¡El nombre de la categoría de calendario debe ser único!"
+msgstr "Ime kategorije koledarja mora biti edinstveno."
msgctxt "error:calendar.event.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.event.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.event.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.event.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.event.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.event.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.event.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.event.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.event.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.event.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.event.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.event.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.event.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.event.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.event.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.event.rrule:"
msgid "Invalid \"By Position\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Posición\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na pozicijo\" v ponovitvenem pravilu \"%s\""
msgctxt "error:calendar.event.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.event.rrule:"
msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Número de Semana\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na teden v letu\" v ponovitvenem pravilu \"%s\""
msgctxt "error:calendar.event.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.event.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.event:"
msgid "Recurrence \"%s\" can not be recurrent."
-msgstr "Recurrencia \"%s\" no puede ser recurrente."
+msgstr "Ponovitev \"%s\" se ne more ponavljati."
msgctxt "error:calendar.event:"
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 "error:calendar.location:"
msgid "The name of calendar location must be unique."
-msgstr "El nombre de la ubicación del calendario bede ser único."
+msgstr "Ime lokacije koledarja mora biti edinstveno."
msgctxt "field:calendar.calendar,create_date:"
msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
msgctxt "field:calendar.calendar,create_uid:"
msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
msgctxt "field:calendar.calendar,description:"
msgid "Description"
-msgstr "Descripción"
+msgstr "Opis"
msgctxt "field:calendar.calendar,id:"
msgid "ID"
@@ -128,43 +128,43 @@ msgstr "ID"
msgctxt "field:calendar.calendar,name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ident"
msgctxt "field:calendar.calendar,owner:"
msgid "Owner"
-msgstr "Propietario"
+msgstr "Imetnik"
msgctxt "field:calendar.calendar,read_users:"
msgid "Read Users"
-msgstr "Usuarios que pueden Leer"
+msgstr "Bralci"
msgctxt "field:calendar.calendar,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:calendar.calendar,write_date:"
msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
msgctxt "field:calendar.calendar,write_uid:"
msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
msgctxt "field:calendar.calendar,write_users:"
msgid "Write Users"
-msgstr "Modificado por Usuario"
+msgstr "Zapisovalci"
msgctxt "field:calendar.calendar-read-res.user,calendar:"
msgid "Calendar"
-msgstr "Calendario"
+msgstr "Koledar"
msgctxt "field:calendar.calendar-read-res.user,create_date:"
msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
msgctxt "field:calendar.calendar-read-res.user,create_uid:"
msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
msgctxt "field:calendar.calendar-read-res.user,id:"
msgid "ID"
@@ -172,31 +172,31 @@ msgstr "ID"
msgctxt "field:calendar.calendar-read-res.user,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:calendar.calendar-read-res.user,user:"
msgid "User"
-msgstr "Usuario"
+msgstr "Uporabnik"
msgctxt "field:calendar.calendar-read-res.user,write_date:"
msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
msgctxt "field:calendar.calendar-read-res.user,write_uid:"
msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
msgctxt "field:calendar.calendar-write-res.user,calendar:"
msgid "Calendar"
-msgstr "Calendario"
+msgstr "Koledar"
msgctxt "field:calendar.calendar-write-res.user,create_date:"
msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
msgctxt "field:calendar.calendar-write-res.user,create_uid:"
msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
msgctxt "field:calendar.calendar-write-res.user,id:"
msgid "ID"
@@ -204,27 +204,27 @@ msgstr "ID"
msgctxt "field:calendar.calendar-write-res.user,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:calendar.calendar-write-res.user,user:"
msgid "User"
-msgstr "Usuario"
+msgstr "Uporabnik"
msgctxt "field:calendar.calendar-write-res.user,write_date:"
msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
msgctxt "field:calendar.calendar-write-res.user,write_uid:"
msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
msgctxt "field:calendar.category,create_date:"
msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
msgctxt "field:calendar.category,create_uid:"
msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
msgctxt "field:calendar.category,id:"
msgid "ID"
@@ -232,83 +232,83 @@ msgstr "ID"
msgctxt "field:calendar.category,name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Naziv"
msgctxt "field:calendar.category,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:calendar.category,write_date:"
msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
msgctxt "field:calendar.category,write_uid:"
msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
msgctxt "field:calendar.event,alarms:"
msgid "Alarms"
-msgstr "Alarmas"
+msgstr "Alarmi"
msgctxt "field:calendar.event,all_day:"
msgid "All Day"
-msgstr "Todo el Día"
+msgstr "Cel dan"
msgctxt "field:calendar.event,attendees:"
msgid "Attendees"
-msgstr "Asistentes"
+msgstr "Navzoči"
msgctxt "field:calendar.event,calendar:"
msgid "Calendar"
-msgstr "Calendario"
+msgstr "Koledar"
msgctxt "field:calendar.event,calendar_owner:"
msgid "Owner"
-msgstr "Propietario"
+msgstr "Imetnik"
msgctxt "field:calendar.event,calendar_read_users:"
msgid "Read Users"
-msgstr "Usuarios que pueden Leer"
+msgstr "Bralci"
msgctxt "field:calendar.event,calendar_write_users:"
msgid "Write Users"
-msgstr "Modificado por Usuario"
+msgstr "Zapisovalci"
msgctxt "field:calendar.event,categories:"
msgid "Categories"
-msgstr "Categorías"
+msgstr "Kategorije"
msgctxt "field:calendar.event,classification:"
msgid "Classification"
-msgstr "Clasificación"
+msgstr "Klasifikacija"
msgctxt "field:calendar.event,create_date:"
msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
msgctxt "field:calendar.event,create_uid:"
msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
msgctxt "field:calendar.event,description:"
msgid "Description"
-msgstr "Descripción"
+msgstr "Opis"
msgctxt "field:calendar.event,dtend:"
msgid "End Date"
-msgstr "Fecha Fin"
+msgstr "Končni datum"
msgctxt "field:calendar.event,dtstart:"
msgid "Start Date"
-msgstr "Fecha Inicial"
+msgstr "Začetni datum"
msgctxt "field:calendar.event,exdates:"
msgid "Exception Dates"
-msgstr "Fechas de Excepción"
+msgstr "Izjemni datumi"
msgctxt "field:calendar.event,exrules:"
msgid "Exception Rules"
-msgstr "Reglas de Excepción"
+msgstr "Izjemna pravila"
msgctxt "field:calendar.event,id:"
msgid "ID"
@@ -316,55 +316,55 @@ msgstr "ID"
msgctxt "field:calendar.event,location:"
msgid "Location"
-msgstr "Lugar"
+msgstr "Lokacija"
msgctxt "field:calendar.event,occurences:"
msgid "Occurences"
-msgstr "Ocurrencias"
+msgstr "Pojavljanje"
msgctxt "field:calendar.event,organizer:"
msgid "Organizer"
-msgstr "Organizador"
+msgstr "Organizator"
msgctxt "field:calendar.event,parent:"
msgid "Parent"
-msgstr "Padre"
+msgstr "Poddogodek"
msgctxt "field:calendar.event,rdates:"
msgid "Recurrence Dates"
-msgstr "Fechas de Repetición"
+msgstr "Datumi ponovitev"
msgctxt "field:calendar.event,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:calendar.event,recurrence:"
msgid "Recurrence"
-msgstr "Repetición"
+msgstr "Ponovitev"
msgctxt "field:calendar.event,rrules:"
msgid "Recurrence Rules"
-msgstr "Reglas de Repetición"
+msgstr "Pravila ponovitev"
msgctxt "field:calendar.event,sequence:"
msgid "Sequence"
-msgstr "Secuencia"
+msgstr "Zap.št."
msgctxt "field:calendar.event,status:"
msgid "Status"
-msgstr "Estado"
+msgstr "Status"
msgctxt "field:calendar.event,summary:"
msgid "Summary"
-msgstr "Resumen"
+msgstr "Povzetek"
msgctxt "field:calendar.event,timezone:"
msgid "Timezone"
-msgstr "Zona horaria"
+msgstr "Časovni pas"
msgctxt "field:calendar.event,transp:"
msgid "Time Transparency"
-msgstr "Transparencia de Tiempo"
+msgstr "Časovna preglednost"
msgctxt "field:calendar.event,uuid:"
msgid "UUID"
@@ -372,31 +372,31 @@ msgstr "UUID"
msgctxt "field:calendar.event,vevent:"
msgid "vevent"
-msgstr "vevento"
+msgstr "vevent"
msgctxt "field:calendar.event,write_date:"
msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
msgctxt "field:calendar.event,write_uid:"
msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
msgctxt "field:calendar.event-calendar.category,category:"
msgid "Category"
-msgstr "Categoría"
+msgstr "Kategorija"
msgctxt "field:calendar.event-calendar.category,create_date:"
msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
msgctxt "field:calendar.event-calendar.category,create_uid:"
msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
msgctxt "field:calendar.event-calendar.category,event:"
msgid "Event"
-msgstr "Evento"
+msgstr "Dogodek"
msgctxt "field:calendar.event-calendar.category,id:"
msgid "ID"
@@ -404,27 +404,27 @@ msgstr "ID"
msgctxt "field:calendar.event-calendar.category,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:calendar.event-calendar.category,write_date:"
msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
msgctxt "field:calendar.event-calendar.category,write_uid:"
msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
msgctxt "field:calendar.event.alarm,create_date:"
msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
msgctxt "field:calendar.event.alarm,create_uid:"
msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
msgctxt "field:calendar.event.alarm,event:"
msgid "Event"
-msgstr "Evento"
+msgstr "Dogodek"
msgctxt "field:calendar.event.alarm,id:"
msgid "ID"
@@ -432,39 +432,39 @@ msgstr "ID"
msgctxt "field:calendar.event.alarm,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:calendar.event.alarm,valarm:"
msgid "valarm"
-msgstr "valarma"
+msgstr "valarm"
msgctxt "field:calendar.event.alarm,write_date:"
msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
msgctxt "field:calendar.event.alarm,write_uid:"
msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
msgctxt "field:calendar.event.attendee,attendee:"
msgid "attendee"
-msgstr "Asistente"
+msgstr "Navzoči"
msgctxt "field:calendar.event.attendee,create_date:"
msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
msgctxt "field:calendar.event.attendee,create_uid:"
msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
msgctxt "field:calendar.event.attendee,email:"
msgid "Email"
-msgstr "Correo Electrónico"
+msgstr "E-pošta"
msgctxt "field:calendar.event.attendee,event:"
msgid "Event"
-msgstr "Evento"
+msgstr "Dogodek"
msgctxt "field:calendar.event.attendee,id:"
msgid "ID"
@@ -472,39 +472,39 @@ msgstr "ID"
msgctxt "field:calendar.event.attendee,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:calendar.event.attendee,status:"
msgid "Participation Status"
-msgstr "Estado de Participación"
+msgstr "Status udeleženca"
msgctxt "field:calendar.event.attendee,write_date:"
msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
msgctxt "field:calendar.event.attendee,write_uid:"
msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
msgctxt "field:calendar.event.exdate,create_date:"
msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
msgctxt "field:calendar.event.exdate,create_uid:"
msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
msgctxt "field:calendar.event.exdate,date:"
msgid "Is Date"
-msgstr "Esta Fecha"
+msgstr "Je datum"
msgctxt "field:calendar.event.exdate,datetime:"
msgid "Date"
-msgstr "Fecha"
+msgstr "Datum"
msgctxt "field:calendar.event.exdate,event:"
msgid "Event"
-msgstr "Evento"
+msgstr "Dogodek"
msgctxt "field:calendar.event.exdate,id:"
msgid "ID"
@@ -512,71 +512,71 @@ msgstr "ID"
msgctxt "field:calendar.event.exdate,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:calendar.event.exdate,write_date:"
msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
msgctxt "field:calendar.event.exdate,write_uid:"
msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
msgctxt "field:calendar.event.exrule,byday:"
msgid "By Day"
-msgstr "Por Día"
+msgstr "Na dan"
msgctxt "field:calendar.event.exrule,byhour:"
msgid "By Hour"
-msgstr "Por Hora"
+msgstr "Na uro"
msgctxt "field:calendar.event.exrule,byminute:"
msgid "By Minute"
-msgstr "Por Minuto"
+msgstr "Na minuto"
msgctxt "field:calendar.event.exrule,bymonth:"
msgid "By Month"
-msgstr "Por Mes"
+msgstr "Na mesec"
msgctxt "field:calendar.event.exrule,bymonthday:"
msgid "By Month Day"
-msgstr "Por Día del Mes"
+msgstr "Na dan v mesecu"
msgctxt "field:calendar.event.exrule,bysecond:"
msgid "By Second"
-msgstr "Por Segundo"
+msgstr "Na sekundo"
msgctxt "field:calendar.event.exrule,bysetpos:"
msgid "By Position"
-msgstr "Por Posición"
+msgstr "Na pozicijo"
msgctxt "field:calendar.event.exrule,byweekno:"
msgid "By Week Number"
-msgstr "Por Número de la Semana"
+msgstr "Na teden v letu"
msgctxt "field:calendar.event.exrule,byyearday:"
msgid "By Year Day"
-msgstr "Por Día del Año"
+msgstr "Na dan v letu"
msgctxt "field:calendar.event.exrule,count:"
msgid "Count"
-msgstr "Contar"
+msgstr "Število"
msgctxt "field:calendar.event.exrule,create_date:"
msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
msgctxt "field:calendar.event.exrule,create_uid:"
msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
msgctxt "field:calendar.event.exrule,event:"
msgid "Event"
-msgstr "Evento"
+msgstr "Dogodek"
msgctxt "field:calendar.event.exrule,freq:"
msgid "Frequency"
-msgstr "Frecuencia"
+msgstr "Frekvenca"
msgctxt "field:calendar.event.exrule,id:"
msgid "ID"
@@ -584,51 +584,51 @@ msgstr "ID"
msgctxt "field:calendar.event.exrule,interval:"
msgid "Interval"
-msgstr "Intervalo"
+msgstr "Interval"
msgctxt "field:calendar.event.exrule,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:calendar.event.exrule,until:"
msgid "Until Date"
-msgstr "Hasta la Fecha"
+msgstr "Do dne"
msgctxt "field:calendar.event.exrule,until_date:"
msgid "Is Date"
-msgstr "Esta Fecha"
+msgstr "Je datum"
msgctxt "field:calendar.event.exrule,wkst:"
msgid "Week Day"
-msgstr "Día de la Semana"
+msgstr "Dan v tednu"
msgctxt "field:calendar.event.exrule,write_date:"
msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
msgctxt "field:calendar.event.exrule,write_uid:"
msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
msgctxt "field:calendar.event.rdate,create_date:"
msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
msgctxt "field:calendar.event.rdate,create_uid:"
msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
msgctxt "field:calendar.event.rdate,date:"
msgid "Is Date"
-msgstr "Esta Fecha"
+msgstr "Je datum"
msgctxt "field:calendar.event.rdate,datetime:"
msgid "Date"
-msgstr "Fecha"
+msgstr "Datum"
msgctxt "field:calendar.event.rdate,event:"
msgid "Event"
-msgstr "Evento"
+msgstr "Dogodek"
msgctxt "field:calendar.event.rdate,id:"
msgid "ID"
@@ -636,71 +636,71 @@ msgstr "ID"
msgctxt "field:calendar.event.rdate,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:calendar.event.rdate,write_date:"
msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
msgctxt "field:calendar.event.rdate,write_uid:"
msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
msgctxt "field:calendar.event.rrule,byday:"
msgid "By Day"
-msgstr "Por Día"
+msgstr "Na dan"
msgctxt "field:calendar.event.rrule,byhour:"
msgid "By Hour"
-msgstr "Por Hora"
+msgstr "Na uro"
msgctxt "field:calendar.event.rrule,byminute:"
msgid "By Minute"
-msgstr "Por Minuto"
+msgstr "Na minuto"
msgctxt "field:calendar.event.rrule,bymonth:"
msgid "By Month"
-msgstr "Por Mes"
+msgstr "Na mesec"
msgctxt "field:calendar.event.rrule,bymonthday:"
msgid "By Month Day"
-msgstr "Por Día del Mes"
+msgstr "Na dan v mesecu"
msgctxt "field:calendar.event.rrule,bysecond:"
msgid "By Second"
-msgstr "Por Segundo"
+msgstr "Na sekundo"
msgctxt "field:calendar.event.rrule,bysetpos:"
msgid "By Position"
-msgstr "Por Posición"
+msgstr "Na pozicijo"
msgctxt "field:calendar.event.rrule,byweekno:"
msgid "By Week Number"
-msgstr "Por Número de la Semana"
+msgstr "Na teden v letu"
msgctxt "field:calendar.event.rrule,byyearday:"
msgid "By Year Day"
-msgstr "Por Día del Año"
+msgstr "Na dan v letu"
msgctxt "field:calendar.event.rrule,count:"
msgid "Count"
-msgstr "Contar"
+msgstr "Število"
msgctxt "field:calendar.event.rrule,create_date:"
msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
msgctxt "field:calendar.event.rrule,create_uid:"
msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
msgctxt "field:calendar.event.rrule,event:"
msgid "Event"
-msgstr "Evento"
+msgstr "Dogodek"
msgctxt "field:calendar.event.rrule,freq:"
msgid "Frequency"
-msgstr "Frecuencia"
+msgstr "Frekvenca"
msgctxt "field:calendar.event.rrule,id:"
msgid "ID"
@@ -708,39 +708,39 @@ msgstr "ID"
msgctxt "field:calendar.event.rrule,interval:"
msgid "Interval"
-msgstr "Intervalo"
+msgstr "Interval"
msgctxt "field:calendar.event.rrule,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:calendar.event.rrule,until:"
msgid "Until Date"
-msgstr "Hasta la Fecha"
+msgstr "Do dne"
msgctxt "field:calendar.event.rrule,until_date:"
msgid "Is Date"
-msgstr "Esta Fecha"
+msgstr "Je datum"
msgctxt "field:calendar.event.rrule,wkst:"
msgid "Week Day"
-msgstr "Día de la Semana"
+msgstr "Dan v tednu"
msgctxt "field:calendar.event.rrule,write_date:"
msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
msgctxt "field:calendar.event.rrule,write_uid:"
msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
msgctxt "field:calendar.location,create_date:"
msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
msgctxt "field:calendar.location,create_uid:"
msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
msgctxt "field:calendar.location,id:"
msgid "ID"
@@ -748,399 +748,392 @@ msgstr "ID"
msgctxt "field:calendar.location,name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Naziv"
msgctxt "field:calendar.location,rec_name:"
msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
msgctxt "field:calendar.location,write_date:"
msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
msgctxt "field:calendar.location,write_uid:"
msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
msgctxt "field:res.user,calendars:"
msgid "Calendars"
-msgstr "Calendarios"
+msgstr "Koledarji"
msgctxt "help:calendar.calendar,owner:"
msgid "The user must have an email"
-msgstr "El usuario debe tener un email"
+msgstr "Uporabnik mora imeti elektronski naslov"
msgctxt "help:calendar.event,uuid:"
msgid "Universally Unique Identifier"
-msgstr "Idenitificador Universal Único"
+msgstr "Vsesplošno edinstven identifikator"
msgctxt "help:calendar.event.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.event.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.event.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.event.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.calendar,name:"
msgid "Calendar"
-msgstr "Calendario"
+msgstr "Koledar"
msgctxt "model:calendar.calendar-read-res.user,name:"
msgid "Calendar - read - User"
-msgstr "Calendario - leer - Usuario"
+msgstr "Koledar - branje - Uporabnik"
msgctxt "model:calendar.calendar-write-res.user,name:"
msgid "Calendar - write - User"
-msgstr "Calendario - escribir - Usuario"
+msgstr "Koledar - pisanje - Uporabnik"
msgctxt "model:calendar.category,name:"
msgid "Category"
-msgstr "Categoría"
+msgstr "Kategorija"
msgctxt "model:calendar.event,name:"
msgid "Event"
-msgstr "Evento"
+msgstr "Dogodek"
msgctxt "model:calendar.event-calendar.category,name:"
msgid "Event - Category"
-msgstr "Evento - Categoría"
+msgstr "Dogodek - Kategorija"
msgctxt "model:calendar.event.alarm,name:"
msgid "Alarm"
-msgstr "Alarma"
+msgstr "Alarm"
msgctxt "model:calendar.event.attendee,name:"
msgid "Attendee"
-msgstr "Asistente"
+msgstr "Navzoči"
msgctxt "model:calendar.event.exdate,name:"
msgid "Exception Date"
-msgstr "Fecha de Excepción"
+msgstr "Izjemni datum"
msgctxt "model:calendar.event.exrule,name:"
msgid "Exception Rule"
-msgstr "Regla de Excepción"
+msgstr "Izjemno pravilo"
msgctxt "model:calendar.event.rdate,name:"
msgid "Recurrence Date"
-msgstr "Fecha de Repetición"
+msgstr "Datum ponovitve"
msgctxt "model:calendar.event.rrule,name:"
msgid "Recurrence Rule"
-msgstr "Regla de Repetición"
+msgstr "Pravilo ponovitve"
msgctxt "model:calendar.location,name:"
msgid "Location"
-msgstr "Lugar"
+msgstr "Lokacija"
msgctxt "model:ir.action,name:act_calendar_form"
msgid "Calendars"
-msgstr "Calendarios"
+msgstr "Koledarji"
msgctxt "model:ir.action,name:act_event_form"
msgid "Events"
-msgstr "Eventos"
+msgstr "Dogodki"
msgctxt "model:ir.action,name:act_event_form3"
msgid "Events"
-msgstr "Eventos"
+msgstr "Dogodki"
msgctxt "model:ir.ui.menu,name:menu_calendar"
msgid "Calendar"
-msgstr "Calendario"
+msgstr "Koledar"
msgctxt "model:ir.ui.menu,name:menu_calendar_form"
msgid "Calendars"
-msgstr "Calendarios"
+msgstr "Koledarji"
msgctxt "model:ir.ui.menu,name:menu_event_form"
msgid "Events"
-msgstr "Eventos"
+msgstr "Dogodki"
msgctxt "model:res.group,name:group_calendar_admin"
msgid "Calendar Administration"
-msgstr "Administración Calendario"
+msgstr "Koledar - vodenje"
msgctxt "selection:calendar.event,classification:"
msgid "Confidential"
-msgstr "Confidencial"
+msgstr "Zaupno"
msgctxt "selection:calendar.event,classification:"
msgid "Private"
-msgstr "Privado"
+msgstr "Zasebno"
msgctxt "selection:calendar.event,classification:"
msgid "Public"
-msgstr "Público"
+msgstr "Javno"
-#, fuzzy
msgctxt "selection:calendar.event,status:"
msgid ""
-msgstr "Punto de Orden"
+msgstr ""
msgctxt "selection:calendar.event,status:"
msgid "Cancelled"
-msgstr "Cancelado"
+msgstr "Preklicano"
msgctxt "selection:calendar.event,status:"
msgid "Confirmed"
-msgstr "Confirmado"
+msgstr "Potrjeno"
msgctxt "selection:calendar.event,status:"
msgid "Tentative"
-msgstr "Tentativa"
+msgstr "Negotovo"
msgctxt "selection:calendar.event,transp:"
msgid "Opaque"
-msgstr "Opaco"
+msgstr "Nepregledno"
msgctxt "selection:calendar.event,transp:"
msgid "Transparent"
-msgstr "Transparente"
+msgstr "Pregledno"
-#, fuzzy
msgctxt "selection:calendar.event.attendee,status:"
msgid ""
-msgstr "Punto de Orden"
+msgstr ""
msgctxt "selection:calendar.event.attendee,status:"
msgid "Accepted"
-msgstr "Aceptado"
+msgstr "Sprejeto"
msgctxt "selection:calendar.event.attendee,status:"
msgid "Declined"
-msgstr "Declinado"
+msgstr "Zavrnjeno"
msgctxt "selection:calendar.event.attendee,status:"
msgid "Delegated"
-msgstr "Delegado"
+msgstr "Delegirano"
msgctxt "selection:calendar.event.attendee,status:"
msgid "Needs Action"
-msgstr "Necesita una Acción"
+msgstr "Potreben ukrep"
msgctxt "selection:calendar.event.attendee,status:"
msgid "Tentative"
-msgstr "Tentativa"
+msgstr "Negotovo"
msgctxt "selection:calendar.event.exrule,freq:"
msgid "Daily"
-msgstr "Diario"
+msgstr "Dnevno"
msgctxt "selection:calendar.event.exrule,freq:"
msgid "Hourly"
-msgstr "Cada Hora"
+msgstr "Na uro"
msgctxt "selection:calendar.event.exrule,freq:"
msgid "Minutely"
-msgstr "Cada Minuto"
+msgstr "Na minuto"
msgctxt "selection:calendar.event.exrule,freq:"
msgid "Monthly"
-msgstr "Mensualmente"
+msgstr "Mesečno"
msgctxt "selection:calendar.event.exrule,freq:"
msgid "Secondly"
-msgstr "En segundo lugar"
+msgstr "Na sekundo"
msgctxt "selection:calendar.event.exrule,freq:"
msgid "Weekly"
-msgstr "Semanalmente"
+msgstr "Tedensko"
msgctxt "selection:calendar.event.exrule,freq:"
msgid "Yearly"
-msgstr "Anualmente"
+msgstr "Letno"
msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Friday"
-msgstr "Viernes"
+msgstr "Petek"
msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Monday"
-msgstr "Lunes"
+msgstr "Ponedeljek"
msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Saturday"
-msgstr "Sábado"
+msgstr "Sobota"
msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Sunday"
-msgstr "Domingo"
+msgstr "Nedelja"
msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Thursday"
-msgstr "Jueves"
+msgstr "Četrtek"
msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Tuesday"
-msgstr "Martes"
+msgstr "Torek"
msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Wednesday"
-msgstr "Miércoles"
+msgstr "Sreda"
msgctxt "selection:calendar.event.rrule,freq:"
msgid "Daily"
-msgstr "Diario"
+msgstr "Dnevno"
msgctxt "selection:calendar.event.rrule,freq:"
msgid "Hourly"
-msgstr "Cada Hora"
+msgstr "Na uro"
msgctxt "selection:calendar.event.rrule,freq:"
msgid "Minutely"
-msgstr "Cada Minuto"
+msgstr "Na minuto"
msgctxt "selection:calendar.event.rrule,freq:"
msgid "Monthly"
-msgstr "Mensualmente"
+msgstr "Mesečno"
msgctxt "selection:calendar.event.rrule,freq:"
msgid "Secondly"
-msgstr "En segundo lugar"
+msgstr "Na sekundo"
msgctxt "selection:calendar.event.rrule,freq:"
msgid "Weekly"
-msgstr "Semanalmente"
+msgstr "Tedensko"
msgctxt "selection:calendar.event.rrule,freq:"
msgid "Yearly"
-msgstr "Anualmente"
+msgstr "Letno"
msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Friday"
-msgstr "Viernes"
+msgstr "Petek"
msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Monday"
-msgstr "Lunes"
+msgstr "Ponedeljek"
msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Saturday"
-msgstr "Sábado"
+msgstr "Sobota"
msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Sunday"
-msgstr "Domingo"
+msgstr "Nedelja"
msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Thursday"
-msgstr "Jueves"
+msgstr "Četrtek"
msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Tuesday"
-msgstr "Martes"
+msgstr "Torek"
msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Wednesday"
-msgstr "Miércoles"
+msgstr "Sreda"
-#, fuzzy
msgctxt "view:calendar.calendar:"
msgid "Access Permissions"
-msgstr "Permisos de Acceso"
+msgstr "Dostop"
msgctxt "view:calendar.calendar:"
msgid "Calendar"
-msgstr "Calendario"
+msgstr "Koledar"
msgctxt "view:calendar.calendar:"
msgid "Calendars"
-msgstr "Calendarios"
+msgstr "Koledarji"
msgctxt "view:calendar.calendar:"
msgid "General"
-msgstr "General"
+msgstr "Splošno"
msgctxt "view:calendar.category:"
msgid "Categories"
-msgstr "Categorías"
+msgstr "Kategorije"
msgctxt "view:calendar.category:"
msgid "Category"
-msgstr "Categoría"
+msgstr "Kategorija"
msgctxt "view:calendar.event.attendee:"
msgid "Attendee"
-msgstr "Asistente"
+msgstr "Navzoči"
msgctxt "view:calendar.event.attendee:"
msgid "Attendees"
-msgstr "Asistentes"
+msgstr "Navzoči"
msgctxt "view:calendar.event.exdate:"
msgid "Exception Date"
-msgstr "Fecha de Excepción"
+msgstr "Izjemni datum"
msgctxt "view:calendar.event.exdate:"
msgid "Exception Dates"
-msgstr "Fechas de Excepción"
+msgstr "Izjemni datumi"
msgctxt "view:calendar.event.exrule:"
msgid "Exception Rule"
-msgstr "Regla de Excepción"
+msgstr "Izjemno pravilo"
msgctxt "view:calendar.event.exrule:"
msgid "Exception Rules"
-msgstr "Reglas de Excepción"
+msgstr "Izjemna pravila"
msgctxt "view:calendar.event.rdate:"
msgid "Recurrence Date"
-msgstr "Fecha de Repetición"
+msgstr "Datum ponovitve"
msgctxt "view:calendar.event.rdate:"
msgid "Recurrence Dates"
-msgstr "Fechas de Repetición"
+msgstr "Datumi ponovitev"
msgctxt "view:calendar.event.rrule:"
msgid "Recurrence Rule"
-msgstr "Regla de Repetición"
+msgstr "Pravilo ponovitve"
msgctxt "view:calendar.event.rrule:"
msgid "Recurrence Rules"
-msgstr "Reglas de Repetición"
+msgstr "Pravila ponovitev"
msgctxt "view:calendar.event:"
msgid "Attendees"
-msgstr "Asistentes"
+msgstr "Navzoči"
msgctxt "view:calendar.event:"
msgid "Categories"
-msgstr "Categorías"
+msgstr "Kategorije"
msgctxt "view:calendar.event:"
msgid "Event"
-msgstr "Evento"
+msgstr "Dogodek"
msgctxt "view:calendar.event:"
msgid "Events"
-msgstr "Eventos"
+msgstr "Dogodki"
msgctxt "view:calendar.event:"
msgid "General"
-msgstr "General"
+msgstr "Splošno"
msgctxt "view:calendar.event:"
msgid "Occurences"
-msgstr "Ocurrencias"
+msgstr "Pojavljanje"
msgctxt "view:calendar.location:"
msgid "Location"
-msgstr "Lugar"
+msgstr "Lokacija"
msgctxt "view:calendar.location:"
msgid "Locations"
-msgstr "Lugares"
+msgstr "Lokacije"
diff --git a/setup.py b/setup.py
index 91a746f..4267a73 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',
'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 40ec561..84d6a76 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 import suite
+
+__all__ = ['suite']
diff --git a/tryton.cfg b/tryton.cfg
index c27871a..6b62a9f 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
[tryton]
-version=2.8.0
+version=3.0.0
depends:
ir
res
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index 741485f..4345681 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.1
Name: trytond-calendar
-Version: 2.8.0
+Version: 3.0.0
Summary: Tryton module for 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
================
@@ -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.egg-info/SOURCES.txt b/trytond_calendar.egg-info/SOURCES.txt
index a44e6d3..6fc119c 100644
--- a/trytond_calendar.egg-info/SOURCES.txt
+++ b/trytond_calendar.egg-info/SOURCES.txt
@@ -25,6 +25,7 @@ locale/es_ES.po
locale/fr_FR.po
locale/nl_NL.po
locale/ru_RU.po
+locale/sl_SI.po
trytond_calendar.egg-info/PKG-INFO
trytond_calendar.egg-info/SOURCES.txt
trytond_calendar.egg-info/dependency_links.txt
diff --git a/trytond_calendar.egg-info/requires.txt b/trytond_calendar.egg-info/requires.txt
index 823ce06..67ab9f8 100644
--- a/trytond_calendar.egg-info/requires.txt
+++ b/trytond_calendar.egg-info/requires.txt
@@ -2,7 +2,8 @@ vobject >= 0.8.0
PyWebDAV >= 0.9.8
python-dateutil
pytz
-trytond >= 2.8, < 2.9
+python-sql
+trytond >= 3.0, < 3.1
[test]
caldav
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index ea6f3e7..cc99d87 100644
--- a/webdav.py
+++ b/webdav.py
@@ -2,6 +2,10 @@
#this repository contains the full copyright notices and license terms.
import vobject
import urllib
+from sql.functions import Extract
+from sql.conditionals import Coalesce
+from sql.aggregate import Max
+
from pywebdav.lib.errors import DAV_NotFound, DAV_Forbidden
from trytond.tools import reduce_ids
from trytond.cache import Cache
@@ -262,6 +266,8 @@ class Collection:
def get_creationdate(cls, uri, cache=None):
Calendar = Pool().get('calendar.calendar')
Event = Pool().get('calendar.event')
+ calendar = Calendar.__table__()
+ event = Event.__table__()
calendar_id = cls.calendar(uri)
if not calendar_id:
@@ -284,11 +290,10 @@ class Collection:
cursor = Transaction().cursor
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 "' + Calendar._table + '" '
- 'WHERE ' + red_sql, red_ids)
+ red_sql = reduce_ids(calendar.id, sub_ids)
+ cursor.execute(*calendar.select(calendar.id,
+ Extract('EPOCH', calendar.create_date),
+ where=red_sql))
for calendar_id2, date in cursor.fetchall():
if calendar_id2 == calendar_id:
res = date
@@ -318,11 +323,10 @@ class Collection:
cursor = Transaction().cursor
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 "' + Event._table + '" '
- 'WHERE ' + red_sql, red_ids)
+ red_sql = reduce_ids(event.id, sub_ids)
+ cursor.execute(*event.select(event.id,
+ Extract('EPOCH', event.create_date),
+ where=red_sql))
for event_id2, date in cursor.fetchall():
if event_id2 == event_id:
res = date
@@ -340,6 +344,8 @@ class Collection:
pool = Pool()
Calendar = pool.get('calendar.calendar')
Event = pool.get('calendar.event')
+ calendar = Calendar.__table__()
+ event = Event.__table__()
cursor = Transaction().cursor
calendar_id = cls.calendar(uri)
@@ -360,12 +366,11 @@ 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 '
- 'COALESCE(write_date, create_date)) '
- 'FROM "' + Calendar._table + '" '
- 'WHERE ' + red_sql, red_ids)
+ red_sql = reduce_ids(calendar.id, sub_ids)
+ cursor.execute(*calendar.select(calendar.id,
+ Extract('EPOCH', Coalesce(calendar.write_date,
+ calendar.create_date)),
+ where=red_sql))
for calendar_id2, date in cursor.fetchall():
if calendar_id2 == calendar_id:
res = date
@@ -394,17 +399,14 @@ 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 "' + Event._table + '" '
- 'WHERE ' + red_id_sql + ' '
- 'OR ' + red_parent_sql + ' '
- 'GROUP BY parent, id',
- red_id_ids + red_parent_ids)
+ red_id_sql = reduce_ids(event.id, sub_ids)
+ red_parent_sql = reduce_ids(event.parent, sub_ids)
+ cursor.execute(*event.select(
+ Coalesce(event.parent, event.id),
+ Max(Extract('EPOCH', Coalesce(event.write_date,
+ event.create_date))),
+ where=red_id_sql | red_parent_sql,
+ group_by=(event.parent, event.id)))
for event_id2, date in cursor.fetchall():
if event_id2 == event_id:
res = date
@@ -432,12 +434,12 @@ 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('calendar', sub_ids)
- cursor.execute('SELECT calendar, MAX(EXTRACT(epoch FROM '
- 'COALESCE(write_date, create_date))) '
- 'FROM "' + Event._table + '" '
- 'WHERE ' + red_sql + ' '
- 'GROUP BY calendar', red_ids)
+ red_sql = reduce_ids(event.calendar, sub_ids)
+ cursor.execute(*event.select(event.calendar,
+ Max(Extract('EPOCH', Coalesce(event.write_date,
+ event.create_date))),
+ where=red_sql,
+ group_by=event.calendar))
for calendar_id2, date in cursor.fetchall():
if calendar_id2 == calendar_ics_id:
res = date
commit b355b7d614f21b74938630bb9078fb4b019ce7af
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Thu May 2 00:35:26 2013 +0200
Adding upstream version 2.8.0.
diff --git a/CHANGELOG b/CHANGELOG
index ce8b818..434be38 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 37e5095..d0ce93a 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.1
Name: trytond_calendar
-Version: 2.6.1
+Version: 2.8.0
Summary: Tryton module for 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
================
@@ -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/__init__.py b/__init__.py
index 81a621a..caf0820 100644
--- a/__init__.py
+++ b/__init__.py
@@ -18,14 +18,10 @@ def register():
Location,
Event,
EventCategory,
- Alarm,
EventAlarm,
- Attendee,
EventAttendee,
- Date,
EventRDate,
EventExDate,
- RRule,
EventRRule,
EventExRule,
User,
diff --git a/caldav.py b/caldav.py
index ae205be..a5fd3b1 100644
--- a/caldav.py
+++ b/caldav.py
@@ -38,7 +38,7 @@ 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/'):
+ if parent_uri in ('Calendars', 'Calendars/'):
ad = doc.createElement('calendar')
ad.setAttribute('xmlns', 'urn:ietf:params:xml:ns:caldav')
#Disable groupdav attribute for iPhone
@@ -295,7 +295,8 @@ def do_POST(self):
try:
DATA = '%s\n' % dc._get_caldav_post(uri, body, ct)
- except DAV_Error, (ec, dd):
+ except DAV_Error, exception:
+ ec, _ = exception
return self.send_status(ec)
self.send_body_chunks(DATA, '200', 'OK', 'OK')
return
diff --git a/calendar.xml b/calendar.xml
index 3294b35..535bd17 100644
--- a/calendar.xml
+++ b/calendar.xml
@@ -23,38 +23,12 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.ui.view" id="calendar_view_tree">
<field name="model">calendar.calendar</field>
<field name="type">tree</field>
- <field name="arch" type="xml">
- <![CDATA[
- <tree string="Calendars">
- <field name="name"/>
- <field name="owner"/>
- </tree>
- ]]>
- </field>
+ <field name="name">calendar_tree</field>
</record>
<record model="ir.ui.view" id="calendar_view_form">
<field name="model">calendar.calendar</field>
<field name="type">form</field>
- <field name="arch" type="xml">
- <![CDATA[
- <form string="Calendar">
- <label name="name"/>
- <field name="name"/>
- <label name="owner"/>
- <field name="owner"/>
- <notebook colspan="4">
- <page string="General" id="general">
- <separator name="description" colspan="4"/>
- <field name="description" colspan="4"/>
- </page>
- <page string="Security" id="security">
- <field name="read_users" colspan="4"/>
- <field name="write_users" colspan="4"/>
- </page>
- </notebook>
- </form>
- ]]>
- </field>
+ <field name="name">calendar_form</field>
</record>
<record model="ir.action.act_window" id="act_calendar_form">
<field name="name">Calendars</field>
@@ -83,15 +57,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_calendar_line1">
- <field name="field" search="[('name', '=', 'calendar_owner'), ('model.model', '=', 'calendar.event')]"/>
- <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_calendar"/>
</record>
<record model="ir.rule" id="rule_group_read_calendar_line2">
- <field name="field" search="[('name', '=', 'calendar_read_users'), ('model.model', '=', 'calendar.event')]"/>
- <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_calendar"/>
</record>
@@ -105,157 +75,56 @@ 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_calendar_line1">
- <field name="field" search="[('name', '=', 'calendar_owner'), ('model.model', '=', 'calendar.event')]"/>
- <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_calendar"/>
</record>
<record model="ir.rule" id="rule_group_write_calendar_line2">
- <field name="field" search="[('name', '=', 'calendar_write_users'), ('model.model', '=', 'calendar.event')]"/>
- <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_calendar"/>
</record>
<record model="ir.ui.view" id="category_view_tree">
<field name="model">calendar.category</field>
<field name="type">tree</field>
- <field name="arch" type="xml">
- <![CDATA[
- <tree string="Categories">
- <field name="name"/>
- </tree>
- ]]>
- </field>
+ <field name="name">category_tree</field>
</record>
<record model="ir.ui.view" id="category_view_form">
<field name="model">calendar.category</field>
<field name="type">form</field>
- <field name="arch" type="xml">
- <![CDATA[
- <form string="Category">
- <label name="name"/>
- <field name="name"/>
- </form>
- ]]>
- </field>
+ <field name="name">category_form</field>
</record>
<record model="ir.ui.view" id="location_view_tree">
<field name="model">calendar.location</field>
<field name="type">tree</field>
- <field name="arch" type="xml">
- <![CDATA[
- <tree string="Locations">
- <field name="name"/>
- </tree>
- ]]>
- </field>
+ <field name="name">location_tree</field>
</record>
<record model="ir.ui.view" id="location_view_form">
<field name="model">calendar.location</field>
<field name="type">form</field>
- <field name="arch" type="xml">
- <![CDATA[
- <form string="Location">
- <label name="name"/>
- <field name="name"/>
- </form>
- ]]>
- </field>
+ <field name="name">location_form</field>
</record>
<record model="ir.ui.view" id="event_view_tree">
<field name="model">calendar.event</field>
<field name="type">tree</field>
<field name="priority" eval="10"/>
- <field name="arch" type="xml">
- <![CDATA[
- <tree string="Events">
- <field name="calendar"/>
- <field name="summary"/>
- <field name="all_day"/>
- <field name="dtstart"/>
- <field name="dtend"/>
- <field name="status"/>
- </tree>
- ]]>
- </field>
+ <field name="name">event_tree</field>
</record>
- <record model="ir.ui.view" id="event_vieww_tree_occurence">
+ <record model="ir.ui.view" id="event_view_tree_occurence">
<field name="model">calendar.event</field>
<field name="type">tree</field>
<field name="priority" eval="20"/>
- <field name="arch" type="xml">
- <![CDATA[
- <tree string="Events">
- <field name="summary"/>
- <field name="recurrence"/>
- <field name="all_day"/>
- <field name="dtstart"/>
- <field name="dtend"/>
- <field name="status"/>
- </tree>
- ]]>
- </field>
+ <field name="name">event_tree_occurence</field>
</record>
<record model="ir.ui.view" id="event_view_form">
<field name="model">calendar.event</field>
<field name="type">form</field>
- <field name="arch" type="xml">
- <![CDATA[
- <form string="Event">
- <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="all_day"/>
- <field name="all_day"/>
- <label name="transp"/>
- <field name="transp"/>
- <label name="dtstart"/>
- <field name="dtstart"/>
- <label name="dtend"/>
- <field name="dtend"/>
- <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.event_vieww_tree_occurence"/>
- </page>
- </notebook>
- <field name="parent" colspan="4" invisible="1"/>
- </form>
- ]]>
- </field>
+ <field name="name">event_form</field>
</record>
<record model="ir.action.act_window" id="act_event_form">
@@ -301,208 +170,62 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.ui.view" id="attendee_view_tree">
<field name="model">calendar.event.attendee</field>
<field name="type">tree</field>
- <field name="arch" type="xml">
- <![CDATA[
- <tree string="Attendees">
- <field name="event"/>
- <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.event.attendee</field>
<field name="type">form</field>
- <field name="arch" type="xml">
- <![CDATA[
- <form string="Attendee">
- <label name="event"/>
- <field name="event" 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.event.rdate</field>
<field name="type">tree</field>
- <field name="arch" type="xml">
- <![CDATA[
- <tree string="Recurrence Dates">
- <field name="event"/>
- <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.event.rdate</field>
<field name="type">form</field>
- <field name="arch" type="xml">
- <![CDATA[
- <form string="Recurrence Date">
- <label name="event"/>
- <field name="event" 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.event.exdate</field>
<field name="type">tree</field>
- <field name="arch" type="xml">
- <![CDATA[
- <tree string="Exception Dates">
- <field name="event"/>
- <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.event.exdate</field>
<field name="type">form</field>
- <field name="arch" type="xml">
- <![CDATA[
- <form string="Exception Date">
- <label name="event"/>
- <field name="event" 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.event.rrule</field>
<field name="type">tree</field>
- <field name="arch" type="xml">
- <![CDATA[
- <tree string="Recurrence Rules">
- <field name="event"/>
- <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.event.rrule</field>
<field name="type">form</field>
- <field name="arch" type="xml">
- <![CDATA[
- <form string="Recurrence Rule">
- <label name="event"/>
- <field name="event" 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.event.exrule</field>
<field name="type">tree</field>
- <field name="arch" type="xml">
- <![CDATA[
- <tree string="Exception Rules">
- <field name="event"/>
- <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.event.exrule</field>
<field name="type">form</field>
- <field name="arch" type="xml">
- <![CDATA[
- <form string="Exception Rule">
- <label name="event"/>
- <field name="event" 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>
</tryton>
diff --git a/calendar_.py b/calendar_.py
index 1e63623..4a9c2d3 100644
--- a/calendar_.py
+++ b/calendar_.py
@@ -6,7 +6,7 @@ import dateutil.tz
import pytz
import datetime
import xml.dom.minidom
-from trytond.model import ModelSQL, ModelView, fields
+from trytond.model import Model, ModelSQL, ModelView, fields
from trytond.tools import reduce_ids
from trytond.backend import TableHandler
from trytond.pyson import If, Bool, Eval
@@ -15,8 +15,8 @@ from trytond.cache import Cache
from trytond.pool import Pool
__all__ = ['Calendar', 'ReadUser', 'WriteUser', 'Category', 'Location',
- 'Event', 'EventCategory', 'Alarm', 'EventAlarm', 'Attendee',
- 'EventAttendee', 'Date', 'EventRDate', 'EventExDate', 'RRule',
+ 'Event', 'EventCategory', 'AlarmMixin', 'EventAlarm', 'AttendeeMixin',
+ 'EventAttendee', 'DateMixin', 'EventRDate', 'EventExDate', 'RRuleMixin',
'EventRRule', 'EventExRule']
tzlocal = dateutil.tz.tzlocal()
@@ -43,21 +43,21 @@ class Calendar(ModelSQL, ModelView):
super(Calendar, cls).__setup__()
cls._sql_constraints = [
('name_uniq', 'UNIQUE(name)',
- 'The name of calendar must be unique!'),
+ 'The name of calendar must be unique.'),
('owner_uniq', 'UNIQUE(owner)',
- 'A user can have only one calendar!'),
+ 'A user can have only one calendar.'),
]
cls._order.insert(0, ('name', 'ASC'))
- cls._constraints += [
- ('check_name', 'Calendar name can not end with .ics'),
- ]
+ cls._error_messages.update({
+ 'invalid_name': 'Calendar name "%s" can not end with .ics',
+ })
@classmethod
- def create(cls, vals):
- calendar = super(Calendar, cls).create(vals)
+ def create(cls, vlist):
+ calendars = super(Calendar, cls).create(vlist)
# Restart the cache for get_name
cls._get_name_cache.clear()
- return calendar
+ return calendars
@classmethod
def write(cls, calendars, vals):
@@ -71,13 +71,18 @@ class Calendar(ModelSQL, ModelView):
# Restart the cache for calendar
cls._get_name_cache.clear()
+ @classmethod
+ def validate(cls, calendars):
+ super(Calendar, cls).validate(calendars)
+ for calendar in calendars:
+ calendar.check_name()
+
def check_name(self):
'''
Check the name doesn't end with .ics
'''
if self.name.endswith('.ics'):
- return False
- return True
+ self.raise_user_error('invalid_name', (self.name,))
@classmethod
def get_name(cls, name):
@@ -146,13 +151,13 @@ class Calendar(ModelSQL, ModelView):
if not isinstance(dtstart, datetime.datetime):
ical.vfreebusy.add('dtstart').value = dtstart
dtstart = datetime.datetime.combine(dtstart, datetime.time())\
- .replace(tzinfo=tzlocal)
+ .replace(tzinfo=tzlocal)
else:
ical.vfreebusy.add('dtstart').value = dtstart.astimezone(tzutc)
if not isinstance(dtend, datetime.datetime):
ical.vfreebusy.add('dtend').value = dtend
dtend = datetime.datetime.combine(dtend, datetime.time.max)\
- .replace(tzinfo=tzlocal)
+ .replace(tzinfo=tzlocal)
else:
ical.vfreebusy.add('dtend').value = dtend.astimezone(tzutc)
@@ -218,8 +223,8 @@ class Calendar(ModelSQL, ModelView):
freebusy_dtend = freebusy_dtstart
else:
freebusy_dtend = event.dtend.replace(tzinfo=tzlocal)\
- - event.dtstart.replace(tzinfo=tzlocal) \
- + freebusy_dtstart
+ - event.dtstart.replace(tzinfo=tzlocal) \
+ + freebusy_dtstart
f_dtstart_tz = freebusy_dtstart.replace(tzinfo=tzlocal)
f_dtend_tz = freebusy_dtend.replace(tzinfo=tzlocal)
if not ((f_dtstart_tz <= dtstart
@@ -238,7 +243,7 @@ class Calendar(ModelSQL, ModelView):
occurence.dtstart.replace(tzinfo=tzlocal)
if occurence.dtend:
freebusy_dtend = occurence.dtend\
- .replace(tzinfo=tzlocal)
+ .replace(tzinfo=tzlocal)
else:
freebusy_dtend = freebusy_dtstart
all_day = occurence.all_day
@@ -320,11 +325,11 @@ class Calendar(ModelSQL, ModelView):
if calendars:
vfreebusy = cls.freebusy(calendars[0].id, dtstart, dtend)
vfreebusy.vfreebusy.add('dtstamp').value = \
- ical.vfreebusy.dtstamp.value
+ ical.vfreebusy.dtstamp.value
vfreebusy.vfreebusy.add('uid').value = \
- ical.vfreebusy.uid.value
+ ical.vfreebusy.uid.value
vfreebusy.vfreebusy.add('organizer').value = \
- ical.vfreebusy.organizer.value
+ ical.vfreebusy.organizer.value
vfreebusy.vfreebusy.add('attendee').value = attendee.value
status = doc.createElement('C:request-status')
@@ -368,7 +373,7 @@ class Category(ModelSQL, ModelView):
super(Category, cls).__setup__()
cls._sql_constraints = [
('name_uniq', 'UNIQUE(name)',
- 'The name of calendar category must be unique!'),
+ 'The name of calendar category must be unique.'),
]
cls._order.insert(0, ('name', 'ASC'))
@@ -383,7 +388,7 @@ class Location(ModelSQL, ModelView):
super(Location, cls).__setup__()
cls._sql_constraints = [
('name_uniq', 'UNIQUE(name)',
- 'The name of calendar location must be unique!'),
+ 'The name of calendar location must be unique.'),
]
cls._order.insert(0, ('name', 'ASC'))
@@ -479,13 +484,10 @@ class Event(ModelSQL, ModelView):
super(Event, cls).__setup__()
cls._sql_constraints = [
('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': 'Recurrence "%s" can not be recurrent.',
})
@classmethod
@@ -497,7 +499,6 @@ class Event(ModelSQL, ModelView):
models_data = ModelData.search([
('fs_id', '=', 'rule_group_read_calendar_line3'),
('module', '=', module_name),
- ('inherit', '=', None),
], limit=1)
if models_data:
model_data, = models_data
@@ -543,6 +544,12 @@ class Event(ModelSQL, ModelView):
def search_calendar_field(cls, name, clause):
return [('calendar.' + name[9:],) + tuple(clause[1:])]
+ @classmethod
+ def validate(cls, events):
+ super(Event, cls).validate(events)
+ for event in events:
+ event.check_recurrence()
+
def check_recurrence(self):
'''
Check the recurrence is not recurrent.
@@ -553,64 +560,64 @@ class Event(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')
- event = super(Event, cls).create(values)
- if (event.calendar.owner
- and (event.organizer == event.calendar.owner.email
- or (event.parent
- and event.parent.organizer == \
+ events = super(Event, cls).create(vlist)
+ for event in events:
+ if (event.calendar.owner
+ and (event.organizer == event.calendar.owner.email
+ or (event.parent
+ and event.parent.organizer ==
event.parent.calendar.owner.email))):
- if event.organizer == event.calendar.owner.email:
- attendee_emails = [x.email for x in event.attendees
- if x.status != 'declined'
- and x.email != event.organizer]
- else:
- attendee_emails = [x.email for x in event.parent.attendees
- if x.status != 'declined'
- and x.email != event.parent.organizer]
- if attendee_emails:
- with Transaction().set_user(0):
- calendars = Calendar.search([
- ('owner.email', 'in', attendee_emails),
- ])
- if not event.recurrence:
- for calendar in calendars:
- new_event, = cls.copy([event], default={
- 'calendar': calendar.id,
- 'occurences': None,
- 'uuid': event.uuid,
- })
- for occurence in event.occurences:
- cls.copy([occurence], default={
- 'calendar': calendar.id,
- 'parent': new_event.id,
- 'uuid': occurence.uuid,
- })
- else:
- parents = cls.search([
- ('uuid', '=', event.uuid),
- ('calendar.owner.email', 'in',
- attendee_emails),
- ('id', '!=', event.id),
- ('recurrence', '=', None),
+ if event.organizer == event.calendar.owner.email:
+ attendee_emails = [x.email for x in event.attendees
+ if x.status != 'declined'
+ and x.email != event.organizer]
+ else:
+ attendee_emails = [x.email for x in event.parent.attendees
+ if x.status != 'declined'
+ and x.email != event.parent.organizer]
+ if attendee_emails:
+ with Transaction().set_user(0):
+ calendars = Calendar.search([
+ ('owner.email', 'in', attendee_emails),
])
- for parent in parents:
- cls.copy([event], default={
- 'calendar': parent.calendar.id,
- 'parent': parent.id,
- 'uuid': event.uuid,
- })
+ if not event.recurrence:
+ for calendar in calendars:
+ new_event, = cls.copy([event], default={
+ 'calendar': calendar.id,
+ 'occurences': None,
+ 'uuid': event.uuid,
+ })
+ for occurence in event.occurences:
+ cls.copy([occurence], default={
+ 'calendar': calendar.id,
+ 'parent': new_event.id,
+ 'uuid': occurence.uuid,
+ })
+ else:
+ parents = cls.search([
+ ('uuid', '=', event.uuid),
+ ('calendar.owner.email', 'in',
+ attendee_emails),
+ ('id', '!=', event.id),
+ ('recurrence', '=', None),
+ ])
+ for parent in parents:
+ cls.copy([event], default={
+ 'calendar': parent.calendar.id,
+ 'parent': parent.id,
+ 'uuid': event.uuid,
+ })
# Restart the cache for event
Collection._event_cache.clear()
- return event
+ return events
def _event2update(self):
return {
@@ -622,14 +629,14 @@ class Event(ModelSQL, ModelView):
'location': self.location.id if self.location else None,
'status': self.status,
'organizer': self.organizer,
- 'rdates': [('delete_all',)] + [('create', rdate._date2update())
- for rdate in self.rdates],
- 'exdates': [('delete_all',)] + [('create', exdate._date2update())
- for exdate in self.exdates],
- 'rrules': [('delete_all',)] + [('create', rrule._date2update())
- for rrule in self.rrules],
- 'exrules': [('delete_all',)] + [('create', exrule._date2update())
- for exrule in self.exrules],
+ 'rdates': [('delete_all',)] + ('create', [rdate._date2update()
+ for rdate in self.rdates]),
+ 'exdates': [('delete_all',)] + ('create', [exdate._date2update()
+ for exdate in self.exdates]),
+ 'rrules': [('delete_all',)] + ('create', [rrule._date2update()
+ for rrule in self.rrules]),
+ 'exrules': [('delete_all',)] + ('create', [exrule._date2update()
+ for exrule in self.exrules]),
}
@classmethod
@@ -655,10 +662,11 @@ class Event(ModelSQL, ModelView):
if not values:
return
for event in events:
- if event.calendar.owner \
- and (event.organizer == event.calendar.owner.email \
- or (event.parent \
- and event.parent.organizer == event.calendar.owner.email)):
+ if (event.calendar.owner
+ and (event.organizer == event.calendar.owner.email
+ or (event.parent
+ and event.parent.organizer
+ == event.calendar.owner.email))):
if event.organizer == event.calendar.owner.email:
attendee_emails = [x.email for x in event.attendees
if x.status != 'declined'
@@ -737,10 +745,11 @@ class Event(ModelSQL, ModelView):
Collection = pool.get('webdav.collection')
for event in events:
- if event.calendar.owner \
- and (event.organizer == event.calendar.owner.email \
- or (event.parent \
- and event.parent.organizer == event.calendar.owner.email)):
+ if (event.calendar.owner
+ and (event.organizer == event.calendar.owner.email
+ or (event.parent
+ and event.parent.organizer
+ == event.calendar.owner.email))):
if event.organizer == event.calendar.owner.email:
attendee_emails = [x.email for x in event.attendees
if x.email != event.organizer]
@@ -787,6 +796,7 @@ class Event(ModelSQL, ModelView):
the event id for write or None for create
'''
pool = Pool()
+ Attendee = pool.get('calendar.event.attendee')
Category = pool.get('calendar.category')
Location = pool.get('calendar.location')
Alarm = pool.get('calendar.event.alarm')
@@ -853,7 +863,7 @@ class Event(ModelSQL, ModelView):
else:
if vevent.recurrence_id.value.tzinfo:
res['recurrence'] = \
- vevent.recurrence_id.value.astimezone(tzlocal)
+ vevent.recurrence_id.value.astimezone(tzlocal)
else:
res['recurrence'] = vevent.recurrence_id.value
else:
@@ -870,11 +880,14 @@ class Event(ModelSQL, ModelView):
category_names2ids = {}
for category in categories:
category_names2ids[category.name] = category.id
+ to_create = []
for category in vevent.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', map(int, categories))]
else:
res['categories'] = [('unlink_all',)]
@@ -892,9 +905,9 @@ class Event(ModelSQL, ModelView):
('name', '=', vevent.location.value),
], limit=1)
if not locations:
- location = Location.create({
- 'name': vevent.location.value,
- })
+ location, = Location.create([{
+ 'name': vevent.location.value,
+ }])
else:
location, = locations
res['location'] = location.id
@@ -922,6 +935,7 @@ class Event(ModelSQL, ModelView):
attendees_todel[attendee.email] = attendee.id
res['attendees'] = []
if hasattr(vevent, 'attendee'):
+ to_create = []
while vevent.attendee_list:
attendee = vevent.attendee_list.pop()
vals = Attendee.attendee2values(attendee)
@@ -930,52 +944,66 @@ class Event(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 event:
res['rdates'].append(('delete', [x.id for x in event.rdates]))
if hasattr(vevent, 'rdate'):
+ to_create = []
while vevent.rdate_list:
rdate = vevent.rdate_list.pop()
- for rdate in rdate.value:
- res['rdates'].append(('create', Rdate.date2values(rdate)))
+ to_create += [Rdate.date2values(d) for d in rdate.value]
+ if to_create:
+ res['rdates'].append(('create', to_create))
res['exdates'] = []
if event:
res['exdates'].append(('delete', [x.id for x in event.exdates]))
if hasattr(vevent, 'exdate'):
+ to_create = []
while vevent.exdate_list:
exdate = vevent.exdate_list.pop()
- for exdate in exdate.value:
- res['exdates'].append(('create',
- Exdate.date2values(exdate)))
+ to_create += [Exdate.date2values(d) for d in exdate.value]
+ if to_create:
+ res['exdates'].append(('create', to_create))
res['rrules'] = []
if event:
res['rrules'].append(('delete', [x.id for x in event.rrules]))
if hasattr(vevent, 'rrule'):
+ to_create = []
while vevent.rrule_list:
rrule = vevent.rrule_list.pop()
- res['rrules'].append(('create', Rrule.rule2values(rrule)))
+ to_create.append(Rrule.rule2values(rrule))
+ if to_create:
+ res['rrules'].append(('create', to_create))
res['exrules'] = []
if event:
res['exrules'].append(('delete', [x.id for x in event.exrules]))
if hasattr(vevent, 'exrule'):
+ to_create = []
while vevent.exrule_list:
exrule = vevent.exrule_list.pop()
- res['exrules'].append(('create', Exrule.rule2values(exrule)))
+ to_create.append(Exrule.rule2values(exrule))
+ if to_create:
+ res['exrules'].append(('create', to_create))
if event:
res.setdefault('alarms', [])
res['alarms'].append(('delete', [x.id for x in event.alarms]))
if hasattr(vevent, 'valarm'):
res.setdefault('alarms', [])
+ to_create = []
while vevent.valarm_list:
valarm = vevent.valarm_list.pop()
- res['alarms'].append(('create', Alarm.valarm2values(valarm)))
+ 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:
@@ -990,6 +1018,7 @@ class Event(ModelSQL, ModelView):
occurences_todel = []
if event:
occurences_todel = [x.id for x in event.occurences]
+ to_create = []
for vevent in vevents:
event_id = None
vals = cls.ical2values(event_id, ical, calendar_id, vevent=vevent)
@@ -1007,7 +1036,9 @@ class Event(ModelSQL, ModelView):
if event_id:
res['occurences'].append(('write', event_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'].insert(0, ('delete', occurences_todel))
@@ -1053,7 +1084,7 @@ class Event(ModelSQL, ModelView):
vevent.dtstart.value = self.dtstart.date()
else:
vevent.dtstart.value = self.dtstart.replace(tzinfo=tzlocal)\
- .astimezone(tzevent)
+ .astimezone(tzevent)
if self.dtend:
if not hasattr(vevent, 'dtend'):
vevent.add('dtend')
@@ -1061,7 +1092,7 @@ class Event(ModelSQL, ModelView):
vevent.dtend.value = self.dtend.date()
else:
vevent.dtend.value = self.dtend.replace(tzinfo=tzlocal)\
- .astimezone(tzevent)
+ .astimezone(tzevent)
elif hasattr(vevent, 'dtend'):
del vevent.dtend
if not hasattr(vevent, 'created'):
@@ -1081,7 +1112,7 @@ class Event(ModelSQL, ModelView):
vevent.recurrence_id.value = self.recurrence.date()
else:
vevent.recurrence_id.value = self.recurrence\
- .replace(tzinfo=tzlocal).astimezone(tzevent)
+ .replace(tzinfo=tzlocal).astimezone(tzevent)
elif hasattr(vevent, 'recurrence-id'):
del vevent.recurrence_id
if self.status:
@@ -1171,9 +1202,7 @@ class EventCategory(ModelSQL):
ondelete='CASCADE', required=True, select=True)
-class Alarm(ModelSQL):
- 'Alarm'
- __name__ = 'calendar.alarm'
+class AlarmMixin:
valarm = fields.Binary('valarm')
@classmethod
@@ -1193,22 +1222,39 @@ class Alarm(ModelSQL):
return vobject.readOne(str(self.valarm))
-class EventAlarm(ModelSQL):
+class EventAlarm(AlarmMixin, ModelSQL, ModelView):
'Alarm'
__name__ = 'calendar.event.alarm'
- _inherits = {'calendar.alarm': 'calendar_alarm'}
- calendar_alarm = fields.Many2One('calendar.alarm', 'Calendar Alarm',
- required=True, ondelete='CASCADE', select=True)
event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
required=True, select=True)
@classmethod
- def create(cls, values):
+ def __register__(cls, module_name):
+ cursor = Transaction().cursor
+
+ super(EventAlarm, cls).__register__(module_name)
+
+ table = TableHandler(cursor, cls, module_name)
+
+ # Migration from 2.6: Remove inherits calendar.alarm
+ if table.column_exist('calendar_alarm'):
+ cursor.execute('UPDATE "' + cls._table + '" AS e '
+ 'SET valarm = (SELECT a.valarm '
+ 'FROM calendar_alarm AS a '
+ 'WHERE a.id = e.calendar_alarm)')
+ table.drop_column('calendar_alarm', True)
+
+ @classmethod
+ def create(cls, vlist):
Event = Pool().get('calendar.event')
- if values.get('event'):
- # Update write_date of event
- Event.write(values['event'], {})
- return super(EventAlarm, cls).create(values)
+ to_write = []
+ for values in vlist:
+ if values.get('event'):
+ # Update write_date of event
+ to_write.append(values['event'])
+ if to_write:
+ Event.write(Event.browse(to_write), {})
+ return super(EventAlarm, cls).create(vlist)
@classmethod
def write(cls, event_alarms, values):
@@ -1225,28 +1271,14 @@ class EventAlarm(ModelSQL):
def delete(cls, event_alarms):
pool = Pool()
Event = pool.get('calendar.event')
- Alarm = pool.get('calendar.alarm')
- alarms = [a.calendar_alarm for a in event_alarms]
events = [x.event for x in event_alarms]
if events:
# Update write_date of event
Event.write(events, {})
super(EventAlarm, cls).delete(event_alarms)
- if alarms:
- Alarm.delete(alarms)
- @classmethod
- def valarm2values(cls, alarm):
- Alarm = Pool().get('calendar.alarm')
- return Alarm.valarm2values(alarm)
-
- def alarm2valarm(self):
- return self.calendar_alarm.alarm2valarm()
-
-class Attendee(ModelSQL, ModelView):
- 'Attendee'
- __name__ = 'calendar.attendee'
+class AttendeeMixin:
email = fields.Char('Email', required=True, states={
'readonly': Eval('id', 0) > 0,
}, depends=['id'])
@@ -1312,47 +1344,70 @@ class Attendee(ModelSQL, ModelView):
return res
-class EventAttendee(ModelSQL, ModelView):
+class EventAttendee(AttendeeMixin, ModelSQL, ModelView):
'Attendee'
__name__ = 'calendar.event.attendee'
- _inherits = {'calendar.attendee': 'calendar_attendee'}
- calendar_attendee = fields.Many2One('calendar.attendee',
- 'Calendar Attendee', required=True, ondelete='CASCADE', select=True)
event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
required=True, select=True)
@classmethod
- def create(cls, values):
+ def __register__(cls, module_name):
+ cursor = Transaction().cursor
+
+ super(EventAttendee, 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):
Event = Pool().get('calendar.event')
- if values.get('event'):
- # Update write_date of event
- Event.write([Event(values['event'])], {})
- event_attendee = super(EventAttendee, cls).create(values)
- event = event_attendee.event
- if (event.calendar.owner
- and (event.organizer == event.calendar.owner.email
- or (event.parent
- and event.parent.organizer == \
+ to_write = []
+ for values in vlist:
+ if values.get('event'):
+ # Update write_date of event
+ to_write.append(values['event'])
+
+ if to_write:
+ Event.write([Event.browse(to_write)], {})
+ event_attendees = super(EventAttendee, cls).create(vlist)
+ for event_attendee in event_attendees:
+ event = event_attendee.event
+ if (event.calendar.owner
+ and (event.organizer == event.calendar.owner.email
+ or (event.parent
+ and event.parent.organizer ==
event.parent.calendar.owner.email))):
- if event.organizer == event.calendar.owner.email:
- attendee_emails = [x.email for x in event.attendees
- if x.email != event.organizer]
- else:
- attendee_emails = [x.email for x in event.parent.attendees
- if x.email != event.parent.organizer]
- if attendee_emails:
- with Transaction().set_user(0):
- events = Event.search([
- ('uuid', '=', event.uuid),
- ('calendar.owner.email', 'in', attendee_emails),
- ('id', '!=', event.id),
- ('recurrence', '=', event.recurrence),
- ])
- for event in events:
- cls.copy([event_attendee], default={
- 'event': event.id,
- })
- return event_attendee
+ if event.organizer == event.calendar.owner.email:
+ attendee_emails = [x.email for x in event.attendees
+ if x.email != event.organizer]
+ else:
+ attendee_emails = [x.email for x in event.parent.attendees
+ if x.email != event.parent.organizer]
+ if attendee_emails:
+ with Transaction().set_user(0):
+ events = Event.search([
+ ('uuid', '=', event.uuid),
+ ('calendar.owner.email', 'in',
+ attendee_emails),
+ ('id', '!=', event.id),
+ ('recurrence', '=', event.recurrence),
+ ])
+ for event in events:
+ cls.copy([event_attendee], default={
+ 'event': event.id,
+ })
+ return event_attendees
@classmethod
def write(cls, event_attendees, values):
@@ -1371,10 +1426,11 @@ class EventAttendee(ModelSQL, ModelView):
super(EventAttendee, cls).write(event_attendees, values)
for event_attendee in event_attendees:
event = event_attendee.event
- if event.calendar.owner \
- and (event.organizer == event.calendar.owner.email \
- or (event.parent \
- and event.parent.organizer == event.calendar.owner.email)):
+ if (event.calendar.owner
+ and (event.organizer == event.calendar.owner.email
+ or (event.parent
+ and event.parent.organizer
+ == event.calendar.owner.email))):
if event.organizer == event.calendar.owner.email:
attendee_emails = [x.email for x in event.attendees
if x.email != event.organizer]
@@ -1399,9 +1455,7 @@ class EventAttendee(ModelSQL, ModelView):
def delete(cls, event_attendees):
pool = Pool()
Event = pool.get('calendar.event')
- Attendee = pool.get('calendar.attendee')
- calendar_attendees = [a.calendar_attendee for a in event_attendees]
events = [x.event for x in event_attendees]
if events:
# Update write_date of event
@@ -1409,10 +1463,11 @@ class EventAttendee(ModelSQL, ModelView):
for attendee in event_attendees:
event = attendee.event
- if event.calendar.owner \
- and (event.organizer == event.calendar.owner.email \
- or (event.parent \
- and event.parent.organizer == event.calendar.owner.email)):
+ if (event.calendar.owner
+ and (event.organizer == event.calendar.owner.email
+ or (event.parent
+ and event.parent.organizer
+ == event.calendar.owner.email))):
if event.organizer == event.calendar.owner.email:
attendee_emails = [x.email for x in event.attendees
if x.email != event.organizer]
@@ -1431,10 +1486,10 @@ class EventAttendee(ModelSQL, ModelView):
('email', '=', attendee.email),
])
cls.delete(attendees)
- elif event.calendar.owner \
- and ((event.organizer \
- or (event.parent and event.parent.organizer)) \
- and attendee.email == event.calendar.owner.email):
+ elif (event.calendar.owner
+ and ((event.organizer
+ or (event.parent and event.parent.organizer))
+ and attendee.email == event.calendar.owner.email)):
if event.organizer:
organizer = event.organizer
else:
@@ -1452,54 +1507,14 @@ class EventAttendee(ModelSQL, ModelView):
'status': 'declined',
})
super(EventAttendee, cls).delete(event_attendees)
- if calendar_attendees:
- Attendee.delete(calendar_attendees)
-
- @classmethod
- def copy(cls, event_attendees, default=None):
- Attendee = Pool().get('calendar.attendee')
-
- if default is None:
- default = {}
- default = default.copy()
- new_event_attendees = []
- for event_attendee in event_attendees:
- default['calendar_attendee'], = Attendee.copy(
- [event_attendee.calendar_attendee])
- new_event_attendees.extend(super(EventAttendee, cls).copy(
- [event_attendee], default=default))
- return new_event_attendees
-
- def _attendee2update(self):
- return self.calendar_attendee._attendee2update()
- @staticmethod
- def attendee2values(attendee):
- Attendee = Pool().get('calendar.attendee')
- return Attendee.attendee2values(attendee)
-
- def attendee2attendee(self):
- return self.calendar_attendee.attendee2attendee()
-
-class Date(ModelSQL, ModelView):
- 'Calendar Date'
- __name__ = 'calendar.date'
+class DateMixin:
_rec_name = 'datetime'
- date = fields.Boolean('Is Date', help='Ignore time of field "Date", ' \
- 'but handle as date only.')
+ date = fields.Boolean('Is Date',
+ help='Ignore time of field "Date", but handle as date only.')
datetime = fields.DateTime('Date', required=True)
- @classmethod
- def __register__(cls, module_name):
- cursor = Transaction().cursor
- # Migration from 1.4: calendar.rdate renamed to calendar.date
- old_table = 'calendar_rdate'
- if TableHandler.table_exist(cursor, old_table):
- TableHandler.table_rename(cursor, old_table, cls._table)
-
- super(Date, cls).__register__(module_name)
-
def _date2update(self):
return {
'date': self.date,
@@ -1535,13 +1550,10 @@ class Date(ModelSQL, ModelView):
return self.datetime.replace(tzinfo=tzlocal).astimezone(tzutc)
-class EventRDate(ModelSQL, ModelView):
+class EventRDate(DateMixin, ModelSQL, ModelView):
'Recurrence Date'
__name__ = 'calendar.event.rdate'
- _inherits = {'calendar.date': 'calendar_date'}
_rec_name = 'datetime'
- calendar_date = fields.Many2One('calendar.date', 'Calendar Date',
- required=True, ondelete='CASCADE', select=True)
event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
select=True, required=True)
@@ -1556,13 +1568,30 @@ class EventRDate(ModelSQL, ModelView):
super(EventRDate, 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):
Event = Pool().get('calendar.event')
- if values.get('event'):
- # Update write_date of event
- Event.write([Event(values['event'])], {})
- return super(EventRDate, cls).create(values)
+ to_write = []
+ for values in vlist:
+ if values.get('event'):
+ # Update write_date of event
+ to_write.append(values['event'])
+ if to_write:
+ Event.write(Event.browse(to_write), {})
+ return super(EventRDate, cls).create(vlist)
@classmethod
def write(cls, event_rdates, values):
@@ -1579,38 +1608,21 @@ class EventRDate(ModelSQL, ModelView):
def delete(cls, event_rdates):
pool = Pool()
Event = pool.get('calendar.event')
- Date = pool.get('calendar.date')
- dates = [a.calendar_date for a in event_rdates]
events = [x.event for x in event_rdates]
if events:
# Update write_date of event
Event.write(events, {})
super(EventRDate, cls).delete(event_rdates)
- if dates:
- Date.delete(dates)
-
- def _date2update(self):
- return self.calendar_date._date2update()
-
- @classmethod
- def date2values(cls, date):
- Date = Pool().get('calendar.date')
- return Date.date2values(date)
-
- def date2date(self):
- return self.calendar_date.date2date()
class EventExDate(EventRDate):
'Exception Date'
__name__ = 'calendar.event.exdate'
+ _table = 'calendar_event_exdate' # Needed to override EventRDate._table
-class RRule(ModelSQL, ModelView):
- 'Recurrence Rule'
- __name__ = 'calendar.rrule'
+class RRuleMixin(Model):
_rec_name = 'freq'
-
freq = fields.Selection([
('secondly', 'Secondly'),
('minutely', 'Minutely'),
@@ -1620,8 +1632,8 @@ class RRule(ModelSQL, ModelView):
('monthly', 'Monthly'),
('yearly', 'Yearly'),
], 'Frequency', required=True)
- until_date = fields.Boolean('Is Date', help='Ignore time of field ' \
- '"Until Date", but handle as date only.')
+ until_date = fields.Boolean('Is Date',
+ help='Ignore time of field "Until Date", but handle as date only.')
until = fields.DateTime('Until Date')
count = fields.Integer('Count')
interval = fields.Integer('Interval')
@@ -1646,42 +1658,43 @@ class RRule(ModelSQL, ModelView):
@classmethod
def __setup__(cls):
- super(RRule, cls).__setup__()
+ super(RRuleMixin, cls).__setup__()
cls._sql_constraints += [
('until_count_only_one',
'CHECK(until IS NULL OR count IS NULL OR count = 0)',
- 'Only one of "until" and "count" can be set!'),
- ]
- cls._constraints += [
- ('check_bysecond', 'invalid_bysecond'),
- ('check_byminute', 'invalid_byminute'),
- ('check_byhour', 'invalid_byhour'),
- ('check_byday', 'invalid_byday'),
- ('check_bymonthday', 'invalid_bymonthday'),
- ('check_byyearday', 'invalid_byyearday'),
- ('check_byweekno', 'invalid_byweekno'),
- ('check_bymonth', 'invalid_bymonth'),
- ('check_bysetpos', 'invalid_bysetpos'),
+ 'Only one of "until" and "count" can be set.'),
]
cls._error_messages.update({
- 'invalid_bysecond': 'Invalid "By Second"',
- 'invalid_byminute': 'Invalid "By Minute"',
- 'invalid_byhour': 'Invalid "By Hour"',
- 'invalid_byday': 'Invalid "By Day"',
- 'invalid_bymonthday': 'Invalid "By Month Day"',
- 'invalid_byyearday': 'Invalid "By Year Day"',
- 'invalid_byweekno': 'Invalid "By Week Number"',
- 'invalid_bymonth': 'Invalid "By Month"',
- 'invalid_bysetpos': 'Invalid "By Position"',
+ 'invalid_bysecond': ('Invalid "By Second" in recurrence rule '
+ '"%s"'),
+ 'invalid_byminute': ('Invalid "By Minute" in recurrence rule '
+ '"%s"'),
+ 'invalid_byhour': 'Invalid "By Hour" in recurrence rule "%s"',
+ 'invalid_byday': 'Invalid "By Day" in recurrence rule "%s"',
+ 'invalid_bymonthday': ('Invalid "By Month Day" in recurrence '
+ 'rule "%s"'),
+ 'invalid_byyearday': ('Invalid "By Year Day" in recurrence '
+ 'rule "%s"'),
+ 'invalid_byweekno': ('Invalid "By Week Number" in recurrence '
+ 'rule "%s"'),
+ 'invalid_bymonth': 'Invalid "By Month" in recurrence rule "%s"',
+ 'invalid_bysetpos': ('Invalid "By Position" in recurrence rule '
+ '"%s"'),
})
@classmethod
- def __register__(cls, module_name):
- cursor = Transaction().cursor
- # Migrate from 1.4: unit_count replaced by until_count_only_one
- table = TableHandler(cursor, cls, module_name)
- table.drop_constraint('until_count')
- return super(RRule, cls).__register__(module_name)
+ def validate(cls, rules):
+ super(RRuleMixin, cls).validate(rules)
+ for rule in rules:
+ rule.check_bysecond()
+ rule.check_byminute()
+ rule.check_byhour()
+ rule.check_byday()
+ rule.check_bymonthday()
+ rule.check_byyearday()
+ rule.check_byweekno()
+ rule.check_bymonth()
+ rule.check_bysetpos()
def check_bysecond(self):
if self.bysecond:
@@ -1689,10 +1702,9 @@ class RRule(ModelSQL, ModelView):
try:
second = int(second)
except Exception:
- return False
+ second = -1
if not (second >= 0 and second <= 59):
- return False
- return True
+ self.raise_user_error('invalid_bysecond', (self.rec_name,))
def check_byminute(self):
if self.byminute:
@@ -1700,10 +1712,9 @@ class RRule(ModelSQL, ModelView):
try:
minute = int(minute)
except Exception:
- return False
+ minute = -1
if not (minute >= 0 and minute <= 59):
- return False
- return True
+ self.raise_user_error('invalid_byminute', (self.rec_name,))
def check_byhour(self):
if self.byhour:
@@ -1711,27 +1722,25 @@ class RRule(ModelSQL, ModelView):
try:
hour = int(hour)
except Exception:
- return False
+ hour = -1
if not (hour >= 0 and hour <= 23):
- return False
- return True
+ self.raise_user_error('invalid_byhour', (self.rec_name,))
def check_byday(self):
if self.byday:
for weekdaynum in self.byday.split(','):
weekday = weekdaynum[-2:]
if weekday not in ('SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'):
- return False
+ self.raise_user_error('invalid_byday', (self.rec_name,))
ordwk = weekday[:-2]
if not ordwk:
continue
try:
ordwk = int(ordwk)
except Exception:
- return False
+ ordwk = -1
if not (abs(ordwk) >= 1 and abs(ordwk) <= 53):
- return False
- return True
+ self.raise_user_error('invalid_byday', (self.rec_name,))
def check_bymonthday(self):
if self.bymonthday:
@@ -1739,10 +1748,10 @@ class RRule(ModelSQL, ModelView):
try:
monthdaynum = int(monthdaynum)
except Exception:
- return False
+ monthdaynum = -100
if not (abs(monthdaynum) >= 1 and abs(monthdaynum) <= 31):
- return False
- return True
+ self.raise_user_error('invalid_bymonthday', (
+ self.rec_name,))
def check_byyearday(self):
if self.byyearday:
@@ -1750,10 +1759,9 @@ class RRule(ModelSQL, ModelView):
try:
yeardaynum = int(yeardaynum)
except Exception:
- return False
+ yeardaynum = -1000
if not (abs(yeardaynum) >= 1 and abs(yeardaynum) <= 366):
- return False
- return True
+ self.raise_user_error('invalid_byyearday', (self.rec_name,))
def check_byweekno(self):
if self.byweekno:
@@ -1761,10 +1769,9 @@ class RRule(ModelSQL, ModelView):
try:
weeknum = int(weeknum)
except Exception:
- return False
+ weeknum = -100
if not (abs(weeknum) >= 1 and abs(weeknum) <= 53):
- return False
- return True
+ self.raise_user_error('invalid_byweekno', (self.rec_name,))
def check_bymonth(self):
if self.bymonth:
@@ -1772,10 +1779,9 @@ class RRule(ModelSQL, ModelView):
try:
monthnum = int(monthnum)
except Exception:
- return False
+ monthnum = -1
if not (monthnum >= 1 and monthnum <= 12):
- return False
- return True
+ self.raise_user_error('invalid_bymonth', (self.rec_name,))
def check_bysetpos(self):
if self.bysetpos:
@@ -1783,10 +1789,9 @@ class RRule(ModelSQL, ModelView):
try:
setposday = int(setposday)
except Exception:
- return False
+ setposday = -1000
if not (abs(setposday) >= 1 and abs(setposday) <= 366):
- return False
- return True
+ self.raise_user_error('invalid_bysetpos', (self.rec_name,))
def _rule2update(self):
res = {}
@@ -1836,9 +1841,9 @@ class RRule(ModelSQL, ModelView):
if self.until_date:
res += vobject.icalendar.dateToString(self.until.date())
else:
- res += vobject.icalendar.dateTimeToString(self.until\
- .replace(tzinfo=tzlocal).astimezone(tzutc),
- convertToUTC=True)
+ res += vobject.icalendar.dateTimeToString(self.until
+ .replace(tzinfo=tzlocal).astimezone(tzutc),
+ convertToUTC=True)
elif self.count:
res += ';COUNT=' + str(self.count)
for field in ('freq', 'wkst'):
@@ -1852,24 +1857,42 @@ class RRule(ModelSQL, ModelView):
return res
-class EventRRule(ModelSQL, ModelView):
+class EventRRule(RRuleMixin, ModelSQL, ModelView):
'Recurrence Rule'
__name__ = 'calendar.event.rrule'
- _inherits = {'calendar.rrule': 'calendar_rrule'}
- _rec_name = 'freq'
-
- calendar_rrule = fields.Many2One('calendar.rrule', 'Calendar RRule',
- required=True, ondelete='CASCADE', select=True)
event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
select=True, required=True)
@classmethod
- def create(cls, values):
+ def __register__(cls, module_name):
+ cursor = Transaction().cursor
+
+ super(EventRRule, 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):
Event = Pool().get('calendar.event')
- if values.get('event'):
- # Update write_date of event
- Event.write([Event(values['event'])], {})
- return super(EventRRule, cls).create(values)
+ to_write = []
+ for values in vlist:
+ if values.get('event'):
+ # Update write_date of event
+ to_write.append(values['event'])
+ if to_write:
+ Event.write(Event.browse(to_write), {})
+ return super(EventRRule, cls).create(vlist)
@classmethod
def write(cls, event_rrules, values):
@@ -1886,26 +1909,11 @@ class EventRRule(ModelSQL, ModelView):
def delete(cls, event_rrules):
pool = Pool()
Event = pool.get('calendar.event')
- Rrule = pool.get('calendar.rrule')
- rrules = [a.calendar_rrule for a in event_rrules]
events = [x.event for x in event_rrules]
if events:
# Update write_date of event
Event.write(events, {})
super(EventRRule, cls).delete(event_rrules)
- if rrules:
- Rrule.delete(rrules)
-
- def _rule2update(self):
- return self.calendar_rrule._rule2update()
-
- @classmethod
- def rule2values(self, rule):
- Rule = Pool().get('calendar.rrule')
- return Rule.rule2values(rule)
-
- def rule2rule(self):
- return self.calendar_rrule.rule2rule()
class EventExRule(EventRRule):
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
index 537b2ff..f74ad13 100644
--- a/locale/bg_BG.po
+++ b/locale/bg_BG.po
@@ -3,132 +3,112 @@ msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:calendar.calendar:"
-msgid "A user can have only one calendar!"
-msgstr "Потребителя може да има само един календар!"
+msgid "A user can have only one calendar."
+msgstr ""
msgctxt "error:calendar.calendar:"
-msgid "The name of calendar must be unique!"
-msgstr "Името на календара трябва да е уникално!"
-
-msgctxt "error:calendar.category:"
-msgid "The name of calendar category must be unique!"
-msgstr "Името на категорията на календара трябва да е уникално!"
-
-msgctxt "error:calendar.event:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Повторението не може да е периодично!"
-
-msgctxt "error:calendar.event:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "UUID и взаимна вложеност трябва да са уникални в календар!"
-
-msgctxt "error:calendar.location:"
-msgid "The name of calendar location must be unique!"
-msgstr "Името на местонахождението на календара трябва да е уникално!"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Day\""
-msgstr "Невалиден \"По ден\""
+msgid "Calendar name \"%s\" can not end with .ics"
+msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Hour\""
-msgstr "Навалиден \"По час\""
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique."
+msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Minute\""
-msgstr "Невалиден \"По минута\""
+msgctxt "error:calendar.category:"
+msgid "The name of calendar category must be unique."
+msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month Day\""
-msgstr "Невалиден \"По ден от месец\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month\""
-msgstr "Невалидно \"По месец\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Position\""
-msgstr "Невалиден \"По позиция\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Second\""
-msgstr "Невалиден \"По секунда\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Week Number\""
-msgstr "Невалиден \"По номер на седмица\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Year Day\""
-msgstr "Невалиден \"По ден от годината\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Only one of \"until\" and \"count\" can be set!"
-msgstr "\"Крайна дата\" и \"брой\" не може да се попълва по едно и също време!"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
-msgctxt "field:calendar.alarm,create_date:"
-msgid "Create Date"
-msgstr "Създадено на"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
-msgctxt "field:calendar.alarm,create_uid:"
-msgid "Create User"
-msgstr "Създадено от"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
-msgctxt "field:calendar.alarm,id:"
-msgid "ID"
-msgstr "ID"
+msgctxt "error:calendar.event.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr ""
-msgctxt "field:calendar.alarm,rec_name:"
-msgid "Name"
-msgstr "Име"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr ""
-msgctxt "field:calendar.alarm,valarm:"
-msgid "valarm"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "field:calendar.alarm,write_date:"
-msgid "Write Date"
-msgstr "Променено на"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr ""
-msgctxt "field:calendar.alarm,write_uid:"
-msgid "Write User"
-msgstr "Променено от"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
-msgctxt "field:calendar.attendee,attendee:"
-msgid "attendee"
-msgstr "присътващ"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr ""
-msgctxt "field:calendar.attendee,create_date:"
-msgid "Create Date"
-msgstr "Създадено на"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr ""
-msgctxt "field:calendar.attendee,create_uid:"
-msgid "Create User"
-msgstr "Създадено от"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
-msgctxt "field:calendar.attendee,email:"
-msgid "Email"
-msgstr "Email"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
-msgctxt "field:calendar.attendee,id:"
-msgid "ID"
-msgstr "ID"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
-msgctxt "field:calendar.attendee,rec_name:"
-msgid "Name"
-msgstr "Име"
+msgctxt "error:calendar.event.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr ""
-msgctxt "field:calendar.attendee,status:"
-msgid "Participation Status"
-msgstr "Статус на участие"
+msgctxt "error:calendar.event:"
+msgid "Recurrence \"%s\" can not be recurrent."
+msgstr ""
-msgctxt "field:calendar.attendee,write_date:"
-msgid "Write Date"
-msgstr "Променено на"
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr ""
-msgctxt "field:calendar.attendee,write_uid:"
-msgid "Write User"
-msgstr "Променено от"
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique."
+msgstr ""
msgctxt "field:calendar.calendar,create_date:"
msgid "Create Date"
@@ -266,38 +246,6 @@ msgctxt "field:calendar.category,write_uid:"
msgid "Write User"
msgstr "Променено от"
-msgctxt "field:calendar.date,create_date:"
-msgid "Create Date"
-msgstr "Създадено на"
-
-msgctxt "field:calendar.date,create_uid:"
-msgid "Create User"
-msgstr "Създадено от"
-
-msgctxt "field:calendar.date,date:"
-msgid "Is Date"
-msgstr "Е дата"
-
-msgctxt "field:calendar.date,datetime:"
-msgid "Date"
-msgstr "Дата"
-
-msgctxt "field:calendar.date,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.date,rec_name:"
-msgid "Name"
-msgstr "Име"
-
-msgctxt "field:calendar.date,write_date:"
-msgid "Write Date"
-msgstr "Променено на"
-
-msgctxt "field:calendar.date,write_uid:"
-msgid "Write User"
-msgstr "Променено от"
-
msgctxt "field:calendar.event,alarms:"
msgid "Alarms"
msgstr "Аларми"
@@ -466,10 +414,6 @@ msgctxt "field:calendar.event-calendar.category,write_uid:"
msgid "Write User"
msgstr "Променено от"
-msgctxt "field:calendar.event.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Аларма на календар"
-
msgctxt "field:calendar.event.alarm,create_date:"
msgid "Create Date"
msgstr "Създадено на"
@@ -490,6 +434,10 @@ msgctxt "field:calendar.event.alarm,rec_name:"
msgid "Name"
msgstr "Име"
+msgctxt "field:calendar.event.alarm,valarm:"
+msgid "valarm"
+msgstr ""
+
msgctxt "field:calendar.event.alarm,write_date:"
msgid "Write Date"
msgstr "Променено на"
@@ -498,9 +446,9 @@ msgctxt "field:calendar.event.alarm,write_uid:"
msgid "Write User"
msgstr "Променено от"
-msgctxt "field:calendar.event.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Присъстващ на календар"
+msgctxt "field:calendar.event.attendee,attendee:"
+msgid "attendee"
+msgstr ""
msgctxt "field:calendar.event.attendee,create_date:"
msgid "Create Date"
@@ -510,6 +458,11 @@ msgctxt "field:calendar.event.attendee,create_uid:"
msgid "Create User"
msgstr "Създадено от"
+#, fuzzy
+msgctxt "field:calendar.event.attendee,email:"
+msgid "Email"
+msgstr "Email"
+
msgctxt "field:calendar.event.attendee,event:"
msgid "Event"
msgstr "Събитие"
@@ -522,6 +475,10 @@ msgctxt "field:calendar.event.attendee,rec_name:"
msgid "Name"
msgstr "Име"
+msgctxt "field:calendar.event.attendee,status:"
+msgid "Participation Status"
+msgstr ""
+
msgctxt "field:calendar.event.attendee,write_date:"
msgid "Write Date"
msgstr "Променено на"
@@ -530,10 +487,6 @@ msgctxt "field:calendar.event.attendee,write_uid:"
msgid "Write User"
msgstr "Променено от"
-msgctxt "field:calendar.event.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Дата от календар"
-
msgctxt "field:calendar.event.exdate,create_date:"
msgid "Create Date"
msgstr "Създадено на"
@@ -542,6 +495,15 @@ msgctxt "field:calendar.event.exdate,create_uid:"
msgid "Create User"
msgstr "Създадено от"
+msgctxt "field:calendar.event.exdate,date:"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.exdate,datetime:"
+msgid "Date"
+msgstr "Дата"
+
msgctxt "field:calendar.event.exdate,event:"
msgid "Event"
msgstr "Събитие"
@@ -562,8 +524,44 @@ msgctxt "field:calendar.event.exdate,write_uid:"
msgid "Write User"
msgstr "Променено от"
-msgctxt "field:calendar.event.exrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.event.exrule,byday:"
+msgid "By Day"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,byhour:"
+msgid "By Hour"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,byminute:"
+msgid "By Minute"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,bysecond:"
+msgid "By Second"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,count:"
+msgid "Count"
msgstr ""
msgctxt "field:calendar.event.exrule,create_date:"
@@ -578,14 +576,35 @@ msgctxt "field:calendar.event.exrule,event:"
msgid "Event"
msgstr "Събитие"
+msgctxt "field:calendar.event.exrule,freq:"
+msgid "Frequency"
+msgstr ""
+
msgctxt "field:calendar.event.exrule,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:calendar.event.exrule,interval:"
+msgid "Interval"
+msgstr ""
+
msgctxt "field:calendar.event.exrule,rec_name:"
msgid "Name"
msgstr "Име"
+msgctxt "field:calendar.event.exrule,until:"
+msgid "Until Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,until_date:"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.exrule,wkst:"
+msgid "Week Day"
+msgstr "Ден от седмица"
+
msgctxt "field:calendar.event.exrule,write_date:"
msgid "Write Date"
msgstr "Променено на"
@@ -594,10 +613,6 @@ msgctxt "field:calendar.event.exrule,write_uid:"
msgid "Write User"
msgstr "Променено от"
-msgctxt "field:calendar.event.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Дата от календар"
-
msgctxt "field:calendar.event.rdate,create_date:"
msgid "Create Date"
msgstr "Създадено на"
@@ -606,6 +621,15 @@ msgctxt "field:calendar.event.rdate,create_uid:"
msgid "Create User"
msgstr "Създадено от"
+msgctxt "field:calendar.event.rdate,date:"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.rdate,datetime:"
+msgid "Date"
+msgstr "Дата"
+
msgctxt "field:calendar.event.rdate,event:"
msgid "Event"
msgstr "Събитие"
@@ -626,8 +650,44 @@ msgctxt "field:calendar.event.rdate,write_uid:"
msgid "Write User"
msgstr "Променено от"
-msgctxt "field:calendar.event.rrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.event.rrule,byday:"
+msgid "By Day"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,byhour:"
+msgid "By Hour"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,byminute:"
+msgid "By Minute"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,bysecond:"
+msgid "By Second"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,count:"
+msgid "Count"
msgstr ""
msgctxt "field:calendar.event.rrule,create_date:"
@@ -642,14 +702,35 @@ msgctxt "field:calendar.event.rrule,event:"
msgid "Event"
msgstr "Събитие"
+msgctxt "field:calendar.event.rrule,freq:"
+msgid "Frequency"
+msgstr ""
+
msgctxt "field:calendar.event.rrule,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:calendar.event.rrule,interval:"
+msgid "Interval"
+msgstr ""
+
msgctxt "field:calendar.event.rrule,rec_name:"
msgid "Name"
msgstr "Име"
+msgctxt "field:calendar.event.rrule,until:"
+msgid "Until Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,until_date:"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.rrule,wkst:"
+msgid "Week Day"
+msgstr "Ден от седмица"
+
msgctxt "field:calendar.event.rrule,write_date:"
msgid "Write Date"
msgstr "Променено на"
@@ -686,90 +767,6 @@ msgctxt "field:calendar.location,write_uid:"
msgid "Write User"
msgstr "Променено от"
-msgctxt "field:calendar.rrule,byday:"
-msgid "By Day"
-msgstr "По ден"
-
-msgctxt "field:calendar.rrule,byhour:"
-msgid "By Hour"
-msgstr "По час"
-
-msgctxt "field:calendar.rrule,byminute:"
-msgid "By Minute"
-msgstr "По минута"
-
-msgctxt "field:calendar.rrule,bymonth:"
-msgid "By Month"
-msgstr "По месец"
-
-msgctxt "field:calendar.rrule,bymonthday:"
-msgid "By Month Day"
-msgstr "По ден от месеца"
-
-msgctxt "field:calendar.rrule,bysecond:"
-msgid "By Second"
-msgstr "По секунда"
-
-msgctxt "field:calendar.rrule,bysetpos:"
-msgid "By Position"
-msgstr "По позиция"
-
-msgctxt "field:calendar.rrule,byweekno:"
-msgid "By Week Number"
-msgstr "По номер на седмицата"
-
-msgctxt "field:calendar.rrule,byyearday:"
-msgid "By Year Day"
-msgstr "По ден от годината"
-
-msgctxt "field:calendar.rrule,count:"
-msgid "Count"
-msgstr "Брой"
-
-msgctxt "field:calendar.rrule,create_date:"
-msgid "Create Date"
-msgstr "Създадено на"
-
-msgctxt "field:calendar.rrule,create_uid:"
-msgid "Create User"
-msgstr "Създадено от"
-
-msgctxt "field:calendar.rrule,freq:"
-msgid "Frequency"
-msgstr "Честота"
-
-msgctxt "field:calendar.rrule,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.rrule,interval:"
-msgid "Interval"
-msgstr "Интервал"
-
-msgctxt "field:calendar.rrule,rec_name:"
-msgid "Name"
-msgstr "Име"
-
-msgctxt "field:calendar.rrule,until:"
-msgid "Until Date"
-msgstr "До дата"
-
-msgctxt "field:calendar.rrule,until_date:"
-msgid "Is Date"
-msgstr "Е дата"
-
-msgctxt "field:calendar.rrule,wkst:"
-msgid "Week Day"
-msgstr "Ден от седмица"
-
-msgctxt "field:calendar.rrule,write_date:"
-msgid "Write Date"
-msgstr "Променено на"
-
-msgctxt "field:calendar.rrule,write_uid:"
-msgid "Write User"
-msgstr "Променено от"
-
msgctxt "field:res.user,calendars:"
msgid "Calendars"
msgstr "Календари"
@@ -778,25 +775,25 @@ msgctxt "help:calendar.calendar,owner:"
msgid "The user must have an email"
msgstr "Потребителя трябва да има email"
-msgctxt "help:calendar.date,date:"
-msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr "От полето \"Дата\" се игнорира часа и се използва само датата."
-
msgctxt "help:calendar.event,uuid:"
msgid "Universally Unique Identifier"
msgstr "Универсален иникален идентификатор"
-msgctxt "help:calendar.rrule,until_date:"
+msgctxt "help:calendar.event.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.event.exrule,until_date:"
msgid "Ignore time of field \"Until Date\", but handle as date only."
-msgstr "От полето \"До дата\" се игнорира часа и се използва само датата."
+msgstr ""
-msgctxt "model:calendar.alarm,name:"
-msgid "Alarm"
-msgstr "Аларма"
+msgctxt "help:calendar.event.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
-msgctxt "model:calendar.attendee,name:"
-msgid "Attendee"
-msgstr "Присъстващ"
+msgctxt "help:calendar.event.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
msgctxt "model:calendar.calendar,name:"
msgid "Calendar"
@@ -814,10 +811,6 @@ msgctxt "model:calendar.category,name:"
msgid "Category"
msgstr "Категория"
-msgctxt "model:calendar.date,name:"
-msgid "Calendar Date"
-msgstr "Дата от календар"
-
msgctxt "model:calendar.event,name:"
msgid "Event"
msgstr "Събитие"
@@ -854,10 +847,6 @@ msgctxt "model:calendar.location,name:"
msgid "Location"
msgstr "Местоположение"
-msgctxt "model:calendar.rrule,name:"
-msgid "Recurrence Rule"
-msgstr "Правило за повторение"
-
msgctxt "model:ir.action,name:act_calendar_form"
msgid "Calendars"
msgstr "Календари"
@@ -886,30 +875,6 @@ msgctxt "model:res.group,name:group_calendar_admin"
msgid "Calendar Administration"
msgstr "Управление на календар"
-msgctxt "selection:calendar.attendee,status:"
-msgid ""
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Accepted"
-msgstr "Приет"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Declined"
-msgstr "Отхвърлен"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Delegated"
-msgstr "Делегиран"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Needs Action"
-msgstr "Необходимо е действие"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Tentative"
-msgstr "Пробен"
-
msgctxt "selection:calendar.event,classification:"
msgid "Confidential"
msgstr "Поверителен"
@@ -946,62 +911,162 @@ msgctxt "selection:calendar.event,transp:"
msgid "Transparent"
msgstr "Прозрачен"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Accepted"
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Declined"
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Delegated"
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Needs Action"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Tentative"
+msgstr "Пробен"
+
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Daily"
-msgstr "Ежедневно"
+msgstr ""
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Hourly"
-msgstr "Ежечасно"
+msgstr ""
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Minutely"
-msgstr "Ежеминутно"
+msgstr ""
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Monthly"
-msgstr "Месечно"
+msgstr ""
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Secondly"
-msgstr "Всяка секунда"
+msgstr ""
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Weekly"
-msgstr "Седмично"
+msgstr ""
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Yearly"
-msgstr "Годишно"
+msgstr ""
-msgctxt "selection:calendar.rrule,wkst:"
+#, fuzzy
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Friday"
msgstr "Петък"
-msgctxt "selection:calendar.rrule,wkst:"
+#, fuzzy
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Monday"
msgstr "Понеделник"
-msgctxt "selection:calendar.rrule,wkst:"
+#, fuzzy
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Saturday"
msgstr "Събота"
-msgctxt "selection:calendar.rrule,wkst:"
+#, fuzzy
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Sunday"
msgstr "Неделя"
-msgctxt "selection:calendar.rrule,wkst:"
+#, fuzzy
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Thursday"
msgstr "Четвъртък"
-msgctxt "selection:calendar.rrule,wkst:"
+#, fuzzy
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Tuesday"
msgstr "Вторник"
-msgctxt "selection:calendar.rrule,wkst:"
+#, fuzzy
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Wednesday"
msgstr "Сряда"
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Yearly"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Friday"
+msgstr "Петък"
+
+#, fuzzy
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Monday"
+msgstr "Понеделник"
+
+#, fuzzy
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Saturday"
+msgstr "Събота"
+
+#, fuzzy
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Sunday"
+msgstr "Неделя"
+
+#, fuzzy
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Thursday"
+msgstr "Четвъртък"
+
+#, fuzzy
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Вторник"
+
+#, fuzzy
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Сряда"
+
+#, fuzzy
+msgctxt "view:calendar.calendar:"
+msgid "Access Permissions"
+msgstr "Фактура"
+
msgctxt "view:calendar.calendar:"
msgid "Calendar"
msgstr "Календар"
@@ -1014,10 +1079,6 @@ msgctxt "view:calendar.calendar:"
msgid "General"
msgstr "Основен"
-msgctxt "view:calendar.calendar:"
-msgid "Security"
-msgstr "Сигурност"
-
msgctxt "view:calendar.category:"
msgid "Categories"
msgstr "Категории"
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index 5dd0706..07679c6 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -3,132 +3,120 @@ msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:calendar.calendar:"
-msgid "A user can have only one calendar!"
-msgstr "Un usuari només pot tenir un calendari"
+msgid "A user can have only one calendar."
+msgstr "Un usuari només pot tenir un calendari."
msgctxt "error:calendar.calendar:"
-msgid "The name of calendar must be unique!"
-msgstr "El nom del calendari ha de ser únic"
+msgid "Calendar name \"%s\" can not end with .ics"
+msgstr "El nom del calendari \"%s\" no ha de finalitzar amb la extensió .ics"
+
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique."
+msgstr "El nom del calendari ha de ser únic."
msgctxt "error:calendar.category:"
-msgid "The name of calendar category must be unique!"
-msgstr "El nom de la categoria del calendari ha de ser únic"
+msgid "The name of calendar category must be unique."
+msgstr "El nom de la categoria del calendari ha de ser únic."
+
+msgctxt "error:calendar.event.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.event.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.event.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.event.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.event.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.event.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.event.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.event.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.event.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.event.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Defineix un \"fins\" i un \"comptador\"."
+
+msgctxt "error:calendar.event.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.event.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.event.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.event.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.event.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.event.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.event.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.event.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.event.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.event.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Defineix un \"fins\" i un \"comptador\"."
msgctxt "error:calendar.event:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Una recurrència no pot ser recurrent"
+msgid "Recurrence \"%s\" can not be recurrent."
+msgstr "La recurrència \"%s\" no pot ser recurrent."
msgctxt "error:calendar.event:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "L'UUID i la recurrència 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 "error:calendar.location:"
-msgid "The name of calendar location must be unique!"
-msgstr "El nom de la ubicació del calendari ha de ser únic"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Day\""
-msgstr "Invàlid «per dia»"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Hour\""
-msgstr "Invàlid «per dia»"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Minute\""
-msgstr "Invàlid «per minut»"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month Day\""
-msgstr "Invàlid «per dia del mes»"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month\""
-msgstr "Invàlid «per mes»"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Position\""
-msgstr "Invàlid «per posició»"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Second\""
-msgstr "Invàlid «per segons»"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Week Number\""
-msgstr "Invàlid «per nombre de setmana»"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Year Day\""
-msgstr "Invàlid «per dia de l'any»"
-
-msgctxt "error:calendar.rrule:"
-msgid "Only one of \"until\" and \"count\" can be set!"
-msgstr "Només es pot usar o «Fins a» o «Nombre de vegades»"
-
-msgctxt "field:calendar.alarm,create_date:"
-msgid "Create Date"
-msgstr "Data creació"
-
-msgctxt "field:calendar.alarm,create_uid:"
-msgid "Create User"
-msgstr "Usuari creació"
-
-msgctxt "field:calendar.alarm,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.alarm,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:calendar.alarm,valarm:"
-msgid "valarm"
-msgstr "valarm"
-
-msgctxt "field:calendar.alarm,write_date:"
-msgid "Write Date"
-msgstr "Data modificació"
-
-msgctxt "field:calendar.alarm,write_uid:"
-msgid "Write User"
-msgstr "Usuari modificació"
-
-msgctxt "field:calendar.attendee,attendee:"
-msgid "attendee"
-msgstr "assistent"
-
-msgctxt "field:calendar.attendee,create_date:"
-msgid "Create Date"
-msgstr "Data creació"
-
-msgctxt "field:calendar.attendee,create_uid:"
-msgid "Create User"
-msgstr "Usuari creació"
-
-msgctxt "field:calendar.attendee,email:"
-msgid "Email"
-msgstr "Correu electrònic"
-
-msgctxt "field:calendar.attendee,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.attendee,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:calendar.attendee,status:"
-msgid "Participation Status"
-msgstr "Estat de participació"
-
-msgctxt "field:calendar.attendee,write_date:"
-msgid "Write Date"
-msgstr "Data modificació"
-
-msgctxt "field:calendar.attendee,write_uid:"
-msgid "Write User"
-msgstr "Usuari modificació"
+msgid "The name of calendar location must be unique."
+msgstr "El nom de la ubicació del calendari ha de ser únic."
msgctxt "field:calendar.calendar,create_date:"
msgid "Create Date"
@@ -266,38 +254,6 @@ msgctxt "field:calendar.category,write_uid:"
msgid "Write User"
msgstr "Usuari modificació"
-msgctxt "field:calendar.date,create_date:"
-msgid "Create Date"
-msgstr "Data creació"
-
-msgctxt "field:calendar.date,create_uid:"
-msgid "Create User"
-msgstr "Usuari creació"
-
-msgctxt "field:calendar.date,date:"
-msgid "Is Date"
-msgstr "És data"
-
-msgctxt "field:calendar.date,datetime:"
-msgid "Date"
-msgstr "Data"
-
-msgctxt "field:calendar.date,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.date,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:calendar.date,write_date:"
-msgid "Write Date"
-msgstr "Data modificació"
-
-msgctxt "field:calendar.date,write_uid:"
-msgid "Write User"
-msgstr "Usuari modificació"
-
msgctxt "field:calendar.event,alarms:"
msgid "Alarms"
msgstr "Alarmes"
@@ -466,10 +422,6 @@ msgctxt "field:calendar.event-calendar.category,write_uid:"
msgid "Write User"
msgstr "Usuari modificació"
-msgctxt "field:calendar.event.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Alarma del calendari"
-
msgctxt "field:calendar.event.alarm,create_date:"
msgid "Create Date"
msgstr "Data creació"
@@ -490,6 +442,10 @@ msgctxt "field:calendar.event.alarm,rec_name:"
msgid "Name"
msgstr "Nom"
+msgctxt "field:calendar.event.alarm,valarm:"
+msgid "valarm"
+msgstr "valarm"
+
msgctxt "field:calendar.event.alarm,write_date:"
msgid "Write Date"
msgstr "Data modificació"
@@ -498,9 +454,9 @@ msgctxt "field:calendar.event.alarm,write_uid:"
msgid "Write User"
msgstr "Usuari modificació"
-msgctxt "field:calendar.event.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Calendari d'assistents"
+msgctxt "field:calendar.event.attendee,attendee:"
+msgid "attendee"
+msgstr "assistent"
msgctxt "field:calendar.event.attendee,create_date:"
msgid "Create Date"
@@ -510,6 +466,10 @@ msgctxt "field:calendar.event.attendee,create_uid:"
msgid "Create User"
msgstr "Usuari creació"
+msgctxt "field:calendar.event.attendee,email:"
+msgid "Email"
+msgstr "Email"
+
msgctxt "field:calendar.event.attendee,event:"
msgid "Event"
msgstr "Esdeveniment"
@@ -522,6 +482,10 @@ msgctxt "field:calendar.event.attendee,rec_name:"
msgid "Name"
msgstr "Nom"
+msgctxt "field:calendar.event.attendee,status:"
+msgid "Participation Status"
+msgstr "Estat de participacions"
+
msgctxt "field:calendar.event.attendee,write_date:"
msgid "Write Date"
msgstr "Data modificació"
@@ -530,10 +494,6 @@ msgctxt "field:calendar.event.attendee,write_uid:"
msgid "Write User"
msgstr "Usuari modificació"
-msgctxt "field:calendar.event.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Data calendari"
-
msgctxt "field:calendar.event.exdate,create_date:"
msgid "Create Date"
msgstr "Data creació"
@@ -542,6 +502,14 @@ msgctxt "field:calendar.event.exdate,create_uid:"
msgid "Create User"
msgstr "Usuari creació"
+msgctxt "field:calendar.event.exdate,date:"
+msgid "Is Date"
+msgstr "Es una data"
+
+msgctxt "field:calendar.event.exdate,datetime:"
+msgid "Date"
+msgstr "Data"
+
msgctxt "field:calendar.event.exdate,event:"
msgid "Event"
msgstr "Esdeveniment"
@@ -562,9 +530,45 @@ msgctxt "field:calendar.event.exdate,write_uid:"
msgid "Write User"
msgstr "Usuari modificació"
-msgctxt "field:calendar.event.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrència"
+msgctxt "field:calendar.event.exrule,byday:"
+msgid "By Day"
+msgstr "Per dia"
+
+msgctxt "field:calendar.event.exrule,byhour:"
+msgid "By Hour"
+msgstr "Per hora"
+
+msgctxt "field:calendar.event.exrule,byminute:"
+msgid "By Minute"
+msgstr "Per minut"
+
+msgctxt "field:calendar.event.exrule,bymonth:"
+msgid "By Month"
+msgstr "Per mes"
+
+msgctxt "field:calendar.event.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Per dia del mes"
+
+msgctxt "field:calendar.event.exrule,bysecond:"
+msgid "By Second"
+msgstr "Per segon"
+
+msgctxt "field:calendar.event.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Per ubicació"
+
+msgctxt "field:calendar.event.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Per número de la setmana"
+
+msgctxt "field:calendar.event.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Per dia de l'any"
+
+msgctxt "field:calendar.event.exrule,count:"
+msgid "Count"
+msgstr "Contador"
msgctxt "field:calendar.event.exrule,create_date:"
msgid "Create Date"
@@ -578,14 +582,34 @@ msgctxt "field:calendar.event.exrule,event:"
msgid "Event"
msgstr "Esdeveniment"
+msgctxt "field:calendar.event.exrule,freq:"
+msgid "Frequency"
+msgstr "Freqüència"
+
msgctxt "field:calendar.event.exrule,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:calendar.event.exrule,interval:"
+msgid "Interval"
+msgstr "Intèrval"
+
msgctxt "field:calendar.event.exrule,rec_name:"
msgid "Name"
msgstr "Nom"
+msgctxt "field:calendar.event.exrule,until:"
+msgid "Until Date"
+msgstr "Fins a la data"
+
+msgctxt "field:calendar.event.exrule,until_date:"
+msgid "Is Date"
+msgstr "Es una data"
+
+msgctxt "field:calendar.event.exrule,wkst:"
+msgid "Week Day"
+msgstr "Dia de la setmana"
+
msgctxt "field:calendar.event.exrule,write_date:"
msgid "Write Date"
msgstr "Data modificació"
@@ -594,10 +618,6 @@ msgctxt "field:calendar.event.exrule,write_uid:"
msgid "Write User"
msgstr "Usuari modificació"
-msgctxt "field:calendar.event.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Data calendari"
-
msgctxt "field:calendar.event.rdate,create_date:"
msgid "Create Date"
msgstr "Data creació"
@@ -606,6 +626,14 @@ msgctxt "field:calendar.event.rdate,create_uid:"
msgid "Create User"
msgstr "Usuari creació"
+msgctxt "field:calendar.event.rdate,date:"
+msgid "Is Date"
+msgstr "Es una data"
+
+msgctxt "field:calendar.event.rdate,datetime:"
+msgid "Date"
+msgstr "Data"
+
msgctxt "field:calendar.event.rdate,event:"
msgid "Event"
msgstr "Esdeveniment"
@@ -626,147 +654,119 @@ msgctxt "field:calendar.event.rdate,write_uid:"
msgid "Write User"
msgstr "Usuari modificació"
-msgctxt "field:calendar.event.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrència"
-
-msgctxt "field:calendar.event.rrule,create_date:"
-msgid "Create Date"
-msgstr "Data creació"
-
-msgctxt "field:calendar.event.rrule,create_uid:"
-msgid "Create User"
-msgstr "Usuari creació"
-
-msgctxt "field:calendar.event.rrule,event:"
-msgid "Event"
-msgstr "Esdeveniment"
-
-msgctxt "field:calendar.event.rrule,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.event.rrule,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:calendar.event.rrule,write_date:"
-msgid "Write Date"
-msgstr "Data modificació"
-
-msgctxt "field:calendar.event.rrule,write_uid:"
-msgid "Write User"
-msgstr "Usuari modificació"
-
-msgctxt "field:calendar.location,create_date:"
-msgid "Create Date"
-msgstr "Data creació"
-
-msgctxt "field:calendar.location,create_uid:"
-msgid "Create User"
-msgstr "Usuari creació"
-
-msgctxt "field:calendar.location,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.location,name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:calendar.location,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:calendar.location,write_date:"
-msgid "Write Date"
-msgstr "Data modificació"
-
-msgctxt "field:calendar.location,write_uid:"
-msgid "Write User"
-msgstr "Usuari modificació"
-
-msgctxt "field:calendar.rrule,byday:"
+msgctxt "field:calendar.event.rrule,byday:"
msgid "By Day"
msgstr "Per dia"
-msgctxt "field:calendar.rrule,byhour:"
+msgctxt "field:calendar.event.rrule,byhour:"
msgid "By Hour"
msgstr "Per hora"
-msgctxt "field:calendar.rrule,byminute:"
+msgctxt "field:calendar.event.rrule,byminute:"
msgid "By Minute"
msgstr "Per minut"
-msgctxt "field:calendar.rrule,bymonth:"
+msgctxt "field:calendar.event.rrule,bymonth:"
msgid "By Month"
msgstr "Per mes"
-msgctxt "field:calendar.rrule,bymonthday:"
+msgctxt "field:calendar.event.rrule,bymonthday:"
msgid "By Month Day"
msgstr "Per dia del mes"
-msgctxt "field:calendar.rrule,bysecond:"
+msgctxt "field:calendar.event.rrule,bysecond:"
msgid "By Second"
msgstr "Per segon"
-msgctxt "field:calendar.rrule,bysetpos:"
+msgctxt "field:calendar.event.rrule,bysetpos:"
msgid "By Position"
-msgstr "Per posició"
+msgstr "Per ubicació"
-msgctxt "field:calendar.rrule,byweekno:"
+msgctxt "field:calendar.event.rrule,byweekno:"
msgid "By Week Number"
-msgstr "Per dia de la setmana"
+msgstr "Per número de la setmana"
-msgctxt "field:calendar.rrule,byyearday:"
+msgctxt "field:calendar.event.rrule,byyearday:"
msgid "By Year Day"
msgstr "Per dia de l'any"
-msgctxt "field:calendar.rrule,count:"
+msgctxt "field:calendar.event.rrule,count:"
msgid "Count"
-msgstr "Nombre de vegades"
+msgstr "Contador"
-msgctxt "field:calendar.rrule,create_date:"
+msgctxt "field:calendar.event.rrule,create_date:"
msgid "Create Date"
msgstr "Data creació"
-msgctxt "field:calendar.rrule,create_uid:"
+msgctxt "field:calendar.event.rrule,create_uid:"
msgid "Create User"
msgstr "Usuari creació"
-msgctxt "field:calendar.rrule,freq:"
+msgctxt "field:calendar.event.rrule,event:"
+msgid "Event"
+msgstr "Esdeveniment"
+
+msgctxt "field:calendar.event.rrule,freq:"
msgid "Frequency"
msgstr "Freqüència"
-msgctxt "field:calendar.rrule,id:"
+msgctxt "field:calendar.event.rrule,id:"
msgid "ID"
msgstr "ID"
-msgctxt "field:calendar.rrule,interval:"
+msgctxt "field:calendar.event.rrule,interval:"
msgid "Interval"
-msgstr "Interval"
+msgstr "Intèrval"
-msgctxt "field:calendar.rrule,rec_name:"
+msgctxt "field:calendar.event.rrule,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.rrule,until:"
+msgctxt "field:calendar.event.rrule,until:"
msgid "Until Date"
msgstr "Fins a la data"
-msgctxt "field:calendar.rrule,until_date:"
+msgctxt "field:calendar.event.rrule,until_date:"
msgid "Is Date"
-msgstr "És data"
+msgstr "Es una data"
-msgctxt "field:calendar.rrule,wkst:"
+msgctxt "field:calendar.event.rrule,wkst:"
msgid "Week Day"
msgstr "Dia de la setmana"
-msgctxt "field:calendar.rrule,write_date:"
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr "Data modificació"
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr "Usuari modificació"
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr "Data creació"
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Usuari creació"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.location,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.location,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.location,write_date:"
msgid "Write Date"
msgstr "Data modificació"
-msgctxt "field:calendar.rrule,write_uid:"
+msgctxt "field:calendar.location,write_uid:"
msgid "Write User"
msgstr "Usuari modificació"
@@ -778,25 +778,27 @@ msgctxt "help:calendar.calendar,owner:"
msgid "The user must have an email"
msgstr "L'usuari ha de tenir un correu electrònic"
-msgctxt "help:calendar.date,date:"
-msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr "Ignora l'hora del camp \"Data\" i tracta només la data."
-
msgctxt "help:calendar.event,uuid:"
msgid "Universally Unique Identifier"
msgstr "Identificador universal únic"
-msgctxt "help:calendar.rrule,until_date:"
+msgctxt "help:calendar.event.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.event.exrule,until_date:"
msgid "Ignore time of field \"Until Date\", but handle as date only."
-msgstr "Ignora l'hora del camp «Fins a la data» i tracta'l com a data."
+msgstr ""
+"Ingnora la hora del camp \"Fins a la data\", però utilitza com a única data."
-msgctxt "model:calendar.alarm,name:"
-msgid "Alarm"
-msgstr "Alarma"
+msgctxt "help:calendar.event.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 "model:calendar.attendee,name:"
-msgid "Attendee"
-msgstr "Assistent"
+msgctxt "help:calendar.event.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.calendar,name:"
msgid "Calendar"
@@ -814,10 +816,6 @@ msgctxt "model:calendar.category,name:"
msgid "Category"
msgstr "Categoria"
-msgctxt "model:calendar.date,name:"
-msgid "Calendar Date"
-msgstr "Data calendari"
-
msgctxt "model:calendar.event,name:"
msgid "Event"
msgstr "Esdeveniment"
@@ -854,10 +852,6 @@ msgctxt "model:calendar.location,name:"
msgid "Location"
msgstr "Ubicació"
-msgctxt "model:calendar.rrule,name:"
-msgid "Recurrence Rule"
-msgstr "Regla de recurrència"
-
msgctxt "model:ir.action,name:act_calendar_form"
msgid "Calendars"
msgstr "Calendaris"
@@ -886,31 +880,6 @@ msgctxt "model:res.group,name:group_calendar_admin"
msgid "Calendar Administration"
msgstr "Administració de calendari"
-#, fuzzy
-msgctxt "selection:calendar.attendee,status:"
-msgid ""
-msgstr "Recreat"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Accepted"
-msgstr "Acceptada"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Declined"
-msgstr "Refusat"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Delegated"
-msgstr "Delegada"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Needs Action"
-msgstr "Necessita una acció"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Tentative"
-msgstr "Temptativa"
-
msgctxt "selection:calendar.event,classification:"
msgid "Confidential"
msgstr "Confidencial"
@@ -923,10 +892,9 @@ msgctxt "selection:calendar.event,classification:"
msgid "Public"
msgstr "Públic"
-#, fuzzy
msgctxt "selection:calendar.event,status:"
msgid ""
-msgstr "Recreat"
+msgstr " "
msgctxt "selection:calendar.event,status:"
msgid "Cancelled"
@@ -948,63 +916,147 @@ msgctxt "selection:calendar.event,transp:"
msgid "Transparent"
msgstr "Transparent"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.attendee,status:"
+msgid ""
+msgstr " "
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Accepted"
+msgstr "Acceptat"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Declined"
+msgstr "Refusar"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Delegated"
+msgstr "Delegar"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Needs Action"
+msgstr "Necessitat Acció"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Tentative"
+msgstr "Temptatiu"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Daily"
+msgstr "Diariament"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Minutely"
+msgstr "Cada minut"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Monthly"
+msgstr "Mensualment"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Secondly"
+msgstr "Cada segon"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Weekly"
+msgstr "Setmanalment"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Yearly"
+msgstr "Anualment"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Friday"
+msgstr "Divendres"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Monday"
+msgstr "Dilluns"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Saturday"
+msgstr "Dissabte"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Sunday"
+msgstr "Diumenge"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Thursday"
+msgstr "Dijous"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Dimarts"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Dimecres"
+
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Daily"
-msgstr "Diàriament"
+msgstr "Diariament"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Hourly"
msgstr "Cada hora"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Minutely"
msgstr "Cada minut"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Monthly"
msgstr "Mensualment"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Secondly"
msgstr "Cada segon"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Weekly"
msgstr "Setmanalment"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Yearly"
msgstr "Anualment"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Friday"
msgstr "Divendres"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Monday"
msgstr "Dilluns"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Saturday"
msgstr "Dissabte"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Sunday"
msgstr "Diumenge"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Thursday"
msgstr "Dijous"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Tuesday"
msgstr "Dimarts"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Wednesday"
msgstr "Dimecres"
msgctxt "view:calendar.calendar:"
+msgid "Access Permissions"
+msgstr "Permisos d'accés"
+
+msgctxt "view:calendar.calendar:"
msgid "Calendar"
msgstr "Calendari"
@@ -1016,10 +1068,6 @@ msgctxt "view:calendar.calendar:"
msgid "General"
msgstr "General"
-msgctxt "view:calendar.calendar:"
-msgid "Security"
-msgstr "Seguretat"
-
msgctxt "view:calendar.category:"
msgid "Categories"
msgstr "Categories"
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
index 4d23715..2a615b2 100644
--- a/locale/cs_CZ.po
+++ b/locale/cs_CZ.po
@@ -3,131 +3,111 @@ msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:calendar.calendar:"
-msgid "A user can have only one calendar!"
+msgid "A user can have only one calendar."
msgstr ""
msgctxt "error:calendar.calendar:"
-msgid "The name of calendar must be unique!"
+msgid "Calendar name \"%s\" can not end with .ics"
msgstr ""
-msgctxt "error:calendar.category:"
-msgid "The name of calendar category must be unique!"
-msgstr ""
-
-msgctxt "error:calendar.event:"
-msgid "Recurrence can not be recurrent!"
-msgstr ""
-
-msgctxt "error:calendar.event:"
-msgid "UUID and recurrence must be unique in a calendar!"
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique."
msgstr ""
-msgctxt "error:calendar.location:"
-msgid "The name of calendar location must be unique!"
+msgctxt "error:calendar.category:"
+msgid "The name of calendar category must be unique."
msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Day\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Hour\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Minute\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month Day\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Position\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Second\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Week Number\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Year Day\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Only one of \"until\" and \"count\" can be set!"
+msgctxt "error:calendar.event.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
msgstr ""
-msgctxt "field:calendar.alarm,create_date:"
-msgid "Create Date"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "field:calendar.alarm,create_uid:"
-msgid "Create User"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "field:calendar.alarm,id:"
-msgid "ID"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "field:calendar.alarm,rec_name:"
-msgid "Name"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "field:calendar.alarm,valarm:"
-msgid "valarm"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "field:calendar.alarm,write_date:"
-msgid "Write Date"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "field:calendar.alarm,write_uid:"
-msgid "Write User"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "field:calendar.attendee,attendee:"
-msgid "attendee"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "field:calendar.attendee,create_date:"
-msgid "Create Date"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "field:calendar.attendee,create_uid:"
-msgid "Create User"
+msgctxt "error:calendar.event.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
msgstr ""
-msgctxt "field:calendar.attendee,email:"
-msgid "Email"
-msgstr ""
-
-msgctxt "field:calendar.attendee,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:calendar.attendee,rec_name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:calendar.attendee,status:"
-msgid "Participation Status"
+msgctxt "error:calendar.event:"
+msgid "Recurrence \"%s\" can not be recurrent."
msgstr ""
-msgctxt "field:calendar.attendee,write_date:"
-msgid "Write Date"
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar."
msgstr ""
-msgctxt "field:calendar.attendee,write_uid:"
-msgid "Write User"
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique."
msgstr ""
msgctxt "field:calendar.calendar,create_date:"
@@ -266,38 +246,6 @@ msgctxt "field:calendar.category,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.date,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:calendar.date,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:calendar.date,date:"
-msgid "Is Date"
-msgstr ""
-
-msgctxt "field:calendar.date,datetime:"
-msgid "Date"
-msgstr ""
-
-msgctxt "field:calendar.date,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:calendar.date,rec_name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:calendar.date,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:calendar.date,write_uid:"
-msgid "Write User"
-msgstr ""
-
msgctxt "field:calendar.event,alarms:"
msgid "Alarms"
msgstr ""
@@ -466,10 +414,6 @@ msgctxt "field:calendar.event-calendar.category,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.event.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr ""
-
msgctxt "field:calendar.event.alarm,create_date:"
msgid "Create Date"
msgstr ""
@@ -490,6 +434,10 @@ msgctxt "field:calendar.event.alarm,rec_name:"
msgid "Name"
msgstr ""
+msgctxt "field:calendar.event.alarm,valarm:"
+msgid "valarm"
+msgstr ""
+
msgctxt "field:calendar.event.alarm,write_date:"
msgid "Write Date"
msgstr ""
@@ -498,8 +446,8 @@ msgctxt "field:calendar.event.alarm,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.event.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
+msgctxt "field:calendar.event.attendee,attendee:"
+msgid "attendee"
msgstr ""
msgctxt "field:calendar.event.attendee,create_date:"
@@ -510,6 +458,10 @@ msgctxt "field:calendar.event.attendee,create_uid:"
msgid "Create User"
msgstr ""
+msgctxt "field:calendar.event.attendee,email:"
+msgid "Email"
+msgstr ""
+
msgctxt "field:calendar.event.attendee,event:"
msgid "Event"
msgstr ""
@@ -522,6 +474,10 @@ msgctxt "field:calendar.event.attendee,rec_name:"
msgid "Name"
msgstr ""
+msgctxt "field:calendar.event.attendee,status:"
+msgid "Participation Status"
+msgstr ""
+
msgctxt "field:calendar.event.attendee,write_date:"
msgid "Write Date"
msgstr ""
@@ -530,10 +486,6 @@ msgctxt "field:calendar.event.attendee,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.event.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr ""
-
msgctxt "field:calendar.event.exdate,create_date:"
msgid "Create Date"
msgstr ""
@@ -542,6 +494,14 @@ msgctxt "field:calendar.event.exdate,create_uid:"
msgid "Create User"
msgstr ""
+msgctxt "field:calendar.event.exdate,date:"
+msgid "Is Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,datetime:"
+msgid "Date"
+msgstr ""
+
msgctxt "field:calendar.event.exdate,event:"
msgid "Event"
msgstr ""
@@ -562,211 +522,243 @@ msgctxt "field:calendar.event.exdate,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.event.exrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.event.exrule,byday:"
+msgid "By Day"
msgstr ""
-msgctxt "field:calendar.event.exrule,create_date:"
-msgid "Create Date"
+msgctxt "field:calendar.event.exrule,byhour:"
+msgid "By Hour"
msgstr ""
-msgctxt "field:calendar.event.exrule,create_uid:"
-msgid "Create User"
+msgctxt "field:calendar.event.exrule,byminute:"
+msgid "By Minute"
msgstr ""
-msgctxt "field:calendar.event.exrule,event:"
-msgid "Event"
+msgctxt "field:calendar.event.exrule,bymonth:"
+msgid "By Month"
msgstr ""
-msgctxt "field:calendar.event.exrule,id:"
-msgid "ID"
+msgctxt "field:calendar.event.exrule,bymonthday:"
+msgid "By Month Day"
msgstr ""
-msgctxt "field:calendar.event.exrule,rec_name:"
-msgid "Name"
+msgctxt "field:calendar.event.exrule,bysecond:"
+msgid "By Second"
msgstr ""
-msgctxt "field:calendar.event.exrule,write_date:"
-msgid "Write Date"
+msgctxt "field:calendar.event.exrule,bysetpos:"
+msgid "By Position"
msgstr ""
-msgctxt "field:calendar.event.exrule,write_uid:"
-msgid "Write User"
+msgctxt "field:calendar.event.exrule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,byyearday:"
+msgid "By Year Day"
msgstr ""
-msgctxt "field:calendar.event.rdate,calendar_date:"
-msgid "Calendar Date"
+msgctxt "field:calendar.event.exrule,count:"
+msgid "Count"
msgstr ""
-msgctxt "field:calendar.event.rdate,create_date:"
+msgctxt "field:calendar.event.exrule,create_date:"
msgid "Create Date"
msgstr ""
-msgctxt "field:calendar.event.rdate,create_uid:"
+msgctxt "field:calendar.event.exrule,create_uid:"
msgid "Create User"
msgstr ""
-msgctxt "field:calendar.event.rdate,event:"
+msgctxt "field:calendar.event.exrule,event:"
msgid "Event"
msgstr ""
-msgctxt "field:calendar.event.rdate,id:"
-msgid "ID"
+msgctxt "field:calendar.event.exrule,freq:"
+msgid "Frequency"
msgstr ""
-msgctxt "field:calendar.event.rdate,rec_name:"
-msgid "Name"
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
msgstr ""
-msgctxt "field:calendar.event.rdate,write_date:"
-msgid "Write Date"
+msgctxt "field:calendar.event.exrule,interval:"
+msgid "Interval"
msgstr ""
-msgctxt "field:calendar.event.rdate,write_uid:"
-msgid "Write User"
+msgctxt "field:calendar.event.exrule,rec_name:"
+msgid "Name"
msgstr ""
-msgctxt "field:calendar.event.rrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.event.exrule,until:"
+msgid "Until Date"
msgstr ""
-msgctxt "field:calendar.event.rrule,create_date:"
-msgid "Create Date"
+msgctxt "field:calendar.event.exrule,until_date:"
+msgid "Is Date"
msgstr ""
-msgctxt "field:calendar.event.rrule,create_uid:"
-msgid "Create User"
+msgctxt "field:calendar.event.exrule,wkst:"
+msgid "Week Day"
msgstr ""
-msgctxt "field:calendar.event.rrule,event:"
-msgid "Event"
+msgctxt "field:calendar.event.exrule,write_date:"
+msgid "Write Date"
msgstr ""
-msgctxt "field:calendar.event.rrule,id:"
-msgid "ID"
+msgctxt "field:calendar.event.exrule,write_uid:"
+msgid "Write User"
msgstr ""
-msgctxt "field:calendar.event.rrule,rec_name:"
-msgid "Name"
+msgctxt "field:calendar.event.rdate,create_date:"
+msgid "Create Date"
msgstr ""
-msgctxt "field:calendar.event.rrule,write_date:"
-msgid "Write Date"
+msgctxt "field:calendar.event.rdate,create_uid:"
+msgid "Create User"
msgstr ""
-msgctxt "field:calendar.event.rrule,write_uid:"
-msgid "Write User"
+msgctxt "field:calendar.event.rdate,date:"
+msgid "Is Date"
msgstr ""
-msgctxt "field:calendar.location,create_date:"
-msgid "Create Date"
+msgctxt "field:calendar.event.rdate,datetime:"
+msgid "Date"
msgstr ""
-msgctxt "field:calendar.location,create_uid:"
-msgid "Create User"
+msgctxt "field:calendar.event.rdate,event:"
+msgid "Event"
msgstr ""
-msgctxt "field:calendar.location,id:"
+msgctxt "field:calendar.event.rdate,id:"
msgid "ID"
msgstr ""
-msgctxt "field:calendar.location,name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:calendar.location,rec_name:"
+msgctxt "field:calendar.event.rdate,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.location,write_date:"
+msgctxt "field:calendar.event.rdate,write_date:"
msgid "Write Date"
msgstr ""
-msgctxt "field:calendar.location,write_uid:"
+msgctxt "field:calendar.event.rdate,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.rrule,byday:"
+msgctxt "field:calendar.event.rrule,byday:"
msgid "By Day"
msgstr ""
-msgctxt "field:calendar.rrule,byhour:"
+msgctxt "field:calendar.event.rrule,byhour:"
msgid "By Hour"
msgstr ""
-msgctxt "field:calendar.rrule,byminute:"
+msgctxt "field:calendar.event.rrule,byminute:"
msgid "By Minute"
msgstr ""
-msgctxt "field:calendar.rrule,bymonth:"
+msgctxt "field:calendar.event.rrule,bymonth:"
msgid "By Month"
msgstr ""
-msgctxt "field:calendar.rrule,bymonthday:"
+msgctxt "field:calendar.event.rrule,bymonthday:"
msgid "By Month Day"
msgstr ""
-msgctxt "field:calendar.rrule,bysecond:"
+msgctxt "field:calendar.event.rrule,bysecond:"
msgid "By Second"
msgstr ""
-msgctxt "field:calendar.rrule,bysetpos:"
+msgctxt "field:calendar.event.rrule,bysetpos:"
msgid "By Position"
msgstr ""
-msgctxt "field:calendar.rrule,byweekno:"
+msgctxt "field:calendar.event.rrule,byweekno:"
msgid "By Week Number"
msgstr ""
-msgctxt "field:calendar.rrule,byyearday:"
+msgctxt "field:calendar.event.rrule,byyearday:"
msgid "By Year Day"
msgstr ""
-msgctxt "field:calendar.rrule,count:"
+msgctxt "field:calendar.event.rrule,count:"
msgid "Count"
msgstr ""
-msgctxt "field:calendar.rrule,create_date:"
+msgctxt "field:calendar.event.rrule,create_date:"
msgid "Create Date"
msgstr ""
-msgctxt "field:calendar.rrule,create_uid:"
+msgctxt "field:calendar.event.rrule,create_uid:"
msgid "Create User"
msgstr ""
-msgctxt "field:calendar.rrule,freq:"
+msgctxt "field:calendar.event.rrule,event:"
+msgid "Event"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,freq:"
msgid "Frequency"
msgstr ""
-msgctxt "field:calendar.rrule,id:"
+msgctxt "field:calendar.event.rrule,id:"
msgid "ID"
msgstr ""
-msgctxt "field:calendar.rrule,interval:"
+msgctxt "field:calendar.event.rrule,interval:"
msgid "Interval"
msgstr ""
-msgctxt "field:calendar.rrule,rec_name:"
+msgctxt "field:calendar.event.rrule,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.rrule,until:"
+msgctxt "field:calendar.event.rrule,until:"
msgid "Until Date"
msgstr ""
-msgctxt "field:calendar.rrule,until_date:"
+msgctxt "field:calendar.event.rrule,until_date:"
msgid "Is Date"
msgstr ""
-msgctxt "field:calendar.rrule,wkst:"
+msgctxt "field:calendar.event.rrule,wkst:"
msgid "Week Day"
msgstr ""
-msgctxt "field:calendar.rrule,write_date:"
+msgctxt "field:calendar.event.rrule,write_date:"
msgid "Write Date"
msgstr ""
-msgctxt "field:calendar.rrule,write_uid:"
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.location,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.location,rec_name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.location,write_uid:"
msgid "Write User"
msgstr ""
@@ -778,24 +770,24 @@ msgctxt "help:calendar.calendar,owner:"
msgid "The user must have an email"
msgstr ""
-msgctxt "help:calendar.date,date:"
-msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr ""
-
msgctxt "help:calendar.event,uuid:"
msgid "Universally Unique Identifier"
msgstr ""
-msgctxt "help:calendar.rrule,until_date:"
+msgctxt "help:calendar.event.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.event.exrule,until_date:"
msgid "Ignore time of field \"Until Date\", but handle as date only."
msgstr ""
-msgctxt "model:calendar.alarm,name:"
-msgid "Alarm"
+msgctxt "help:calendar.event.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
msgstr ""
-msgctxt "model:calendar.attendee,name:"
-msgid "Attendee"
+msgctxt "help:calendar.event.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
msgstr ""
msgctxt "model:calendar.calendar,name:"
@@ -814,10 +806,6 @@ msgctxt "model:calendar.category,name:"
msgid "Category"
msgstr ""
-msgctxt "model:calendar.date,name:"
-msgid "Calendar Date"
-msgstr ""
-
msgctxt "model:calendar.event,name:"
msgid "Event"
msgstr ""
@@ -854,10 +842,6 @@ msgctxt "model:calendar.location,name:"
msgid "Location"
msgstr ""
-msgctxt "model:calendar.rrule,name:"
-msgid "Recurrence Rule"
-msgstr ""
-
msgctxt "model:ir.action,name:act_calendar_form"
msgid "Calendars"
msgstr ""
@@ -886,30 +870,6 @@ msgctxt "model:res.group,name:group_calendar_admin"
msgid "Calendar Administration"
msgstr ""
-msgctxt "selection:calendar.attendee,status:"
-msgid ""
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Accepted"
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Declined"
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Delegated"
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Needs Action"
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Tentative"
-msgstr ""
-
msgctxt "selection:calendar.event,classification:"
msgid "Confidential"
msgstr ""
@@ -946,76 +906,156 @@ msgctxt "selection:calendar.event,transp:"
msgid "Transparent"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Accepted"
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Declined"
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Delegated"
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Needs Action"
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Tentative"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Yearly"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Friday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Monday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Saturday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Sunday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Thursday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Tuesday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Wednesday"
+msgstr ""
+
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Daily"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Hourly"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Minutely"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Monthly"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Secondly"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Weekly"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Yearly"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Friday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Monday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Saturday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Sunday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Thursday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Tuesday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Wednesday"
msgstr ""
msgctxt "view:calendar.calendar:"
-msgid "Calendar"
+msgid "Access Permissions"
msgstr ""
msgctxt "view:calendar.calendar:"
-msgid "Calendars"
+msgid "Calendar"
msgstr ""
msgctxt "view:calendar.calendar:"
-msgid "General"
+msgid "Calendars"
msgstr ""
msgctxt "view:calendar.calendar:"
-msgid "Security"
+msgid "General"
msgstr ""
msgctxt "view:calendar.category:"
diff --git a/locale/de_DE.po b/locale/de_DE.po
index fd10881..314f9c1 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -3,134 +3,113 @@ msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:calendar.calendar:"
-msgid "A user can have only one calendar!"
-msgstr "Es ist nur ein Kalender pro Benutzer möglich!"
+msgid "A user can have only one calendar."
+msgstr "Es kann nur ein Kalender pro Benutzer eingetragen werden."
msgctxt "error:calendar.calendar:"
-msgid "The name of calendar must be unique!"
-msgstr "Kalendername kann nicht mehrfach vergeben werden!"
+msgid "Calendar name \"%s\" can not end with .ics"
+msgstr "Der Name des Kalenders darf nicht mit .ics enden"
-msgctxt "error:calendar.category:"
-msgid "The name of calendar category must be unique!"
-msgstr "Name für Kalenderkategorie kann nicht mehrfach vergeben werden!"
-
-msgctxt "error:calendar.event:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Wiederholungen können nicht rekursiv sein!"
-
-msgctxt "error:calendar.event:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr ""
-"UUID und Wiederholung können in einem Kalender nicht mehrfach vergeben "
-"werden!"
-
-msgctxt "error:calendar.location:"
-msgid "The name of calendar location must be unique!"
-msgstr "Name für Kalenderort kann nicht mehrfach vergeben werden!"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Day\""
-msgstr "Ungültig \"Für Tag\""
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Hour\""
-msgstr "Ungültig \"Für Stunde\""
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique."
+msgstr "Der Name eines Kalenders kann nur einmal vergeben werden."
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Minute\""
-msgstr "Ungültig \"Für Minute\""
+msgctxt "error:calendar.category:"
+msgid "The name of calendar category must be unique."
+msgstr "Der Name einer Kalenderkategorie kann nur einmal vergeben werden."
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month Day\""
-msgstr "Ungültig \"Für Tag des Monats\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Tag\" in Wiederholungsregel \"%s\""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month\""
-msgstr "Ungültig \"Für Monat\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Stunde\" in Wiederholungsregel \"%s\""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Position\""
-msgstr "Ungültig \"Für Position\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Minute\" in Wiederholungsregel \"%s\""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Second\""
-msgstr "Ungültig \"Für Sekunde\""
+msgctxt "error:calendar.event.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.rrule:"
-msgid "Invalid \"By Week Number\""
-msgstr "Ungültig \"Für Woche Nummer\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Monat\" in Wiederholungsregel \"%s\""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Year Day\""
-msgstr "Ungültig \"Für Tag des Jahres\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Position\" in Wiederholungsregel \"%s\""
-msgctxt "error:calendar.rrule:"
-msgid "Only one of \"until\" and \"count\" can be set!"
-msgstr "Es kann nur entweder \"Bis\" oder \"Anzahl\" gesetzt werden!"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Sekunde\" in Wiederholungsregel \"%s\""
-msgctxt "field:calendar.alarm,create_date:"
-msgid "Create Date"
-msgstr "Erstellungsdatum"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Wochennummer\" in Wiederholungsregel \"%s\""
-msgctxt "field:calendar.alarm,create_uid:"
-msgid "Create User"
-msgstr "Erstellt durch"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Tag des Jahres\" in Wiederholungsregel \"%s\""
-msgctxt "field:calendar.alarm,id:"
-msgid "ID"
-msgstr "ID"
+msgctxt "error:calendar.event.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Es kann nur eine der Optionen \"Bis\" oder \"Anzahl\" gesetzt werden."
-msgctxt "field:calendar.alarm,rec_name:"
-msgid "Name"
-msgstr "Name"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Tag\" in Wiederholungsregel \"%s\""
-msgctxt "field:calendar.alarm,valarm:"
-msgid "valarm"
-msgstr "valarm"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Stunde\" in Wiederholungsregel \"%s\""
-msgctxt "field:calendar.alarm,write_date:"
-msgid "Write Date"
-msgstr "Zuletzt geändert"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Minute\" in Wiederholungsregel \"%s\""
-msgctxt "field:calendar.alarm,write_uid:"
-msgid "Write User"
-msgstr "Letzte Änderung durch"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Tag des Monats\" in Wiederholungsregel \"%s\""
-msgctxt "field:calendar.attendee,attendee:"
-msgid "attendee"
-msgstr "Teilnehmer"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Monat\" in Wiederholungsregel \"%s\""
-msgctxt "field:calendar.attendee,create_date:"
-msgid "Create Date"
-msgstr "Erstellungsdatum"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Position\" in Wiederholungsregel \"%s\""
-msgctxt "field:calendar.attendee,create_uid:"
-msgid "Create User"
-msgstr "Erstellt durch"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Sekunde\" in Wiederholungsregel \"%s\""
-msgctxt "field:calendar.attendee,email:"
-msgid "Email"
-msgstr "E-Mail"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Wochennummer\" in Wiederholungsregel \"%s\""
-msgctxt "field:calendar.attendee,id:"
-msgid "ID"
-msgstr "ID"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Tag des Jahres\" in Wiederholungsregel \"%s\""
-msgctxt "field:calendar.attendee,rec_name:"
-msgid "Name"
-msgstr "Name"
+msgctxt "error:calendar.event.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Es kann nur eine der Optionen \"Bis\" oder \"Anzahl\" gesetzt werden."
-msgctxt "field:calendar.attendee,status:"
-msgid "Participation Status"
-msgstr "Teilnahmestatus"
+msgctxt "error:calendar.event:"
+msgid "Recurrence \"%s\" can not be recurrent."
+msgstr "Wiederholung \"%s\" kann sich nicht wiederholen."
-msgctxt "field:calendar.attendee,write_date:"
-msgid "Write Date"
-msgstr "Zuletzt geändert"
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr ""
+"UUID und Wiederholung können in einem Kalender nur einmal vergeben werden."
-msgctxt "field:calendar.attendee,write_uid:"
-msgid "Write User"
-msgstr "Letzte Änderung durch"
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique."
+msgstr "Der Name eines Kalenderorts kann nur einmal vergeben werden."
msgctxt "field:calendar.calendar,create_date:"
msgid "Create Date"
@@ -268,38 +247,6 @@ msgctxt "field:calendar.category,write_uid:"
msgid "Write User"
msgstr "Letzte Änderung durch"
-msgctxt "field:calendar.date,create_date:"
-msgid "Create Date"
-msgstr "Erstellungsdatum"
-
-msgctxt "field:calendar.date,create_uid:"
-msgid "Create User"
-msgstr "Erstellt durch"
-
-msgctxt "field:calendar.date,date:"
-msgid "Is Date"
-msgstr "Als Datum"
-
-msgctxt "field:calendar.date,datetime:"
-msgid "Date"
-msgstr "Zeitpunkt"
-
-msgctxt "field:calendar.date,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.date,rec_name:"
-msgid "Name"
-msgstr "Name"
-
-msgctxt "field:calendar.date,write_date:"
-msgid "Write Date"
-msgstr "Zuletzt geändert"
-
-msgctxt "field:calendar.date,write_uid:"
-msgid "Write User"
-msgstr "Letzte Änderung durch"
-
msgctxt "field:calendar.event,alarms:"
msgid "Alarms"
msgstr "Alarm"
@@ -468,10 +415,6 @@ msgctxt "field:calendar.event-calendar.category,write_uid:"
msgid "Write User"
msgstr "Letzte Änderung durch"
-msgctxt "field:calendar.event.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Kalender Alarm"
-
msgctxt "field:calendar.event.alarm,create_date:"
msgid "Create Date"
msgstr "Erstellungsdatum"
@@ -492,6 +435,10 @@ msgctxt "field:calendar.event.alarm,rec_name:"
msgid "Name"
msgstr "Name"
+msgctxt "field:calendar.event.alarm,valarm:"
+msgid "valarm"
+msgstr ""
+
msgctxt "field:calendar.event.alarm,write_date:"
msgid "Write Date"
msgstr "Zuletzt geändert"
@@ -500,9 +447,9 @@ msgctxt "field:calendar.event.alarm,write_uid:"
msgid "Write User"
msgstr "Letzte Änderung durch"
-msgctxt "field:calendar.event.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Kalender Teilnehmer"
+msgctxt "field:calendar.event.attendee,attendee:"
+msgid "attendee"
+msgstr "Teilnehmer"
msgctxt "field:calendar.event.attendee,create_date:"
msgid "Create Date"
@@ -512,6 +459,10 @@ msgctxt "field:calendar.event.attendee,create_uid:"
msgid "Create User"
msgstr "Erstellt durch"
+msgctxt "field:calendar.event.attendee,email:"
+msgid "Email"
+msgstr "E-Mail"
+
msgctxt "field:calendar.event.attendee,event:"
msgid "Event"
msgstr "Termin"
@@ -524,6 +475,10 @@ msgctxt "field:calendar.event.attendee,rec_name:"
msgid "Name"
msgstr "Name"
+msgctxt "field:calendar.event.attendee,status:"
+msgid "Participation Status"
+msgstr "Teilnahmestatus"
+
msgctxt "field:calendar.event.attendee,write_date:"
msgid "Write Date"
msgstr "Zuletzt geändert"
@@ -532,10 +487,6 @@ msgctxt "field:calendar.event.attendee,write_uid:"
msgid "Write User"
msgstr "Letzte Änderung durch"
-msgctxt "field:calendar.event.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Kalender Datum"
-
msgctxt "field:calendar.event.exdate,create_date:"
msgid "Create Date"
msgstr "Erstellungsdatum"
@@ -544,6 +495,14 @@ msgctxt "field:calendar.event.exdate,create_uid:"
msgid "Create User"
msgstr "Erstellt durch"
+msgctxt "field:calendar.event.exdate,date:"
+msgid "Is Date"
+msgstr "Als Datum"
+
+msgctxt "field:calendar.event.exdate,datetime:"
+msgid "Date"
+msgstr "Zeitpunkt"
+
msgctxt "field:calendar.event.exdate,event:"
msgid "Event"
msgstr "Termin"
@@ -564,9 +523,45 @@ msgctxt "field:calendar.event.exdate,write_uid:"
msgid "Write User"
msgstr "Letzte Änderung durch"
-msgctxt "field:calendar.event.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Kalender WRegel"
+msgctxt "field:calendar.event.exrule,byday:"
+msgid "By Day"
+msgstr "Für Tag"
+
+msgctxt "field:calendar.event.exrule,byhour:"
+msgid "By Hour"
+msgstr "Für Stunde"
+
+msgctxt "field:calendar.event.exrule,byminute:"
+msgid "By Minute"
+msgstr "Für Minute"
+
+msgctxt "field:calendar.event.exrule,bymonth:"
+msgid "By Month"
+msgstr "Für Monat"
+
+msgctxt "field:calendar.event.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Für Tag des Monats"
+
+msgctxt "field:calendar.event.exrule,bysecond:"
+msgid "By Second"
+msgstr "Für Sekunde"
+
+msgctxt "field:calendar.event.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Für Position"
+
+msgctxt "field:calendar.event.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Für Wochennummer"
+
+msgctxt "field:calendar.event.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Für Tag des Jahres"
+
+msgctxt "field:calendar.event.exrule,count:"
+msgid "Count"
+msgstr "Anzahl"
msgctxt "field:calendar.event.exrule,create_date:"
msgid "Create Date"
@@ -580,14 +575,34 @@ msgctxt "field:calendar.event.exrule,event:"
msgid "Event"
msgstr "Termin"
+msgctxt "field:calendar.event.exrule,freq:"
+msgid "Frequency"
+msgstr "Häufigkeit"
+
msgctxt "field:calendar.event.exrule,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:calendar.event.exrule,interval:"
+msgid "Interval"
+msgstr "Intervall"
+
msgctxt "field:calendar.event.exrule,rec_name:"
msgid "Name"
msgstr "Name"
+msgctxt "field:calendar.event.exrule,until:"
+msgid "Until Date"
+msgstr "Bis Datum"
+
+msgctxt "field:calendar.event.exrule,until_date:"
+msgid "Is Date"
+msgstr "Als Datum"
+
+msgctxt "field:calendar.event.exrule,wkst:"
+msgid "Week Day"
+msgstr "Wochentag"
+
msgctxt "field:calendar.event.exrule,write_date:"
msgid "Write Date"
msgstr "Zuletzt geändert"
@@ -596,10 +611,6 @@ msgctxt "field:calendar.event.exrule,write_uid:"
msgid "Write User"
msgstr "Letzte Änderung durch"
-msgctxt "field:calendar.event.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Kalender Datum"
-
msgctxt "field:calendar.event.rdate,create_date:"
msgid "Create Date"
msgstr "Erstellungsdatum"
@@ -608,6 +619,14 @@ msgctxt "field:calendar.event.rdate,create_uid:"
msgid "Create User"
msgstr "Erstellt durch"
+msgctxt "field:calendar.event.rdate,date:"
+msgid "Is Date"
+msgstr "Als Datum"
+
+msgctxt "field:calendar.event.rdate,datetime:"
+msgid "Date"
+msgstr "Zeitpunkt"
+
msgctxt "field:calendar.event.rdate,event:"
msgid "Event"
msgstr "Termin"
@@ -628,147 +647,119 @@ msgctxt "field:calendar.event.rdate,write_uid:"
msgid "Write User"
msgstr "Letzte Änderung durch"
-msgctxt "field:calendar.event.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Kalender WRegel"
-
-msgctxt "field:calendar.event.rrule,create_date:"
-msgid "Create Date"
-msgstr "Erstellungsdatum"
-
-msgctxt "field:calendar.event.rrule,create_uid:"
-msgid "Create User"
-msgstr "Erstellt durch"
-
-msgctxt "field:calendar.event.rrule,event:"
-msgid "Event"
-msgstr "Termin"
-
-msgctxt "field:calendar.event.rrule,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.event.rrule,rec_name:"
-msgid "Name"
-msgstr "Name"
-
-msgctxt "field:calendar.event.rrule,write_date:"
-msgid "Write Date"
-msgstr "Zuletzt geändert"
-
-msgctxt "field:calendar.event.rrule,write_uid:"
-msgid "Write User"
-msgstr "Letzte Änderung durch"
-
-msgctxt "field:calendar.location,create_date:"
-msgid "Create Date"
-msgstr "Erstellungsdatum"
-
-msgctxt "field:calendar.location,create_uid:"
-msgid "Create User"
-msgstr "Erstellt durch"
-
-msgctxt "field:calendar.location,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.location,name:"
-msgid "Name"
-msgstr "Name"
-
-msgctxt "field:calendar.location,rec_name:"
-msgid "Name"
-msgstr "Name"
-
-msgctxt "field:calendar.location,write_date:"
-msgid "Write Date"
-msgstr "Zuletzt geändert"
-
-msgctxt "field:calendar.location,write_uid:"
-msgid "Write User"
-msgstr "Letzte Änderung durch"
-
-msgctxt "field:calendar.rrule,byday:"
+msgctxt "field:calendar.event.rrule,byday:"
msgid "By Day"
msgstr "Für Tag"
-msgctxt "field:calendar.rrule,byhour:"
+msgctxt "field:calendar.event.rrule,byhour:"
msgid "By Hour"
msgstr "Für Stunde"
-msgctxt "field:calendar.rrule,byminute:"
+msgctxt "field:calendar.event.rrule,byminute:"
msgid "By Minute"
msgstr "Für Minute"
-msgctxt "field:calendar.rrule,bymonth:"
+msgctxt "field:calendar.event.rrule,bymonth:"
msgid "By Month"
msgstr "Für Monat"
-msgctxt "field:calendar.rrule,bymonthday:"
+msgctxt "field:calendar.event.rrule,bymonthday:"
msgid "By Month Day"
msgstr "Für Tag des Monats"
-msgctxt "field:calendar.rrule,bysecond:"
+msgctxt "field:calendar.event.rrule,bysecond:"
msgid "By Second"
msgstr "Für Sekunde"
-msgctxt "field:calendar.rrule,bysetpos:"
+msgctxt "field:calendar.event.rrule,bysetpos:"
msgid "By Position"
msgstr "Für Position"
-msgctxt "field:calendar.rrule,byweekno:"
+msgctxt "field:calendar.event.rrule,byweekno:"
msgid "By Week Number"
-msgstr "Für Woche Nummer"
+msgstr "Für Wochennummer"
-msgctxt "field:calendar.rrule,byyearday:"
+msgctxt "field:calendar.event.rrule,byyearday:"
msgid "By Year Day"
msgstr "Für Tag des Jahres"
-msgctxt "field:calendar.rrule,count:"
+msgctxt "field:calendar.event.rrule,count:"
msgid "Count"
msgstr "Anzahl"
-msgctxt "field:calendar.rrule,create_date:"
+msgctxt "field:calendar.event.rrule,create_date:"
msgid "Create Date"
msgstr "Erstellungsdatum"
-msgctxt "field:calendar.rrule,create_uid:"
+msgctxt "field:calendar.event.rrule,create_uid:"
msgid "Create User"
msgstr "Erstellt durch"
-msgctxt "field:calendar.rrule,freq:"
+msgctxt "field:calendar.event.rrule,event:"
+msgid "Event"
+msgstr "Termin"
+
+msgctxt "field:calendar.event.rrule,freq:"
msgid "Frequency"
msgstr "Häufigkeit"
-msgctxt "field:calendar.rrule,id:"
+msgctxt "field:calendar.event.rrule,id:"
msgid "ID"
msgstr "ID"
-msgctxt "field:calendar.rrule,interval:"
+msgctxt "field:calendar.event.rrule,interval:"
msgid "Interval"
msgstr "Intervall"
-msgctxt "field:calendar.rrule,rec_name:"
+msgctxt "field:calendar.event.rrule,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.rrule,until:"
+msgctxt "field:calendar.event.rrule,until:"
msgid "Until Date"
-msgstr "Bis Zeitpunkt"
+msgstr "Bis Datum"
-msgctxt "field:calendar.rrule,until_date:"
+msgctxt "field:calendar.event.rrule,until_date:"
msgid "Is Date"
msgstr "Als Datum"
-msgctxt "field:calendar.rrule,wkst:"
+msgctxt "field:calendar.event.rrule,wkst:"
msgid "Week Day"
msgstr "Wochentag"
-msgctxt "field:calendar.rrule,write_date:"
+msgctxt "field:calendar.event.rrule,write_date:"
msgid "Write Date"
msgstr "Zuletzt geändert"
-msgctxt "field:calendar.rrule,write_uid:"
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.location,name:"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.location,rec_name:"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.location,write_uid:"
msgid "Write User"
msgstr "Letzte Änderung durch"
@@ -778,27 +769,35 @@ msgstr "Kalender"
msgctxt "help:calendar.calendar,owner:"
msgid "The user must have an email"
-msgstr "Dem Benutzer muss eine E-Mail-Adresse zugeordnet sein!"
-
-msgctxt "help:calendar.date,date:"
-msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr "Verwende von Feld \"Zeitpunkt\" nur das Datum ohne den Zeitanteil."
+msgstr "Dem Benutzer muss eine E-Mailadresse zugeordnet sein!"
msgctxt "help:calendar.event,uuid:"
msgid "Universally Unique Identifier"
msgstr "Universally Unique Identifier"
-msgctxt "help:calendar.rrule,until_date:"
+msgctxt "help:calendar.event.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.event.exrule,until_date:"
msgid "Ignore time of field \"Until Date\", but handle as date only."
-msgstr "Verwende von Feld \"Bis Zeitpunkt\" nur das Datum ohne den Zeitanteil."
+msgstr ""
+"Zeit von Feld \"Bis Datum\" ignorieren, sondern nur als Datum ohne Zeit "
+"behandeln."
-msgctxt "model:calendar.alarm,name:"
-msgid "Alarm"
-msgstr "Alarm"
+msgctxt "help:calendar.event.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 "model:calendar.attendee,name:"
-msgid "Attendee"
-msgstr "Teilnehmer"
+msgctxt "help:calendar.event.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.calendar,name:"
msgid "Calendar"
@@ -816,10 +815,6 @@ msgctxt "model:calendar.category,name:"
msgid "Category"
msgstr "Kategorie"
-msgctxt "model:calendar.date,name:"
-msgid "Calendar Date"
-msgstr "Kalender Datum"
-
msgctxt "model:calendar.event,name:"
msgid "Event"
msgstr "Termin"
@@ -856,10 +851,6 @@ msgctxt "model:calendar.location,name:"
msgid "Location"
msgstr "Ort"
-msgctxt "model:calendar.rrule,name:"
-msgid "Recurrence Rule"
-msgstr "Wiederholungsregel"
-
msgctxt "model:ir.action,name:act_calendar_form"
msgid "Calendars"
msgstr "Kalender"
@@ -888,30 +879,6 @@ msgctxt "model:res.group,name:group_calendar_admin"
msgid "Calendar Administration"
msgstr "Kalender Administration"
-msgctxt "selection:calendar.attendee,status:"
-msgid ""
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Accepted"
-msgstr "Angenommen"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Declined"
-msgstr "Abgelehnt"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Delegated"
-msgstr "Delegiert"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Needs Action"
-msgstr "Aktion erforderlich"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Tentative"
-msgstr "Unter Vorbehalt"
-
msgctxt "selection:calendar.event,classification:"
msgid "Confidential"
msgstr "Vertraulich"
@@ -948,62 +915,146 @@ msgctxt "selection:calendar.event,transp:"
msgid "Transparent"
msgstr "Transparent"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Accepted"
+msgstr "Bestätigt"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Declined"
+msgstr "Abgelehnt"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Delegated"
+msgstr "Delegiert"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Needs Action"
+msgstr "Benötigt Eingriff"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Tentative"
+msgstr "Unter Vorbehalt"
+
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Daily"
msgstr "Täglich"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Hourly"
msgstr "Stündlich"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Minutely"
msgstr "Minütlich"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Monthly"
msgstr "Monatlich"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Secondly"
msgstr "Sekündlich"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Weekly"
msgstr "Wöchentlich"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Yearly"
msgstr "Jährlich"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Friday"
msgstr "Freitag"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Monday"
msgstr "Montag"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Saturday"
msgstr "Samstag"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Sunday"
msgstr "Sonntag"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Thursday"
msgstr "Donnerstag"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Tuesday"
msgstr "Dienstag"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Wednesday"
msgstr "Mittwoch"
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Daily"
+msgstr "Täglich"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Hourly"
+msgstr "Stündlich"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Minutely"
+msgstr "Minütlich"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Monthly"
+msgstr "Monatlich"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Secondly"
+msgstr "Sekündlich"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Weekly"
+msgstr "Wöchentlich"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Yearly"
+msgstr "Jährlich"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Friday"
+msgstr "Freitag"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Monday"
+msgstr "Montag"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Saturday"
+msgstr "Samstag"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Sunday"
+msgstr "Sonntag"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Thursday"
+msgstr "Donnerstag"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Dienstag"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Mittwoch"
+
+msgctxt "view:calendar.calendar:"
+msgid "Access Permissions"
+msgstr "Zugriffsberechtigungen"
+
msgctxt "view:calendar.calendar:"
msgid "Calendar"
msgstr "Kalender"
@@ -1016,10 +1067,6 @@ msgctxt "view:calendar.calendar:"
msgid "General"
msgstr "Allgemein"
-msgctxt "view:calendar.calendar:"
-msgid "Security"
-msgstr "Sicherheit"
-
msgctxt "view:calendar.category:"
msgid "Categories"
msgstr "Kategorien"
@@ -1092,10 +1139,6 @@ msgctxt "view:calendar.event:"
msgid "Occurences"
msgstr "Ereignisse"
-msgctxt "view:calendar.event:"
-msgid "Recurrences"
-msgstr "Wiederholungen"
-
msgctxt "view:calendar.location:"
msgid "Location"
msgstr "Ort"
diff --git a/locale/es_AR.po b/locale/es_AR.po
index 39ec4b4..9805a8d 100644
--- a/locale/es_AR.po
+++ b/locale/es_AR.po
@@ -3,132 +3,124 @@ msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:calendar.calendar:"
-msgid "A user can have only one calendar!"
-msgstr "¡Un usuario solo puede tener un calendario!"
+msgid "A user can have only one calendar."
+msgstr "Un usuario sólo puede tener un calendario."
msgctxt "error:calendar.calendar:"
-msgid "The name of calendar must be unique!"
-msgstr "¡El nombre del calendario debe ser único!"
+msgid "Calendar name \"%s\" can not end with .ics"
+msgstr "El nombre del calendario «%s» no debe terminar con la extensión .ics"
-msgctxt "error:calendar.category:"
-msgid "The name of calendar category must be unique!"
-msgstr "¡El nombre de la categoría del calendario debe ser único!"
-
-msgctxt "error:calendar.event:"
-msgid "Recurrence can not be recurrent!"
-msgstr "¡Una recurrencia no puede ser recurrente!"
-
-msgctxt "error:calendar.event:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "¡UUID y recurrencia deben ser únicos en un calendario!"
-
-msgctxt "error:calendar.location:"
-msgid "The name of calendar location must be unique!"
-msgstr "¡El nombre de la ubicación del calendario debe ser único!"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Day\""
-msgstr "Inválido «por día»"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Hour\""
-msgstr "Inválido «por hora»"
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique."
+msgstr "El nombre del calendario debe ser único."
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Minute\""
-msgstr "Inválido «por minuto»"
+msgctxt "error:calendar.category:"
+msgid "The name of calendar category must be unique."
+msgstr "El nombre de la categoría del calendario debe ser único."
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month Day\""
-msgstr "Inválido «por día del mes»"
+msgctxt "error:calendar.event.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.rrule:"
-msgid "Invalid \"By Month\""
-msgstr "Inválido «por mes»"
+msgctxt "error:calendar.event.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.rrule:"
-msgid "Invalid \"By Position\""
-msgstr "Inválido «por posición»"
+msgctxt "error:calendar.event.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.rrule:"
-msgid "Invalid \"By Second\""
-msgstr "Inválido «por segundos»"
+msgctxt "error:calendar.event.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.rrule:"
-msgid "Invalid \"By Week Number\""
-msgstr "Inválido «por número de semana»"
+msgctxt "error:calendar.event.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.rrule:"
-msgid "Invalid \"By Year Day\""
-msgstr "Inválido «por día del año»"
+msgctxt "error:calendar.event.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.rrule:"
-msgid "Only one of \"until\" and \"count\" can be set!"
-msgstr "¡Solo se puede usar o «hasta» o «Número de veces»!"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por segundo» de la regla de recurrencia «%s» no es correcto."
-msgctxt "field:calendar.alarm,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
+msgctxt "error:calendar.event.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 "field:calendar.alarm,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
+msgctxt "error:calendar.event.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 "field:calendar.alarm,id:"
-msgid "ID"
-msgstr "ID"
+msgctxt "error:calendar.event.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Sólo un «hasta» y «contador» puede ser definido."
-msgctxt "field:calendar.alarm,rec_name:"
-msgid "Name"
-msgstr "Nombre"
+msgctxt "error:calendar.event.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 "field:calendar.alarm,valarm:"
-msgid "valarm"
-msgstr "valarm"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "El campo «Por hora» de la regla de recurrencia «%s» no es correcto."
-msgctxt "field:calendar.alarm,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "El campo «Por minuto» de la regla de recurrencia «%s» no es correcto."
-msgctxt "field:calendar.alarm,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
+msgctxt "error:calendar.event.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 "field:calendar.attendee,attendee:"
-msgid "attendee"
-msgstr "asistentes"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "El campo «Por mes» de la regla de recurrencia «%s» no es correcto."
-msgctxt "field:calendar.attendee,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
+msgctxt "error:calendar.event.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 "field:calendar.attendee,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por segundo» de la regla de recurrencia «%s» no es correcto."
-msgctxt "field:calendar.attendee,email:"
-msgid "Email"
-msgstr "Correo electrónico"
+msgctxt "error:calendar.event.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 "field:calendar.attendee,id:"
-msgid "ID"
-msgstr "ID"
+msgctxt "error:calendar.event.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 "field:calendar.attendee,rec_name:"
-msgid "Name"
-msgstr "Nombre"
+msgctxt "error:calendar.event.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Sólo un «hasta» y «contador» puede ser definido."
-msgctxt "field:calendar.attendee,status:"
-msgid "Participation Status"
-msgstr "Estado de participación"
+msgctxt "error:calendar.event:"
+msgid "Recurrence \"%s\" can not be recurrent."
+msgstr "La recurrencia «%s» no puede ser recurrente."
-msgctxt "field:calendar.attendee,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr "UUID y la recurrencia deben ser únicos en el calendario."
-msgctxt "field:calendar.attendee,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique."
+msgstr "El nombre de la ubicación del calendario debe ser único."
msgctxt "field:calendar.calendar,create_date:"
msgid "Create Date"
@@ -266,38 +258,6 @@ msgctxt "field:calendar.category,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.date,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:calendar.date,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
-
-msgctxt "field:calendar.date,date:"
-msgid "Is Date"
-msgstr "Es fecha"
-
-msgctxt "field:calendar.date,datetime:"
-msgid "Date"
-msgstr "Fecha"
-
-msgctxt "field:calendar.date,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.date,rec_name:"
-msgid "Name"
-msgstr "Nombre del campo"
-
-msgctxt "field:calendar.date,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:calendar.date,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
-
msgctxt "field:calendar.event,alarms:"
msgid "Alarms"
msgstr "Alarmas"
@@ -466,10 +426,6 @@ msgctxt "field:calendar.event-calendar.category,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.event.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Alarma del calendario"
-
msgctxt "field:calendar.event.alarm,create_date:"
msgid "Create Date"
msgstr "Fecha creación"
@@ -490,6 +446,10 @@ msgctxt "field:calendar.event.alarm,rec_name:"
msgid "Name"
msgstr "Nombre"
+msgctxt "field:calendar.event.alarm,valarm:"
+msgid "valarm"
+msgstr "valarm"
+
msgctxt "field:calendar.event.alarm,write_date:"
msgid "Write Date"
msgstr "Fecha modificación"
@@ -498,9 +458,9 @@ msgctxt "field:calendar.event.alarm,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.event.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Calendario de asistentes"
+msgctxt "field:calendar.event.attendee,attendee:"
+msgid "attendee"
+msgstr "asistente"
msgctxt "field:calendar.event.attendee,create_date:"
msgid "Create Date"
@@ -510,6 +470,10 @@ msgctxt "field:calendar.event.attendee,create_uid:"
msgid "Create User"
msgstr "Usuario creación"
+msgctxt "field:calendar.event.attendee,email:"
+msgid "Email"
+msgstr "Correo electrónico"
+
msgctxt "field:calendar.event.attendee,event:"
msgid "Event"
msgstr "Evento"
@@ -522,6 +486,10 @@ msgctxt "field:calendar.event.attendee,rec_name:"
msgid "Name"
msgstr "Nombre"
+msgctxt "field:calendar.event.attendee,status:"
+msgid "Participation Status"
+msgstr "Estado de participación"
+
msgctxt "field:calendar.event.attendee,write_date:"
msgid "Write Date"
msgstr "Fecha modificación"
@@ -530,10 +498,6 @@ msgctxt "field:calendar.event.attendee,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.event.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha Calendario"
-
msgctxt "field:calendar.event.exdate,create_date:"
msgid "Create Date"
msgstr "Fecha creación"
@@ -542,6 +506,14 @@ msgctxt "field:calendar.event.exdate,create_uid:"
msgid "Create User"
msgstr "Usuario creación"
+msgctxt "field:calendar.event.exdate,date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.event.exdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
msgctxt "field:calendar.event.exdate,event:"
msgid "Event"
msgstr "Evento"
@@ -562,9 +534,45 @@ msgctxt "field:calendar.event.exdate,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.event.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrencia"
+msgctxt "field:calendar.event.exrule,byday:"
+msgid "By Day"
+msgstr "Por día"
+
+msgctxt "field:calendar.event.exrule,byhour:"
+msgid "By Hour"
+msgstr "Por hora"
+
+msgctxt "field:calendar.event.exrule,byminute:"
+msgid "By Minute"
+msgstr "Por minuto"
+
+msgctxt "field:calendar.event.exrule,bymonth:"
+msgid "By Month"
+msgstr "Por mes"
+
+msgctxt "field:calendar.event.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Por día del mes"
+
+msgctxt "field:calendar.event.exrule,bysecond:"
+msgid "By Second"
+msgstr "Por segundo"
+
+msgctxt "field:calendar.event.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Por ubicación"
+
+msgctxt "field:calendar.event.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Por número de la semana"
+
+msgctxt "field:calendar.event.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Por día del año"
+
+msgctxt "field:calendar.event.exrule,count:"
+msgid "Count"
+msgstr "Contador"
msgctxt "field:calendar.event.exrule,create_date:"
msgid "Create Date"
@@ -578,14 +586,34 @@ msgctxt "field:calendar.event.exrule,event:"
msgid "Event"
msgstr "Evento"
+msgctxt "field:calendar.event.exrule,freq:"
+msgid "Frequency"
+msgstr "Frecuencia"
+
msgctxt "field:calendar.event.exrule,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:calendar.event.exrule,interval:"
+msgid "Interval"
+msgstr "Intervalo"
+
msgctxt "field:calendar.event.exrule,rec_name:"
msgid "Name"
msgstr "Nombre"
+msgctxt "field:calendar.event.exrule,until:"
+msgid "Until Date"
+msgstr "Hasta la fecha"
+
+msgctxt "field:calendar.event.exrule,until_date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.event.exrule,wkst:"
+msgid "Week Day"
+msgstr "Día de la semana"
+
msgctxt "field:calendar.event.exrule,write_date:"
msgid "Write Date"
msgstr "Fecha modificación"
@@ -594,10 +622,6 @@ msgctxt "field:calendar.event.exrule,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.event.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha Calendario"
-
msgctxt "field:calendar.event.rdate,create_date:"
msgid "Create Date"
msgstr "Fecha creación"
@@ -606,6 +630,14 @@ msgctxt "field:calendar.event.rdate,create_uid:"
msgid "Create User"
msgstr "Usuario creación"
+msgctxt "field:calendar.event.rdate,date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.event.rdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
msgctxt "field:calendar.event.rdate,event:"
msgid "Event"
msgstr "Evento"
@@ -626,147 +658,119 @@ msgctxt "field:calendar.event.rdate,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.event.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrencia"
-
-msgctxt "field:calendar.event.rrule,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:calendar.event.rrule,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
-
-msgctxt "field:calendar.event.rrule,event:"
-msgid "Event"
-msgstr "Evento"
-
-msgctxt "field:calendar.event.rrule,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.event.rrule,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.event.rrule,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:calendar.event.rrule,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
-
-msgctxt "field:calendar.location,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:calendar.location,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
-
-msgctxt "field:calendar.location,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.location,name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.location,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.location,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:calendar.location,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
-
-msgctxt "field:calendar.rrule,byday:"
+msgctxt "field:calendar.event.rrule,byday:"
msgid "By Day"
msgstr "Por día"
-msgctxt "field:calendar.rrule,byhour:"
+msgctxt "field:calendar.event.rrule,byhour:"
msgid "By Hour"
msgstr "Por hora"
-msgctxt "field:calendar.rrule,byminute:"
+msgctxt "field:calendar.event.rrule,byminute:"
msgid "By Minute"
msgstr "Por minuto"
-msgctxt "field:calendar.rrule,bymonth:"
+msgctxt "field:calendar.event.rrule,bymonth:"
msgid "By Month"
msgstr "Por mes"
-msgctxt "field:calendar.rrule,bymonthday:"
+msgctxt "field:calendar.event.rrule,bymonthday:"
msgid "By Month Day"
msgstr "Por día del mes"
-msgctxt "field:calendar.rrule,bysecond:"
+msgctxt "field:calendar.event.rrule,bysecond:"
msgid "By Second"
msgstr "Por segundo"
-msgctxt "field:calendar.rrule,bysetpos:"
+msgctxt "field:calendar.event.rrule,bysetpos:"
msgid "By Position"
-msgstr "Por posición"
+msgstr "Por ubicación"
-msgctxt "field:calendar.rrule,byweekno:"
+msgctxt "field:calendar.event.rrule,byweekno:"
msgid "By Week Number"
-msgstr "Por día de la semana"
+msgstr "Por número de la semana"
-msgctxt "field:calendar.rrule,byyearday:"
+msgctxt "field:calendar.event.rrule,byyearday:"
msgid "By Year Day"
msgstr "Por día del año"
-msgctxt "field:calendar.rrule,count:"
+msgctxt "field:calendar.event.rrule,count:"
msgid "Count"
-msgstr "Número de veces"
+msgstr "Contador"
-msgctxt "field:calendar.rrule,create_date:"
+msgctxt "field:calendar.event.rrule,create_date:"
msgid "Create Date"
msgstr "Fecha creación"
-msgctxt "field:calendar.rrule,create_uid:"
+msgctxt "field:calendar.event.rrule,create_uid:"
msgid "Create User"
msgstr "Usuario creación"
-msgctxt "field:calendar.rrule,freq:"
+msgctxt "field:calendar.event.rrule,event:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.rrule,freq:"
msgid "Frequency"
msgstr "Frecuencia"
-msgctxt "field:calendar.rrule,id:"
+msgctxt "field:calendar.event.rrule,id:"
msgid "ID"
msgstr "ID"
-msgctxt "field:calendar.rrule,interval:"
+msgctxt "field:calendar.event.rrule,interval:"
msgid "Interval"
msgstr "Intervalo"
-msgctxt "field:calendar.rrule,rec_name:"
+msgctxt "field:calendar.event.rrule,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.rrule,until:"
+msgctxt "field:calendar.event.rrule,until:"
msgid "Until Date"
msgstr "Hasta la fecha"
-msgctxt "field:calendar.rrule,until_date:"
+msgctxt "field:calendar.event.rrule,until_date:"
msgid "Is Date"
-msgstr "Es fecha"
+msgstr "Es una fecha"
-msgctxt "field:calendar.rrule,wkst:"
+msgctxt "field:calendar.event.rrule,wkst:"
msgid "Week Day"
msgstr "Día de la semana"
-msgctxt "field:calendar.rrule,write_date:"
+msgctxt "field:calendar.event.rrule,write_date:"
msgid "Write Date"
msgstr "Fecha modificación"
-msgctxt "field:calendar.rrule,write_uid:"
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.location,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.location,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
@@ -778,25 +782,27 @@ msgctxt "help:calendar.calendar,owner:"
msgid "The user must have an email"
msgstr "El usuario debe tener un correo electrónico"
-msgctxt "help:calendar.date,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.event,uuid:"
msgid "Universally Unique Identifier"
msgstr "Identificador universal único"
-msgctxt "help:calendar.rrule,until_date:"
+msgctxt "help:calendar.event.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.event.exrule,until_date:"
msgid "Ignore time of field \"Until Date\", but handle as date only."
-msgstr "Ignora la hora del campo «Hasta la fecha», y trata solo la fecha"
+msgstr ""
+"Ignora la hora del campo «Hasta la fecha», pero usar como única fecha."
-msgctxt "model:calendar.alarm,name:"
-msgid "Alarm"
-msgstr "Alarma"
+msgctxt "help:calendar.event.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 "model:calendar.attendee,name:"
-msgid "Attendee"
-msgstr "Asistentes"
+msgctxt "help:calendar.event.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.calendar,name:"
msgid "Calendar"
@@ -804,20 +810,16 @@ msgstr "Calendario"
msgctxt "model:calendar.calendar-read-res.user,name:"
msgid "Calendar - read - User"
-msgstr "Calendario - leer - usuario"
+msgstr "Calendario - leer - Usuario"
msgctxt "model:calendar.calendar-write-res.user,name:"
msgid "Calendar - write - User"
-msgstr "Calendario - escribir - usuario"
+msgstr "Calendario - escribir - Usuario"
msgctxt "model:calendar.category,name:"
msgid "Category"
msgstr "Categoría"
-msgctxt "model:calendar.date,name:"
-msgid "Calendar Date"
-msgstr "Fecha Calendario"
-
msgctxt "model:calendar.event,name:"
msgid "Event"
msgstr "Evento"
@@ -854,10 +856,6 @@ msgctxt "model:calendar.location,name:"
msgid "Location"
msgstr "Ubicación"
-msgctxt "model:calendar.rrule,name:"
-msgid "Recurrence Rule"
-msgstr "Regla de recurrencia"
-
msgctxt "model:ir.action,name:act_calendar_form"
msgid "Calendars"
msgstr "Calendarios"
@@ -872,7 +870,7 @@ msgstr "Eventos"
msgctxt "model:ir.ui.menu,name:menu_calendar"
msgid "Calendar"
-msgstr "Gestión de calendario"
+msgstr "Calendarios"
msgctxt "model:ir.ui.menu,name:menu_calendar_form"
msgid "Calendars"
@@ -886,30 +884,6 @@ msgctxt "model:res.group,name:group_calendar_admin"
msgid "Calendar Administration"
msgstr "Administración de calendario"
-msgctxt "selection:calendar.attendee,status:"
-msgid ""
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Accepted"
-msgstr "Aceptada"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Declined"
-msgstr "Rehusado"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Delegated"
-msgstr "Delegada"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Needs Action"
-msgstr "Necesita una acción"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Tentative"
-msgstr "Tentativa"
-
msgctxt "selection:calendar.event,classification:"
msgid "Confidential"
msgstr "Confidencial"
@@ -946,63 +920,147 @@ msgctxt "selection:calendar.event,transp:"
msgid "Transparent"
msgstr "Transparente"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Accepted"
+msgstr "Aceptado"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Declined"
+msgstr "Rechazado"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Delegated"
+msgstr "Delegado"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Needs Action"
+msgstr "Necesita una acción"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Tentative"
+msgstr "Tentativo"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Daily"
+msgstr "Diariamente"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Minutely"
+msgstr "Cada minuto"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Monthly"
+msgstr "Mensualmente"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Secondly"
+msgstr "Cada segundo"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Daily"
msgstr "Diariamente"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Hourly"
msgstr "Cada hora"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Minutely"
msgstr "Cada minuto"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Monthly"
msgstr "Mensualmente"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Secondly"
msgstr "Cada segundo"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Weekly"
msgstr "Semanalmente"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Yearly"
msgstr "Anualmente"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Friday"
msgstr "Viernes"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Monday"
msgstr "Lunes"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Saturday"
msgstr "Sábado"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Sunday"
msgstr "Domingo"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Thursday"
msgstr "Jueves"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Tuesday"
msgstr "Martes"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Wednesday"
msgstr "Miércoles"
msgctxt "view:calendar.calendar:"
+msgid "Access Permissions"
+msgstr "Permisos de acceso"
+
+msgctxt "view:calendar.calendar:"
msgid "Calendar"
msgstr "Calendario"
@@ -1014,10 +1072,6 @@ msgctxt "view:calendar.calendar:"
msgid "General"
msgstr "General"
-msgctxt "view:calendar.calendar:"
-msgid "Security"
-msgstr "Seguridad"
-
msgctxt "view:calendar.category:"
msgid "Categories"
msgstr "Categorías"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index eaf3e4d..571f7af 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -3,132 +3,112 @@ msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:calendar.calendar:"
-msgid "A user can have only one calendar!"
-msgstr "¡Un usuario puede tener a lo sumo un calendario!"
+msgid "A user can have only one calendar."
+msgstr "Un usuario solo puede tener un calendario."
msgctxt "error:calendar.calendar:"
-msgid "The name of calendar must be unique!"
-msgstr "¡El nombre del calendario es único!"
+msgid "Calendar name \"%s\" can not end with .ics"
+msgstr "El nombre del calendario \"%s\" no puede terminar con .ics"
+
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique."
+msgstr "El nombre de calendario debe ser único."
msgctxt "error:calendar.category:"
-msgid "The name of calendar category must be unique!"
+msgid "The name of calendar category must be unique."
msgstr "¡El nombre de la categoría de calendario debe ser único!"
-msgctxt "error:calendar.event:"
-msgid "Recurrence can not be recurrent!"
-msgstr "¡La repetición no puede repetirse!"
-
-msgctxt "error:calendar.event:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "¡El UUID y la recurrencia deben ser únicos por calendario! "
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Día\" en regla recurrente \"%s\""
-msgctxt "error:calendar.location:"
-msgid "The name of calendar location must be unique!"
-msgstr "¡El nombre del lugar del calendario debe ser único!"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Hora\" en regla recurrente \"%s\""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Day\""
-msgstr "Inválido \"Por Día\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Minuto\" en regla recurrente \"%s\""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Hour\""
-msgstr "Inválido \"Por Hora\""
+msgctxt "error:calendar.event.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.rrule:"
-msgid "Invalid \"By Minute\""
-msgstr "Inválido \"Por Minuto\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Mes\" en regla recurrente \"%s\""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month Day\""
-msgstr "Inválido \"Por Día del Mes\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Position\" en regla recurrente \"%s\""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month\""
-msgstr "Inválido \"Por Mes\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Segundo\" en regla recurrente \"%s\""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Position\""
-msgstr "Inválido \"Por Posición\""
+msgctxt "error:calendar.event.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.rrule:"
-msgid "Invalid \"By Second\""
-msgstr "Inválido \"Por Segundo\""
+msgctxt "error:calendar.event.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.rrule:"
-msgid "Invalid \"By Week Number\""
-msgstr "Inválido \"Por Número de Semana\""
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Year Day\""
-msgstr "Inválido \"Por Día del Año\""
-
-msgctxt "error:calendar.rrule:"
-msgid "Only one of \"until\" and \"count\" can be set!"
+msgctxt "error:calendar.event.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
msgstr "Solo un \"hasta\" y \"contar\" pude ser establecido!"
-msgctxt "field:calendar.alarm,create_date:"
-msgid "Create Date"
-msgstr "Fecha de Creación"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Día\" en regla recurrente \"%s\""
-msgctxt "field:calendar.alarm,create_uid:"
-msgid "Create User"
-msgstr "Creado por Usuario"
-
-msgctxt "field:calendar.alarm,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.alarm,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.alarm,valarm:"
-msgid "valarm"
-msgstr "valarma"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Hora\" en regla recurrente \"%s\""
-msgctxt "field:calendar.alarm,write_date:"
-msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Minuto\" en regla recurrente \"%s\""
-msgctxt "field:calendar.alarm,write_uid:"
-msgid "Write User"
-msgstr "Modificado por Usuario"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Día del Mes\" en regla recurrente \"%s\""
-msgctxt "field:calendar.attendee,attendee:"
-msgid "attendee"
-msgstr "Asistente"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Mes\" en regla recurrente \"%s\""
-msgctxt "field:calendar.attendee,create_date:"
-msgid "Create Date"
-msgstr "Fecha de Creación"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Posición\" en regla recurrente \"%s\""
-msgctxt "field:calendar.attendee,create_uid:"
-msgid "Create User"
-msgstr "Creado por Usuario"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Segundo\" en regla recurrente \"%s\""
-msgctxt "field:calendar.attendee,email:"
-msgid "Email"
-msgstr "Correo Electrónico"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Número de Semana\" en regla recurrente \"%s\""
-msgctxt "field:calendar.attendee,id:"
-msgid "ID"
-msgstr "ID"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Día del Año\" en regla recurrente \"%s\""
-msgctxt "field:calendar.attendee,rec_name:"
-msgid "Name"
-msgstr "Nombre"
+msgctxt "error:calendar.event.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Solo un \"hasta\" y \"contar\" pude ser establecido!"
-msgctxt "field:calendar.attendee,status:"
-msgid "Participation Status"
-msgstr "Estado de Participación"
+msgctxt "error:calendar.event:"
+msgid "Recurrence \"%s\" can not be recurrent."
+msgstr "Recurrencia \"%s\" no puede ser recurrente."
-msgctxt "field:calendar.attendee,write_date:"
-msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr "UUID y recurrencia debe ser única en un calendario."
-msgctxt "field:calendar.attendee,write_uid:"
-msgid "Write User"
-msgstr "Modificado por Usuario"
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique."
+msgstr "El nombre de la ubicación del calendario bede ser único."
msgctxt "field:calendar.calendar,create_date:"
msgid "Create Date"
@@ -266,38 +246,6 @@ msgctxt "field:calendar.category,write_uid:"
msgid "Write User"
msgstr "Modificado por Usuario"
-msgctxt "field:calendar.date,create_date:"
-msgid "Create Date"
-msgstr "Fecha de Creación"
-
-msgctxt "field:calendar.date,create_uid:"
-msgid "Create User"
-msgstr "Creado por Usuario"
-
-msgctxt "field:calendar.date,date:"
-msgid "Is Date"
-msgstr "Es Fecha"
-
-msgctxt "field:calendar.date,datetime:"
-msgid "Date"
-msgstr "Fecha"
-
-msgctxt "field:calendar.date,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.date,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.date,write_date:"
-msgid "Write Date"
-msgstr "Fecha de Modificación"
-
-msgctxt "field:calendar.date,write_uid:"
-msgid "Write User"
-msgstr "Modificado por Usuario"
-
msgctxt "field:calendar.event,alarms:"
msgid "Alarms"
msgstr "Alarmas"
@@ -466,10 +414,6 @@ msgctxt "field:calendar.event-calendar.category,write_uid:"
msgid "Write User"
msgstr "Modificado por Usuario"
-msgctxt "field:calendar.event.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Alarma del Calendario"
-
msgctxt "field:calendar.event.alarm,create_date:"
msgid "Create Date"
msgstr "Fecha de Creación"
@@ -490,6 +434,10 @@ msgctxt "field:calendar.event.alarm,rec_name:"
msgid "Name"
msgstr "Nombre"
+msgctxt "field:calendar.event.alarm,valarm:"
+msgid "valarm"
+msgstr "valarma"
+
msgctxt "field:calendar.event.alarm,write_date:"
msgid "Write Date"
msgstr "Fecha de Modificación"
@@ -498,9 +446,9 @@ msgctxt "field:calendar.event.alarm,write_uid:"
msgid "Write User"
msgstr "Modificado por Usuario"
-msgctxt "field:calendar.event.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Asistente de Calendario "
+msgctxt "field:calendar.event.attendee,attendee:"
+msgid "attendee"
+msgstr "Asistente"
msgctxt "field:calendar.event.attendee,create_date:"
msgid "Create Date"
@@ -510,6 +458,10 @@ msgctxt "field:calendar.event.attendee,create_uid:"
msgid "Create User"
msgstr "Creado por Usuario"
+msgctxt "field:calendar.event.attendee,email:"
+msgid "Email"
+msgstr "Correo Electrónico"
+
msgctxt "field:calendar.event.attendee,event:"
msgid "Event"
msgstr "Evento"
@@ -522,6 +474,10 @@ msgctxt "field:calendar.event.attendee,rec_name:"
msgid "Name"
msgstr "Nombre"
+msgctxt "field:calendar.event.attendee,status:"
+msgid "Participation Status"
+msgstr "Estado de Participación"
+
msgctxt "field:calendar.event.attendee,write_date:"
msgid "Write Date"
msgstr "Fecha de Modificación"
@@ -530,10 +486,6 @@ msgctxt "field:calendar.event.attendee,write_uid:"
msgid "Write User"
msgstr "Modificado por Usuario"
-msgctxt "field:calendar.event.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha Calendario"
-
msgctxt "field:calendar.event.exdate,create_date:"
msgid "Create Date"
msgstr "Fecha de Creación"
@@ -542,6 +494,14 @@ msgctxt "field:calendar.event.exdate,create_uid:"
msgid "Create User"
msgstr "Creado por Usuario"
+msgctxt "field:calendar.event.exdate,date:"
+msgid "Is Date"
+msgstr "Esta Fecha"
+
+msgctxt "field:calendar.event.exdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
msgctxt "field:calendar.event.exdate,event:"
msgid "Event"
msgstr "Evento"
@@ -562,9 +522,45 @@ msgctxt "field:calendar.event.exdate,write_uid:"
msgid "Write User"
msgstr "Modificado por Usuario"
-msgctxt "field:calendar.event.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de Calendario"
+msgctxt "field:calendar.event.exrule,byday:"
+msgid "By Day"
+msgstr "Por Día"
+
+msgctxt "field:calendar.event.exrule,byhour:"
+msgid "By Hour"
+msgstr "Por Hora"
+
+msgctxt "field:calendar.event.exrule,byminute:"
+msgid "By Minute"
+msgstr "Por Minuto"
+
+msgctxt "field:calendar.event.exrule,bymonth:"
+msgid "By Month"
+msgstr "Por Mes"
+
+msgctxt "field:calendar.event.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Por Día del Mes"
+
+msgctxt "field:calendar.event.exrule,bysecond:"
+msgid "By Second"
+msgstr "Por Segundo"
+
+msgctxt "field:calendar.event.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Por Posición"
+
+msgctxt "field:calendar.event.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Por Número de la Semana"
+
+msgctxt "field:calendar.event.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Por Día del Año"
+
+msgctxt "field:calendar.event.exrule,count:"
+msgid "Count"
+msgstr "Contar"
msgctxt "field:calendar.event.exrule,create_date:"
msgid "Create Date"
@@ -578,14 +574,34 @@ msgctxt "field:calendar.event.exrule,event:"
msgid "Event"
msgstr "Evento"
+msgctxt "field:calendar.event.exrule,freq:"
+msgid "Frequency"
+msgstr "Frecuencia"
+
msgctxt "field:calendar.event.exrule,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:calendar.event.exrule,interval:"
+msgid "Interval"
+msgstr "Intervalo"
+
msgctxt "field:calendar.event.exrule,rec_name:"
msgid "Name"
msgstr "Nombre"
+msgctxt "field:calendar.event.exrule,until:"
+msgid "Until Date"
+msgstr "Hasta la Fecha"
+
+msgctxt "field:calendar.event.exrule,until_date:"
+msgid "Is Date"
+msgstr "Esta Fecha"
+
+msgctxt "field:calendar.event.exrule,wkst:"
+msgid "Week Day"
+msgstr "Día de la Semana"
+
msgctxt "field:calendar.event.exrule,write_date:"
msgid "Write Date"
msgstr "Fecha de Modificación"
@@ -594,10 +610,6 @@ msgctxt "field:calendar.event.exrule,write_uid:"
msgid "Write User"
msgstr "Modificado por Usuario"
-msgctxt "field:calendar.event.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha Calendario"
-
msgctxt "field:calendar.event.rdate,create_date:"
msgid "Create Date"
msgstr "Fecha de Creación"
@@ -606,6 +618,14 @@ msgctxt "field:calendar.event.rdate,create_uid:"
msgid "Create User"
msgstr "Creado por Usuario"
+msgctxt "field:calendar.event.rdate,date:"
+msgid "Is Date"
+msgstr "Esta Fecha"
+
+msgctxt "field:calendar.event.rdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
msgctxt "field:calendar.event.rdate,event:"
msgid "Event"
msgstr "Evento"
@@ -626,147 +646,119 @@ msgctxt "field:calendar.event.rdate,write_uid:"
msgid "Write User"
msgstr "Modificado por Usuario"
-msgctxt "field:calendar.event.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de Calendario"
-
-msgctxt "field:calendar.event.rrule,create_date:"
-msgid "Create Date"
-msgstr "Fecha de Creación"
-
-msgctxt "field:calendar.event.rrule,create_uid:"
-msgid "Create User"
-msgstr "Creado por Usuario"
-
-msgctxt "field:calendar.event.rrule,event:"
-msgid "Event"
-msgstr "Evento"
-
-msgctxt "field:calendar.event.rrule,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.event.rrule,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.event.rrule,write_date:"
-msgid "Write Date"
-msgstr "Fecha de Modificación"
-
-msgctxt "field:calendar.event.rrule,write_uid:"
-msgid "Write User"
-msgstr "Modificado por Usuario"
-
-msgctxt "field:calendar.location,create_date:"
-msgid "Create Date"
-msgstr "Fecha de Creación"
-
-msgctxt "field:calendar.location,create_uid:"
-msgid "Create User"
-msgstr "Creado por Usuario"
-
-msgctxt "field:calendar.location,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.location,name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.location,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.location,write_date:"
-msgid "Write Date"
-msgstr "Fecha de Modificación"
-
-msgctxt "field:calendar.location,write_uid:"
-msgid "Write User"
-msgstr "Modificado por Usuario"
-
-msgctxt "field:calendar.rrule,byday:"
+msgctxt "field:calendar.event.rrule,byday:"
msgid "By Day"
msgstr "Por Día"
-msgctxt "field:calendar.rrule,byhour:"
+msgctxt "field:calendar.event.rrule,byhour:"
msgid "By Hour"
msgstr "Por Hora"
-msgctxt "field:calendar.rrule,byminute:"
+msgctxt "field:calendar.event.rrule,byminute:"
msgid "By Minute"
msgstr "Por Minuto"
-msgctxt "field:calendar.rrule,bymonth:"
+msgctxt "field:calendar.event.rrule,bymonth:"
msgid "By Month"
msgstr "Por Mes"
-msgctxt "field:calendar.rrule,bymonthday:"
+msgctxt "field:calendar.event.rrule,bymonthday:"
msgid "By Month Day"
msgstr "Por Día del Mes"
-msgctxt "field:calendar.rrule,bysecond:"
+msgctxt "field:calendar.event.rrule,bysecond:"
msgid "By Second"
msgstr "Por Segundo"
-msgctxt "field:calendar.rrule,bysetpos:"
+msgctxt "field:calendar.event.rrule,bysetpos:"
msgid "By Position"
msgstr "Por Posición"
-msgctxt "field:calendar.rrule,byweekno:"
+msgctxt "field:calendar.event.rrule,byweekno:"
msgid "By Week Number"
msgstr "Por Número de la Semana"
-msgctxt "field:calendar.rrule,byyearday:"
+msgctxt "field:calendar.event.rrule,byyearday:"
msgid "By Year Day"
msgstr "Por Día del Año"
-msgctxt "field:calendar.rrule,count:"
+msgctxt "field:calendar.event.rrule,count:"
msgid "Count"
msgstr "Contar"
-msgctxt "field:calendar.rrule,create_date:"
+msgctxt "field:calendar.event.rrule,create_date:"
msgid "Create Date"
msgstr "Fecha de Creación"
-msgctxt "field:calendar.rrule,create_uid:"
+msgctxt "field:calendar.event.rrule,create_uid:"
msgid "Create User"
msgstr "Creado por Usuario"
-msgctxt "field:calendar.rrule,freq:"
+msgctxt "field:calendar.event.rrule,event:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.rrule,freq:"
msgid "Frequency"
msgstr "Frecuencia"
-msgctxt "field:calendar.rrule,id:"
+msgctxt "field:calendar.event.rrule,id:"
msgid "ID"
msgstr "ID"
-msgctxt "field:calendar.rrule,interval:"
+msgctxt "field:calendar.event.rrule,interval:"
msgid "Interval"
msgstr "Intervalo"
-msgctxt "field:calendar.rrule,rec_name:"
+msgctxt "field:calendar.event.rrule,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.rrule,until:"
+msgctxt "field:calendar.event.rrule,until:"
msgid "Until Date"
msgstr "Hasta la Fecha"
-msgctxt "field:calendar.rrule,until_date:"
+msgctxt "field:calendar.event.rrule,until_date:"
msgid "Is Date"
-msgstr "Es Fecha"
+msgstr "Esta Fecha"
-msgctxt "field:calendar.rrule,wkst:"
+msgctxt "field:calendar.event.rrule,wkst:"
msgid "Week Day"
msgstr "Día de la Semana"
-msgctxt "field:calendar.rrule,write_date:"
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha de Modificación"
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr "Modificado por Usuario"
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr "Fecha de Creación"
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Creado por Usuario"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.location,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,write_date:"
msgid "Write Date"
msgstr "Fecha de Modificación"
-msgctxt "field:calendar.rrule,write_uid:"
+msgctxt "field:calendar.location,write_uid:"
msgid "Write User"
msgstr "Modificado por Usuario"
@@ -778,27 +770,29 @@ msgctxt "help:calendar.calendar,owner:"
msgid "The user must have an email"
msgstr "El usuario debe tener un email"
-msgctxt "help:calendar.date,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.event,uuid:"
msgid "Universally Unique Identifier"
msgstr "Idenitificador Universal Único"
-msgctxt "help:calendar.rrule,until_date:"
+msgctxt "help:calendar.event.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.event.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 "model:calendar.alarm,name:"
-msgid "Alarm"
-msgstr "Alarma"
+msgctxt "help:calendar.event.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 "model:calendar.attendee,name:"
-msgid "Attendee"
-msgstr "Asistente"
+msgctxt "help:calendar.event.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.calendar,name:"
msgid "Calendar"
@@ -816,10 +810,6 @@ msgctxt "model:calendar.category,name:"
msgid "Category"
msgstr "Categoría"
-msgctxt "model:calendar.date,name:"
-msgid "Calendar Date"
-msgstr "Fecha Calendario"
-
msgctxt "model:calendar.event,name:"
msgid "Event"
msgstr "Evento"
@@ -856,10 +846,6 @@ msgctxt "model:calendar.location,name:"
msgid "Location"
msgstr "Lugar"
-msgctxt "model:calendar.rrule,name:"
-msgid "Recurrence Rule"
-msgstr "Regla de Repetición"
-
msgctxt "model:ir.action,name:act_calendar_form"
msgid "Calendars"
msgstr "Calendarios"
@@ -888,30 +874,6 @@ msgctxt "model:res.group,name:group_calendar_admin"
msgid "Calendar Administration"
msgstr "Administración Calendario"
-msgctxt "selection:calendar.attendee,status:"
-msgid ""
-msgstr "Punto de Orden"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Accepted"
-msgstr "Aceptado"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Declined"
-msgstr "Declinado"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Delegated"
-msgstr "Delegado"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Needs Action"
-msgstr "Necesita una Acción"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Tentative"
-msgstr "Tentativa"
-
msgctxt "selection:calendar.event,classification:"
msgid "Confidential"
msgstr "Confidencial"
@@ -924,6 +886,7 @@ msgctxt "selection:calendar.event,classification:"
msgid "Public"
msgstr "Público"
+#, fuzzy
msgctxt "selection:calendar.event,status:"
msgid ""
msgstr "Punto de Orden"
@@ -948,62 +911,148 @@ msgctxt "selection:calendar.event,transp:"
msgid "Transparent"
msgstr "Transparente"
-msgctxt "selection:calendar.rrule,freq:"
+#, fuzzy
+msgctxt "selection:calendar.event.attendee,status:"
+msgid ""
+msgstr "Punto de Orden"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Accepted"
+msgstr "Aceptado"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Declined"
+msgstr "Declinado"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Delegated"
+msgstr "Delegado"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Needs Action"
+msgstr "Necesita una Acción"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Tentative"
+msgstr "Tentativa"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Daily"
+msgstr "Diario"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Hourly"
+msgstr "Cada Hora"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Minutely"
+msgstr "Cada Minuto"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Monthly"
+msgstr "Mensualmente"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Secondly"
+msgstr "En segundo lugar"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Daily"
msgstr "Diario"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Hourly"
msgstr "Cada Hora"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Minutely"
msgstr "Cada Minuto"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Monthly"
msgstr "Mensualmente"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Secondly"
msgstr "En segundo lugar"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Weekly"
msgstr "Semanalmente"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Yearly"
msgstr "Anualmente"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Friday"
msgstr "Viernes"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Monday"
msgstr "Lunes"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Saturday"
msgstr "Sábado"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Sunday"
msgstr "Domingo"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Thursday"
msgstr "Jueves"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Tuesday"
msgstr "Martes"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Wednesday"
msgstr "Miércoles"
+#, fuzzy
+msgctxt "view:calendar.calendar:"
+msgid "Access Permissions"
+msgstr "Permisos de Acceso"
+
msgctxt "view:calendar.calendar:"
msgid "Calendar"
msgstr "Calendario"
@@ -1016,10 +1065,6 @@ msgctxt "view:calendar.calendar:"
msgid "General"
msgstr "General"
-msgctxt "view:calendar.calendar:"
-msgid "Security"
-msgstr "Seguridad"
-
msgctxt "view:calendar.category:"
msgid "Categories"
msgstr "Categorías"
@@ -1092,10 +1137,6 @@ msgctxt "view:calendar.event:"
msgid "Occurences"
msgstr "Ocurrencias"
-msgctxt "view:calendar.event:"
-msgid "Recurrences"
-msgstr "Repeticiones"
-
msgctxt "view:calendar.location:"
msgid "Location"
msgstr "Lugar"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index aaf4fd4..bc47ca4 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -3,132 +3,124 @@ msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:calendar.calendar:"
-msgid "A user can have only one calendar!"
+msgid "A user can have only one calendar."
msgstr "Un usuario sólo puede tener un calendario."
msgctxt "error:calendar.calendar:"
-msgid "The name of calendar must be unique!"
+msgid "Calendar name \"%s\" can not end with .ics"
+msgstr "El nombre del calendario \"%s\" no debe terminar con la extensión .ics"
+
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique."
msgstr "El nombre del calendario debe ser único."
msgctxt "error:calendar.category:"
-msgid "The name of calendar category must be unique!"
+msgid "The name of calendar category must be unique."
msgstr "El nombre de la categoría del calendario debe ser único."
-msgctxt "error:calendar.event:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Una recurrencia no puede ser recurrente."
-
-msgctxt "error:calendar.event:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "UUID y recurrencia deben ser únicos en un calendario."
-
-msgctxt "error:calendar.location:"
-msgid "The name of calendar location must be unique!"
-msgstr "El nombre de la ubicación del calendario debe ser único."
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Day\""
-msgstr "\"Por día\" no es correcto."
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Hour\""
-msgstr "\"Por hora\" no es correcto."
+msgctxt "error:calendar.event.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.rrule:"
-msgid "Invalid \"By Minute\""
-msgstr "\"Por minuto\" no es correcto."
+msgctxt "error:calendar.event.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.rrule:"
-msgid "Invalid \"By Month Day\""
-msgstr "\"Por día del mes\" no es correcto."
+msgctxt "error:calendar.event.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.rrule:"
-msgid "Invalid \"By Month\""
-msgstr "\"Por mes\" no es correcto."
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Position\""
-msgstr "\"Por posición\" no es correcto."
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Second\""
-msgstr "\"Por segundos\" no es correcto."
+msgctxt "error:calendar.event.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.rrule:"
-msgid "Invalid \"By Week Number\""
-msgstr "\"Por número de semana\" no es correcto."
+msgctxt "error:calendar.event.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.rrule:"
-msgid "Invalid \"By Year Day\""
-msgstr "\"Por día del año\" no es correcto."
+msgctxt "error:calendar.event.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.rrule:"
-msgid "Only one of \"until\" and \"count\" can be set!"
-msgstr "Sólo se puede usar o \"Hasta\" o \"Número de veces\"."
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "El campo \"por segundo\" de la regla de recurrencia \"%s\" no es correcto."
-msgctxt "field:calendar.alarm,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
+msgctxt "error:calendar.event.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 "field:calendar.alarm,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
+msgctxt "error:calendar.event.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 "field:calendar.alarm,id:"
-msgid "ID"
-msgstr "ID"
+msgctxt "error:calendar.event.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Define un \"hasta\" y un \"contador\"."
-msgctxt "field:calendar.alarm,rec_name:"
-msgid "Name"
-msgstr "Nombre"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "El campo \"por dia\" de la regla de recurrencia \"%s\" no es correcto."
-msgctxt "field:calendar.alarm,valarm:"
-msgid "valarm"
-msgstr "valarm"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "El campo \"por hora\" de la regla de recurrencia \"%s\" no es correcto."
-msgctxt "field:calendar.alarm,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "El campo \"por minuto\" de la regla de recurrencia \"%s\" no es correcto."
-msgctxt "field:calendar.alarm,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
+msgctxt "error:calendar.event.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 "field:calendar.attendee,attendee:"
-msgid "attendee"
-msgstr "asistentes"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "El campo \"por mes\" de la regla de recurrencia \"%s\" no es correcto."
-msgctxt "field:calendar.attendee,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
+msgctxt "error:calendar.event.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 "field:calendar.attendee,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "El campo \"por segundo\" de la regla de recurrencia \"%s\" no es correcto."
-msgctxt "field:calendar.attendee,email:"
-msgid "Email"
-msgstr "Correo electrónico"
+msgctxt "error:calendar.event.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 "field:calendar.attendee,id:"
-msgid "ID"
-msgstr "ID"
+msgctxt "error:calendar.event.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 "field:calendar.attendee,rec_name:"
-msgid "Name"
-msgstr "Nombre"
+msgctxt "error:calendar.event.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Define un \"hasta\" y un \"contador\"."
-msgctxt "field:calendar.attendee,status:"
-msgid "Participation Status"
-msgstr "Estado de participación"
+msgctxt "error:calendar.event:"
+msgid "Recurrence \"%s\" can not be recurrent."
+msgstr "La recurrencia \"%s\" no puede ser recurrente."
-msgctxt "field:calendar.attendee,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr "UUID y la recurrencia deber ser únicos en el calendario."
-msgctxt "field:calendar.attendee,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique."
+msgstr "El nombre de la ubicación del calendario debe ser único."
msgctxt "field:calendar.calendar,create_date:"
msgid "Create Date"
@@ -266,38 +258,6 @@ msgctxt "field:calendar.category,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.date,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:calendar.date,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
-
-msgctxt "field:calendar.date,date:"
-msgid "Is Date"
-msgstr "Es fecha"
-
-msgctxt "field:calendar.date,datetime:"
-msgid "Date"
-msgstr "Fecha"
-
-msgctxt "field:calendar.date,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.date,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.date,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:calendar.date,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
-
msgctxt "field:calendar.event,alarms:"
msgid "Alarms"
msgstr "Alarmas"
@@ -466,10 +426,6 @@ msgctxt "field:calendar.event-calendar.category,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.event.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Alarma del calendario"
-
msgctxt "field:calendar.event.alarm,create_date:"
msgid "Create Date"
msgstr "Fecha creación"
@@ -490,6 +446,10 @@ msgctxt "field:calendar.event.alarm,rec_name:"
msgid "Name"
msgstr "Nombre"
+msgctxt "field:calendar.event.alarm,valarm:"
+msgid "valarm"
+msgstr "valarm"
+
msgctxt "field:calendar.event.alarm,write_date:"
msgid "Write Date"
msgstr "Fecha modificación"
@@ -498,9 +458,9 @@ msgctxt "field:calendar.event.alarm,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.event.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Calendario de asistentes"
+msgctxt "field:calendar.event.attendee,attendee:"
+msgid "attendee"
+msgstr "asistente"
msgctxt "field:calendar.event.attendee,create_date:"
msgid "Create Date"
@@ -510,6 +470,10 @@ msgctxt "field:calendar.event.attendee,create_uid:"
msgid "Create User"
msgstr "Usuario creación"
+msgctxt "field:calendar.event.attendee,email:"
+msgid "Email"
+msgstr "Email"
+
msgctxt "field:calendar.event.attendee,event:"
msgid "Event"
msgstr "Evento"
@@ -522,6 +486,10 @@ msgctxt "field:calendar.event.attendee,rec_name:"
msgid "Name"
msgstr "Nombre"
+msgctxt "field:calendar.event.attendee,status:"
+msgid "Participation Status"
+msgstr "Estat de participacions"
+
msgctxt "field:calendar.event.attendee,write_date:"
msgid "Write Date"
msgstr "Fecha modificación"
@@ -530,10 +498,6 @@ msgctxt "field:calendar.event.attendee,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.event.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha calendario"
-
msgctxt "field:calendar.event.exdate,create_date:"
msgid "Create Date"
msgstr "Fecha creación"
@@ -542,6 +506,14 @@ msgctxt "field:calendar.event.exdate,create_uid:"
msgid "Create User"
msgstr "Usuario creación"
+msgctxt "field:calendar.event.exdate,date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.event.exdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
msgctxt "field:calendar.event.exdate,event:"
msgid "Event"
msgstr "Evento"
@@ -562,9 +534,45 @@ msgctxt "field:calendar.event.exdate,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.event.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrencia"
+msgctxt "field:calendar.event.exrule,byday:"
+msgid "By Day"
+msgstr "Por día"
+
+msgctxt "field:calendar.event.exrule,byhour:"
+msgid "By Hour"
+msgstr "Por hora"
+
+msgctxt "field:calendar.event.exrule,byminute:"
+msgid "By Minute"
+msgstr "Por minuto"
+
+msgctxt "field:calendar.event.exrule,bymonth:"
+msgid "By Month"
+msgstr "Por mes"
+
+msgctxt "field:calendar.event.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Por día del mes"
+
+msgctxt "field:calendar.event.exrule,bysecond:"
+msgid "By Second"
+msgstr "Por segundo"
+
+msgctxt "field:calendar.event.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Por ubicación"
+
+msgctxt "field:calendar.event.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Por número de la semana"
+
+msgctxt "field:calendar.event.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Por día del año"
+
+msgctxt "field:calendar.event.exrule,count:"
+msgid "Count"
+msgstr "Contador"
msgctxt "field:calendar.event.exrule,create_date:"
msgid "Create Date"
@@ -578,14 +586,34 @@ msgctxt "field:calendar.event.exrule,event:"
msgid "Event"
msgstr "Evento"
+msgctxt "field:calendar.event.exrule,freq:"
+msgid "Frequency"
+msgstr "Frecuencia"
+
msgctxt "field:calendar.event.exrule,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:calendar.event.exrule,interval:"
+msgid "Interval"
+msgstr "Intérvalo"
+
msgctxt "field:calendar.event.exrule,rec_name:"
msgid "Name"
msgstr "Nombre"
+msgctxt "field:calendar.event.exrule,until:"
+msgid "Until Date"
+msgstr "Hasta la fecha"
+
+msgctxt "field:calendar.event.exrule,until_date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.event.exrule,wkst:"
+msgid "Week Day"
+msgstr "Día de la semana"
+
msgctxt "field:calendar.event.exrule,write_date:"
msgid "Write Date"
msgstr "Fecha modificación"
@@ -594,10 +622,6 @@ msgctxt "field:calendar.event.exrule,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.event.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha calendario"
-
msgctxt "field:calendar.event.rdate,create_date:"
msgid "Create Date"
msgstr "Fecha creación"
@@ -606,6 +630,14 @@ msgctxt "field:calendar.event.rdate,create_uid:"
msgid "Create User"
msgstr "Usuario creación"
+msgctxt "field:calendar.event.rdate,date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.event.rdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
msgctxt "field:calendar.event.rdate,event:"
msgid "Event"
msgstr "Evento"
@@ -626,147 +658,119 @@ msgctxt "field:calendar.event.rdate,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
-msgctxt "field:calendar.event.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrencia"
-
-msgctxt "field:calendar.event.rrule,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:calendar.event.rrule,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
-
-msgctxt "field:calendar.event.rrule,event:"
-msgid "Event"
-msgstr "Evento"
-
-msgctxt "field:calendar.event.rrule,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.event.rrule,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.event.rrule,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:calendar.event.rrule,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
-
-msgctxt "field:calendar.location,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:calendar.location,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
-
-msgctxt "field:calendar.location,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.location,name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.location,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.location,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:calendar.location,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
-
-msgctxt "field:calendar.rrule,byday:"
+msgctxt "field:calendar.event.rrule,byday:"
msgid "By Day"
msgstr "Por día"
-msgctxt "field:calendar.rrule,byhour:"
+msgctxt "field:calendar.event.rrule,byhour:"
msgid "By Hour"
msgstr "Por hora"
-msgctxt "field:calendar.rrule,byminute:"
+msgctxt "field:calendar.event.rrule,byminute:"
msgid "By Minute"
msgstr "Por minuto"
-msgctxt "field:calendar.rrule,bymonth:"
+msgctxt "field:calendar.event.rrule,bymonth:"
msgid "By Month"
msgstr "Por mes"
-msgctxt "field:calendar.rrule,bymonthday:"
+msgctxt "field:calendar.event.rrule,bymonthday:"
msgid "By Month Day"
msgstr "Por día del mes"
-msgctxt "field:calendar.rrule,bysecond:"
+msgctxt "field:calendar.event.rrule,bysecond:"
msgid "By Second"
msgstr "Por segundo"
-msgctxt "field:calendar.rrule,bysetpos:"
+msgctxt "field:calendar.event.rrule,bysetpos:"
msgid "By Position"
-msgstr "Por posición"
+msgstr "Por ubicación"
-msgctxt "field:calendar.rrule,byweekno:"
+msgctxt "field:calendar.event.rrule,byweekno:"
msgid "By Week Number"
-msgstr "Por número de semana"
+msgstr "Por número de la semana"
-msgctxt "field:calendar.rrule,byyearday:"
+msgctxt "field:calendar.event.rrule,byyearday:"
msgid "By Year Day"
msgstr "Por día del año"
-msgctxt "field:calendar.rrule,count:"
+msgctxt "field:calendar.event.rrule,count:"
msgid "Count"
-msgstr "Número de veces"
+msgstr "Contador"
-msgctxt "field:calendar.rrule,create_date:"
+msgctxt "field:calendar.event.rrule,create_date:"
msgid "Create Date"
msgstr "Fecha creación"
-msgctxt "field:calendar.rrule,create_uid:"
+msgctxt "field:calendar.event.rrule,create_uid:"
msgid "Create User"
msgstr "Usuario creación"
-msgctxt "field:calendar.rrule,freq:"
+msgctxt "field:calendar.event.rrule,event:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.rrule,freq:"
msgid "Frequency"
msgstr "Frecuencia"
-msgctxt "field:calendar.rrule,id:"
+msgctxt "field:calendar.event.rrule,id:"
msgid "ID"
msgstr "ID"
-msgctxt "field:calendar.rrule,interval:"
+msgctxt "field:calendar.event.rrule,interval:"
msgid "Interval"
-msgstr "Intervalo"
+msgstr "Intérvalo"
-msgctxt "field:calendar.rrule,rec_name:"
+msgctxt "field:calendar.event.rrule,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.rrule,until:"
+msgctxt "field:calendar.event.rrule,until:"
msgid "Until Date"
msgstr "Hasta la fecha"
-msgctxt "field:calendar.rrule,until_date:"
+msgctxt "field:calendar.event.rrule,until_date:"
msgid "Is Date"
-msgstr "Es fecha"
+msgstr "Es una fecha"
-msgctxt "field:calendar.rrule,wkst:"
+msgctxt "field:calendar.event.rrule,wkst:"
msgid "Week Day"
msgstr "Día de la semana"
-msgctxt "field:calendar.rrule,write_date:"
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.location,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,write_date:"
msgid "Write Date"
msgstr "Fecha modificación"
-msgctxt "field:calendar.rrule,write_uid:"
+msgctxt "field:calendar.location,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
@@ -778,25 +782,25 @@ msgctxt "help:calendar.calendar,owner:"
msgid "The user must have an email"
msgstr "El usuario debe tener un correo electrónico."
-msgctxt "help:calendar.date,date:"
-msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr "Ignora la hora del campo \"Fecha\" y trata sólo la fecha."
-
msgctxt "help:calendar.event,uuid:"
msgid "Universally Unique Identifier"
msgstr "Identificador universal único."
-msgctxt "help:calendar.rrule,until_date:"
+msgctxt "help:calendar.event.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.event.exrule,until_date:"
msgid "Ignore time of field \"Until Date\", but handle as date only."
-msgstr "Ignora la hora del campo \"Hasta la fecha\" y trata sólo la fecha."
+msgstr "Ingnora la hora del campo \"Hasta la fecha\", pero usar como única fecha."
-msgctxt "model:calendar.alarm,name:"
-msgid "Alarm"
-msgstr "Alarma"
+msgctxt "help:calendar.event.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 "model:calendar.attendee,name:"
-msgid "Attendee"
-msgstr "Asistentes"
+msgctxt "help:calendar.event.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.calendar,name:"
msgid "Calendar"
@@ -814,10 +818,6 @@ msgctxt "model:calendar.category,name:"
msgid "Category"
msgstr "Categoría"
-msgctxt "model:calendar.date,name:"
-msgid "Calendar Date"
-msgstr "Fecha calendario"
-
msgctxt "model:calendar.event,name:"
msgid "Event"
msgstr "Evento"
@@ -854,10 +854,6 @@ msgctxt "model:calendar.location,name:"
msgid "Location"
msgstr "Ubicación"
-msgctxt "model:calendar.rrule,name:"
-msgid "Recurrence Rule"
-msgstr "Regla de recurrencia"
-
msgctxt "model:ir.action,name:act_calendar_form"
msgid "Calendars"
msgstr "Calendarios"
@@ -886,30 +882,6 @@ msgctxt "model:res.group,name:group_calendar_admin"
msgid "Calendar Administration"
msgstr "Administración de calendario"
-msgctxt "selection:calendar.attendee,status:"
-msgid ""
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Accepted"
-msgstr "Aceptada"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Declined"
-msgstr "Rehusada"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Delegated"
-msgstr "Delegada"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Needs Action"
-msgstr "Necesita acción"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Tentative"
-msgstr "Tentativa"
-
msgctxt "selection:calendar.event,classification:"
msgid "Confidential"
msgstr "Confidencial"
@@ -946,63 +918,147 @@ msgctxt "selection:calendar.event,transp:"
msgid "Transparent"
msgstr "Transparente"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Accepted"
+msgstr "Acceptado"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Declined"
+msgstr "Rechazar"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Delegated"
+msgstr "Delegar"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Needs Action"
+msgstr "Necesidad Acción"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Tentative"
+msgstr "Tentativo"
+
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Daily"
msgstr "Diariamente"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Hourly"
msgstr "Cada hora"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Minutely"
msgstr "Cada minuto"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Monthly"
msgstr "Mensualmente"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Secondly"
msgstr "Cada segundo"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Weekly"
msgstr "Semanalmente"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Yearly"
msgstr "Anualmente"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Friday"
msgstr "Viernes"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Monday"
msgstr "Lunes"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Saturday"
msgstr "Sábado"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Sunday"
msgstr "Domingo"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Thursday"
msgstr "Jueves"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Tuesday"
msgstr "Martes"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Daily"
+msgstr "Diariamente"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Minutely"
+msgstr "Cada minuto"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Monthly"
+msgstr "Mensualmente"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Secondly"
+msgstr "Cada segundo"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Wednesday"
msgstr "Miércoles"
msgctxt "view:calendar.calendar:"
+msgid "Access Permissions"
+msgstr "Permisos de acceso"
+
+msgctxt "view:calendar.calendar:"
msgid "Calendar"
msgstr "Calendario"
@@ -1014,10 +1070,6 @@ msgctxt "view:calendar.calendar:"
msgid "General"
msgstr "General"
-msgctxt "view:calendar.calendar:"
-msgid "Security"
-msgstr "Seguridad"
-
msgctxt "view:calendar.category:"
msgid "Categories"
msgstr "Categorías"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index 19822de..7ac841e 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -3,196 +3,112 @@ msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:calendar.calendar:"
-msgid "A user can have only one calendar!"
-msgstr "Un utilisateur ne peut avoir qu'un seul calendrier !"
+msgid "A user can have only one calendar."
+msgstr "Un utilisteur ne peut avoir qu'un seul calendrier"
msgctxt "error:calendar.calendar:"
-msgid "A user can have only one calendar!"
-msgstr "Un utilisateur ne peut avoir qu'un seul calendrier !"
+msgid "Calendar name \"%s\" can not end with .ics"
+msgstr "Le nom de calendrier \"%s\" ne peut terminer par \".ics\""
msgctxt "error:calendar.calendar:"
-msgid "The name of calendar must be unique!"
-msgstr "Le nom du calendrier doit être unique !"
-
-msgctxt "error:calendar.calendar:"
-msgid "The name of calendar must be unique!"
-msgstr "Le nom du calendrier doit être unique !"
-
-msgctxt "error:calendar.category:"
-msgid "The name of calendar category must be unique!"
-msgstr "Le nom de la catégorie de calendrier doit être unique"
+msgid "The name of calendar must be unique."
+msgstr "le nom du calendrier doit être unique."
msgctxt "error:calendar.category:"
-msgid "The name of calendar category must be unique!"
-msgstr "Le nom de la catégorie de calendrier doit être unique"
-
-msgctxt "error:calendar.event:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Une récurrence ne peut pas être récurrente !"
-
-msgctxt "error:calendar.event:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Une récurrence ne peut pas être récurrente !"
-
-msgctxt "error:calendar.event:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "UUID et récurrence doivent être uniques sur un calendrier !"
-
-msgctxt "error:calendar.event:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "UUID et récurrence doivent être uniques sur un calendrier !"
-
-msgctxt "error:calendar.location:"
-msgid "The name of calendar location must be unique!"
-msgstr "Le nom de l'emplacement doit être unique !"
-
-msgctxt "error:calendar.location:"
-msgid "The name of calendar location must be unique!"
-msgstr "Le nom de l'emplacement doit être unique !"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Day\""
-msgstr "\"Par jour\" invalide"
+msgid "The name of calendar category must be unique."
+msgstr "Le nom du calendrier doit être unique."
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Day\""
-msgstr "\"Par jour\" invalide"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "\"Par jour\" invalide dans la règle de récurrence \"%s\"."
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Hour\""
-msgstr "\"Par heure\" invalide"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "\"Par heure\" invalide dans la règle de récurrence \"%s\"."
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Hour\""
-msgstr "\"Par heure\" invalide"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "\"Par minute\" invalide dans la règle de récurrence \"%s\"."
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Minute\""
-msgstr "\"Par minute\" invalide"
+msgctxt "error:calendar.event.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.rrule:"
-msgid "Invalid \"By Minute\""
-msgstr "\"Par minute\" invalide"
+msgctxt "error:calendar.event.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.rrule:"
-msgid "Invalid \"By Month Day\""
-msgstr "\"Par jour du mois\" invalide"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "\"Par position\" invalide dans la règle de récurrence \"%s\"."
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month Day\""
-msgstr "\"Par jour du mois\" invalide"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "\"Par seconde\" invalide dans la règle de récurrence \"%s\"."
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month\""
-msgstr "\"Par mois\" invalide"
+msgctxt "error:calendar.event.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.rrule:"
-msgid "Invalid \"By Month\""
-msgstr "\"Par mois\" invalide"
+msgctxt "error:calendar.event.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.rrule:"
-msgid "Invalid \"By Position\""
-msgstr "\"Par position\" invalide"
+msgctxt "error:calendar.event.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.rrule:"
-msgid "Invalid \"By Position\""
-msgstr "\"Par position\" invalide"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "\"Par jour\" invalide dans la règle de récurrence \"%s\"."
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Second\""
-msgstr "\"Par seconde\" invalide"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "\"Par heure\" invalide dans la règle de récurrence \"%s\"."
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Second\""
-msgstr "\"Par seconde\" invalide"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "\"Par minute\" invalide dans la règle de récurrence \"%s\"."
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Week Number\""
-msgstr "\"Par jour de la semaine\" invalide"
+msgctxt "error:calendar.event.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.rrule:"
-msgid "Invalid \"By Week Number\""
-msgstr "\"Par jour de la semaine\" invalide"
+msgctxt "error:calendar.event.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.rrule:"
-msgid "Invalid \"By Year Day\""
-msgstr "\"Par jour de l'année\" invalide"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "\"Par position\" invalide dans la règle de récurrence \"%s\"."
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Year Day\""
-msgstr "\"Par jour de l'année\" invalide"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "\"Par seconde\" invalide dans la règle de récurrence \"%s\"."
-msgctxt "error:calendar.rrule:"
-msgid "Only one of \"until\" and \"count\" can be set!"
-msgstr "\"Date de fin\" et \"Répétitions\" ne peuvent être remplis en même temps !"
-
-msgctxt "error:calendar.rrule:"
-msgid "Only one of \"until\" and \"count\" can be set!"
-msgstr "\"Date de fin\" et \"Répétitions\" ne peuvent être remplis en même temps !"
-
-msgctxt "field:calendar.alarm,create_date:"
-msgid "Create Date"
-msgstr "Date de création"
-
-msgctxt "field:calendar.alarm,create_uid:"
-msgid "Create User"
-msgstr "Créé par"
-
-msgctxt "field:calendar.alarm,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.alarm,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:calendar.alarm,valarm:"
-msgid "valarm"
-msgstr "valarm"
-
-msgctxt "field:calendar.alarm,write_date:"
-msgid "Write Date"
-msgstr "Date de mise à jour"
-
-msgctxt "field:calendar.alarm,write_uid:"
-msgid "Write User"
-msgstr "Mis à jour par"
-
-msgctxt "field:calendar.attendee,attendee:"
-msgid "attendee"
-msgstr "participant"
-
-msgctxt "field:calendar.attendee,create_date:"
-msgid "Create Date"
-msgstr "Date de création"
-
-msgctxt "field:calendar.attendee,create_uid:"
-msgid "Create User"
-msgstr "Créé par"
-
-msgctxt "field:calendar.attendee,email:"
-msgid "Email"
-msgstr "E-mail"
+msgctxt "error:calendar.event.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 "field:calendar.attendee,id:"
-msgid "ID"
-msgstr "ID"
+msgctxt "error:calendar.event.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 "field:calendar.attendee,rec_name:"
-msgid "Name"
-msgstr "Nom"
+msgctxt "error:calendar.event.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "\"Date de fin\" et \"Répétitions\" sont mutuellement exclusifs"
-msgctxt "field:calendar.attendee,status:"
-msgid "Participation Status"
-msgstr "Statut de participation"
+msgctxt "error:calendar.event:"
+msgid "Recurrence \"%s\" can not be recurrent."
+msgstr "La récurrence \"%s\" ne peut pas être récurrente."
-msgctxt "field:calendar.attendee,write_date:"
-msgid "Write Date"
-msgstr "Date de mise à jour"
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr "UUID et récurence doivent être unique dans un calendrier."
-msgctxt "field:calendar.attendee,write_uid:"
-msgid "Write User"
-msgstr "Mis à jour par"
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique."
+msgstr "Le nom de l'emplacement doit être unique."
msgctxt "field:calendar.calendar,create_date:"
msgid "Create Date"
@@ -330,38 +246,6 @@ msgctxt "field:calendar.category,write_uid:"
msgid "Write User"
msgstr "Mis à jour par"
-msgctxt "field:calendar.date,create_date:"
-msgid "Create Date"
-msgstr "Date de création"
-
-msgctxt "field:calendar.date,create_uid:"
-msgid "Create User"
-msgstr "Créé par"
-
-msgctxt "field:calendar.date,date:"
-msgid "Is Date"
-msgstr "Est une date"
-
-msgctxt "field:calendar.date,datetime:"
-msgid "Date"
-msgstr "Date"
-
-msgctxt "field:calendar.date,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.date,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:calendar.date,write_date:"
-msgid "Write Date"
-msgstr "Date de mise à jour"
-
-msgctxt "field:calendar.date,write_uid:"
-msgid "Write User"
-msgstr "Mis à jour par"
-
msgctxt "field:calendar.event,alarms:"
msgid "Alarms"
msgstr "Alarmes"
@@ -530,10 +414,6 @@ msgctxt "field:calendar.event-calendar.category,write_uid:"
msgid "Write User"
msgstr "Mis à jour par"
-msgctxt "field:calendar.event.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Alarme calendrier"
-
msgctxt "field:calendar.event.alarm,create_date:"
msgid "Create Date"
msgstr "Date de création"
@@ -554,6 +434,10 @@ msgctxt "field:calendar.event.alarm,rec_name:"
msgid "Name"
msgstr "Nom"
+msgctxt "field:calendar.event.alarm,valarm:"
+msgid "valarm"
+msgstr "valarm"
+
msgctxt "field:calendar.event.alarm,write_date:"
msgid "Write Date"
msgstr "Date de mise à jour"
@@ -562,9 +446,9 @@ msgctxt "field:calendar.event.alarm,write_uid:"
msgid "Write User"
msgstr "Mis à jour par"
-msgctxt "field:calendar.event.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Participant calendrier"
+msgctxt "field:calendar.event.attendee,attendee:"
+msgid "attendee"
+msgstr "participant"
msgctxt "field:calendar.event.attendee,create_date:"
msgid "Create Date"
@@ -574,6 +458,10 @@ msgctxt "field:calendar.event.attendee,create_uid:"
msgid "Create User"
msgstr "Créé par"
+msgctxt "field:calendar.event.attendee,email:"
+msgid "Email"
+msgstr "E-mail"
+
msgctxt "field:calendar.event.attendee,event:"
msgid "Event"
msgstr "Événement"
@@ -586,6 +474,10 @@ msgctxt "field:calendar.event.attendee,rec_name:"
msgid "Name"
msgstr "Nom"
+msgctxt "field:calendar.event.attendee,status:"
+msgid "Participation Status"
+msgstr "Statut de participation"
+
msgctxt "field:calendar.event.attendee,write_date:"
msgid "Write Date"
msgstr "Date de mise à jour"
@@ -594,10 +486,6 @@ msgctxt "field:calendar.event.attendee,write_uid:"
msgid "Write User"
msgstr "Mis à jour par"
-msgctxt "field:calendar.event.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Date calendrier"
-
msgctxt "field:calendar.event.exdate,create_date:"
msgid "Create Date"
msgstr "Date de création"
@@ -606,6 +494,14 @@ msgctxt "field:calendar.event.exdate,create_uid:"
msgid "Create User"
msgstr "Créé par"
+msgctxt "field:calendar.event.exdate,date:"
+msgid "Is Date"
+msgstr "Est une date"
+
+msgctxt "field:calendar.event.exdate,datetime:"
+msgid "Date"
+msgstr "Date"
+
msgctxt "field:calendar.event.exdate,event:"
msgid "Event"
msgstr "Événement"
@@ -626,9 +522,45 @@ msgctxt "field:calendar.event.exdate,write_uid:"
msgid "Write User"
msgstr "Mis à jour par"
-msgctxt "field:calendar.event.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Règle de récurrence"
+msgctxt "field:calendar.event.exrule,byday:"
+msgid "By Day"
+msgstr "Par jour"
+
+msgctxt "field:calendar.event.exrule,byhour:"
+msgid "By Hour"
+msgstr "Par heure"
+
+msgctxt "field:calendar.event.exrule,byminute:"
+msgid "By Minute"
+msgstr "Par minute"
+
+msgctxt "field:calendar.event.exrule,bymonth:"
+msgid "By Month"
+msgstr "Par mois"
+
+msgctxt "field:calendar.event.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Par jour du mois"
+
+msgctxt "field:calendar.event.exrule,bysecond:"
+msgid "By Second"
+msgstr "Par seconde"
+
+msgctxt "field:calendar.event.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Par position"
+
+msgctxt "field:calendar.event.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Par numéro de semaine"
+
+msgctxt "field:calendar.event.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Par jour de l'année"
+
+msgctxt "field:calendar.event.exrule,count:"
+msgid "Count"
+msgstr "Répétitions"
msgctxt "field:calendar.event.exrule,create_date:"
msgid "Create Date"
@@ -642,14 +574,34 @@ msgctxt "field:calendar.event.exrule,event:"
msgid "Event"
msgstr "Événement"
+msgctxt "field:calendar.event.exrule,freq:"
+msgid "Frequency"
+msgstr "Fréquence"
+
msgctxt "field:calendar.event.exrule,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:calendar.event.exrule,interval:"
+msgid "Interval"
+msgstr "Intervalle"
+
msgctxt "field:calendar.event.exrule,rec_name:"
msgid "Name"
msgstr "Nom"
+msgctxt "field:calendar.event.exrule,until:"
+msgid "Until Date"
+msgstr "Date de fin"
+
+msgctxt "field:calendar.event.exrule,until_date:"
+msgid "Is Date"
+msgstr "Est une date"
+
+msgctxt "field:calendar.event.exrule,wkst:"
+msgid "Week Day"
+msgstr "Jour de la semaine"
+
msgctxt "field:calendar.event.exrule,write_date:"
msgid "Write Date"
msgstr "Date de mise à jour"
@@ -658,10 +610,6 @@ msgctxt "field:calendar.event.exrule,write_uid:"
msgid "Write User"
msgstr "Mis à jour par"
-msgctxt "field:calendar.event.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Date calendrier"
-
msgctxt "field:calendar.event.rdate,create_date:"
msgid "Create Date"
msgstr "Date de création"
@@ -670,6 +618,14 @@ msgctxt "field:calendar.event.rdate,create_uid:"
msgid "Create User"
msgstr "Créé par"
+msgctxt "field:calendar.event.rdate,date:"
+msgid "Is Date"
+msgstr "Est une date"
+
+msgctxt "field:calendar.event.rdate,datetime:"
+msgid "Date"
+msgstr "Date"
+
msgctxt "field:calendar.event.rdate,event:"
msgid "Event"
msgstr "Événement"
@@ -690,147 +646,119 @@ msgctxt "field:calendar.event.rdate,write_uid:"
msgid "Write User"
msgstr "Mis à jour par"
-msgctxt "field:calendar.event.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Règle de récurrence"
-
-msgctxt "field:calendar.event.rrule,create_date:"
-msgid "Create Date"
-msgstr "Date de création"
-
-msgctxt "field:calendar.event.rrule,create_uid:"
-msgid "Create User"
-msgstr "Créé par"
-
-msgctxt "field:calendar.event.rrule,event:"
-msgid "Event"
-msgstr "Événement"
-
-msgctxt "field:calendar.event.rrule,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.event.rrule,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:calendar.event.rrule,write_date:"
-msgid "Write Date"
-msgstr "Date de mise à jour"
-
-msgctxt "field:calendar.event.rrule,write_uid:"
-msgid "Write User"
-msgstr "Mis à jour par"
-
-msgctxt "field:calendar.location,create_date:"
-msgid "Create Date"
-msgstr "Date de création"
-
-msgctxt "field:calendar.location,create_uid:"
-msgid "Create User"
-msgstr "Créé par"
-
-msgctxt "field:calendar.location,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.location,name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:calendar.location,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:calendar.location,write_date:"
-msgid "Write Date"
-msgstr "Date de mise à jour"
-
-msgctxt "field:calendar.location,write_uid:"
-msgid "Write User"
-msgstr "Mis à jour par"
-
-msgctxt "field:calendar.rrule,byday:"
+msgctxt "field:calendar.event.rrule,byday:"
msgid "By Day"
msgstr "Par jour"
-msgctxt "field:calendar.rrule,byhour:"
+msgctxt "field:calendar.event.rrule,byhour:"
msgid "By Hour"
msgstr "Par heure"
-msgctxt "field:calendar.rrule,byminute:"
+msgctxt "field:calendar.event.rrule,byminute:"
msgid "By Minute"
msgstr "Par minute"
-msgctxt "field:calendar.rrule,bymonth:"
+msgctxt "field:calendar.event.rrule,bymonth:"
msgid "By Month"
msgstr "Par mois"
-msgctxt "field:calendar.rrule,bymonthday:"
+msgctxt "field:calendar.event.rrule,bymonthday:"
msgid "By Month Day"
msgstr "Par jour du mois"
-msgctxt "field:calendar.rrule,bysecond:"
+msgctxt "field:calendar.event.rrule,bysecond:"
msgid "By Second"
msgstr "Par seconde"
-msgctxt "field:calendar.rrule,bysetpos:"
+msgctxt "field:calendar.event.rrule,bysetpos:"
msgid "By Position"
msgstr "Par position"
-msgctxt "field:calendar.rrule,byweekno:"
+msgctxt "field:calendar.event.rrule,byweekno:"
msgid "By Week Number"
msgstr "Par numéro de semaine"
-msgctxt "field:calendar.rrule,byyearday:"
+msgctxt "field:calendar.event.rrule,byyearday:"
msgid "By Year Day"
msgstr "Par jour de l'année"
-msgctxt "field:calendar.rrule,count:"
+msgctxt "field:calendar.event.rrule,count:"
msgid "Count"
msgstr "Répétitions"
-msgctxt "field:calendar.rrule,create_date:"
+msgctxt "field:calendar.event.rrule,create_date:"
msgid "Create Date"
msgstr "Date de création"
-msgctxt "field:calendar.rrule,create_uid:"
+msgctxt "field:calendar.event.rrule,create_uid:"
msgid "Create User"
msgstr "Créé par"
-msgctxt "field:calendar.rrule,freq:"
+msgctxt "field:calendar.event.rrule,event:"
+msgid "Event"
+msgstr "Événement"
+
+msgctxt "field:calendar.event.rrule,freq:"
msgid "Frequency"
msgstr "Fréquence"
-msgctxt "field:calendar.rrule,id:"
+msgctxt "field:calendar.event.rrule,id:"
msgid "ID"
msgstr "ID"
-msgctxt "field:calendar.rrule,interval:"
+msgctxt "field:calendar.event.rrule,interval:"
msgid "Interval"
msgstr "Intervalle"
-msgctxt "field:calendar.rrule,rec_name:"
+msgctxt "field:calendar.event.rrule,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.rrule,until:"
+msgctxt "field:calendar.event.rrule,until:"
msgid "Until Date"
msgstr "Date de fin"
-msgctxt "field:calendar.rrule,until_date:"
+msgctxt "field:calendar.event.rrule,until_date:"
msgid "Is Date"
msgstr "Est une date"
-msgctxt "field:calendar.rrule,wkst:"
+msgctxt "field:calendar.event.rrule,wkst:"
msgid "Week Day"
msgstr "Jour de la semaine"
-msgctxt "field:calendar.rrule,write_date:"
+msgctxt "field:calendar.event.rrule,write_date:"
msgid "Write Date"
msgstr "Date de mise à jour"
-msgctxt "field:calendar.rrule,write_uid:"
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.location,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.location,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.location,write_uid:"
msgid "Write User"
msgstr "Mis à jour par"
@@ -842,25 +770,25 @@ msgctxt "help:calendar.calendar,owner:"
msgid "The user must have an email"
msgstr "L'utilisateur doit avoir une adresse mail"
-msgctxt "help:calendar.date,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.event,uuid:"
msgid "Universally Unique Identifier"
msgstr "Identificateur unique universel"
-msgctxt "help:calendar.rrule,until_date:"
+msgctxt "help:calendar.event.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.event.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 "model:calendar.alarm,name:"
-msgid "Alarm"
-msgstr "Alarme"
+msgctxt "help:calendar.event.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 "model:calendar.attendee,name:"
-msgid "Attendee"
-msgstr "Participant"
+msgctxt "help:calendar.event.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.calendar,name:"
msgid "Calendar"
@@ -878,10 +806,6 @@ msgctxt "model:calendar.category,name:"
msgid "Category"
msgstr "Catégorie"
-msgctxt "model:calendar.date,name:"
-msgid "Calendar Date"
-msgstr "Date calendrier"
-
msgctxt "model:calendar.event,name:"
msgid "Event"
msgstr "Événement"
@@ -918,10 +842,6 @@ msgctxt "model:calendar.location,name:"
msgid "Location"
msgstr "Emplacement"
-msgctxt "model:calendar.rrule,name:"
-msgid "Recurrence Rule"
-msgstr "Règle de récurrence"
-
msgctxt "model:ir.action,name:act_calendar_form"
msgid "Calendars"
msgstr "Calendriers"
@@ -950,54 +870,6 @@ msgctxt "model:res.group,name:group_calendar_admin"
msgid "Calendar Administration"
msgstr "Administration calendrier"
-msgctxt "selection:calendar.attendee,status:"
-msgid ""
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid ""
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Accepted"
-msgstr "Accepté"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Accepted"
-msgstr "Accepté"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Declined"
-msgstr "Décliné"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Declined"
-msgstr "Décliné"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Delegated"
-msgstr "Délégué"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Delegated"
-msgstr "Délégué"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Needs Action"
-msgstr "Nécessite une action"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Needs Action"
-msgstr "Nécessite une action"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Tentative"
-msgstr "Tentative"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Tentative"
-msgstr "Tentative"
-
msgctxt "selection:calendar.event,classification:"
msgid "Confidential"
msgstr "Confidentiel"
@@ -1070,117 +942,145 @@ msgctxt "selection:calendar.event,transp:"
msgid "Transparent"
msgstr "transparent"
-msgctxt "selection:calendar.rrule,freq:"
-msgid "Daily"
-msgstr "Journalier"
+msgctxt "selection:calendar.event.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Accepted"
+msgstr "Accepté"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Declined"
+msgstr "Décliné"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Delegated"
+msgstr "Délégué"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Needs Action"
+msgstr "Nécessite une action"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Tentative"
+msgstr "Tentative"
+
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Daily"
msgstr "Journalier"
-msgctxt "selection:calendar.rrule,freq:"
-msgid "Hourly"
-msgstr "Horaire"
-
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Hourly"
msgstr "Horaire"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Minutely"
msgstr "Chaque minute"
-msgctxt "selection:calendar.rrule,freq:"
-msgid "Minutely"
-msgstr "Chaque minute"
-
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Monthly"
msgstr "Mensuel"
-msgctxt "selection:calendar.rrule,freq:"
-msgid "Monthly"
-msgstr "Mensuel"
-
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Secondly"
msgstr "Chaque seconde"
-msgctxt "selection:calendar.rrule,freq:"
-msgid "Secondly"
-msgstr "Chaque seconde"
-
-msgctxt "selection:calendar.rrule,freq:"
-msgid "Weekly"
-msgstr "hebdomadaire"
-
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Weekly"
msgstr "hebdomadaire"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
msgid "Yearly"
msgstr "Annuel"
-msgctxt "selection:calendar.rrule,freq:"
-msgid "Yearly"
-msgstr "Annuel"
-
-msgctxt "selection:calendar.rrule,wkst:"
-msgid "Friday"
-msgstr "Vendredi"
-
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Friday"
msgstr "Vendredi"
-msgctxt "selection:calendar.rrule,wkst:"
-msgid "Monday"
-msgstr "Lundi"
-
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Monday"
msgstr "Lundi"
-msgctxt "selection:calendar.rrule,wkst:"
-msgid "Saturday"
-msgstr "Samedi"
-
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Saturday"
msgstr "Samedi"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Sunday"
msgstr "Dimanche"
-msgctxt "selection:calendar.rrule,wkst:"
-msgid "Sunday"
-msgstr "Dimanche"
-
-msgctxt "selection:calendar.rrule,wkst:"
-msgid "Thursday"
-msgstr "Jeudi"
-
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Thursday"
msgstr "Jeudi"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
msgid "Tuesday"
msgstr "Mardi"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Mercredi"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Daily"
+msgstr "Journalier"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Hourly"
+msgstr "Horaire"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Minutely"
+msgstr "Chaque minute"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Monthly"
+msgstr "Mensuel"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Secondly"
+msgstr "Chaque seconde"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Weekly"
+msgstr "hebdomadaire"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Yearly"
+msgstr "Annuel"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Friday"
+msgstr "Vendredi"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Monday"
+msgstr "Lundi"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Saturday"
+msgstr "Samedi"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Sunday"
+msgstr "Dimanche"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Thursday"
+msgstr "Jeudi"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Tuesday"
msgstr "Mardi"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Wednesday"
msgstr "Mercredi"
-msgctxt "selection:calendar.rrule,wkst:"
-msgid "Wednesday"
-msgstr "Mercredi"
+msgctxt "view:calendar.calendar:"
+msgid "Access Permissions"
+msgstr "Permissions d'accès"
msgctxt "view:calendar.calendar:"
msgid "Calendar"
@@ -1206,14 +1106,6 @@ msgctxt "view:calendar.calendar:"
msgid "General"
msgstr "Général"
-msgctxt "view:calendar.calendar:"
-msgid "Security"
-msgstr "Sécurité"
-
-msgctxt "view:calendar.calendar:"
-msgid "Security"
-msgstr "Sécurité"
-
msgctxt "view:calendar.category:"
msgid "Categories"
msgstr "Catégories"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
index 96ff8d9..c1b5a15 100644
--- a/locale/nl_NL.po
+++ b/locale/nl_NL.po
@@ -3,134 +3,111 @@ msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:calendar.calendar:"
-msgid "A user can have only one calendar!"
+msgid "A user can have only one calendar."
msgstr ""
msgctxt "error:calendar.calendar:"
-msgid "The name of calendar must be unique!"
+msgid "Calendar name \"%s\" can not end with .ics"
msgstr ""
-msgctxt "error:calendar.category:"
-msgid "The name of calendar category must be unique!"
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique."
msgstr ""
-msgctxt "error:calendar.event:"
-msgid "Recurrence can not be recurrent!"
+msgctxt "error:calendar.category:"
+msgid "The name of calendar category must be unique."
msgstr ""
-msgctxt "error:calendar.event:"
-msgid "UUID and recurrence must be unique in a calendar!"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "error:calendar.location:"
-msgid "The name of calendar location must be unique!"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Day\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Hour\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Minute\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month Day\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Position\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Second\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Week Number\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Year Day\""
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "error:calendar.rrule:"
-msgid "Only one of \"until\" and \"count\" can be set!"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "field:calendar.alarm,create_date:"
-msgid "Create Date"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "field:calendar.alarm,create_uid:"
-msgid "Create User"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "field:calendar.alarm,id:"
-msgid "ID"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
msgstr ""
-#, fuzzy
-msgctxt "field:calendar.alarm,rec_name:"
-msgid "Name"
-msgstr "Naam bijlage"
-
-msgctxt "field:calendar.alarm,valarm:"
-msgid "valarm"
-msgstr ""
-
-msgctxt "field:calendar.alarm,write_date:"
-msgid "Write Date"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "field:calendar.alarm,write_uid:"
-msgid "Write User"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "field:calendar.attendee,attendee:"
-msgid "attendee"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "field:calendar.attendee,create_date:"
-msgid "Create Date"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
msgstr ""
-msgctxt "field:calendar.attendee,create_uid:"
-msgid "Create User"
+msgctxt "error:calendar.event.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
msgstr ""
-#, fuzzy
-msgctxt "field:calendar.attendee,email:"
-msgid "Email"
-msgstr "E-mail"
-
-msgctxt "field:calendar.attendee,id:"
-msgid "ID"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:calendar.attendee,rec_name:"
-msgid "Name"
-msgstr "Naam bijlage"
-
-msgctxt "field:calendar.attendee,status:"
-msgid "Participation Status"
+msgctxt "error:calendar.event:"
+msgid "Recurrence \"%s\" can not be recurrent."
msgstr ""
-msgctxt "field:calendar.attendee,write_date:"
-msgid "Write Date"
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar."
msgstr ""
-msgctxt "field:calendar.attendee,write_uid:"
-msgid "Write User"
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique."
msgstr ""
msgctxt "field:calendar.calendar,create_date:"
@@ -278,40 +255,6 @@ msgctxt "field:calendar.category,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.date,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:calendar.date,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:calendar.date,date:"
-msgid "Is Date"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:calendar.date,datetime:"
-msgid "Date"
-msgstr "Vervaldatum"
-
-msgctxt "field:calendar.date,id:"
-msgid "ID"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:calendar.date,rec_name:"
-msgid "Name"
-msgstr "Naam bijlage"
-
-msgctxt "field:calendar.date,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:calendar.date,write_uid:"
-msgid "Write User"
-msgstr ""
-
msgctxt "field:calendar.event,alarms:"
msgid "Alarms"
msgstr ""
@@ -489,10 +432,6 @@ msgctxt "field:calendar.event-calendar.category,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.event.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr ""
-
msgctxt "field:calendar.event.alarm,create_date:"
msgid "Create Date"
msgstr ""
@@ -514,6 +453,10 @@ msgctxt "field:calendar.event.alarm,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
+msgctxt "field:calendar.event.alarm,valarm:"
+msgid "valarm"
+msgstr ""
+
msgctxt "field:calendar.event.alarm,write_date:"
msgid "Write Date"
msgstr ""
@@ -522,8 +465,8 @@ msgctxt "field:calendar.event.alarm,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.event.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
+msgctxt "field:calendar.event.attendee,attendee:"
+msgid "attendee"
msgstr ""
msgctxt "field:calendar.event.attendee,create_date:"
@@ -534,6 +477,11 @@ msgctxt "field:calendar.event.attendee,create_uid:"
msgid "Create User"
msgstr ""
+#, fuzzy
+msgctxt "field:calendar.event.attendee,email:"
+msgid "Email"
+msgstr "E-mail"
+
msgctxt "field:calendar.event.attendee,event:"
msgid "Event"
msgstr ""
@@ -547,6 +495,10 @@ msgctxt "field:calendar.event.attendee,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
+msgctxt "field:calendar.event.attendee,status:"
+msgid "Participation Status"
+msgstr ""
+
msgctxt "field:calendar.event.attendee,write_date:"
msgid "Write Date"
msgstr ""
@@ -555,10 +507,6 @@ msgctxt "field:calendar.event.attendee,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.event.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr ""
-
msgctxt "field:calendar.event.exdate,create_date:"
msgid "Create Date"
msgstr ""
@@ -567,6 +515,15 @@ msgctxt "field:calendar.event.exdate,create_uid:"
msgid "Create User"
msgstr ""
+msgctxt "field:calendar.event.exdate,date:"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.exdate,datetime:"
+msgid "Date"
+msgstr "Vervaldatum"
+
msgctxt "field:calendar.event.exdate,event:"
msgid "Event"
msgstr ""
@@ -588,217 +545,249 @@ msgctxt "field:calendar.event.exdate,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.event.exrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.event.exrule,byday:"
+msgid "By Day"
msgstr ""
-msgctxt "field:calendar.event.exrule,create_date:"
-msgid "Create Date"
+msgctxt "field:calendar.event.exrule,byhour:"
+msgid "By Hour"
msgstr ""
-msgctxt "field:calendar.event.exrule,create_uid:"
-msgid "Create User"
+msgctxt "field:calendar.event.exrule,byminute:"
+msgid "By Minute"
msgstr ""
-msgctxt "field:calendar.event.exrule,event:"
-msgid "Event"
+msgctxt "field:calendar.event.exrule,bymonth:"
+msgid "By Month"
msgstr ""
-msgctxt "field:calendar.event.exrule,id:"
-msgid "ID"
+msgctxt "field:calendar.event.exrule,bymonthday:"
+msgid "By Month Day"
msgstr ""
-#, fuzzy
-msgctxt "field:calendar.event.exrule,rec_name:"
-msgid "Name"
-msgstr "Naam bijlage"
+msgctxt "field:calendar.event.exrule,bysecond:"
+msgid "By Second"
+msgstr ""
-msgctxt "field:calendar.event.exrule,write_date:"
-msgid "Write Date"
+msgctxt "field:calendar.event.exrule,bysetpos:"
+msgid "By Position"
msgstr ""
-msgctxt "field:calendar.event.exrule,write_uid:"
-msgid "Write User"
+msgctxt "field:calendar.event.exrule,byweekno:"
+msgid "By Week Number"
msgstr ""
-msgctxt "field:calendar.event.rdate,calendar_date:"
-msgid "Calendar Date"
+msgctxt "field:calendar.event.exrule,byyearday:"
+msgid "By Year Day"
msgstr ""
-msgctxt "field:calendar.event.rdate,create_date:"
+msgctxt "field:calendar.event.exrule,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,create_date:"
msgid "Create Date"
msgstr ""
-msgctxt "field:calendar.event.rdate,create_uid:"
+msgctxt "field:calendar.event.exrule,create_uid:"
msgid "Create User"
msgstr ""
-msgctxt "field:calendar.event.rdate,event:"
+msgctxt "field:calendar.event.exrule,event:"
msgid "Event"
msgstr ""
-msgctxt "field:calendar.event.rdate,id:"
-msgid "ID"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:calendar.event.rdate,rec_name:"
-msgid "Name"
-msgstr "Naam bijlage"
-
-msgctxt "field:calendar.event.rdate,write_date:"
-msgid "Write Date"
+msgctxt "field:calendar.event.exrule,freq:"
+msgid "Frequency"
msgstr ""
-msgctxt "field:calendar.event.rdate,write_uid:"
-msgid "Write User"
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
msgstr ""
-msgctxt "field:calendar.event.rrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.event.exrule,interval:"
+msgid "Interval"
msgstr ""
-msgctxt "field:calendar.event.rrule,create_date:"
-msgid "Create Date"
-msgstr ""
+#, fuzzy
+msgctxt "field:calendar.event.exrule,rec_name:"
+msgid "Name"
+msgstr "Naam bijlage"
-msgctxt "field:calendar.event.rrule,create_uid:"
-msgid "Create User"
+msgctxt "field:calendar.event.exrule,until:"
+msgid "Until Date"
msgstr ""
-msgctxt "field:calendar.event.rrule,event:"
-msgid "Event"
+msgctxt "field:calendar.event.exrule,until_date:"
+msgid "Is Date"
msgstr ""
-msgctxt "field:calendar.event.rrule,id:"
-msgid "ID"
+msgctxt "field:calendar.event.exrule,wkst:"
+msgid "Week Day"
msgstr ""
-#, fuzzy
-msgctxt "field:calendar.event.rrule,rec_name:"
-msgid "Name"
-msgstr "Naam bijlage"
-
-msgctxt "field:calendar.event.rrule,write_date:"
+msgctxt "field:calendar.event.exrule,write_date:"
msgid "Write Date"
msgstr ""
-msgctxt "field:calendar.event.rrule,write_uid:"
+msgctxt "field:calendar.event.exrule,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.location,create_date:"
+msgctxt "field:calendar.event.rdate,create_date:"
msgid "Create Date"
msgstr ""
-msgctxt "field:calendar.location,create_uid:"
+msgctxt "field:calendar.event.rdate,create_uid:"
msgid "Create User"
msgstr ""
-msgctxt "field:calendar.location,id:"
-msgid "ID"
+msgctxt "field:calendar.event.rdate,date:"
+msgid "Is Date"
msgstr ""
#, fuzzy
-msgctxt "field:calendar.location,name:"
-msgid "Name"
-msgstr "Naam bijlage"
+msgctxt "field:calendar.event.rdate,datetime:"
+msgid "Date"
+msgstr "Vervaldatum"
+
+msgctxt "field:calendar.event.rdate,event:"
+msgid "Event"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,id:"
+msgid "ID"
+msgstr ""
#, fuzzy
-msgctxt "field:calendar.location,rec_name:"
+msgctxt "field:calendar.event.rdate,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.location,write_date:"
+msgctxt "field:calendar.event.rdate,write_date:"
msgid "Write Date"
msgstr ""
-msgctxt "field:calendar.location,write_uid:"
+msgctxt "field:calendar.event.rdate,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:calendar.rrule,byday:"
+msgctxt "field:calendar.event.rrule,byday:"
msgid "By Day"
msgstr ""
-msgctxt "field:calendar.rrule,byhour:"
+msgctxt "field:calendar.event.rrule,byhour:"
msgid "By Hour"
msgstr ""
-msgctxt "field:calendar.rrule,byminute:"
+msgctxt "field:calendar.event.rrule,byminute:"
msgid "By Minute"
msgstr ""
-msgctxt "field:calendar.rrule,bymonth:"
+msgctxt "field:calendar.event.rrule,bymonth:"
msgid "By Month"
msgstr ""
-msgctxt "field:calendar.rrule,bymonthday:"
+msgctxt "field:calendar.event.rrule,bymonthday:"
msgid "By Month Day"
msgstr ""
-msgctxt "field:calendar.rrule,bysecond:"
+msgctxt "field:calendar.event.rrule,bysecond:"
msgid "By Second"
msgstr ""
-msgctxt "field:calendar.rrule,bysetpos:"
+msgctxt "field:calendar.event.rrule,bysetpos:"
msgid "By Position"
msgstr ""
-msgctxt "field:calendar.rrule,byweekno:"
+msgctxt "field:calendar.event.rrule,byweekno:"
msgid "By Week Number"
msgstr ""
-msgctxt "field:calendar.rrule,byyearday:"
+msgctxt "field:calendar.event.rrule,byyearday:"
msgid "By Year Day"
msgstr ""
-msgctxt "field:calendar.rrule,count:"
+msgctxt "field:calendar.event.rrule,count:"
msgid "Count"
msgstr ""
-msgctxt "field:calendar.rrule,create_date:"
+msgctxt "field:calendar.event.rrule,create_date:"
msgid "Create Date"
msgstr ""
-msgctxt "field:calendar.rrule,create_uid:"
+msgctxt "field:calendar.event.rrule,create_uid:"
msgid "Create User"
msgstr ""
-msgctxt "field:calendar.rrule,freq:"
+msgctxt "field:calendar.event.rrule,event:"
+msgid "Event"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,freq:"
msgid "Frequency"
msgstr ""
-msgctxt "field:calendar.rrule,id:"
+msgctxt "field:calendar.event.rrule,id:"
msgid "ID"
msgstr ""
-msgctxt "field:calendar.rrule,interval:"
+msgctxt "field:calendar.event.rrule,interval:"
msgid "Interval"
msgstr ""
#, fuzzy
-msgctxt "field:calendar.rrule,rec_name:"
+msgctxt "field:calendar.event.rrule,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.rrule,until:"
+msgctxt "field:calendar.event.rrule,until:"
msgid "Until Date"
msgstr ""
-msgctxt "field:calendar.rrule,until_date:"
+msgctxt "field:calendar.event.rrule,until_date:"
msgid "Is Date"
msgstr ""
-msgctxt "field:calendar.rrule,wkst:"
+msgctxt "field:calendar.event.rrule,wkst:"
msgid "Week Day"
msgstr ""
-msgctxt "field:calendar.rrule,write_date:"
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.location,name:"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:calendar.location,rec_name:"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.location,write_date:"
msgid "Write Date"
msgstr ""
-msgctxt "field:calendar.rrule,write_uid:"
+msgctxt "field:calendar.location,write_uid:"
msgid "Write User"
msgstr ""
@@ -810,24 +799,24 @@ msgctxt "help:calendar.calendar,owner:"
msgid "The user must have an email"
msgstr ""
-msgctxt "help:calendar.date,date:"
-msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr ""
-
msgctxt "help:calendar.event,uuid:"
msgid "Universally Unique Identifier"
msgstr ""
-msgctxt "help:calendar.rrule,until_date:"
+msgctxt "help:calendar.event.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.event.exrule,until_date:"
msgid "Ignore time of field \"Until Date\", but handle as date only."
msgstr ""
-msgctxt "model:calendar.alarm,name:"
-msgid "Alarm"
+msgctxt "help:calendar.event.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
msgstr ""
-msgctxt "model:calendar.attendee,name:"
-msgid "Attendee"
+msgctxt "help:calendar.event.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
msgstr ""
msgctxt "model:calendar.calendar,name:"
@@ -847,10 +836,6 @@ msgctxt "model:calendar.category,name:"
msgid "Category"
msgstr "Categorie"
-msgctxt "model:calendar.date,name:"
-msgid "Calendar Date"
-msgstr ""
-
msgctxt "model:calendar.event,name:"
msgid "Event"
msgstr ""
@@ -887,10 +872,6 @@ msgctxt "model:calendar.location,name:"
msgid "Location"
msgstr ""
-msgctxt "model:calendar.rrule,name:"
-msgid "Recurrence Rule"
-msgstr ""
-
msgctxt "model:ir.action,name:act_calendar_form"
msgid "Calendars"
msgstr ""
@@ -919,30 +900,6 @@ msgctxt "model:res.group,name:group_calendar_admin"
msgid "Calendar Administration"
msgstr ""
-msgctxt "selection:calendar.attendee,status:"
-msgid ""
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Accepted"
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Declined"
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Delegated"
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Needs Action"
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Tentative"
-msgstr ""
-
msgctxt "selection:calendar.event,classification:"
msgid "Confidential"
msgstr ""
@@ -980,63 +937,147 @@ msgctxt "selection:calendar.event,transp:"
msgid "Transparent"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Accepted"
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Declined"
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Delegated"
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Needs Action"
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Tentative"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Yearly"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Friday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Monday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Saturday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Sunday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Thursday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Tuesday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Wednesday"
+msgstr ""
+
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Daily"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Hourly"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Minutely"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Monthly"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Secondly"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Weekly"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Yearly"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Friday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Monday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Saturday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Sunday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Thursday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Tuesday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Wednesday"
msgstr ""
msgctxt "view:calendar.calendar:"
+msgid "Access Permissions"
+msgstr ""
+
+msgctxt "view:calendar.calendar:"
msgid "Calendar"
msgstr ""
@@ -1049,10 +1090,6 @@ msgctxt "view:calendar.calendar:"
msgid "General"
msgstr "Algemeen"
-msgctxt "view:calendar.calendar:"
-msgid "Security"
-msgstr ""
-
#, fuzzy
msgctxt "view:calendar.category:"
msgid "Categories"
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
index 4c2e639..e5bb5c8 100644
--- a/locale/ru_RU.po
+++ b/locale/ru_RU.po
@@ -3,140 +3,120 @@ msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:calendar.calendar:"
-msgid "A user can have only one calendar!"
-msgstr "Пользователь может иметь только Один календарь!"
+msgid "A user can have only one calendar."
+msgstr "Пользователь может иметь только один календарь."
msgctxt "error:calendar.calendar:"
-msgid "The name of calendar must be unique!"
-msgstr "Имя календаря должно быть уникально"
+msgid "Calendar name \"%s\" can not end with .ics"
+msgstr "Название календаря \"%s\" не может оканчиваться на \".ics\"."
+
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique."
+msgstr "Название календаря должно быть уникальным."
msgctxt "error:calendar.category:"
-msgid "The name of calendar category must be unique!"
-msgstr ""
+msgid "The name of calendar category must be unique."
+msgstr "Название категории календаря должно быть уникальным."
-msgctxt "error:calendar.event:"
-msgid "Recurrence can not be recurrent!"
-msgstr ""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день\" в повторении \"%s\"."
-msgctxt "error:calendar.event:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr ""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В час\" в повторении \"%s\"."
-msgctxt "error:calendar.location:"
-msgid "The name of calendar location must be unique!"
-msgstr ""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В минуту\" в повторении \"%s\"."
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Day\""
-msgstr "Неверное поле \"По дням\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день месяца\" в повторении \"%s\"."
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Hour\""
-msgstr "Неверное поле \"По часам\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В месяц\" в повторении \"%s\"."
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Minute\""
-msgstr "Неверное поле \"По минутам\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"По положению\" в повторении \"%s\"."
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month Day\""
-msgstr "Неверное поле \"По дням месяца\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В секунду\" в повторении \"%s\"."
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month\""
-msgstr "Неверное поле \"По месяцам\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В неделю номер\" в повторении \"%s\"."
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Position\""
-msgstr "Неверное поле \"По позиции\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день года\" в повторении \"%s\"."
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Second\""
-msgstr "Неверное поле \"По секундам\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Может быть задано только одно из полей - \"До даты\" или \"Кол-во\"."
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Week Number\""
-msgstr "Неверное поле \"По номерам недель\""
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день\" в повторении \"%s\"."
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Year Day\""
-msgstr "Неверный \"По дням года\""
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В час\" в повторении \"%s\"."
-msgctxt "error:calendar.rrule:"
-msgid "Only one of \"until\" and \"count\" can be set!"
-msgstr ""
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В минуту\" в повторении \"%s\"."
-msgctxt "field:calendar.alarm,create_date:"
-msgid "Create Date"
-msgstr ""
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день месяца\" в повторении \"%s\"."
-msgctxt "field:calendar.alarm,create_uid:"
-msgid "Create User"
-msgstr ""
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В месяц\" в повторении \"%s\"."
-msgctxt "field:calendar.alarm,id:"
-msgid "ID"
-msgstr ""
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"По положению\" в повторении \"%s\"."
-msgctxt "field:calendar.alarm,rec_name:"
-msgid "Name"
-msgstr "Наименование"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В секунду\" в повторении \"%s\"."
-msgctxt "field:calendar.alarm,valarm:"
-msgid "valarm"
-msgstr ""
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В неделю номер\" в повторении \"%s\"."
-msgctxt "field:calendar.alarm,write_date:"
-msgid "Write Date"
-msgstr ""
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день года\" в повторении \"%s\"."
-msgctxt "field:calendar.alarm,write_uid:"
-msgid "Write User"
-msgstr ""
+msgctxt "error:calendar.event.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Может быть задано только одно из полей - \"До даты\" или \"Кол-во\"."
-msgctxt "field:calendar.attendee,attendee:"
-msgid "attendee"
-msgstr "участник"
-
-msgctxt "field:calendar.attendee,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:calendar.attendee,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:calendar.attendee,email:"
-msgid "Email"
-msgstr "Эл.почта"
-
-msgctxt "field:calendar.attendee,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:calendar.attendee,rec_name:"
-msgid "Name"
-msgstr "Наименование"
-
-msgctxt "field:calendar.attendee,status:"
-msgid "Participation Status"
-msgstr "Статус участия"
+msgctxt "error:calendar.event:"
+msgid "Recurrence \"%s\" can not be recurrent."
+msgstr "Повторение \"%s\" не может быть повторяемым."
-msgctxt "field:calendar.attendee,write_date:"
-msgid "Write Date"
-msgstr ""
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr "UUID и повторение должны быть уникальными в календаре."
-msgctxt "field:calendar.attendee,write_uid:"
-msgid "Write User"
-msgstr ""
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique."
+msgstr "Название местоположения календаря должно быть уникальным."
msgctxt "field:calendar.calendar,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:calendar.calendar,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
msgctxt "field:calendar.calendar,description:"
msgid "Description"
@@ -144,7 +124,7 @@ msgstr "Описание"
msgctxt "field:calendar.calendar,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.calendar,name:"
msgid "Name"
@@ -164,11 +144,11 @@ msgstr "Наименование"
msgctxt "field:calendar.calendar,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:calendar.calendar,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
msgctxt "field:calendar.calendar,write_users:"
msgid "Write Users"
@@ -180,15 +160,15 @@ msgstr "Календар"
msgctxt "field:calendar.calendar-read-res.user,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:calendar.calendar-read-res.user,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
msgctxt "field:calendar.calendar-read-res.user,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.calendar-read-res.user,rec_name:"
msgid "Name"
@@ -200,11 +180,11 @@ msgstr "Пользователь"
msgctxt "field:calendar.calendar-read-res.user,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:calendar.calendar-read-res.user,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
msgctxt "field:calendar.calendar-write-res.user,calendar:"
msgid "Calendar"
@@ -212,15 +192,15 @@ msgstr "Календарь"
msgctxt "field:calendar.calendar-write-res.user,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:calendar.calendar-write-res.user,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
msgctxt "field:calendar.calendar-write-res.user,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.calendar-write-res.user,rec_name:"
msgid "Name"
@@ -232,23 +212,23 @@ msgstr "Пользователь"
msgctxt "field:calendar.calendar-write-res.user,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:calendar.calendar-write-res.user,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
msgctxt "field:calendar.category,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:calendar.category,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
msgctxt "field:calendar.category,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.category,name:"
msgid "Name"
@@ -260,43 +240,11 @@ msgstr "Наименование"
msgctxt "field:calendar.category,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:calendar.category,write_uid:"
msgid "Write User"
-msgstr ""
-
-msgctxt "field:calendar.date,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:calendar.date,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:calendar.date,date:"
-msgid "Is Date"
-msgstr "Весь день"
-
-msgctxt "field:calendar.date,datetime:"
-msgid "Date"
-msgstr "Дата"
-
-msgctxt "field:calendar.date,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:calendar.date,rec_name:"
-msgid "Name"
-msgstr "Наименование"
-
-msgctxt "field:calendar.date,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:calendar.date,write_uid:"
-msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
msgctxt "field:calendar.event,alarms:"
msgid "Alarms"
@@ -336,11 +284,11 @@ msgstr "Классификация"
msgctxt "field:calendar.event,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:calendar.event,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
msgctxt "field:calendar.event,description:"
msgid "Description"
@@ -364,7 +312,7 @@ msgstr "Правила исключения"
msgctxt "field:calendar.event,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.event,location:"
msgid "Location"
@@ -380,7 +328,7 @@ msgstr "Организатор"
msgctxt "field:calendar.event,parent:"
msgid "Parent"
-msgstr "Основной"
+msgstr "Предок"
msgctxt "field:calendar.event,rdates:"
msgid "Recurrence Dates"
@@ -400,7 +348,7 @@ msgstr "Правила повторения"
msgctxt "field:calendar.event,sequence:"
msgid "Sequence"
-msgstr "Последовательность"
+msgstr "Нумерация"
msgctxt "field:calendar.event,status:"
msgid "Status"
@@ -416,11 +364,11 @@ msgstr "Зона времени"
msgctxt "field:calendar.event,transp:"
msgid "Time Transparency"
-msgstr "Время Прозрачность"
+msgstr "Доступность в это время"
msgctxt "field:calendar.event,uuid:"
msgid "UUID"
-msgstr ""
+msgstr "UUID"
msgctxt "field:calendar.event,vevent:"
msgid "vevent"
@@ -428,23 +376,23 @@ msgstr ""
msgctxt "field:calendar.event,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:calendar.event,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
msgctxt "field:calendar.event-calendar.category,category:"
msgid "Category"
-msgstr "Категории"
+msgstr "Категория"
msgctxt "field:calendar.event-calendar.category,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:calendar.event-calendar.category,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
msgctxt "field:calendar.event-calendar.category,event:"
msgid "Event"
@@ -452,7 +400,7 @@ msgstr "Событие"
msgctxt "field:calendar.event-calendar.category,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.event-calendar.category,rec_name:"
msgid "Name"
@@ -460,23 +408,19 @@ msgstr "Наименование"
msgctxt "field:calendar.event-calendar.category,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:calendar.event-calendar.category,write_uid:"
msgid "Write User"
-msgstr ""
-
-msgctxt "field:calendar.event.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Сигнала календаря"
+msgstr "Изменено пользователем"
msgctxt "field:calendar.event.alarm,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:calendar.event.alarm,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
msgctxt "field:calendar.event.alarm,event:"
msgid "Event"
@@ -484,31 +428,39 @@ msgstr "Событие"
msgctxt "field:calendar.event.alarm,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.event.alarm,rec_name:"
msgid "Name"
msgstr "Наименование"
+msgctxt "field:calendar.event.alarm,valarm:"
+msgid "valarm"
+msgstr ""
+
msgctxt "field:calendar.event.alarm,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:calendar.event.alarm,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
-msgctxt "field:calendar.event.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Календарь участников"
+msgctxt "field:calendar.event.attendee,attendee:"
+msgid "attendee"
+msgstr "участник"
msgctxt "field:calendar.event.attendee,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:calendar.event.attendee,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
+
+msgctxt "field:calendar.event.attendee,email:"
+msgid "Email"
+msgstr "Эл.почта"
msgctxt "field:calendar.event.attendee,event:"
msgid "Event"
@@ -516,31 +468,39 @@ msgstr "Событие"
msgctxt "field:calendar.event.attendee,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.event.attendee,rec_name:"
msgid "Name"
msgstr "Наименование"
+msgctxt "field:calendar.event.attendee,status:"
+msgid "Participation Status"
+msgstr "Статус участия"
+
msgctxt "field:calendar.event.attendee,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:calendar.event.attendee,write_uid:"
msgid "Write User"
-msgstr ""
-
-msgctxt "field:calendar.event.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "День календаря"
+msgstr "Изменено пользователем"
msgctxt "field:calendar.event.exdate,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:calendar.event.exdate,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
+
+msgctxt "field:calendar.event.exdate,date:"
+msgid "Is Date"
+msgstr "Только Дата"
+
+msgctxt "field:calendar.event.exdate,datetime:"
+msgid "Date"
+msgstr "Дата"
msgctxt "field:calendar.event.exdate,event:"
msgid "Event"
@@ -548,7 +508,7 @@ msgstr "Событие"
msgctxt "field:calendar.event.exdate,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.event.exdate,rec_name:"
msgid "Name"
@@ -556,55 +516,115 @@ msgstr "Наименование"
msgctxt "field:calendar.event.exdate,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:calendar.event.exdate,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
-msgctxt "field:calendar.event.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Правила календаря"
+msgctxt "field:calendar.event.exrule,byday:"
+msgid "By Day"
+msgstr "В день"
+
+msgctxt "field:calendar.event.exrule,byhour:"
+msgid "By Hour"
+msgstr "В час"
+
+msgctxt "field:calendar.event.exrule,byminute:"
+msgid "By Minute"
+msgstr "В минуту"
+
+msgctxt "field:calendar.event.exrule,bymonth:"
+msgid "By Month"
+msgstr "В месяц"
+
+msgctxt "field:calendar.event.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "В день месяца"
+
+msgctxt "field:calendar.event.exrule,bysecond:"
+msgid "By Second"
+msgstr "В секунду"
+
+msgctxt "field:calendar.event.exrule,bysetpos:"
+msgid "By Position"
+msgstr "По положению"
+
+msgctxt "field:calendar.event.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "В неделю номер"
+
+msgctxt "field:calendar.event.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "В день года"
+
+msgctxt "field:calendar.event.exrule,count:"
+msgid "Count"
+msgstr "Кол-во"
msgctxt "field:calendar.event.exrule,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:calendar.event.exrule,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
msgctxt "field:calendar.event.exrule,event:"
msgid "Event"
msgstr "Событие"
+msgctxt "field:calendar.event.exrule,freq:"
+msgid "Frequency"
+msgstr "Повторение"
+
msgctxt "field:calendar.event.exrule,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
+
+msgctxt "field:calendar.event.exrule,interval:"
+msgid "Interval"
+msgstr "Интервал"
msgctxt "field:calendar.event.exrule,rec_name:"
msgid "Name"
msgstr "Наименование"
+msgctxt "field:calendar.event.exrule,until:"
+msgid "Until Date"
+msgstr "До даты"
+
+msgctxt "field:calendar.event.exrule,until_date:"
+msgid "Is Date"
+msgstr "Только Дата"
+
+msgctxt "field:calendar.event.exrule,wkst:"
+msgid "Week Day"
+msgstr "День недели"
+
msgctxt "field:calendar.event.exrule,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:calendar.event.exrule,write_uid:"
msgid "Write User"
-msgstr ""
-
-msgctxt "field:calendar.event.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "День календаря"
+msgstr "Изменено пользователем"
msgctxt "field:calendar.event.rdate,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:calendar.event.rdate,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
+
+msgctxt "field:calendar.event.rdate,date:"
+msgid "Is Date"
+msgstr "Только Дата"
+
+msgctxt "field:calendar.event.rdate,datetime:"
+msgid "Date"
+msgstr "Дата"
msgctxt "field:calendar.event.rdate,event:"
msgid "Event"
@@ -612,7 +632,7 @@ msgstr "Событие"
msgctxt "field:calendar.event.rdate,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.event.rdate,rec_name:"
msgid "Name"
@@ -620,55 +640,111 @@ msgstr "Наименование"
msgctxt "field:calendar.event.rdate,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:calendar.event.rdate,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
+
+msgctxt "field:calendar.event.rrule,byday:"
+msgid "By Day"
+msgstr "В день"
+
+msgctxt "field:calendar.event.rrule,byhour:"
+msgid "By Hour"
+msgstr "В час"
+
+msgctxt "field:calendar.event.rrule,byminute:"
+msgid "By Minute"
+msgstr "В минуту"
+
+msgctxt "field:calendar.event.rrule,bymonth:"
+msgid "By Month"
+msgstr "В месяц"
+
+msgctxt "field:calendar.event.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr "В день месяца"
+
+msgctxt "field:calendar.event.rrule,bysecond:"
+msgid "By Second"
+msgstr "В секунду"
+
+msgctxt "field:calendar.event.rrule,bysetpos:"
+msgid "By Position"
+msgstr "По положению"
+
+msgctxt "field:calendar.event.rrule,byweekno:"
+msgid "By Week Number"
+msgstr "В неделю номер"
+
+msgctxt "field:calendar.event.rrule,byyearday:"
+msgid "By Year Day"
+msgstr "В день года"
-msgctxt "field:calendar.event.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Правила календаря"
+msgctxt "field:calendar.event.rrule,count:"
+msgid "Count"
+msgstr "Кол-во"
msgctxt "field:calendar.event.rrule,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:calendar.event.rrule,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
msgctxt "field:calendar.event.rrule,event:"
msgid "Event"
msgstr "Событие"
+msgctxt "field:calendar.event.rrule,freq:"
+msgid "Frequency"
+msgstr "Повторение"
+
msgctxt "field:calendar.event.rrule,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
+
+msgctxt "field:calendar.event.rrule,interval:"
+msgid "Interval"
+msgstr "Интервал"
msgctxt "field:calendar.event.rrule,rec_name:"
msgid "Name"
msgstr "Наименование"
+msgctxt "field:calendar.event.rrule,until:"
+msgid "Until Date"
+msgstr "До даты"
+
+msgctxt "field:calendar.event.rrule,until_date:"
+msgid "Is Date"
+msgstr "Только Дата"
+
+msgctxt "field:calendar.event.rrule,wkst:"
+msgid "Week Day"
+msgstr "День недели"
+
msgctxt "field:calendar.event.rrule,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:calendar.event.rrule,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
msgctxt "field:calendar.location,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
msgctxt "field:calendar.location,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
msgctxt "field:calendar.location,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.location,name:"
msgid "Name"
@@ -680,95 +756,11 @@ msgstr "Наименование"
msgctxt "field:calendar.location,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
msgctxt "field:calendar.location,write_uid:"
msgid "Write User"
-msgstr ""
-
-msgctxt "field:calendar.rrule,byday:"
-msgid "By Day"
-msgstr "По дням"
-
-msgctxt "field:calendar.rrule,byhour:"
-msgid "By Hour"
-msgstr "По часам"
-
-msgctxt "field:calendar.rrule,byminute:"
-msgid "By Minute"
-msgstr "По минутам"
-
-msgctxt "field:calendar.rrule,bymonth:"
-msgid "By Month"
-msgstr "По месячно"
-
-msgctxt "field:calendar.rrule,bymonthday:"
-msgid "By Month Day"
-msgstr "По дням месяца"
-
-msgctxt "field:calendar.rrule,bysecond:"
-msgid "By Second"
-msgstr "По секундам"
-
-msgctxt "field:calendar.rrule,bysetpos:"
-msgid "By Position"
-msgstr "По позиции"
-
-msgctxt "field:calendar.rrule,byweekno:"
-msgid "By Week Number"
-msgstr "По номерам недель"
-
-msgctxt "field:calendar.rrule,byyearday:"
-msgid "By Year Day"
-msgstr "По дням года"
-
-msgctxt "field:calendar.rrule,count:"
-msgid "Count"
-msgstr "Количество"
-
-msgctxt "field:calendar.rrule,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:calendar.rrule,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:calendar.rrule,freq:"
-msgid "Frequency"
-msgstr "Частота"
-
-msgctxt "field:calendar.rrule,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:calendar.rrule,interval:"
-msgid "Interval"
-msgstr "Внутренний"
-
-msgctxt "field:calendar.rrule,rec_name:"
-msgid "Name"
-msgstr "Наименование"
-
-msgctxt "field:calendar.rrule,until:"
-msgid "Until Date"
-msgstr "До даты"
-
-msgctxt "field:calendar.rrule,until_date:"
-msgid "Is Date"
-msgstr "Весь день"
-
-msgctxt "field:calendar.rrule,wkst:"
-msgid "Week Day"
-msgstr "День недели"
-
-msgctxt "field:calendar.rrule,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:calendar.rrule,write_uid:"
-msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
msgctxt "field:res.user,calendars:"
msgid "Calendars"
@@ -776,27 +768,35 @@ msgstr "Календари"
msgctxt "help:calendar.calendar,owner:"
msgid "The user must have an email"
-msgstr ""
-
-msgctxt "help:calendar.date,date:"
-msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr "Время игнорируется в поле \"Дата\", действует только дата"
+msgstr "У пользователя должна быть эл.почта."
msgctxt "help:calendar.event,uuid:"
msgid "Universally Unique Identifier"
-msgstr "Универсальный уникальный идентификатор"
+msgstr "Универсальный уникальный идентификатор (UUID)"
+
+msgctxt "help:calendar.event.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+"Если включено, то значение времени в поле \"Дата\" будет проигнорировано, "
+"будет использована только дата."
-msgctxt "help:calendar.rrule,until_date:"
+msgctxt "help:calendar.event.exrule,until_date:"
msgid "Ignore time of field \"Until Date\", but handle as date only."
-msgstr "Время игнорируется в поле \"До даты\", действует только дата"
+msgstr ""
+"Если включено, то значение времени в поле \"До даты\" будет проигнорировано,"
+" будет использована только дата."
-msgctxt "model:calendar.alarm,name:"
-msgid "Alarm"
-msgstr "Вызов"
+msgctxt "help:calendar.event.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+"Если включено, то значение времени в поле \"Дата\" будет проигнорировано, "
+"будет использована только дата."
-msgctxt "model:calendar.attendee,name:"
-msgid "Attendee"
-msgstr "Участник"
+msgctxt "help:calendar.event.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+"Если включено, то значение времени в поле \"До даты\" будет проигнорировано,"
+" будет использована только дата."
msgctxt "model:calendar.calendar,name:"
msgid "Calendar"
@@ -812,11 +812,7 @@ msgstr "Пользователи могут писать"
msgctxt "model:calendar.category,name:"
msgid "Category"
-msgstr "Категории"
-
-msgctxt "model:calendar.date,name:"
-msgid "Calendar Date"
-msgstr "День календаря"
+msgstr "Категория"
msgctxt "model:calendar.event,name:"
msgid "Event"
@@ -854,25 +850,18 @@ msgctxt "model:calendar.location,name:"
msgid "Location"
msgstr "Местоположение"
-msgctxt "model:calendar.rrule,name:"
-msgid "Recurrence Rule"
-msgstr "Правила повторения"
-
msgctxt "model:ir.action,name:act_calendar_form"
msgid "Calendars"
msgstr "Календари"
-#, fuzzy
msgctxt "model:ir.action,name:act_event_form"
msgid "Events"
msgstr "События"
-#, fuzzy
msgctxt "model:ir.action,name:act_event_form3"
msgid "Events"
msgstr "События"
-#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_calendar"
msgid "Calendar"
msgstr "Календари"
@@ -889,30 +878,6 @@ msgctxt "model:res.group,name:group_calendar_admin"
msgid "Calendar Administration"
msgstr "Управление календарем"
-msgctxt "selection:calendar.attendee,status:"
-msgid ""
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Accepted"
-msgstr "Подтверждено"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Declined"
-msgstr "Отклонено"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Delegated"
-msgstr "Делегировано"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Needs Action"
-msgstr "Требуется действие"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Tentative"
-msgstr "Предварительный"
-
msgctxt "selection:calendar.event,classification:"
msgid "Confidential"
msgstr "Конфиденциальное"
@@ -943,69 +908,153 @@ msgstr "Предварительный"
msgctxt "selection:calendar.event,transp:"
msgid "Opaque"
-msgstr "Непрозрачный"
+msgstr "Доступен"
msgctxt "selection:calendar.event,transp:"
msgid "Transparent"
-msgstr "Прозрачный"
+msgstr "Не доступен"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Accepted"
+msgstr "Принято"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Declined"
+msgstr "Отклонено"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Delegated"
+msgstr "Поручено"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Needs Action"
+msgstr "Требует вмешательства"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Tentative"
+msgstr "Предварительный"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Daily"
+msgstr "Ежедневно"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Hourly"
+msgstr "Ежечасно"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Minutely"
+msgstr "Ежеминутно"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Monthly"
+msgstr "Ежемесячно"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Secondly"
+msgstr "Ежесекундно"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Weekly"
+msgstr "Еженедельно"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Yearly"
+msgstr "Ежегодно"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Friday"
+msgstr "Пятница"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Monday"
+msgstr "Понедельник"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Saturday"
+msgstr "Суббота"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Sunday"
+msgstr "Воскресенье"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Thursday"
+msgstr "Четверг"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Вторник"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Среда"
+
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Daily"
-msgstr "Ежедневный"
+msgstr "Ежедневно"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Hourly"
-msgstr "Ежечасный"
+msgstr "Ежечасно"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Minutely"
msgstr "Ежеминутно"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Monthly"
msgstr "Ежемесячно"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Secondly"
-msgstr "Ежесекудно"
+msgstr "Ежесекундно"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Weekly"
msgstr "Еженедельно"
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
msgid "Yearly"
msgstr "Ежегодно"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Friday"
msgstr "Пятница"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Monday"
msgstr "Понедельник"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Saturday"
msgstr "Суббота"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Sunday"
msgstr "Воскресенье"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Thursday"
msgstr "Четверг"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Tuesday"
msgstr "Вторник"
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
msgid "Wednesday"
msgstr "Среда"
msgctxt "view:calendar.calendar:"
+msgid "Access Permissions"
+msgstr "Права доступа"
+
+msgctxt "view:calendar.calendar:"
msgid "Calendar"
msgstr "Календарь"
@@ -1017,17 +1066,13 @@ msgctxt "view:calendar.calendar:"
msgid "General"
msgstr "Основной"
-msgctxt "view:calendar.calendar:"
-msgid "Security"
-msgstr "Доступ"
-
msgctxt "view:calendar.category:"
msgid "Categories"
msgstr "Категория"
msgctxt "view:calendar.category:"
msgid "Category"
-msgstr "Категории"
+msgstr "Категория"
msgctxt "view:calendar.event.attendee:"
msgid "Attendee"
diff --git a/setup.py b/setup.py
index d0e0e98..91a746f 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',
version=info.get('version', '0.0.1'),
@@ -36,16 +36,16 @@ setup(name='trytond_calendar',
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': '.'},
packages=[
'trytond.modules.calendar',
'trytond.modules.calendar.tests',
],
package_data={
- 'trytond.modules.calendar': info.get('xml', []) \
- + ['tryton.cfg', 'locale/*.po'],
+ 'trytond.modules.calendar': (info.get('xml', [])
+ + ['tryton.cfg', 'view/*.xml', 'locale/*.po']),
},
classifiers=[
'Development Status :: 5 - Production/Stable',
@@ -57,6 +57,7 @@ setup(name='trytond_calendar',
'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/tryton.cfg b/tryton.cfg
index 76539b5..c27871a 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
[tryton]
-version=2.6.1
+version=2.8.0
depends:
ir
res
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index 664e32b..741485f 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.1
Name: trytond-calendar
-Version: 2.6.1
+Version: 2.8.0
Summary: Tryton module for 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
================
@@ -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.egg-info/SOURCES.txt b/trytond_calendar.egg-info/SOURCES.txt
index 773ccae..a44e6d3 100644
--- a/trytond_calendar.egg-info/SOURCES.txt
+++ b/trytond_calendar.egg-info/SOURCES.txt
@@ -31,4 +31,23 @@ trytond_calendar.egg-info/dependency_links.txt
trytond_calendar.egg-info/entry_points.txt
trytond_calendar.egg-info/not-zip-safe
trytond_calendar.egg-info/requires.txt
-trytond_calendar.egg-info/top_level.txt
\ No newline at end of file
+trytond_calendar.egg-info/top_level.txt
+view/attendee_form.xml
+view/attendee_tree.xml
+view/calendar_form.xml
+view/calendar_tree.xml
+view/category_form.xml
+view/category_tree.xml
+view/event_form.xml
+view/event_tree.xml
+view/event_tree_occurence.xml
+view/exdate_form.xml
+view/exdate_tree.xml
+view/exrule_form.xml
+view/exrule_tree.xml
+view/location_form.xml
+view/location_tree.xml
+view/rdate_form.xml
+view/rdate_tree.xml
+view/rrule_form.xml
+view/rrule_tree.xml
\ No newline at end of file
diff --git a/trytond_calendar.egg-info/requires.txt b/trytond_calendar.egg-info/requires.txt
index 050605d..823ce06 100644
--- a/trytond_calendar.egg-info/requires.txt
+++ b/trytond_calendar.egg-info/requires.txt
@@ -2,7 +2,7 @@ vobject >= 0.8.0
PyWebDAV >= 0.9.8
python-dateutil
pytz
-trytond >= 2.6, < 2.7
+trytond >= 2.8, < 2.9
[test]
caldav
\ No newline at end of file
diff --git a/view/attendee_form.xml b/view/attendee_form.xml
new file mode 100644
index 0000000..de1f8f4
--- /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="event"/>
+ <field name="event" 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..326faf1
--- /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="event"/>
+ <field name="email"/>
+ <field name="status"/>
+</tree>
diff --git a/view/calendar_form.xml b/view/calendar_form.xml
new file mode 100644
index 0000000..fd4ad51
--- /dev/null
+++ b/view/calendar_form.xml
@@ -0,0 +1,19 @@
+<?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="Calendar">
+ <label name="name"/>
+ <field name="name"/>
+ <label name="owner"/>
+ <field name="owner"/>
+ <notebook colspan="4">
+ <page string="General" id="general">
+ <separator name="description" colspan="4"/>
+ <field name="description" colspan="4"/>
+ </page>
+ <page string="Access Permissions" id="permissions">
+ <field name="read_users" colspan="4"/>
+ <field name="write_users" colspan="4"/>
+ </page>
+ </notebook>
+</form>
diff --git a/view/calendar_tree.xml b/view/calendar_tree.xml
new file mode 100644
index 0000000..bb0ca72
--- /dev/null
+++ b/view/calendar_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="Calendars">
+ <field name="name"/>
+ <field name="owner"/>
+</tree>
diff --git a/view/category_form.xml b/view/category_form.xml
new file mode 100644
index 0000000..66d69b2
--- /dev/null
+++ b/view/category_form.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. -->
+<form string="Category">
+ <label name="name"/>
+ <field name="name"/>
+</form>
diff --git a/view/category_tree.xml b/view/category_tree.xml
new file mode 100644
index 0000000..e35b2fa
--- /dev/null
+++ b/view/category_tree.xml
@@ -0,0 +1,6 @@
+<?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="Categories">
+ <field name="name"/>
+</tree>
diff --git a/view/event_form.xml b/view/event_form.xml
new file mode 100644
index 0000000..5eced8a
--- /dev/null
+++ b/view/event_form.xml
@@ -0,0 +1,49 @@
+<?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="Event">
+ <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="all_day"/>
+ <field name="all_day"/>
+ <label name="transp"/>
+ <field name="transp"/>
+ <label name="dtstart"/>
+ <field name="dtstart"/>
+ <label name="dtend"/>
+ <field name="dtend"/>
+ <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.event_view_tree_occurence"/>
+ </page>
+ </notebook>
+ <field name="parent" colspan="4" invisible="1"/>
+</form>
diff --git a/view/event_tree.xml b/view/event_tree.xml
new file mode 100644
index 0000000..aba889b
--- /dev/null
+++ b/view/event_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="Events">
+ <field name="calendar"/>
+ <field name="summary"/>
+ <field name="all_day"/>
+ <field name="dtstart"/>
+ <field name="dtend"/>
+ <field name="status"/>
+</tree>
diff --git a/view/event_tree_occurence.xml b/view/event_tree_occurence.xml
new file mode 100644
index 0000000..94d560f
--- /dev/null
+++ b/view/event_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="Events">
+ <field name="summary"/>
+ <field name="recurrence"/>
+ <field name="all_day"/>
+ <field name="dtstart"/>
+ <field name="dtend"/>
+ <field name="status"/>
+</tree>
diff --git a/view/exdate_form.xml b/view/exdate_form.xml
new file mode 100644
index 0000000..9177295
--- /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="event"/>
+ <field name="event" 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..6b353ff
--- /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="event"/>
+ <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..4ae4dcc
--- /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="event"/>
+ <field name="event" 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..8828610
--- /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="event"/>
+ <field name="freq"/>
+</tree>
diff --git a/view/location_form.xml b/view/location_form.xml
new file mode 100644
index 0000000..84cd824
--- /dev/null
+++ b/view/location_form.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. -->
+<form string="Location">
+ <label name="name"/>
+ <field name="name"/>
+</form>
diff --git a/view/location_tree.xml b/view/location_tree.xml
new file mode 100644
index 0000000..afdf674
--- /dev/null
+++ b/view/location_tree.xml
@@ -0,0 +1,6 @@
+<?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="Locations">
+ <field name="name"/>
+</tree>
diff --git a/view/rdate_form.xml b/view/rdate_form.xml
new file mode 100644
index 0000000..f908bd4
--- /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="event"/>
+ <field name="event" 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..adfd8ab
--- /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="event"/>
+ <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..52405fc
--- /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="event"/>
+ <field name="event" 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..85fb7e1
--- /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="event"/>
+ <field name="freq"/>
+</tree>
diff --git a/webdav.py b/webdav.py
index 2209151..ea6f3e7 100644
--- a/webdav.py
+++ b/webdav.py
@@ -197,11 +197,11 @@ class Collection:
cache['_calendar'].setdefault(Calendar.__name__, {})
for calendar in calendars:
cache['_calendar'][Calendar.__name__][calendar.id] = {}
- return [x.name for x in calendars] + \
- [x.name + '.ics' for x in calendars]
+ return ([x.name for x in calendars]
+ + [x.name + '.ics' for x in calendars])
if uri 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_event(filter)
events = Event.search([
('calendar', '=', calendar_id),
@@ -285,16 +285,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 "' + Calendar._table + '" ' \
- 'WHERE ' + red_sql, red_ids)
+ cursor.execute('SELECT id, '
+ 'EXTRACT(epoch FROM create_date) '
+ 'FROM "' + Calendar._table + '" '
+ 'WHERE ' + red_sql, red_ids)
for calendar_id2, date in cursor.fetchall():
if calendar_id2 == calendar_id:
res = date
if cache is not None:
cache['_calendar'][Calendar.__name__]\
- .setdefault(calendar_id2, {})
+ .setdefault(calendar_id2, {})
cache['_calendar'][Calendar.__name__][
calendar_id2]['creationdate'] = date
if res is not None:
@@ -319,16 +319,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 "' + Event._table + '" ' \
+ cursor.execute('SELECT id, '
+ 'EXTRACT(epoch FROM create_date) '
+ 'FROM "' + Event._table + '" '
'WHERE ' + red_sql, red_ids)
for event_id2, date in cursor.fetchall():
if event_id2 == event_id:
res = date
if cache is not None:
cache['_calendar'][Event.__name__]\
- .setdefault(event_id2, {})
+ .setdefault(event_id2, {})
cache['_calendar'][Event.__name__][
event_id2]['creationdate'] = date
if res is not None:
@@ -361,17 +361,17 @@ 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 ' \
- 'COALESCE(write_date, create_date)) ' \
- 'FROM "' + Calendar._table + '" ' \
- 'WHERE ' + red_sql, red_ids)
+ cursor.execute('SELECT id, '
+ 'EXTRACT(epoch FROM '
+ 'COALESCE(write_date, create_date)) '
+ 'FROM "' + Calendar._table + '" '
+ 'WHERE ' + red_sql, red_ids)
for calendar_id2, date in cursor.fetchall():
if calendar_id2 == calendar_id:
res = date
if cache is not None:
cache['_calendar'][Calendar.__name__]\
- .setdefault(calendar_id2, {})
+ .setdefault(calendar_id2, {})
cache['_calendar'][Calendar.__name__][
calendar_id2]['lastmodified'] = date
if res is not None:
@@ -397,20 +397,20 @@ 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 "' + Event._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 "' + Event._table + '" '
+ 'WHERE ' + red_id_sql + ' '
+ 'OR ' + red_parent_sql + ' '
+ 'GROUP BY parent, id',
+ red_id_ids + red_parent_ids)
for event_id2, date in cursor.fetchall():
if event_id2 == event_id:
res = date
if cache is not None:
cache['_calendar'][Event.__name__]\
- .setdefault(event_id2, {})
+ .setdefault(event_id2, {})
cache['_calendar'][Event.__name__][
event_id2]['lastmodified'] = date
if res is not None:
@@ -433,17 +433,17 @@ 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('calendar', sub_ids)
- cursor.execute('SELECT calendar, MAX(EXTRACT(epoch FROM ' \
- 'COALESCE(write_date, create_date))) ' \
- 'FROM "' + Event._table + '" ' \
- 'WHERE ' + red_sql + ' ' \
- 'GROUP BY calendar', red_ids)
+ cursor.execute('SELECT calendar, MAX(EXTRACT(epoch FROM '
+ 'COALESCE(write_date, create_date))) '
+ 'FROM "' + Event._table + '" '
+ 'WHERE ' + red_sql + ' '
+ 'GROUP BY calendar', red_ids)
for calendar_id2, date in cursor.fetchall():
if calendar_id2 == calendar_ics_id:
res = date
if cache is not None:
cache['_calendar'][Calendar.__name__]\
- .setdefault(calendar_id2, {})
+ .setdefault(calendar_id2, {})
cache['_calendar'][Calendar.__name__][
calendar_id2]['lastmodified ics'] = date
if res is not None:
@@ -498,7 +498,7 @@ class Collection:
res = calendar.description
if cache is not None:
cache['_calendar'][Calendar.__name__]\
- .setdefault(calendar.id, {})
+ .setdefault(calendar.id, {})
cache['_calendar'][Calendar.__name__][
calendar.id]['calendar_description'] = \
calendar.description
@@ -554,7 +554,7 @@ class Collection:
if not event_id:
ical = vobject.readOne(data)
values = Event.ical2values(None, ical, calendar_id)
- event = Event.create(values)
+ event, = Event.create([values])
calendar = Calendar(calendar_id)
return (Transaction().cursor.database_name + '/Calendars/' +
calendar.name + '/' + event.uuid + '.ics')
commit 057422a0e028cb8fc3987460b684586d04012f79
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Fri Feb 15 20:50:36 2013 +0100
Adding upstream version 2.6.1.
diff --git a/CHANGELOG b/CHANGELOG
index 31faf34..ce8b818 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 3d18025..37e5095 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
-Metadata-Version: 1.0
+Metadata-Version: 1.1
Name: trytond_calendar
-Version: 2.6.0
+Version: 2.6.1
Summary: Tryton module for CalDAV
Home-page: http://www.tryton.org/
Author: Tryton
diff --git a/calendar_.py b/calendar_.py
index 230681a..1e63623 100644
--- a/calendar_.py
+++ b/calendar_.py
@@ -96,8 +96,7 @@ class Calendar(ModelSQL, ModelView):
cls._get_name_cache.set(name, calendar_id)
return calendar_id
- @staticmethod
- def calendar2ical(calendar_id):
+ def calendar2ical(self):
'''
Return an iCalendar object for the given calendar_id containing
all the vevent objects
@@ -107,7 +106,7 @@ class Calendar(ModelSQL, ModelView):
ical = vobject.iCalendar()
ical.vevent_list = []
events = Event.search([
- ('calendar', '=', calendar_id),
+ ('calendar', '=', self.id),
('parent', '=', None),
])
for event in events:
diff --git a/tryton.cfg b/tryton.cfg
index 3e2b6cc..76539b5 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
[tryton]
-version=2.6.0
+version=2.6.1
depends:
ir
res
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index f4586fa..664e32b 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
-Metadata-Version: 1.0
+Metadata-Version: 1.1
Name: trytond-calendar
-Version: 2.6.0
+Version: 2.6.1
Summary: Tryton module for CalDAV
Home-page: http://www.tryton.org/
Author: Tryton
diff --git a/webdav.py b/webdav.py
index fd55fc3..2209151 100644
--- a/webdav.py
+++ b/webdav.py
@@ -364,7 +364,7 @@ class Collection:
cursor.execute('SELECT id, ' \
'EXTRACT(epoch FROM ' \
'COALESCE(write_date, create_date)) ' \
- 'FROM "' + Calendar.__table__ + '" ' \
+ 'FROM "' + Calendar._table + '" ' \
'WHERE ' + red_sql, red_ids)
for calendar_id2, date in cursor.fetchall():
if calendar_id2 == calendar_id:
commit 0507de4e4e02b6c89f6582b5b485b8309b3ab6a1
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Oct 23 19:53:29 2012 +0200
Adding upstream version 2.6.0.
diff --git a/CHANGELOG b/CHANGELOG
index 480068b..31faf34 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 0457a01..3d18025 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,13 +1,49 @@
Metadata-Version: 1.0
Name: trytond_calendar
-Version: 2.4.2
-Summary: Add CalDAV support
+Version: 2.6.0
+Summary: Tryton module for 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
+ ================
+
+ The calendar 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 0f1995e..81a621a 100644
--- a/__init__.py
+++ b/__init__.py
@@ -1,7 +1,32 @@
#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 .webdav import *
from .calendar_ import *
from .res import *
+
+
+def register():
+ Pool.register(
+ Collection,
+ Calendar,
+ ReadUser,
+ WriteUser,
+ Category,
+ Location,
+ Event,
+ EventCategory,
+ Alarm,
+ EventAlarm,
+ Attendee,
+ EventAttendee,
+ Date,
+ EventRDate,
+ EventExDate,
+ RRule,
+ EventRRule,
+ EventExRule,
+ User,
+ module='calendar', type_='model')
diff --git a/__tryton__.py b/__tryton__.py
deleted file mode 100644
index b532430..0000000
--- a/__tryton__.py
+++ /dev/null
@@ -1,47 +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',
- 'name_bg_BG': 'Календар',
- 'name_ca_ES': 'Calendari',
- 'name_de_DE': 'Kalender',
- 'name_es_AR': 'Calendario',
- 'name_es_CO': 'Calendario',
- 'name_es_ES': 'Calendario',
- 'name_fr_FR': 'Calendrier',
- 'name_ru_RU': 'Календарь',
- 'version': '2.4.2',
- 'author': 'B2CK',
- 'email': 'info at b2ck.com',
- 'website': 'http://www.tryton.org/',
- 'description': 'Add CalDAV support',
- 'description_bg_BG': 'Добавя подръжка на CalDAV',
- 'description_ca_ES': 'Afegeix suport per CalDAV.',
- 'description_de_DE': 'Fügt Unterstützung für CalDAV hinzu',
- 'description_es_AR': 'Añade soporte para CalDAV',
- 'description_es_CO': 'Añade soporte para CalDAV',
- 'description_es_ES': 'Añade soporte para CalDAV',
- 'description_fr_FR': 'Ajoute le support CalDAV',
- 'description_ru_RU': 'Добавление поддержки CalDAV',
- 'depends': [
- 'ir',
- 'res',
- 'webdav',
- ],
- 'xml': [
- 'calendar.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/caldav.py b/caldav.py
index 2595186..ae205be 100644
--- a/caldav.py
+++ b/caldav.py
@@ -59,11 +59,11 @@ def _get_caldav_calendar_description(self, uri):
raise DAV_NotFound
pool = Pool(Transaction().cursor.database_name)
try:
- collection_obj = pool.get('webdav.collection')
+ Collection = pool.get('webdav.collection')
except KeyError:
raise DAV_NotFound
try:
- res = collection_obj.get_calendar_description(dburi, cache=CACHE)
+ res = Collection.get_calendar_description(dburi, cache=CACHE)
except AttributeError:
raise DAV_NotFound
except DAV_Error, exception:
@@ -84,11 +84,11 @@ def _get_caldav_calendar_data(self, uri):
raise DAV_NotFound
pool = Pool(Transaction().cursor.database_name)
try:
- collection_obj = pool.get('webdav.collection')
+ Collection = pool.get('webdav.collection')
except KeyError:
raise DAV_NotFound
try:
- res = collection_obj.get_calendar_data(dburi, cache=CACHE)
+ res = Collection.get_calendar_data(dburi, cache=CACHE)
except AttributeError:
raise DAV_NotFound
except DAV_Error, exception:
@@ -108,11 +108,11 @@ def _get_caldav_calendar_home_set(self, uri):
raise DAV_NotFound
pool = Pool(Transaction().cursor.database_name)
try:
- collection_obj = pool.get('webdav.collection')
+ Collection = pool.get('webdav.collection')
except KeyError:
raise DAV_NotFound
try:
- res = collection_obj.get_calendar_home_set(dburi, cache=CACHE)
+ res = Collection.get_calendar_home_set(dburi, cache=CACHE)
except AttributeError:
raise DAV_NotFound
except DAV_Error, exception:
@@ -142,11 +142,11 @@ def _get_caldav_calendar_user_address_set(self, uri):
raise DAV_NotFound
pool = Pool(Transaction().cursor.database_name)
try:
- collection_obj = pool.get('webdav.collection')
+ Collection = pool.get('webdav.collection')
except KeyError:
raise DAV_NotFound
try:
- res = collection_obj.get_calendar_user_address_set(dburi, cache=CACHE)
+ res = Collection.get_calendar_user_address_set(dburi, cache=CACHE)
except AttributeError:
raise DAV_NotFound
except DAV_Error, exception:
@@ -172,11 +172,11 @@ def _get_caldav_schedule_inbox_URL(self, uri):
raise DAV_NotFound
pool = Pool(Transaction().cursor.database_name)
try:
- collection_obj = pool.get('webdav.collection')
+ Collection = pool.get('webdav.collection')
except KeyError:
raise DAV_NotFound
try:
- res = collection_obj.get_schedule_inbox_URL(dburi, cache=CACHE)
+ res = Collection.get_schedule_inbox_URL(dburi, cache=CACHE)
except AttributeError:
raise DAV_NotFound
except DAV_Error, exception:
@@ -204,11 +204,11 @@ def _get_caldav_schedule_outbox_URL(self, uri):
raise DAV_NotFound
pool = Pool(Transaction().cursor.database_name)
try:
- collection_obj = pool.get('webdav.collection')
+ Collection = pool.get('webdav.collection')
except KeyError:
raise DAV_NotFound
try:
- res = collection_obj.get_schedule_outbox_URL(dburi, cache=CACHE)
+ res = Collection.get_schedule_outbox_URL(dburi, cache=CACHE)
except AttributeError:
raise DAV_NotFound
except DAV_Error, exception:
@@ -258,9 +258,9 @@ def _get_caldav_post(self, uri, body, contenttype=''):
if not dbname:
raise DAV_Forbidden
pool = Pool(Transaction().cursor.database_name)
- calendar_obj = pool.get('calendar.calendar')
+ Calendar = pool.get('calendar.calendar')
try:
- res = calendar_obj.post(dburi, body)
+ res = Calendar.post(dburi, body)
except AttributeError:
raise DAV_NotFound
except DAV_Error, exception:
diff --git a/calendar_.py b/calendar_.py
index 123e07b..230681a 100644
--- a/calendar_.py
+++ b/calendar_.py
@@ -13,6 +13,12 @@ from trytond.pyson import If, Bool, Eval
from trytond.transaction import Transaction
from trytond.cache import Cache
from trytond.pool import Pool
+
+__all__ = ['Calendar', 'ReadUser', 'WriteUser', 'Category', 'Location',
+ 'Event', 'EventCategory', 'Alarm', 'EventAlarm', 'Attendee',
+ 'EventAttendee', 'Date', 'EventRDate', 'EventExDate', 'RRule',
+ 'EventRRule', 'EventExRule']
+
tzlocal = dateutil.tz.tzlocal()
tzutc = dateutil.tz.tzutc()
domimpl = xml.dom.minidom.getDOMImplementation()
@@ -20,9 +26,7 @@ domimpl = xml.dom.minidom.getDOMImplementation()
class Calendar(ModelSQL, ModelView):
"Calendar"
- _description = __doc__
- _name = 'calendar.calendar'
-
+ __name__ = 'calendar.calendar'
name = fields.Char('Name', required=True, select=True)
description = fields.Text('Description')
owner = fields.Many2One('res.user', 'Owner', select=True,
@@ -32,95 +36,96 @@ class Calendar(ModelSQL, ModelView):
'calendar', 'user', 'Read Users')
write_users = fields.Many2Many('calendar.calendar-write-res.user',
'calendar', 'user', 'Write Users')
+ _get_name_cache = Cache('calendar_calendar.get_name')
- def __init__(self):
- super(Calendar, self).__init__()
- self._sql_constraints = [
+ @classmethod
+ def __setup__(cls):
+ super(Calendar, cls).__setup__()
+ cls._sql_constraints = [
('name_uniq', 'UNIQUE(name)',
'The name of calendar must be unique!'),
('owner_uniq', 'UNIQUE(owner)',
'A user can have only one calendar!'),
- ]
- self._order.insert(0, ('name', 'ASC'))
- self._constraints += [
+ ]
+ cls._order.insert(0, ('name', 'ASC'))
+ cls._constraints += [
('check_name', 'Calendar name can not end with .ics'),
- ]
+ ]
- def create(self, vals):
- res = super(Calendar, self).create(vals)
+ @classmethod
+ def create(cls, vals):
+ calendar = super(Calendar, cls).create(vals)
# Restart the cache for get_name
- self.get_name.reset()
- return res
+ cls._get_name_cache.clear()
+ return calendar
- def write(self, ids, vals):
- res = super(Calendar, self).write(ids, vals)
+ @classmethod
+ def write(cls, calendars, vals):
+ super(Calendar, cls).write(calendars, vals)
# Restart the cache for get_name
- self.get_name.reset()
- return res
+ cls._get_name_cache.clear()
- def delete(self, ids):
- res = super(Calendar, self).delete(ids)
+ @classmethod
+ def delete(cls, calendars):
+ super(Calendar, cls).delete(calendars)
# Restart the cache for calendar
- self.get_name.reset()
- return res
+ cls._get_name_cache.clear()
- def check_name(self, ids):
+ def check_name(self):
'''
Check the name doesn't end with .ics
'''
- for calendar in self.browse(ids):
- if calendar.name.endswith('.ics'):
- return False
+ if self.name.endswith('.ics'):
+ return False
return True
- @Cache('calendar_calendar.get_name')
- def get_name(self, name):
+ @classmethod
+ def get_name(cls, name):
'''
Return the calendar id of the name
-
- :param name: the calendar name
- :return: the calendar.calendar id
'''
- calendar_ids = self.search([
- ('name', '=', name),
- ], limit=1)
- if calendar_ids:
- return calendar_ids[0]
+ calendar_id = cls._get_name_cache.get(name, default=-1)
+ if calendar_id == -1:
+ calendars = cls.search([
+ ('name', '=', name),
+ ], limit=1)
+ if calendars:
+ calendar_id = calendars[0].id
+ else:
+ calendar_id = None
+ cls._get_name_cache.set(name, calendar_id)
+ return calendar_id
- def calendar2ical(self, calendar_id):
+ @staticmethod
+ def calendar2ical(calendar_id):
'''
Return an iCalendar object for the given calendar_id containing
all the vevent objects
-
- :param calendar_id: an id of calendar.calendar
- :return: an iCalendar
'''
- event_obj = Pool().get('calendar.event')
+ Event = Pool().get('calendar.event')
ical = vobject.iCalendar()
ical.vevent_list = []
- event_ids = event_obj.search([
- ('calendar', '=', calendar_id),
- ('parent', '=', None),
- ])
- for event in event_obj.browse(event_ids):
- ical2 = event_obj.event2ical(event.id)
+ events = Event.search([
+ ('calendar', '=', calendar_id),
+ ('parent', '=', None),
+ ])
+ for event in events:
+ ical2 = event.event2ical()
ical.vevent_list.extend(ical2.vevent_list)
return ical
- def _fbtype(self, event):
+ @property
+ def _fbtype(self):
'''
Return the freebusy type for give transparent and status
-
- :param event: a BrowseRecord of calendar.event
- :return: a freebusy type ('FREE', 'BUSY', 'BUSY-TENTATIVE')
'''
- if event.transp == 'opaque':
- if not event.status or event.status == 'confirmed':
+ if self.transp == 'opaque':
+ if not self.status or self.status == 'confirmed':
fbtype = 'BUSY'
- elif event.status == 'cancelled':
+ elif self.status == 'cancelled':
fbtype = 'FREE'
- elif event.status == 'tentative':
+ elif self.status == 'tentative':
fbtype = 'BUSY-TENTATIVE'
else:
fbtype = 'BUSY'
@@ -128,17 +133,13 @@ class Calendar(ModelSQL, ModelView):
fbtype = 'FREE'
return fbtype
- def freebusy(self, calendar_id, dtstart, dtend):
+ @classmethod
+ def freebusy(cls, calendar_id, dtstart, dtend):
'''
Return an iCalendar object for the given calendar_id with the
vfreebusy objects between the two dates
-
- :param calendar_id: an id of calendar.calendar
- :param dtstart: a date or datetime
- :param dtend: a date of datetime
- :return: an iCalendar
'''
- event_obj = Pool().get('calendar.event')
+ Event = Pool().get('calendar.event')
ical = vobject.iCalendar()
ical.add('method').value = 'REPLY'
@@ -157,31 +158,30 @@ class Calendar(ModelSQL, ModelView):
ical.vfreebusy.add('dtend').value = dtend.astimezone(tzutc)
with Transaction().set_user(0):
- event_ids = event_obj.search([
- ['OR',
- [('dtstart', '<=', dtstart),
- ('dtend', '>=', dtstart)],
- [('dtstart', '<=', dtend),
- ('dtend', '>=', dtend)],
- [('dtstart', '>=', dtstart),
- ('dtend', '<=', dtend)],
- [('dtstart', '>=', dtstart),
- ('dtstart', '<=', dtend),
- ('dtend', '=', None)]],
- ('parent', '=', None),
- ('rdates', '=', None),
- ('rrules', '=', None),
- ('exdates', '=', None),
- ('exrules', '=', None),
- ('occurences', '=', None),
- ('calendar', '=', calendar_id),
- ])
- events = event_obj.browse(event_ids)
+ events = Event.search([
+ ['OR',
+ [('dtstart', '<=', dtstart),
+ ('dtend', '>=', dtstart)],
+ [('dtstart', '<=', dtend),
+ ('dtend', '>=', dtend)],
+ [('dtstart', '>=', dtstart),
+ ('dtend', '<=', dtend)],
+ [('dtstart', '>=', dtstart),
+ ('dtstart', '<=', dtend),
+ ('dtend', '=', None)]],
+ ('parent', '=', None),
+ ('rdates', '=', None),
+ ('rrules', '=', None),
+ ('exdates', '=', None),
+ ('exrules', '=', None),
+ ('occurences', '=', None),
+ ('calendar', '=', calendar_id),
+ ])
for event in events:
# Don't group freebusy as sunbird doesn't handle it
freebusy = ical.vfreebusy.add('freebusy')
- freebusy.fbtype_param = self._fbtype(event)
+ freebusy.fbtype_param = event._fbtype
if event.dtstart.replace(tzinfo=tzlocal) >= dtstart:
freebusy_dtstart = event.dtstart.replace(tzinfo=tzlocal)
else:
@@ -195,22 +195,21 @@ class Calendar(ModelSQL, ModelView):
freebusy_dtend.astimezone(tzutc))]
with Transaction().set_user(0):
- event_ids = event_obj.search([
- ('parent', '=', None),
- ('dtstart', '<=', dtend),
- ['OR',
- ('rdates', '!=', None),
- ('rrules', '!=', None),
- ('exdates', '!=', None),
- ('exrules', '!=', None),
- ('occurences', '!=', None),
- ],
- ('calendar', '=', calendar_id),
- ])
- events = event_obj.browse(event_ids)
+ events = Event.search([
+ ('parent', '=', None),
+ ('dtstart', '<=', dtend),
+ ['OR',
+ ('rdates', '!=', None),
+ ('rrules', '!=', None),
+ ('exdates', '!=', None),
+ ('exrules', '!=', None),
+ ('occurences', '!=', None),
+ ],
+ ('calendar', '=', calendar_id),
+ ])
for event in events:
- event_ical = event_obj.event2ical(event)
+ event_ical = event.event2ical()
if event_ical.vevent.rruleset:
between_dtstart, between_dtend = dtstart, dtend
for freebusy_dtstart in event_ical.vevent.rruleset:
@@ -231,7 +230,7 @@ class Calendar(ModelSQL, ModelView):
or (f_dtstart_tz >= dtstart
and f_dtend_tz <= dtend)):
continue
- freebusy_fbtype = self._fbtype(event)
+ freebusy_fbtype = event._fbtype
all_day = event.all_day
for occurence in event.occurences:
if (occurence.recurrence.replace(tzinfo=tzlocal)
@@ -244,7 +243,7 @@ class Calendar(ModelSQL, ModelView):
else:
freebusy_dtend = freebusy_dtstart
all_day = occurence.all_day
- freebusy_fbtype = self._fbtype(occurence)
+ freebusy_fbtype = occurence._fbtype
break
freebusy = ical.vfreebusy.add('freebusy')
freebusy.fbtype_param = freebusy_fbtype
@@ -263,21 +262,19 @@ class Calendar(ModelSQL, ModelView):
freebusy_dtend.astimezone(tzutc))]
return ical
- def post(self, uri, data):
+ @classmethod
+ def post(cls, uri, data):
'''
- Handle post of vfreebusy request
-
- :param uri: the posted uri
- :param data: the posted data
- :return: the xml with schedule-response
+ Handle post of vfreebusy request and return the XML with
+ schedule-response
'''
from pywebdav.lib.errors import DAV_Forbidden
- collection_obj = Pool().get('webdav.collection')
+ Collection = Pool().get('webdav.collection')
- calendar_id = collection_obj.calendar(uri)
+ calendar_id = Collection.calendar(uri)
if not calendar_id:
raise DAV_Forbidden
- calendar = self.browse(calendar_id)
+ calendar = cls(calendar_id)
if calendar.owner.id != Transaction().user:
raise DAV_Forbidden
ical = vobject.readOne(data)
@@ -318,11 +315,11 @@ class Calendar(ModelSQL, ModelView):
if attendee.value.lower().startswith('mailto:'):
email = attendee.value[7:]
with Transaction().set_user(0):
- calendar_ids = self.search([
- ('owner.email', '=', email),
- ])
- if calendar_ids:
- vfreebusy = self.freebusy(calendar_ids[0], dtstart, dtend)
+ calendars = cls.search([
+ ('owner.email', '=', email),
+ ])
+ if calendars:
+ vfreebusy = cls.freebusy(calendars[0].id, dtstart, dtend)
vfreebusy.vfreebusy.add('dtstamp').value = \
ical.vfreebusy.dtstamp.value
vfreebusy.vfreebusy.add('uid').value = \
@@ -343,77 +340,59 @@ class Calendar(ModelSQL, ModelView):
return doc.toxml(encoding='utf-8')
raise DAV_Forbidden
-Calendar()
-
class ReadUser(ModelSQL):
'Calendar - read - User'
- _description = __doc__
- _name = 'calendar.calendar-read-res.user'
-
+ __name__ = 'calendar.calendar-read-res.user'
calendar = fields.Many2One('calendar.calendar', 'Calendar',
ondelete='CASCADE', required=True, select=True)
user = fields.Many2One('res.user', 'User', ondelete='CASCADE',
required=True, select=True)
-ReadUser()
-
class WriteUser(ModelSQL):
'Calendar - write - User'
- _description = __doc__
- _name = 'calendar.calendar-write-res.user'
-
+ __name__ = 'calendar.calendar-write-res.user'
calendar = fields.Many2One('calendar.calendar', 'Calendar',
ondelete='CASCADE', required=True, select=True)
user = fields.Many2One('res.user', 'User', ondelete='CASCADE',
required=True, select=True)
-WriteUser()
-
class Category(ModelSQL, ModelView):
"Category"
- _description = __doc__
- _name = 'calendar.category'
-
+ __name__ = 'calendar.category'
name = fields.Char('Name', required=True, select=True)
- def __init__(self):
- super(Category, self).__init__()
- self._sql_constraints = [
+ @classmethod
+ def __setup__(cls):
+ super(Category, cls).__setup__()
+ cls._sql_constraints = [
('name_uniq', 'UNIQUE(name)',
'The name of calendar category must be unique!'),
- ]
- self._order.insert(0, ('name', 'ASC'))
-
-Category()
+ ]
+ cls._order.insert(0, ('name', 'ASC'))
class Location(ModelSQL, ModelView):
"Location"
- _description = __doc__
- _name = 'calendar.location'
-
+ __name__ = 'calendar.location'
name = fields.Char('Name', required=True, select=True)
- def __init__(self):
- super(Location, self).__init__()
- self._sql_constraints = [
+ @classmethod
+ def __setup__(cls):
+ super(Location, cls).__setup__()
+ cls._sql_constraints = [
('name_uniq', 'UNIQUE(name)',
'The name of calendar location must be unique!'),
- ]
- self._order.insert(0, ('name', 'ASC'))
-
-Location()
+ ]
+ cls._order.insert(0, ('name', 'ASC'))
class Event(ModelSQL, ModelView):
"Event"
- _description = __doc__
- _name = 'calendar.event'
+ __name__ = 'calendar.event'
_rec_name = 'uuid'
-
uuid = fields.Char('UUID', required=True,
help='Universally Unique Identifier', select=True)
calendar = fields.Many2One('calendar.calendar', 'Calendar',
@@ -496,90 +475,95 @@ class Event(ModelSQL, ModelView):
'Write Users'), 'get_calendar_field', searcher='search_calendar_field')
vevent = fields.Binary('vevent')
- def __init__(self):
- super(Event, self).__init__()
- self._sql_constraints = [
+ @classmethod
+ def __setup__(cls):
+ super(Event, cls).__setup__()
+ cls._sql_constraints = [
('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):
# 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([
- ('fs_id', '=', 'rule_group_read_calendar_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(Event, self).init(module_name)
+ models_data = ModelData.search([
+ ('fs_id', '=', 'rule_group_read_calendar_line3'),
+ ('module', '=', module_name),
+ ('inherit', '=', None),
+ ], limit=1)
+ if models_data:
+ model_data, = models_data
+ Rule.delete([Rule(model_data.db_id)])
+ return super(Event, 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_transp(self):
+ @staticmethod
+ def default_transp():
return 'opaque'
- 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 timezones(self):
+ @staticmethod
+ def timezones():
return [(x, x) for x in pytz.common_timezones] + [('', '')]
- def get_calendar_field(self, ids, name):
+ def get_calendar_field(self, name):
assert name in ('calendar_owner', 'calendar_read_users',
'calendar_write_users'), 'Invalid name'
- res = {}
name = name[9:]
- for event in self.browse(ids):
- if name in ('read_users', 'write_users'):
- res[event.id] = [x.id for x in event.calendar[name]]
- else:
- res[event.id] = event.calendar[name].id
- return res
+ 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 event in self.browse(ids):
- if not event.parent:
- continue
- if event.rdates \
- or event.rrules \
- or event.exdates \
- or event.exrules \
- or event.occurences:
+ if self.parent:
+ 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(Event, self).create(values)
- event = self.browse(res)
+ event = super(Event, cls).create(values)
if (event.calendar.owner
and (event.organizer == event.calendar.owner.email
or (event.parent
@@ -595,94 +579,83 @@ class Event(ModelSQL, ModelView):
and x.email != event.parent.organizer]
if attendee_emails:
with Transaction().set_user(0):
- calendar_ids = calendar_obj.search([
- ('owner.email', 'in', attendee_emails),
- ])
+ calendars = Calendar.search([
+ ('owner.email', 'in', attendee_emails),
+ ])
if not event.recurrence:
- for calendar_id in calendar_ids:
- new_id = self.copy(event.id, default={
- 'calendar': calendar_id,
- 'occurences': None,
- })
+ for calendar in calendars:
+ new_event, = cls.copy([event], default={
+ 'calendar': calendar.id,
+ 'occurences': None,
+ 'uuid': event.uuid,
+ })
for occurence in event.occurences:
- self.copy(occurence.id, default={
- 'calendar': calendar_id,
- 'parent': new_id,
+ cls.copy([occurence], default={
+ 'calendar': calendar.id,
+ 'parent': new_event.id,
+ 'uuid': occurence.uuid,
})
else:
- parent_ids = self.search([
- ('uuid', '=', event.uuid),
- ('calendar.owner.email', 'in', attendee_emails),
- ('id', '!=', event.id),
- ('recurrence', '=', None),
- ])
- for parent in self.browse(parent_ids):
- self.copy(event.id, default={
- 'calendar': parent.calendar.id,
- 'parent': parent.id,
- })
+ parents = cls.search([
+ ('uuid', '=', event.uuid),
+ ('calendar.owner.email', 'in',
+ attendee_emails),
+ ('id', '!=', event.id),
+ ('recurrence', '=', None),
+ ])
+ for parent in parents:
+ cls.copy([event], default={
+ 'calendar': parent.calendar.id,
+ 'parent': parent.id,
+ 'uuid': event.uuid,
+ })
# Restart the cache for event
- collection_obj.event.reset()
- return res
-
- def _event2update(self, event):
+ Collection._event_cache.clear()
+ return event
+
+ def _event2update(self):
+ return {
+ 'summary': self.summary,
+ 'description': self.description,
+ 'all_day': self.all_day,
+ 'dtstart': self.dtstart,
+ 'dtend': self.dtend,
+ 'location': self.location.id if self.location else None,
+ 'status': self.status,
+ 'organizer': self.organizer,
+ 'rdates': [('delete_all',)] + [('create', rdate._date2update())
+ for rdate in self.rdates],
+ 'exdates': [('delete_all',)] + [('create', exdate._date2update())
+ for exdate in self.exdates],
+ 'rrules': [('delete_all',)] + [('create', rrule._date2update())
+ for rrule in self.rrules],
+ 'exrules': [('delete_all',)] + [('create', exrule._date2update())
+ for exrule in self.exrules],
+ }
+
+ @classmethod
+ def write(cls, events, values):
pool = Pool()
- rdate_obj = pool.get('calendar.event.rdate')
- exdate_obj = pool.get('calendar.event.exdate')
- rrule_obj = pool.get('calendar.event.rrule')
- exrule_obj = pool.get('calendar.event.exrule')
-
- res = {}
- res['summary'] = event.summary
- res['description'] = event.description
- res['all_day'] = event.all_day
- res['dtstart'] = event.dtstart
- res['dtend'] = event.dtend
- res['location'] = event.location.id
- res['status'] = event.status
- res['organizer'] = event.organizer
- res['rdates'] = [('delete_all',)]
- for rdate in event.rdates:
- vals = rdate_obj._date2update(rdate)
- res['rdates'].append(('create', vals))
- res['exdates'] = [('delete_all',)]
- for exdate in event.exdates:
- vals = exdate_obj._date2update(exdate)
- res['exdates'].append(('create', vals))
- res['rrules'] = [('delete_all',)]
- for rrule in event.rrules:
- vals = rrule_obj._rule2update(rrule)
- res['rrules'].append(('create', vals))
- res['exrules'] = [('delete_all',)]
- for exrule in event.exrules:
- vals = exrule_obj._rule2update(exrule)
- res['exrules'].append(('create', vals))
- return res
-
- def write(self, ids, values):
- calendar_obj = Pool().get('calendar.calendar')
- collection_obj = Pool().get('webdav.collection')
+ Calendar = pool.get('calendar.calendar')
+ Collection = pool.get('webdav.collection')
cursor = Transaction().cursor
values = values.copy()
if 'sequence' in values:
del values['sequence']
- res = super(Event, self).write(ids, values)
-
- if isinstance(ids, (int, long)):
- ids = [ids]
+ super(Event, cls).write(events, values)
- for i in range(0, len(ids), cursor.IN_MAX):
- sub_ids = ids[i:i + cursor.IN_MAX]
+ for i in range(0, len(events), cursor.IN_MAX):
+ sub_ids = map(int, events[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)
+ cursor.execute('UPDATE "' + cls._table + '" '
+ 'SET sequence = sequence + 1 '
+ 'WHERE ' + red_sql, red_ids)
if not values:
- return res
- for event in self.browse(ids):
+ return
+ for event in events:
if event.calendar.owner \
and (event.organizer == event.calendar.owner.email \
or (event.parent \
@@ -696,79 +669,75 @@ class Event(ModelSQL, ModelView):
if x.status != 'declined'
and x.email != event.parent.organizer]
with Transaction().set_user(0):
- event_ids = self.search([
- ('uuid', '=', event.uuid),
- ('id', '!=', event.id),
- ('recurrence', '=', event.recurrence),
- ])
- for event2 in self.browse(event_ids):
+ events2 = cls.search([
+ ('uuid', '=', event.uuid),
+ ('id', '!=', event.id),
+ ('recurrence', '=', event.recurrence),
+ ])
+ for event2 in events2[:]:
if event2.calendar.owner.email in attendee_emails:
attendee_emails.remove(
event2.calendar.owner.email)
else:
- event_ids.remove(event2.id)
- self.delete(event2.id)
- if event_ids:
- self.write(event_ids, self._event2update(event))
+ events2.remove(event2)
+ cls.delete([event2])
+ if events2:
+ cls.write(events2, event._event2update())
if attendee_emails:
with Transaction().set_user(0):
- calendar_ids = calendar_obj.search([
- ('owner.email', 'in', attendee_emails),
- ])
+ calendars = Calendar.search([
+ ('owner.email', 'in', attendee_emails),
+ ])
if not event.recurrence:
- for calendar_id in calendar_ids:
- new_id = self.copy(event.id, default={
- 'calendar': calendar_id,
- 'occurences': None,
- })
- for occurence in event.occurences:
- self.copy(occurence.id, default={
- 'calendar': calendar_id,
- 'parent': new_id,
+ for calendar in calendars:
+ new_event, = cls.copy([event], default={
+ 'calendar': calendar.id,
+ 'occurences': None,
+ 'uuid': event.uuid,
})
+ for occurence in event.occurences:
+ cls.copy([occurence], default={
+ 'calendar': calendar.id,
+ 'parent': new_event.id,
+ 'uuid': occurence.uuid,
+ })
else:
- parent_ids = self.search([
+ parents = cls.search([
('uuid', '=', event.uuid),
('calendar.owner.email', 'in',
attendee_emails),
('id', '!=', event.id),
('recurrence', '=', None),
])
- for parent in self.browse(parent_ids):
- self.copy(event.id, default={
- 'calendar': parent.calendar.id,
- 'parent': parent.id,
- })
+ for parent in parents:
+ cls.copy([event], default={
+ 'calendar': parent.calendar.id,
+ 'parent': parent.id,
+ 'uuid': event.uuid,
+ })
# Restart the cache for event
- collection_obj.event.reset()
- return res
-
- def copy(self, ids, default=None):
- int_id = isinstance(ids, (int, long))
- if int_id:
- ids = [ids]
+ Collection._event_cache.clear()
+ @classmethod
+ def copy(cls, events, default=None):
if default is None:
default = {}
- new_ids = []
- for event_id in ids:
+ new_events = []
+ for event in events:
current_default = default.copy()
- current_default['uuid'] = self.default_uuid()
- new_id = super(Event, self).copy(event_id, default=current_default)
- new_ids.append(new_id)
-
- if int_id:
- return new_ids[0]
- return new_ids
+ current_default.setdefault('uuid', cls.default_uuid())
+ new_events.extend(super(Event, cls).copy([event],
+ default=current_default))
+ return new_events
- def delete(self, ids):
- attendee_obj = Pool().get('calendar.event.attendee')
- collection_obj = Pool().get('webdav.collection')
+ @classmethod
+ def delete(cls, events):
+ pool = Pool()
+ Attendee = pool.get('calendar.event.attendee')
+ Collection = pool.get('webdav.collection')
- if isinstance(ids, (int, long)):
- ids = [ids]
- for event in self.browse(ids):
+ for event in events:
if event.calendar.owner \
and (event.organizer == event.calendar.owner.email \
or (event.parent \
@@ -781,13 +750,13 @@ class Event(ModelSQL, ModelView):
if x.email != event.parent.organizer]
if attendee_emails:
with Transaction().set_user(0):
- event_ids = self.search([
- ('uuid', '=', event.uuid),
- ('calendar.owner.email', 'in', attendee_emails),
- ('id', '!=', event.id),
- ('recurrence', '=', event.recurrence),
- ])
- self.delete(event_ids)
+ cls.delete(cls.search([
+ ('uuid', '=', event.uuid),
+ ('calendar.owner.email', 'in',
+ attendee_emails),
+ ('id', '!=', event.id),
+ ('recurrence', '=', event.recurrence),
+ ]))
elif event.organizer \
or (event.parent and event.parent.organizer):
if event.organizer:
@@ -795,43 +764,37 @@ class Event(ModelSQL, ModelView):
else:
organizer = event.parent.organizer
with Transaction().set_user(0):
- event_ids = self.search([
- ('uuid', '=', event.uuid),
- ('calendar.owner.email', '=', organizer),
- ('id', '!=', event.id),
- ('recurrence', '=', event.recurrence),
- ], limit=1)
- if event_ids:
- event2 = self.browse(event_ids[0])
+ events2 = cls.search([
+ ('uuid', '=', event.uuid),
+ ('calendar.owner.email', '=', organizer),
+ ('id', '!=', event.id),
+ ('recurrence', '=', event.recurrence),
+ ], limit=1)
+ if events2:
+ event2, = events2
for attendee in event2.attendees:
if attendee.email == event.calendar.owner.email:
- attendee_obj.write(attendee.id, {
- 'status': 'declined',
- })
- res = super(Event, self).delete(ids)
+ Attendee.write([attendee], {
+ 'status': 'declined',
+ })
+ super(Event, cls).delete(events)
# Restart the cache for event
- collection_obj.event.reset()
- return res
+ Collection._event_cache.clear()
- def ical2values(self, event_id, ical, calendar_id, vevent=None):
+ @classmethod
+ def ical2values(cls, event_id, ical, calendar_id, vevent=None):
'''
- Convert iCalendar to values for create or write
-
- :param event_id: the event id for write or None for create
- :param ical: a ical instance of vobject
- :param calendar_id: the calendar id of the event
- :param vevent: the vevent 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
+ the event id for write or None for create
'''
pool = Pool()
- category_obj = pool.get('calendar.category')
- location_obj = pool.get('calendar.location')
- alarm_obj = pool.get('calendar.event.alarm')
- attendee_obj = pool.get('calendar.event.attendee')
- rdate_obj = pool.get('calendar.event.rdate')
- exdate_obj = pool.get('calendar.event.exdate')
- rrule_obj = pool.get('calendar.event.rrule')
- exrule_obj = pool.get('calendar.event.exrule')
+ Category = pool.get('calendar.category')
+ Location = pool.get('calendar.location')
+ Alarm = pool.get('calendar.event.alarm')
+ Rdate = pool.get('calendar.event.rdate')
+ Exdate = pool.get('calendar.event.exdate')
+ Rrule = pool.get('calendar.rrule')
+ Exrule = pool.get('calendar.event.exrule')
vevents = []
if not vevent:
@@ -844,7 +807,7 @@ class Event(ModelSQL, ModelView):
event = None
if event_id:
- event = self.browse(event_id)
+ event = cls(event_id)
res = {}
if not event:
@@ -902,24 +865,23 @@ class Event(ModelSQL, ModelView):
res['status'] = ''
if hasattr(vevent, 'categories'):
with Transaction().set_context(active_test=False):
- category_ids = category_obj.search([
- ('name', 'in', [x for x in vevent.categories.value]),
- ])
- categories = category_obj.browse(category_ids)
+ categories = Category.search([
+ ('name', 'in', [x for x in vevent.categories.value]),
+ ])
category_names2ids = {}
for category in categories:
category_names2ids[category.name] = category.id
for category in vevent.categories.value:
if category not in category_names2ids:
- category_ids.append(category_obj.create({
- 'name': category,
- }))
- res['categories'] = [('set', category_ids)]
+ categories.append(Category.create({
+ 'name': category,
+ }))
+ res['categories'] = [('set', map(int, categories))]
else:
res['categories'] = [('unlink_all',)]
if hasattr(vevent, 'class'):
if getattr(vevent, 'class').value.lower() in \
- dict(self.classification.selection):
+ dict(cls.classification.selection):
res['classification'] = getattr(vevent, 'class').value.lower()
else:
res['classification'] = 'public'
@@ -927,16 +889,16 @@ class Event(ModelSQL, ModelView):
res['classification'] = 'public'
if hasattr(vevent, 'location'):
with Transaction().set_context(active_test=False):
- location_ids = location_obj.search([
- ('name', '=', vevent.location.value),
- ], limit=1)
- if not location_ids:
- location_id = location_obj.create({
- 'name': vevent.location.value,
- })
+ locations = Location.search([
+ ('name', '=', vevent.location.value),
+ ], limit=1)
+ if not locations:
+ location = Location.create({
+ 'name': vevent.location.value,
+ })
else:
- location_id = location_ids[0]
- res['location'] = location_id
+ location, = locations
+ res['location'] = location.id
else:
res['location'] = None
@@ -963,10 +925,10 @@ class Event(ModelSQL, ModelView):
if hasattr(vevent, 'attendee'):
while vevent.attendee_list:
attendee = vevent.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))
+ [attendees_todel[vals['email']]], vals))
del attendees_todel[vals['email']]
else:
res['attendees'].append(('create', vals))
@@ -978,9 +940,8 @@ class Event(ModelSQL, ModelView):
if hasattr(vevent, 'rdate'):
while vevent.rdate_list:
rdate = vevent.rdate_list.pop()
- for date in rdate.value:
- vals = rdate_obj.date2values(date)
- res['rdates'].append(('create', vals))
+ for rdate in rdate.value:
+ res['rdates'].append(('create', Rdate.date2values(rdate)))
res['exdates'] = []
if event:
@@ -988,9 +949,9 @@ class Event(ModelSQL, ModelView):
if hasattr(vevent, 'exdate'):
while vevent.exdate_list:
exdate = vevent.exdate_list.pop()
- for date in exdate.value:
- vals = exdate_obj.date2values(date)
- res['exdates'].append(('create', vals))
+ for exdate in exdate.value:
+ res['exdates'].append(('create',
+ Exdate.date2values(exdate)))
res['rrules'] = []
if event:
@@ -998,8 +959,7 @@ class Event(ModelSQL, ModelView):
if hasattr(vevent, 'rrule'):
while vevent.rrule_list:
rrule = vevent.rrule_list.pop()
- vals = rrule_obj.rule2values(rrule)
- res['rrules'].append(('create', vals))
+ res['rrules'].append(('create', Rrule.rule2values(rrule)))
res['exrules'] = []
if event:
@@ -1007,8 +967,7 @@ class Event(ModelSQL, ModelView):
if hasattr(vevent, 'exrule'):
while vevent.exrule_list:
exrule = vevent.exrule_list.pop()
- vals = exrule_obj.rule2values(exrule)
- res['exrules'].append(('create', vals))
+ res['exrules'].append(('create', Exrule.rule2values(exrule)))
if event:
res.setdefault('alarms', [])
@@ -1017,8 +976,7 @@ class Event(ModelSQL, ModelView):
res.setdefault('alarms', [])
while vevent.valarm_list:
valarm = vevent.valarm_list.pop()
- vals = alarm_obj.valarm2values(valarm)
- res['alarms'].append(('create', vals))
+ res['alarms'].append(('create', Alarm.valarm2values(valarm)))
if hasattr(ical, 'vtimezone'):
if ical.vtimezone.tzid.value in pytz.common_timezones:
@@ -1035,7 +993,7 @@ class Event(ModelSQL, ModelView):
occurences_todel = [x.id for x in event.occurences]
for vevent in vevents:
event_id = None
- vals = self.ical2values(event_id, ical, calendar_id, vevent=vevent)
+ vals = cls.ical2values(event_id, ical, calendar_id, vevent=vevent)
if event:
for occurence in event.occurences:
if vals['recurrence'] == \
@@ -1056,280 +1014,240 @@ class Event(ModelSQL, ModelView):
res['occurences'].insert(0, ('delete', occurences_todel))
return res
- def event2ical(self, event):
+ def event2ical(self):
'''
Return an iCalendar instance of vobject for event
-
- :param event: a BrowseRecord of calendar.event
- or a calendar.event id
- :param calendar: a BrowseRecord of calendar.calendar
- or a calendar.calendar id
- :return: an iCalendar instance of vobject
'''
pool = Pool()
- user_obj = pool.get('res.user')
- alarm_obj = pool.get('calendar.event.alarm')
- attendee_obj = pool.get('calendar.event.attendee')
- rdate_obj = pool.get('calendar.event.rdate')
- exdate_obj = pool.get('calendar.event.exdate')
- rrule_obj = pool.get('calendar.event.rrule')
- exrule_obj = pool.get('calendar.event.exrule')
-
- if isinstance(event, (int, long)):
- event = self.browse(event)
-
- user = user_obj.browse(Transaction().user)
- if event.timezone:
- tzevent = pytz.timezone(event.timezone)
+ User = pool.get('res.user')
+
+ user = User(Transaction().user)
+ if self.timezone:
+ tzevent = pytz.timezone(self.timezone)
+ tzevent = dateutil.tz.gettz(self.timezone)
elif user.timezone:
- tzevent = pytz.timezone(user.timezone)
+ tzevent = dateutil.tz.gettz(user.timezone)
else:
tzevent = tzlocal
ical = vobject.iCalendar()
vevent = ical.add('vevent')
- if event.vevent:
- ical.vevent = vobject.readOne(str(event.vevent))
+ if self.vevent:
+ ical.vevent = vobject.readOne(str(self.vevent))
vevent = ical.vevent
ical.vevent.transformToNative()
- if event.summary:
+ if self.summary:
if not hasattr(vevent, 'summary'):
vevent.add('summary')
- vevent.summary.value = event.summary
+ vevent.summary.value = self.summary
elif hasattr(vevent, 'summary'):
del vevent.summary
- if event.description:
+ if self.description:
if not hasattr(vevent, 'description'):
vevent.add('description')
- vevent.description.value = event.description
+ vevent.description.value = self.description
elif hasattr(vevent, 'description'):
del vevent.description
if not hasattr(vevent, 'dtstart'):
vevent.add('dtstart')
- if event.all_day:
- vevent.dtstart.value = event.dtstart.date()
+ if self.all_day:
+ vevent.dtstart.value = self.dtstart.date()
else:
- vevent.dtstart.value = event.dtstart.replace(tzinfo=tzlocal)\
+ vevent.dtstart.value = self.dtstart.replace(tzinfo=tzlocal)\
.astimezone(tzevent)
- if event.dtend:
+ if self.dtend:
if not hasattr(vevent, 'dtend'):
vevent.add('dtend')
- if event.all_day:
- vevent.dtend.value = event.dtend.date()
+ if self.all_day:
+ vevent.dtend.value = self.dtend.date()
else:
- vevent.dtend.value = event.dtend.replace(tzinfo=tzlocal)\
+ vevent.dtend.value = self.dtend.replace(tzinfo=tzlocal)\
.astimezone(tzevent)
elif hasattr(vevent, 'dtend'):
del vevent.dtend
if not hasattr(vevent, 'created'):
vevent.add('created')
- vevent.created.value = event.create_date.replace(tzinfo=tzlocal)
+ vevent.created.value = self.create_date.replace(tzinfo=tzlocal)
if not hasattr(vevent, 'dtstamp'):
vevent.add('dtstamp')
- date = event.write_date or event.create_date
+ date = self.write_date or self.create_date
vevent.dtstamp.value = date.replace(tzinfo=tzlocal)
if not hasattr(vevent, 'last-modified'):
vevent.add('last-modified')
vevent.last_modified.value = date.replace(tzinfo=tzlocal)
- if event.recurrence and event.parent:
+ if self.recurrence and self.parent:
if not hasattr(vevent, 'recurrence-id'):
vevent.add('recurrence-id')
- if event.all_day:
- vevent.recurrence_id.value = event.recurrence.date()
+ if self.all_day:
+ vevent.recurrence_id.value = self.recurrence.date()
else:
- vevent.recurrence_id.value = event.recurrence\
+ vevent.recurrence_id.value = self.recurrence\
.replace(tzinfo=tzlocal).astimezone(tzevent)
elif hasattr(vevent, 'recurrence-id'):
del vevent.recurrence_id
- if event.status:
+ if self.status:
if not hasattr(vevent, 'status'):
vevent.add('status')
- vevent.status.value = event.status.upper()
+ vevent.status.value = self.status.upper()
elif hasattr(vevent, 'status'):
del vevent.status
if not hasattr(vevent, 'uid'):
vevent.add('uid')
- vevent.uid.value = event.uuid
+ vevent.uid.value = self.uuid
if not hasattr(vevent, 'sequence'):
vevent.add('sequence')
- vevent.sequence.value = str(event.sequence) or '0'
- if event.categories:
+ vevent.sequence.value = str(self.sequence) or '0'
+ if self.categories:
if not hasattr(vevent, 'categories'):
vevent.add('categories')
- vevent.categories.value = [x.name for x in event.categories]
+ vevent.categories.value = [x.name for x in self.categories]
elif hasattr(vevent, 'categories'):
del vevent.categories
if not hasattr(vevent, 'class'):
vevent.add('class')
- getattr(vevent, 'class').value = event.classification.upper()
+ getattr(vevent, 'class').value = self.classification.upper()
elif getattr(vevent, 'class').value.lower() in \
- dict(self.classification.selection):
- getattr(vevent, 'class').value = event.classification.upper()
- if event.location:
+ dict(self.__class__.classification.selection):
+ getattr(vevent, 'class').value = self.classification.upper()
+ if self.location:
if not hasattr(vevent, 'location'):
vevent.add('location')
- vevent.location.value = event.location.name
+ vevent.location.value = self.location.name
elif hasattr(vevent, 'location'):
del vevent.location
if not hasattr(vevent, 'transp'):
vevent.add('transp')
- vevent.transp.value = event.transp.upper()
+ vevent.transp.value = self.transp.upper()
- if event.organizer:
+ if self.organizer:
if not hasattr(vevent, 'organizer'):
vevent.add('organizer')
- vevent.organizer.value = 'MAILTO:' + event.organizer
+ vevent.organizer.value = 'MAILTO:' + self.organizer
elif hasattr(vevent, 'organizer'):
del vevent.organizer
vevent.attendee_list = []
- for attendee in event.attendees:
- vevent.attendee_list.append(attendee_obj.attendee2attendee(
- attendee))
+ for attendee in self.attendees:
+ vevent.attendee_list.append(attendee.attendee2attendee())
- if event.rdates:
+ if self.rdates:
vevent.add('rdate')
vevent.rdate.value = []
- for rdate in event.rdates:
- vevent.rdate.value.append(rdate_obj.date2date(rdate))
+ for rdate in self.rdates:
+ vevent.rdate.value.append(rdate.date2date())
- if event.exdates:
+ if self.exdates:
vevent.add('exdate')
vevent.exdate.value = []
- for exdate in event.exdates:
- vevent.exdate.value.append(exdate_obj.date2date(exdate))
+ for exdate in self.exdates:
+ vevent.exdate.value.append(exdate.date2date())
- if event.rrules:
- for rrule in event.rrules:
- vevent.add('rrule').value = rrule_obj.rule2rule(rrule)
+ if self.rrules:
+ for rrule in self.rrules:
+ vevent.add('rrule').value = rrule.rule2rule()
- if event.exrules:
- for exrule in event.exrules:
- vevent.add('exrule').value = exrule_obj.rule2rule(exrule)
+ if self.exrules:
+ for exrule in self.exrules:
+ vevent.add('exrule').value = exrule.rule2rule()
vevent.valarm_list = []
- for alarm in event.alarms:
- valarm = alarm_obj.alarm2valarm(alarm)
+ for alarm in self.alarms:
+ valarm = alarm.alarm2valarm()
if valarm:
vevent.valarm_list.append(valarm)
- for occurence in event.occurences:
- oical = self.event2ical(occurence)
+ for occurence in self.occurences:
+ oical = occurence.event2ical()
ical.vevent_list.append(oical.vevent)
return ical
-Event()
-
class EventCategory(ModelSQL):
'Event - Category'
- _description = __doc__
- _name = 'calendar.event-calendar.category'
-
+ __name__ = 'calendar.event-calendar.category'
event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
required=True, select=True)
category = fields.Many2One('calendar.category', 'Category',
ondelete='CASCADE', required=True, select=True)
-EventCategory()
-
class Alarm(ModelSQL):
'Alarm'
- _description = __doc__
- _name = 'calendar.alarm'
-
+ __name__ = 'calendar.alarm'
valarm = fields.Binary('valarm')
- def valarm2values(self, valarm):
+ @classmethod
+ def valarm2values(cls, valarm):
'''
Convert a valarm object into values for create or write
-
- :param valarm: the valarm object
- :return: a dictionary with values
'''
- res = {}
- res['valarm'] = valarm.serialize()
- return res
+ return {
+ 'valarm': valarm.serialize(),
+ }
- def alarm2valarm(self, alarm):
+ def alarm2valarm(self):
'''
Return a valarm instance of vobject for alarm
-
- :param alarm: a BrowseRecord of calendar.event.alarm
- :return: a valarm instance of vobject
'''
- valarm = None
- if alarm.valarm:
- valarm = vobject.readOne(str(alarm.valarm))
- return valarm
-
-Alarm()
+ if self.valarm:
+ return vobject.readOne(str(self.valarm))
class EventAlarm(ModelSQL):
'Alarm'
- _description = __doc__
- _name = 'calendar.event.alarm'
+ __name__ = 'calendar.event.alarm'
_inherits = {'calendar.alarm': 'calendar_alarm'}
-
calendar_alarm = fields.Many2One('calendar.alarm', 'Calendar Alarm',
required=True, ondelete='CASCADE', select=True)
event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
required=True, select=True)
- def create(self, values):
- event_obj = Pool().get('calendar.event')
+ @classmethod
+ def create(cls, values):
+ Event = Pool().get('calendar.event')
if values.get('event'):
# Update write_date of event
- event_obj.write(values['event'], {})
- return super(EventAlarm, self).create(values)
-
- def write(self, ids, values):
- event_obj = Pool().get('calendar.event')
- if isinstance(ids, (int, long)):
- ids = [ids]
- event_ids = [x.event.id for x in self.browse(ids)]
+ Event.write(values['event'], {})
+ return super(EventAlarm, cls).create(values)
+
+ @classmethod
+ def write(cls, event_alarms, values):
+ Event = Pool().get('calendar.event')
+ events = [x.event for x in event_alarms]
if values.get('event'):
- event_ids.append(values['event'])
- if event_ids:
- # Update write_date of event
- event_obj.write(event_ids, {})
- return super(EventAlarm, self).write(ids, values)
-
- def delete(self, ids):
- event_obj = Pool().get('calendar.event')
- alarm_obj = Pool().get('calendar.alarm')
- if isinstance(ids, (int, long)):
- ids = [ids]
- event_alarms = self.browse(ids)
- alarm_ids = [a.calendar_alarm.id for a in event_alarms]
- event_ids = [x.event.id for x in event_alarms]
- if event_ids:
+ events.append(Event(values['event']))
+ if events:
# Update write_date of event
- event_obj.write(event_ids, {})
- res = super(EventAlarm, self).delete(ids)
- if alarm_ids:
- alarm_obj.delete(alarm_ids)
- return res
+ Event.write(events, {})
+ return super(EventAlarm, cls).write(event_alarms, values)
- def valarm2values(self, alarm):
- alarm_obj = Pool().get('calendar.alarm')
- return alarm_obj.valarm2values(alarm)
+ @classmethod
+ def delete(cls, event_alarms):
+ pool = Pool()
+ Event = pool.get('calendar.event')
+ Alarm = pool.get('calendar.alarm')
+ alarms = [a.calendar_alarm for a in event_alarms]
+ events = [x.event for x in event_alarms]
+ if events:
+ # Update write_date of event
+ Event.write(events, {})
+ super(EventAlarm, cls).delete(event_alarms)
+ if alarms:
+ Alarm.delete(alarms)
- def alarm2valarm(self, alarm):
- alarm_obj = Pool().get('calendar.alarm')
- return alarm_obj.alarm2valarm(alarm)
+ @classmethod
+ def valarm2values(cls, alarm):
+ Alarm = Pool().get('calendar.alarm')
+ return Alarm.valarm2values(alarm)
-EventAlarm()
+ def alarm2valarm(self):
+ return self.calendar_alarm.alarm2valarm()
class Attendee(ModelSQL, ModelView):
'Attendee'
- _description = __doc__
- _name = 'calendar.attendee'
-
+ __name__ = 'calendar.attendee'
email = fields.Char('Email', required=True, states={
'readonly': Eval('id', 0) > 0,
}, depends=['id'])
@@ -1343,20 +1261,19 @@ class Attendee(ModelSQL, ModelView):
], 'Participation Status')
attendee = fields.Binary('attendee')
- def default_status(self):
+ @staticmethod
+ def default_status():
return ''
- def _attendee2update(self, attendee):
- res = {}
- res['status'] = attendee.status
- return res
+ def _attendee2update(self):
+ return {
+ 'status': self.status,
+ }
- def attendee2values(self, attendee):
+ @classmethod
+ def attendee2values(cls, attendee):
'''
Convert a attendee object into values for create or write
-
- :param attendee: the attendee object
- :return: a dictionary with values
'''
res = {}
if attendee.value.lower().startswith('mailto:'):
@@ -1365,60 +1282,54 @@ class Attendee(ModelSQL, ModelView):
res['email'] = attendee.value
res['status'] = ''
if hasattr(attendee, 'partstat_param'):
- if attendee.partstat_param.lower() in dict(self.status.selection):
+ if attendee.partstat_param.lower() in dict(cls.status.selection):
res['status'] = attendee.partstat_param.lower()
res['attendee'] = attendee.serialize()
return res
- def attendee2attendee(self, attendee):
+ def attendee2attendee(self):
'''
Return a attendee instance of vobject for attendee
-
- :param attendee: a BrowseRecord of calendar.event.attendee
- :return: a attendee instance of vobject
'''
res = None
- if attendee.attendee:
+ if self.attendee:
res = vobject.base.textLineToContentLine(
- str(attendee.attendee).replace('\r\n ', ''))
+ str(self.attendee).replace('\r\n ', ''))
else:
res = vobject.base.ContentLine('ATTENDEE', [], '')
- if attendee.status:
+ selection = dict(self.__class__.status.selection)
+ if self.status:
if hasattr(res, 'partstat_param'):
- if res.partstat_param.lower() in dict(self.status.selection):
- res.partstat_param = attendee.status.upper()
+ if res.partstat_param.lower() in selection:
+ res.partstat_param = self.status.upper()
else:
- res.partstat_param = attendee.status.upper()
+ res.partstat_param = self.status.upper()
elif hasattr(res, 'partstat_param'):
- if res.partstat_param.lower() in dict(self.status.selection):
+ if res.partstat_param.lower() in selection:
del res.partstat_param
- res.value = 'MAILTO:' + attendee.email
+ res.value = 'MAILTO:' + self.email
return res
-Attendee()
-
class EventAttendee(ModelSQL, ModelView):
'Attendee'
- _description = __doc__
- _name = 'calendar.event.attendee'
+ __name__ = 'calendar.event.attendee'
_inherits = {'calendar.attendee': 'calendar_attendee'}
-
calendar_attendee = fields.Many2One('calendar.attendee',
'Calendar Attendee', required=True, ondelete='CASCADE', select=True)
event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
required=True, select=True)
- def create(self, values):
- event_obj = Pool().get('calendar.event')
+ @classmethod
+ def create(cls, values):
+ Event = Pool().get('calendar.event')
if values.get('event'):
# Update write_date of event
- event_obj.write(values['event'], {})
- res = super(EventAttendee, self).create(values)
- attendee = self.browse(res)
- event = attendee.event
+ Event.write([Event(values['event'])], {})
+ event_attendee = super(EventAttendee, cls).create(values)
+ event = event_attendee.event
if (event.calendar.owner
and (event.organizer == event.calendar.owner.email
or (event.parent
@@ -1432,37 +1343,35 @@ class EventAttendee(ModelSQL, ModelView):
if x.email != event.parent.organizer]
if attendee_emails:
with Transaction().set_user(0):
- event_ids = event_obj.search([
- ('uuid', '=', event.uuid),
- ('calendar.owner.email', 'in', attendee_emails),
- ('id', '!=', event.id),
- ('recurrence', '=', event.recurrence),
- ])
- for event_id in event_ids:
- self.copy(res, default={
- 'event': event_id,
- })
- return res
+ events = Event.search([
+ ('uuid', '=', event.uuid),
+ ('calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', event.id),
+ ('recurrence', '=', event.recurrence),
+ ])
+ for event in events:
+ cls.copy([event_attendee], default={
+ 'event': event.id,
+ })
+ return event_attendee
- def write(self, ids, values):
- event_obj = Pool().get('calendar.event')
- if isinstance(ids, (int, long)):
- ids = [ids]
- event_ids = [x.event.id for x in self.browse(ids)]
+ @classmethod
+ def write(cls, event_attendees, values):
+ Event = Pool().get('calendar.event')
+ events = [x.event for x in event_attendees]
if values.get('event'):
- event_ids.append(values['event'])
- if event_ids:
+ events.append(Event(values['event']))
+ if events:
# Update write_date of event
- event_obj.write(event_ids, {})
+ Event.write(events, {})
if 'email' in values:
values = values.copy()
del values['email']
- res = super(EventAttendee, self).write(ids, values)
- attendees = self.browse(ids)
- for attendee in attendees:
- event = attendee.event
+ super(EventAttendee, cls).write(event_attendees, values)
+ for event_attendee in event_attendees:
+ event = event_attendee.event
if event.calendar.owner \
and (event.organizer == event.calendar.owner.email \
or (event.parent \
@@ -1475,34 +1384,31 @@ class EventAttendee(ModelSQL, ModelView):
if x.email != event.parent.organizer]
if attendee_emails:
with Transaction().set_user(0):
- attendee_ids = self.search([
- ('event.uuid', '=', event.uuid),
- ('event.calendar.owner.email', 'in',
- attendee_emails),
- ('id', '!=', attendee.id),
- ('event.recurrence', '=',
- event.recurrence),
- ('email', '=', attendee.email),
- ])
- self.write(attendee_ids, self._attendee2update(
- attendee))
- return res
+ other_attendees = cls.search([
+ ('event.uuid', '=', event.uuid),
+ ('event.calendar.owner.email', 'in',
+ attendee_emails),
+ ('id', '!=', event_attendee.id),
+ ('event.recurrence', '=',
+ event.recurrence),
+ ('email', '=', event_attendee.email),
+ ])
+ cls.write(other_attendees,
+ event_attendee._attendee2update())
+
+ @classmethod
+ def delete(cls, event_attendees):
+ pool = Pool()
+ Event = pool.get('calendar.event')
+ Attendee = pool.get('calendar.attendee')
- def delete(self, ids):
- event_obj = Pool().get('calendar.event')
- attendee_obj = Pool().get('calendar.attendee')
-
- if isinstance(ids, (int, long)):
- ids = [ids]
- event_attendees = self.browse(ids)
- calendar_attendee_ids = [a.calendar_attendee.id \
- for a in event_attendees]
- event_ids = [x.event.id for x in event_attendees]
- if event_ids:
+ calendar_attendees = [a.calendar_attendee for a in event_attendees]
+ events = [x.event for x in event_attendees]
+ if events:
# Update write_date of event
- event_obj.write(event_ids, {})
+ Event.write(events, {})
- for attendee in self.browse(ids):
+ for attendee in event_attendees:
event = attendee.event
if event.calendar.owner \
and (event.organizer == event.calendar.owner.email \
@@ -1516,16 +1422,16 @@ class EventAttendee(ModelSQL, ModelView):
if x.email != event.parent.organizer]
if attendee_emails:
with Transaction().set_user(0):
- attendee_ids = self.search([
- ('event.uuid', '=', event.uuid),
- ('event.calendar.owner.email', 'in',
- attendee_emails),
- ('id', '!=', attendee.id),
- ('event.recurrence', '=',
- event.recurrence),
- ('email', '=', attendee.email),
- ])
- self.delete(attendee_ids)
+ attendees = cls.search([
+ ('event.uuid', '=', event.uuid),
+ ('event.calendar.owner.email', 'in',
+ attendee_emails),
+ ('id', '!=', attendee.id),
+ ('event.recurrence', '=',
+ event.recurrence),
+ ('email', '=', attendee.email),
+ ])
+ cls.delete(attendees)
elif event.calendar.owner \
and ((event.organizer \
or (event.parent and event.parent.organizer)) \
@@ -1535,89 +1441,76 @@ class EventAttendee(ModelSQL, ModelView):
else:
organizer = event.parent.organizer
with Transaction().set_user(0):
- attendee_ids = self.search([
- ('event.uuid', '=', event.uuid),
- ('event.calendar.owner.email', '=', organizer),
- ('id', '!=', attendee.id),
- ('event.recurrence', '=', event.recurrence),
- ('email', '=', attendee.email),
- ])
- if attendee_ids:
- self.write(attendee_ids, {
- 'status': 'declined',
- })
- res = super(EventAttendee, self).delete(ids)
- if calendar_attendee_ids:
- attendee_obj.delete(calendar_attendee_ids)
- return res
+ attendees = cls.search([
+ ('event.uuid', '=', event.uuid),
+ ('event.calendar.owner.email', '=', organizer),
+ ('id', '!=', attendee.id),
+ ('event.recurrence', '=', event.recurrence),
+ ('email', '=', attendee.email),
+ ])
+ if attendees:
+ cls.write(attendees, {
+ 'status': 'declined',
+ })
+ super(EventAttendee, cls).delete(event_attendees)
+ if calendar_attendees:
+ Attendee.delete(calendar_attendees)
- def copy(self, ids, default=None):
- attendee_obj = Pool().get('calendar.attendee')
+ @classmethod
+ def copy(cls, event_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(EventAttendee, self).copy(attendee.id,
- default=default)
- new_ids.append(new_id)
- if int_id:
- return new_ids[0]
- return new_ids
+ new_event_attendees = []
+ for event_attendee in event_attendees:
+ default['calendar_attendee'], = Attendee.copy(
+ [event_attendee.calendar_attendee])
+ new_event_attendees.extend(super(EventAttendee, cls).copy(
+ [event_attendee], default=default))
+ return new_event_attendees
- def _attendee2update(self, attendee):
- attendee_obj = Pool().get('calendar.attendee')
- return attendee_obj._attendee2update(attendee)
+ def _attendee2update(self):
+ return self.calendar_attendee._attendee2update()
- def attendee2values(self, attendee):
- attendee_obj = Pool().get('calendar.attendee')
- return attendee_obj.attendee2values(attendee)
+ @staticmethod
+ def attendee2values(attendee):
+ Attendee = Pool().get('calendar.attendee')
+ return Attendee.attendee2values(attendee)
- def attendee2attendee(self, attendee):
- attendee_obj = Pool().get('calendar.attendee')
- return attendee_obj.attendee2attendee(attendee)
-
-EventAttendee()
+ def attendee2attendee(self):
+ return self.calendar_attendee.attendee2attendee()
class Date(ModelSQL, ModelView):
'Calendar Date'
- _description = __doc__
- _name = 'calendar.date'
+ __name__ = 'calendar.date'
_rec_name = 'datetime'
-
date = fields.Boolean('Is Date', help='Ignore time of field "Date", ' \
'but handle as date only.')
datetime = fields.DateTime('Date', 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
old_table = 'calendar_rdate'
if TableHandler.table_exist(cursor, old_table):
- TableHandler.table_rename(cursor, old_table, self._table)
+ TableHandler.table_rename(cursor, old_table, cls._table)
- return super(Date, self).init(module_name)
+ super(Date, cls).__register__(module_name)
- def _date2update(self, date):
- res = {}
- res['date'] = date.date
- res['datetime'] = date.datetime
- return res
+ def _date2update(self):
+ return {
+ 'date': self.date,
+ 'datetime': self.datetime,
+ }
- def date2values(self, date):
+ @staticmethod
+ def date2values(date):
'''
Convert a date object into values for create or write
-
- :param date: the date object
- :return: a dictionary with values
'''
res = {}
if not isinstance(date, datetime.datetime):
@@ -1632,108 +1525,91 @@ class Date(ModelSQL, ModelView):
res['datetime'] = date
return res
- def date2date(self, date):
+ def date2date(self):
'''
Return a datetime for date
-
- :param date: a BrowseRecord of calendar.date or
- calendar.exdate
- :return: a datetime
'''
- if date.date:
- res = date.datetime.date()
+ if self.date:
+ return self.date.datetime.date()
else:
# Convert to UTC as sunbird doesn't handle tzid
- res = date.datetime.replace(tzinfo=tzlocal).astimezone(tzutc)
- return res
-
-Date()
+ return self.datetime.replace(tzinfo=tzlocal).astimezone(tzutc)
class EventRDate(ModelSQL, ModelView):
'Recurrence Date'
- _description = __doc__
- _name = 'calendar.event.rdate'
+ __name__ = 'calendar.event.rdate'
_inherits = {'calendar.date': 'calendar_date'}
_rec_name = 'datetime'
-
calendar_date = fields.Many2One('calendar.date', 'Calendar Date',
required=True, ondelete='CASCADE', select=True)
event = fields.Many2One('calendar.event', 'Event', 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(EventRDate, self).init(module_name)
+ super(EventRDate, cls).__register__(module_name)
- def create(self, values):
- event_obj = Pool().get('calendar.event')
+ @classmethod
+ def create(cls, values):
+ Event = Pool().get('calendar.event')
if values.get('event'):
# Update write_date of event
- event_obj.write(values['event'], {})
- return super(EventRDate, self).create(values)
-
- def write(self, ids, values):
- event_obj = Pool().get('calendar.event')
- if isinstance(ids, (int, long)):
- ids = [ids]
- event_ids = [x.event.id for x in self.browse(ids)]
+ Event.write([Event(values['event'])], {})
+ return super(EventRDate, cls).create(values)
+
+ @classmethod
+ def write(cls, event_rdates, values):
+ Event = Pool().get('calendar.event')
+ events = [x.event for x in event_rdates]
if values.get('event'):
- event_ids.append(values['event'])
- if event_ids:
- # Update write_date of event
- event_obj.write(event_ids, {})
- return super(EventRDate, self).write(ids, values)
-
- def delete(self, ids):
- event_obj = Pool().get('calendar.event')
- rdate_obj = Pool().get('calendar.date')
- if isinstance(ids, (int, long)):
- ids = [ids]
- event_rdates = self.browse(ids)
- rdate_ids = [a.calendar_date.id for a in event_rdates]
- event_ids = [x.event.id for x in event_rdates]
- if event_ids:
+ events.append(Event(values['event']))
+ if events:
# Update write_date of event
- event_obj.write(event_ids, {})
- res = super(EventRDate, self).delete(ids)
- if rdate_ids:
- rdate_obj.delete(rdate_ids)
- return res
+ Event.write(events, {})
+ super(EventRDate, cls).write(event_rdates, values)
- def _date2update(self, date):
- date_obj = Pool().get('calendar.date')
- return date_obj._date2update(date)
+ @classmethod
+ def delete(cls, event_rdates):
+ pool = Pool()
+ Event = pool.get('calendar.event')
+ Date = pool.get('calendar.date')
+ dates = [a.calendar_date for a in event_rdates]
+ events = [x.event for x in event_rdates]
+ if events:
+ # Update write_date of event
+ Event.write(events, {})
+ super(EventRDate, cls).delete(event_rdates)
+ if dates:
+ Date.delete(dates)
- 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)
-EventRDate()
+ def date2date(self):
+ return self.calendar_date.date2date()
class EventExDate(EventRDate):
'Exception Date'
- _description = __doc__
- _name = 'calendar.event.exdate'
-
-EventExDate()
+ __name__ = 'calendar.event.exdate'
class RRule(ModelSQL, ModelView):
'Recurrence Rule'
- _description = __doc__
- _name = 'calendar.rrule'
+ __name__ = 'calendar.rrule'
_rec_name = 'freq'
freq = fields.Selection([
@@ -1769,14 +1645,15 @@ class RRule(ModelSQL, ModelView):
('sa', 'Saturday'),
], 'Week Day', sort=False)
- def __init__(self):
- super(RRule, self).__init__()
- self._sql_constraints += [
+ @classmethod
+ def __setup__(cls):
+ super(RRule, cls).__setup__()
+ cls._sql_constraints += [
('until_count_only_one',
'CHECK(until IS NULL OR count IS NULL OR count = 0)',
'Only one of "until" and "count" can be set!'),
- ]
- self._constraints += [
+ ]
+ cls._constraints += [
('check_bysecond', 'invalid_bysecond'),
('check_byminute', 'invalid_byminute'),
('check_byhour', 'invalid_byhour'),
@@ -1786,31 +1663,30 @@ class RRule(ModelSQL, ModelView):
('check_byweekno', 'invalid_byweekno'),
('check_bymonth', 'invalid_bymonth'),
('check_bysetpos', 'invalid_bysetpos'),
- ]
- self._error_messages.update({
- 'invalid_bysecond': 'Invalid "By Second"',
- 'invalid_byminute': 'Invalid "By Minute"',
- 'invalid_byhour': 'Invalid "By Hour"',
- 'invalid_byday': 'Invalid "By Day"',
- 'invalid_bymonthday': 'Invalid "By Month Day"',
- 'invalid_byyearday': 'Invalid "By Year Day"',
- 'invalid_byweekno': 'Invalid "By Week Number"',
- 'invalid_bymonth': 'Invalid "By Month"',
- 'invalid_bysetpos': 'Invalid "By Position"',
- })
-
- def init(self, module_name):
+ ]
+ cls._error_messages.update({
+ 'invalid_bysecond': 'Invalid "By Second"',
+ 'invalid_byminute': 'Invalid "By Minute"',
+ 'invalid_byhour': 'Invalid "By Hour"',
+ 'invalid_byday': 'Invalid "By Day"',
+ 'invalid_bymonthday': 'Invalid "By Month Day"',
+ 'invalid_byyearday': 'Invalid "By Year Day"',
+ 'invalid_byweekno': 'Invalid "By Week Number"',
+ 'invalid_bymonth': 'Invalid "By Month"',
+ 'invalid_bysetpos': 'Invalid "By Position"',
+ })
+
+ @classmethod
+ def __register__(cls, module_name):
cursor = Transaction().cursor
# Migrate from 1.4: unit_count replaced by until_count_only_one
- table = TableHandler(cursor, self, module_name)
+ table = TableHandler(cursor, cls, module_name)
table.drop_constraint('until_count')
- return super(RRule, self).init(module_name)
+ return super(RRule, cls).__register__(module_name)
- def check_bysecond(self, ids):
- for rule in self.browse(ids):
- if not rule.bysecond:
- continue
- for second in rule.bysecond.split(','):
+ def check_bysecond(self):
+ if self.bysecond:
+ for second in self.bysecond.split(','):
try:
second = int(second)
except Exception:
@@ -1819,11 +1695,9 @@ class RRule(ModelSQL, ModelView):
return False
return True
- def check_byminute(self, ids):
- for rule in self.browse(ids):
- if not rule.byminute:
- continue
- for minute in rule.byminute.split(','):
+ def check_byminute(self):
+ if self.byminute:
+ for minute in self.byminute.split(','):
try:
minute = int(minute)
except Exception:
@@ -1832,11 +1706,9 @@ class RRule(ModelSQL, ModelView):
return False
return True
- def check_byhour(self, ids):
- for rule in self.browse(ids):
- if not rule.byhour:
- continue
- for hour in rule.byhour.split(','):
+ def check_byhour(self):
+ if self.byhour:
+ for hour in self.byhour.split(','):
try:
hour = int(hour)
except Exception:
@@ -1845,11 +1717,9 @@ class RRule(ModelSQL, ModelView):
return False
return True
- def check_byday(self, ids):
- for rule in self.browse(ids):
- if not rule.byday:
- continue
- for weekdaynum in rule.byday.split(','):
+ def check_byday(self):
+ if self.byday:
+ for weekdaynum in self.byday.split(','):
weekday = weekdaynum[-2:]
if weekday not in ('SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'):
return False
@@ -1864,11 +1734,9 @@ class RRule(ModelSQL, ModelView):
return False
return True
- def check_bymonthday(self, ids):
- for rule in self.browse(ids):
- if not rule.bymonthday:
- continue
- for monthdaynum in rule.bymonthday.split(','):
+ def check_bymonthday(self):
+ if self.bymonthday:
+ for monthdaynum in self.bymonthday.split(','):
try:
monthdaynum = int(monthdaynum)
except Exception:
@@ -1877,11 +1745,9 @@ class RRule(ModelSQL, ModelView):
return False
return True
- def check_byyearday(self, ids):
- for rule in self.browse(ids):
- if not rule.byyearday:
- continue
- for yeardaynum in rule.byyearday.split(','):
+ def check_byyearday(self):
+ if self.byyearday:
+ for yeardaynum in self.byyearday.split(','):
try:
yeardaynum = int(yeardaynum)
except Exception:
@@ -1890,11 +1756,9 @@ class RRule(ModelSQL, ModelView):
return False
return True
- def check_byweekno(self, ids):
- for rule in self.browse(ids):
- if not rule.byweekno:
- continue
- for weeknum in rule.byweekno.split(','):
+ def check_byweekno(self):
+ if self.byweekno:
+ for weeknum in self.byweekno.split(','):
try:
weeknum = int(weeknum)
except Exception:
@@ -1903,11 +1767,9 @@ class RRule(ModelSQL, ModelView):
return False
return True
- def check_bymonth(self, ids):
- for rule in self.browse(ids):
- if not rule.bymonth:
- continue
- for monthnum in rule.bymonth.split(','):
+ def check_bymonth(self):
+ if self.bymonth:
+ for monthnum in self.bymonth.split(','):
try:
monthnum = int(monthnum)
except Exception:
@@ -1916,11 +1778,9 @@ class RRule(ModelSQL, ModelView):
return False
return True
- def check_bysetpos(self, ids):
- for rule in self.browse(ids):
- if not rule.bysetpos:
- continue
- for setposday in rule.bysetpos.split(','):
+ def check_bysetpos(self):
+ if self.bysetpos:
+ for setposday in self.bysetpos.split(','):
try:
setposday = int(setposday)
except Exception:
@@ -1929,20 +1789,18 @@ class RRule(ModelSQL, ModelView):
return False
return True
- def _rule2update(self, rule):
+ def _rule2update(self):
res = {}
for field in ('freq', 'until_date', 'until', 'count', 'interval',
'bysecond', 'byminute', 'byhour', 'byday', 'bymonthday',
'byyearday', 'byweekno', 'bymonth', 'bysetpos', 'wkst'):
- res[field] = rule[field]
+ res[field] = getattr(self, field)
return res
- def rule2values(self, rule):
+ @classmethod
+ def rule2values(cls, rule):
'''
Convert a rule object into values for create or write
-
- :param rule: teh rule object
- :return: a dictionary with values
'''
res = {}
for attr in str(rule.value).replace('\\', '').split(';'):
@@ -1969,42 +1827,35 @@ class RRule(ModelSQL, ModelView):
res[field] = value
return res
- def rule2rule(self, rule):
+ def rule2rule(self):
'''
Return a rule string for rule
-
- :param rule: a BrowseRecord of calendar.rrule or
- calendar.exrule
- :return: a string
'''
- res = 'FREQ=' + rule.freq.upper()
- if rule.until:
+ res = 'FREQ=' + self.freq.upper()
+ if self.until:
res += ';UNTIL='
- if rule.until_date:
- res += vobject.icalendar.dateToString(rule.until.date())
+ if self.until_date:
+ res += vobject.icalendar.dateToString(self.until.date())
else:
- res += vobject.icalendar.dateTimeToString(rule.until\
+ res += vobject.icalendar.dateTimeToString(self.until\
.replace(tzinfo=tzlocal).astimezone(tzutc),
convertToUTC=True)
- elif rule.count:
- res += ';COUNT=' + str(rule.count)
+ elif self.count:
+ res += ';COUNT=' + str(self.count)
for field in ('freq', 'wkst'):
- if rule[field]:
- res += ';' + field.upper() + '=' + rule[field].upper()
+ if getattr(self, field):
+ res += ';' + field.upper() + '=' + getattr(self, field).upper()
for field in ('interval', 'bysecond', 'byminute', 'byhour',
'byday', 'bymonthday', 'byyearday', 'byweekno',
'bymonth', 'bysetpos'):
- if rule[field]:
- res += ';' + field.upper() + '=' + str(rule[field])
+ if getattr(self, field):
+ res += ';' + field.upper() + '=' + str(getattr(self, field))
return res
-RRule()
-
class EventRRule(ModelSQL, ModelView):
'Recurrence Rule'
- _description = __doc__
- _name = 'calendar.event.rrule'
+ __name__ = 'calendar.event.rrule'
_inherits = {'calendar.rrule': 'calendar_rrule'}
_rec_name = 'freq'
@@ -2013,59 +1864,52 @@ class EventRRule(ModelSQL, ModelView):
event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
select=True, required=True)
- def create(self, values):
- event_obj = Pool().get('calendar.event')
+ @classmethod
+ def create(cls, values):
+ Event = Pool().get('calendar.event')
if values.get('event'):
# Update write_date of event
- event_obj.write(values['event'], {})
- return super(EventRRule, self).create(values)
-
- def write(self, ids, values):
- event_obj = Pool().get('calendar.event')
- if isinstance(ids, (int, long)):
- ids = [ids]
- event_ids = [x.event.id for x in self.browse(ids)]
+ Event.write([Event(values['event'])], {})
+ return super(EventRRule, cls).create(values)
+
+ @classmethod
+ def write(cls, event_rrules, values):
+ Event = Pool().get('calendar.event')
+ events = [x.event for x in event_rrules]
if values.get('event'):
- event_ids.append(values['event'])
- if event_ids:
+ events.append(Event(values['event']))
+ if events:
# Update write_date of event
- event_obj.write(event_ids, {})
- return super(EventRRule, self).write(ids, values)
-
- def delete(self, ids):
- event_obj = Pool().get('calendar.event')
- rrule_obj = Pool().get('calendar.rrule')
- if isinstance(ids, (int, long)):
- ids = [ids]
- event_rrules = self.browse(ids)
- rrule_ids = [a.calendar_rrule.id for a in event_rrules]
- event_ids = [x.event.id for x in event_rrules]
- if event_ids:
+ Event.write(events, {})
+ super(EventRRule, cls).write(event_rrules, values)
+
+ @classmethod
+ def delete(cls, event_rrules):
+ pool = Pool()
+ Event = pool.get('calendar.event')
+ Rrule = pool.get('calendar.rrule')
+ rrules = [a.calendar_rrule for a in event_rrules]
+ events = [x.event for x in event_rrules]
+ if events:
# Update write_date of event
- event_obj.write(event_ids, {})
- res = super(EventRRule, self).delete(ids)
- if rrule_ids:
- rrule_obj.delete(rrule_ids)
- return res
+ Event.write(events, {})
+ super(EventRRule, cls).delete(event_rrules)
+ if rrules:
+ Rrule.delete(rrules)
- def _rule2update(self, rule):
- rule_obj = Pool().get('calendar.rrule')
- return rule_obj._rule2update(rule)
+ def _rule2update(self):
+ return self.calendar_rrule._rule2update()
+ @classmethod
def rule2values(self, rule):
- rule_obj = Pool().get('calendar.rrule')
- return rule_obj.rule2values(rule)
+ Rule = Pool().get('calendar.rrule')
+ return Rule.rule2values(rule)
- def rule2rule(self, rule):
- rule_obj = Pool().get('calendar.rrule')
- return rule_obj.rule2rule(rule)
-
-EventRRule()
+ def rule2rule(self):
+ return self.calendar_rrule.rule2rule()
class EventExRule(EventRRule):
'Exception Rule'
- _description = __doc__
- _name = 'calendar.event.exrule'
-
-EventExRule()
+ __name__ = 'calendar.event.exrule'
+ _table = 'calendar_event_exrule' # Needed to override EventRRule._table
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index bb1658b..5dd0706 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -68,16 +68,15 @@ msgstr "Només es pot usar o «Fins a» o «Nombre de vegades»"
msgctxt "field:calendar.alarm,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.alarm,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.alarm,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.alarm,rec_name:"
msgid "Name"
@@ -89,24 +88,23 @@ msgstr "valarm"
msgctxt "field:calendar.alarm,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.alarm,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:calendar.attendee,attendee:"
msgid "attendee"
-msgstr "assistents"
+msgstr "assistent"
msgctxt "field:calendar.attendee,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.attendee,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.attendee,email:"
msgid "Email"
@@ -114,7 +112,7 @@ msgstr "Correu electrònic"
msgctxt "field:calendar.attendee,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.attendee,rec_name:"
msgid "Name"
@@ -126,20 +124,19 @@ msgstr "Estat de participació"
msgctxt "field:calendar.attendee,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.attendee,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:calendar.calendar,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.calendar,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.calendar,description:"
msgid "Description"
@@ -147,7 +144,7 @@ msgstr "Descripció"
msgctxt "field:calendar.calendar,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.calendar,name:"
msgid "Name"
@@ -155,7 +152,7 @@ msgstr "Nom"
msgctxt "field:calendar.calendar,owner:"
msgid "Owner"
-msgstr "Amo"
+msgstr "Propietari"
msgctxt "field:calendar.calendar,read_users:"
msgid "Read Users"
@@ -167,11 +164,11 @@ msgstr "Nom"
msgctxt "field:calendar.calendar,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.calendar,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:calendar.calendar,write_users:"
msgid "Write Users"
@@ -183,16 +180,15 @@ msgstr "Calendari"
msgctxt "field:calendar.calendar-read-res.user,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.calendar-read-res.user,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.calendar-read-res.user,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.calendar-read-res.user,rec_name:"
msgid "Name"
@@ -204,11 +200,11 @@ msgstr "Usuari"
msgctxt "field:calendar.calendar-read-res.user,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.calendar-read-res.user,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:calendar.calendar-write-res.user,calendar:"
msgid "Calendar"
@@ -216,16 +212,15 @@ msgstr "Calendari"
msgctxt "field:calendar.calendar-write-res.user,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.calendar-write-res.user,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.calendar-write-res.user,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.calendar-write-res.user,rec_name:"
msgid "Name"
@@ -237,24 +232,23 @@ msgstr "Usuari"
msgctxt "field:calendar.calendar-write-res.user,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.calendar-write-res.user,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:calendar.category,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.category,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.category,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.category,name:"
msgid "Name"
@@ -266,47 +260,43 @@ msgstr "Nom"
msgctxt "field:calendar.category,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.category,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:calendar.date,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.date,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
-#, fuzzy
msgctxt "field:calendar.date,date:"
msgid "Is Date"
msgstr "És data"
-#, fuzzy
msgctxt "field:calendar.date,datetime:"
msgid "Date"
msgstr "Data"
msgctxt "field:calendar.date,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
-#, fuzzy
msgctxt "field:calendar.date,rec_name:"
msgid "Name"
-msgstr "Nom del camp"
+msgstr "Nom"
msgctxt "field:calendar.date,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.date,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:calendar.event,alarms:"
msgid "Alarms"
@@ -326,7 +316,7 @@ msgstr "Calendari"
msgctxt "field:calendar.event,calendar_owner:"
msgid "Owner"
-msgstr "Amo"
+msgstr "Propietari"
msgctxt "field:calendar.event,calendar_read_users:"
msgid "Read Users"
@@ -346,12 +336,11 @@ msgstr "Classificació"
msgctxt "field:calendar.event,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.event,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.event,description:"
msgid "Description"
@@ -375,7 +364,7 @@ msgstr "Regles d'excepció"
msgctxt "field:calendar.event,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.event,location:"
msgid "Location"
@@ -439,11 +428,11 @@ msgstr "vevent"
msgctxt "field:calendar.event,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.event,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:calendar.event-calendar.category,category:"
msgid "Category"
@@ -451,12 +440,11 @@ msgstr "Categoria"
msgctxt "field:calendar.event-calendar.category,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.event-calendar.category,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.event-calendar.category,event:"
msgid "Event"
@@ -464,7 +452,7 @@ msgstr "Esdeveniment"
msgctxt "field:calendar.event-calendar.category,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.event-calendar.category,rec_name:"
msgid "Name"
@@ -472,11 +460,11 @@ msgstr "Nom"
msgctxt "field:calendar.event-calendar.category,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.event-calendar.category,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:calendar.event.alarm,calendar_alarm:"
msgid "Calendar Alarm"
@@ -484,12 +472,11 @@ msgstr "Alarma del calendari"
msgctxt "field:calendar.event.alarm,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.event.alarm,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.event.alarm,event:"
msgid "Event"
@@ -497,7 +484,7 @@ msgstr "Esdeveniment"
msgctxt "field:calendar.event.alarm,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.event.alarm,rec_name:"
msgid "Name"
@@ -505,11 +492,11 @@ msgstr "Nom"
msgctxt "field:calendar.event.alarm,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.event.alarm,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:calendar.event.attendee,calendar_attendee:"
msgid "Calendar Attendee"
@@ -517,12 +504,11 @@ msgstr "Calendari d'assistents"
msgctxt "field:calendar.event.attendee,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.event.attendee,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.event.attendee,event:"
msgid "Event"
@@ -530,7 +516,7 @@ msgstr "Esdeveniment"
msgctxt "field:calendar.event.attendee,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.event.attendee,rec_name:"
msgid "Name"
@@ -538,24 +524,23 @@ msgstr "Nom"
msgctxt "field:calendar.event.attendee,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.event.attendee,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:calendar.event.exdate,calendar_date:"
msgid "Calendar Date"
-msgstr ""
+msgstr "Data calendari"
msgctxt "field:calendar.event.exdate,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.event.exdate,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.event.exdate,event:"
msgid "Event"
@@ -563,7 +548,7 @@ msgstr "Esdeveniment"
msgctxt "field:calendar.event.exdate,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.event.exdate,rec_name:"
msgid "Name"
@@ -571,11 +556,11 @@ msgstr "Nom"
msgctxt "field:calendar.event.exdate,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.event.exdate,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:calendar.event.exrule,calendar_rrule:"
msgid "Calendar RRule"
@@ -583,12 +568,11 @@ msgstr "Regla de recurrència"
msgctxt "field:calendar.event.exrule,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.event.exrule,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.event.exrule,event:"
msgid "Event"
@@ -596,7 +580,7 @@ msgstr "Esdeveniment"
msgctxt "field:calendar.event.exrule,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.event.exrule,rec_name:"
msgid "Name"
@@ -604,24 +588,23 @@ msgstr "Nom"
msgctxt "field:calendar.event.exrule,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.event.exrule,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:calendar.event.rdate,calendar_date:"
msgid "Calendar Date"
-msgstr ""
+msgstr "Data calendari"
msgctxt "field:calendar.event.rdate,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.event.rdate,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.event.rdate,event:"
msgid "Event"
@@ -629,7 +612,7 @@ msgstr "Esdeveniment"
msgctxt "field:calendar.event.rdate,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.event.rdate,rec_name:"
msgid "Name"
@@ -637,11 +620,11 @@ msgstr "Nom"
msgctxt "field:calendar.event.rdate,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.event.rdate,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:calendar.event.rrule,calendar_rrule:"
msgid "Calendar RRule"
@@ -649,12 +632,11 @@ msgstr "Regla de recurrència"
msgctxt "field:calendar.event.rrule,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.event.rrule,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.event.rrule,event:"
msgid "Event"
@@ -662,7 +644,7 @@ msgstr "Esdeveniment"
msgctxt "field:calendar.event.rrule,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.event.rrule,rec_name:"
msgid "Name"
@@ -670,24 +652,23 @@ msgstr "Nom"
msgctxt "field:calendar.event.rrule,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.event.rrule,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:calendar.location,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.location,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.location,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.location,name:"
msgid "Name"
@@ -699,11 +680,11 @@ msgstr "Nom"
msgctxt "field:calendar.location,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.location,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:calendar.rrule,byday:"
msgid "By Day"
@@ -747,12 +728,11 @@ msgstr "Nombre de vegades"
msgctxt "field:calendar.rrule,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
-#, fuzzy
msgctxt "field:calendar.rrule,create_uid:"
msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
msgctxt "field:calendar.rrule,freq:"
msgid "Frequency"
@@ -760,7 +740,7 @@ msgstr "Freqüència"
msgctxt "field:calendar.rrule,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.rrule,interval:"
msgid "Interval"
@@ -784,11 +764,11 @@ msgstr "Dia de la setmana"
msgctxt "field:calendar.rrule,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
msgctxt "field:calendar.rrule,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
msgctxt "field:res.user,calendars:"
msgid "Calendars"
@@ -800,7 +780,7 @@ msgstr "L'usuari ha de tenir un correu electrònic"
msgctxt "help:calendar.date,date:"
msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr ""
+msgstr "Ignora l'hora del camp \"Data\" i tracta només la data."
msgctxt "help:calendar.event,uuid:"
msgid "Universally Unique Identifier"
@@ -816,7 +796,7 @@ msgstr "Alarma"
msgctxt "model:calendar.attendee,name:"
msgid "Attendee"
-msgstr "Assistents"
+msgstr "Assistent"
msgctxt "model:calendar.calendar,name:"
msgid "Calendar"
@@ -824,11 +804,11 @@ msgstr "Calendari"
msgctxt "model:calendar.calendar-read-res.user,name:"
msgid "Calendar - read - User"
-msgstr "Calendari - llegir - usuari"
+msgstr "Calendari - lectura - usuari"
msgctxt "model:calendar.calendar-write-res.user,name:"
msgid "Calendar - write - User"
-msgstr "Calendari - escriure - usuari"
+msgstr "Calendari - escriptura - usuari"
msgctxt "model:calendar.category,name:"
msgid "Category"
@@ -836,7 +816,7 @@ msgstr "Categoria"
msgctxt "model:calendar.date,name:"
msgid "Calendar Date"
-msgstr ""
+msgstr "Data calendari"
msgctxt "model:calendar.event,name:"
msgid "Event"
@@ -852,7 +832,7 @@ msgstr "Alarma"
msgctxt "model:calendar.event.attendee,name:"
msgid "Attendee"
-msgstr "Assistents"
+msgstr "Assistent"
msgctxt "model:calendar.event.exdate,name:"
msgid "Exception Date"
@@ -886,15 +866,13 @@ msgctxt "model:ir.action,name:act_event_form"
msgid "Events"
msgstr "Esdeveniments"
-#, fuzzy
msgctxt "model:ir.action,name:act_event_form3"
msgid "Events"
msgstr "Esdeveniments"
-#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_calendar"
msgid "Calendar"
-msgstr "Gestió de calendari"
+msgstr "Calendaris"
msgctxt "model:ir.ui.menu,name:menu_calendar_form"
msgid "Calendars"
@@ -908,9 +886,10 @@ msgctxt "model:res.group,name:group_calendar_admin"
msgid "Calendar Administration"
msgstr "Administració de calendari"
+#, fuzzy
msgctxt "selection:calendar.attendee,status:"
msgid ""
-msgstr ""
+msgstr "Recreat"
msgctxt "selection:calendar.attendee,status:"
msgid "Accepted"
@@ -944,9 +923,10 @@ msgctxt "selection:calendar.event,classification:"
msgid "Public"
msgstr "Públic"
+#, fuzzy
msgctxt "selection:calendar.event,status:"
msgid ""
-msgstr ""
+msgstr "Recreat"
msgctxt "selection:calendar.event,status:"
msgid "Cancelled"
@@ -1050,7 +1030,7 @@ msgstr "Categoria"
msgctxt "view:calendar.event.attendee:"
msgid "Attendee"
-msgstr "Assistents"
+msgstr "Assistent"
msgctxt "view:calendar.event.attendee:"
msgid "Attendees"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index 707e3dc..eaf3e4d 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -28,56 +28,55 @@ msgstr "¡El nombre del lugar del calendario debe ser único!"
msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Day\""
-msgstr ""
+msgstr "Inválido \"Por Día\""
msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Hour\""
-msgstr ""
+msgstr "Inválido \"Por Hora\""
msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Minute\""
-msgstr ""
+msgstr "Inválido \"Por Minuto\""
msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Month Day\""
-msgstr ""
+msgstr "Inválido \"Por Día del Mes\""
msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Month\""
-msgstr ""
+msgstr "Inválido \"Por Mes\""
msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Position\""
-msgstr ""
+msgstr "Inválido \"Por Posición\""
msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Second\""
-msgstr ""
+msgstr "Inválido \"Por Segundo\""
msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Week Number\""
-msgstr ""
+msgstr "Inválido \"Por Número de Semana\""
msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Year Day\""
-msgstr ""
+msgstr "Inválido \"Por Día del Año\""
msgctxt "error:calendar.rrule:"
msgid "Only one of \"until\" and \"count\" can be set!"
-msgstr ""
+msgstr "Solo un \"hasta\" y \"contar\" pude ser establecido!"
msgctxt "field:calendar.alarm,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.alarm,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.alarm,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.alarm,rec_name:"
msgid "Name"
@@ -85,28 +84,27 @@ msgstr "Nombre"
msgctxt "field:calendar.alarm,valarm:"
msgid "valarm"
-msgstr ""
+msgstr "valarma"
msgctxt "field:calendar.alarm,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.alarm,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.attendee,attendee:"
msgid "attendee"
-msgstr ""
+msgstr "Asistente"
msgctxt "field:calendar.attendee,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.attendee,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.attendee,email:"
msgid "Email"
@@ -114,7 +112,7 @@ msgstr "Correo Electrónico"
msgctxt "field:calendar.attendee,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.attendee,rec_name:"
msgid "Name"
@@ -122,24 +120,23 @@ msgstr "Nombre"
msgctxt "field:calendar.attendee,status:"
msgid "Participation Status"
-msgstr ""
+msgstr "Estado de Participación"
msgctxt "field:calendar.attendee,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.attendee,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.calendar,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.calendar,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.calendar,description:"
msgid "Description"
@@ -147,7 +144,7 @@ msgstr "Descripción"
msgctxt "field:calendar.calendar,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.calendar,name:"
msgid "Name"
@@ -167,15 +164,15 @@ msgstr "Nombre"
msgctxt "field:calendar.calendar,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.calendar,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.calendar,write_users:"
msgid "Write Users"
-msgstr "Escribir Usuarios"
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.calendar-read-res.user,calendar:"
msgid "Calendar"
@@ -183,16 +180,15 @@ msgstr "Calendario"
msgctxt "field:calendar.calendar-read-res.user,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.calendar-read-res.user,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.calendar-read-res.user,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.calendar-read-res.user,rec_name:"
msgid "Name"
@@ -204,11 +200,11 @@ msgstr "Usuario"
msgctxt "field:calendar.calendar-read-res.user,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.calendar-read-res.user,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.calendar-write-res.user,calendar:"
msgid "Calendar"
@@ -216,16 +212,15 @@ msgstr "Calendario"
msgctxt "field:calendar.calendar-write-res.user,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.calendar-write-res.user,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.calendar-write-res.user,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.calendar-write-res.user,rec_name:"
msgid "Name"
@@ -237,24 +232,23 @@ msgstr "Usuario"
msgctxt "field:calendar.calendar-write-res.user,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.calendar-write-res.user,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.category,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.category,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.category,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.category,name:"
msgid "Name"
@@ -266,46 +260,43 @@ msgstr "Nombre"
msgctxt "field:calendar.category,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.category,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.date,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.date,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.date,date:"
msgid "Is Date"
msgstr "Es Fecha"
-#, fuzzy
msgctxt "field:calendar.date,datetime:"
msgid "Date"
msgstr "Fecha"
msgctxt "field:calendar.date,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
-#, fuzzy
msgctxt "field:calendar.date,rec_name:"
msgid "Name"
-msgstr "Nombre de Contacto"
+msgstr "Nombre"
msgctxt "field:calendar.date,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.date,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.event,alarms:"
msgid "Alarms"
@@ -333,7 +324,7 @@ msgstr "Usuarios que pueden Leer"
msgctxt "field:calendar.event,calendar_write_users:"
msgid "Write Users"
-msgstr "Escribir Usuarios"
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.event,categories:"
msgid "Categories"
@@ -345,12 +336,11 @@ msgstr "Clasificación"
msgctxt "field:calendar.event,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.event,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.event,description:"
msgid "Description"
@@ -374,13 +364,12 @@ msgstr "Reglas de Excepción"
msgctxt "field:calendar.event,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.event,location:"
msgid "Location"
msgstr "Lugar"
-#, fuzzy
msgctxt "field:calendar.event,occurences:"
msgid "Occurences"
msgstr "Ocurrencias"
@@ -439,11 +428,11 @@ msgstr "vevento"
msgctxt "field:calendar.event,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.event,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.event-calendar.category,category:"
msgid "Category"
@@ -451,12 +440,11 @@ msgstr "Categoría"
msgctxt "field:calendar.event-calendar.category,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.event-calendar.category,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.event-calendar.category,event:"
msgid "Event"
@@ -464,7 +452,7 @@ msgstr "Evento"
msgctxt "field:calendar.event-calendar.category,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.event-calendar.category,rec_name:"
msgid "Name"
@@ -472,24 +460,23 @@ msgstr "Nombre"
msgctxt "field:calendar.event-calendar.category,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.event-calendar.category,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.event.alarm,calendar_alarm:"
msgid "Calendar Alarm"
-msgstr ""
+msgstr "Alarma del Calendario"
msgctxt "field:calendar.event.alarm,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.event.alarm,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.event.alarm,event:"
msgid "Event"
@@ -497,7 +484,7 @@ msgstr "Evento"
msgctxt "field:calendar.event.alarm,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.event.alarm,rec_name:"
msgid "Name"
@@ -505,24 +492,23 @@ msgstr "Nombre"
msgctxt "field:calendar.event.alarm,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.event.alarm,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.event.attendee,calendar_attendee:"
msgid "Calendar Attendee"
-msgstr ""
+msgstr "Asistente de Calendario "
msgctxt "field:calendar.event.attendee,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.event.attendee,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.event.attendee,event:"
msgid "Event"
@@ -530,7 +516,7 @@ msgstr "Evento"
msgctxt "field:calendar.event.attendee,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.event.attendee,rec_name:"
msgid "Name"
@@ -538,11 +524,11 @@ msgstr "Nombre"
msgctxt "field:calendar.event.attendee,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.event.attendee,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.event.exdate,calendar_date:"
msgid "Calendar Date"
@@ -550,12 +536,11 @@ msgstr "Fecha Calendario"
msgctxt "field:calendar.event.exdate,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.event.exdate,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.event.exdate,event:"
msgid "Event"
@@ -563,7 +548,7 @@ msgstr "Evento"
msgctxt "field:calendar.event.exdate,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.event.exdate,rec_name:"
msgid "Name"
@@ -571,24 +556,23 @@ msgstr "Nombre"
msgctxt "field:calendar.event.exdate,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.event.exdate,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.event.exrule,calendar_rrule:"
msgid "Calendar RRule"
-msgstr ""
+msgstr "Regla de Calendario"
msgctxt "field:calendar.event.exrule,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.event.exrule,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.event.exrule,event:"
msgid "Event"
@@ -596,7 +580,7 @@ msgstr "Evento"
msgctxt "field:calendar.event.exrule,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.event.exrule,rec_name:"
msgid "Name"
@@ -604,11 +588,11 @@ msgstr "Nombre"
msgctxt "field:calendar.event.exrule,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.event.exrule,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.event.rdate,calendar_date:"
msgid "Calendar Date"
@@ -616,12 +600,11 @@ msgstr "Fecha Calendario"
msgctxt "field:calendar.event.rdate,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.event.rdate,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.event.rdate,event:"
msgid "Event"
@@ -629,7 +612,7 @@ msgstr "Evento"
msgctxt "field:calendar.event.rdate,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.event.rdate,rec_name:"
msgid "Name"
@@ -637,24 +620,23 @@ msgstr "Nombre"
msgctxt "field:calendar.event.rdate,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.event.rdate,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.event.rrule,calendar_rrule:"
msgid "Calendar RRule"
-msgstr ""
+msgstr "Regla de Calendario"
msgctxt "field:calendar.event.rrule,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.event.rrule,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.event.rrule,event:"
msgid "Event"
@@ -662,7 +644,7 @@ msgstr "Evento"
msgctxt "field:calendar.event.rrule,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.event.rrule,rec_name:"
msgid "Name"
@@ -670,24 +652,23 @@ msgstr "Nombre"
msgctxt "field:calendar.event.rrule,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.event.rrule,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.location,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.location,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.location,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.location,name:"
msgid "Name"
@@ -699,72 +680,71 @@ msgstr "Nombre"
msgctxt "field:calendar.location,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.location,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:calendar.rrule,byday:"
msgid "By Day"
-msgstr ""
+msgstr "Por Día"
msgctxt "field:calendar.rrule,byhour:"
msgid "By Hour"
-msgstr ""
+msgstr "Por Hora"
msgctxt "field:calendar.rrule,byminute:"
msgid "By Minute"
-msgstr ""
+msgstr "Por Minuto"
msgctxt "field:calendar.rrule,bymonth:"
msgid "By Month"
-msgstr ""
+msgstr "Por Mes"
msgctxt "field:calendar.rrule,bymonthday:"
msgid "By Month Day"
-msgstr ""
+msgstr "Por Día del Mes"
msgctxt "field:calendar.rrule,bysecond:"
msgid "By Second"
-msgstr ""
+msgstr "Por Segundo"
msgctxt "field:calendar.rrule,bysetpos:"
msgid "By Position"
-msgstr ""
+msgstr "Por Posición"
msgctxt "field:calendar.rrule,byweekno:"
msgid "By Week Number"
-msgstr ""
+msgstr "Por Número de la Semana"
msgctxt "field:calendar.rrule,byyearday:"
msgid "By Year Day"
-msgstr ""
+msgstr "Por Día del Año"
msgctxt "field:calendar.rrule,count:"
msgid "Count"
-msgstr ""
+msgstr "Contar"
msgctxt "field:calendar.rrule,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
-#, fuzzy
msgctxt "field:calendar.rrule,create_uid:"
msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
msgctxt "field:calendar.rrule,freq:"
msgid "Frequency"
-msgstr ""
+msgstr "Frecuencia"
msgctxt "field:calendar.rrule,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:calendar.rrule,interval:"
msgid "Interval"
-msgstr ""
+msgstr "Intervalo"
msgctxt "field:calendar.rrule,rec_name:"
msgid "Name"
@@ -772,9 +752,8 @@ msgstr "Nombre"
msgctxt "field:calendar.rrule,until:"
msgid "Until Date"
-msgstr ""
+msgstr "Hasta la Fecha"
-#, fuzzy
msgctxt "field:calendar.rrule,until_date:"
msgid "Is Date"
msgstr "Es Fecha"
@@ -785,11 +764,11 @@ msgstr "Día de la Semana"
msgctxt "field:calendar.rrule,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
msgctxt "field:calendar.rrule,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
msgctxt "field:res.user,calendars:"
msgid "Calendars"
@@ -797,7 +776,7 @@ msgstr "Calendarios"
msgctxt "help:calendar.calendar,owner:"
msgid "The user must have an email"
-msgstr ""
+msgstr "El usuario debe tener un email"
msgctxt "help:calendar.date,date:"
msgid "Ignore time of field \"Date\", but handle as date only."
@@ -810,6 +789,8 @@ msgstr "Idenitificador Universal Único"
msgctxt "help:calendar.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.alarm,name:"
msgid "Alarm"
@@ -891,7 +872,6 @@ msgctxt "model:ir.action,name:act_event_form3"
msgid "Events"
msgstr "Eventos"
-#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_calendar"
msgid "Calendar"
msgstr "Calendario"
@@ -906,27 +886,27 @@ msgstr "Eventos"
msgctxt "model:res.group,name:group_calendar_admin"
msgid "Calendar Administration"
-msgstr "Administrar Calendario"
+msgstr "Administración Calendario"
msgctxt "selection:calendar.attendee,status:"
msgid ""
-msgstr ""
+msgstr "Punto de Orden"
msgctxt "selection:calendar.attendee,status:"
msgid "Accepted"
-msgstr ""
+msgstr "Aceptado"
msgctxt "selection:calendar.attendee,status:"
msgid "Declined"
-msgstr ""
+msgstr "Declinado"
msgctxt "selection:calendar.attendee,status:"
msgid "Delegated"
-msgstr ""
+msgstr "Delegado"
msgctxt "selection:calendar.attendee,status:"
msgid "Needs Action"
-msgstr ""
+msgstr "Necesita una Acción"
msgctxt "selection:calendar.attendee,status:"
msgid "Tentative"
@@ -946,7 +926,7 @@ msgstr "Público"
msgctxt "selection:calendar.event,status:"
msgid ""
-msgstr ""
+msgstr "Punto de Orden"
msgctxt "selection:calendar.event,status:"
msgid "Cancelled"
@@ -970,31 +950,31 @@ msgstr "Transparente"
msgctxt "selection:calendar.rrule,freq:"
msgid "Daily"
-msgstr ""
+msgstr "Diario"
msgctxt "selection:calendar.rrule,freq:"
msgid "Hourly"
-msgstr ""
+msgstr "Cada Hora"
msgctxt "selection:calendar.rrule,freq:"
msgid "Minutely"
-msgstr ""
+msgstr "Cada Minuto"
msgctxt "selection:calendar.rrule,freq:"
msgid "Monthly"
-msgstr ""
+msgstr "Mensualmente"
msgctxt "selection:calendar.rrule,freq:"
msgid "Secondly"
-msgstr ""
+msgstr "En segundo lugar"
msgctxt "selection:calendar.rrule,freq:"
msgid "Weekly"
-msgstr ""
+msgstr "Semanalmente"
msgctxt "selection:calendar.rrule,freq:"
msgid "Yearly"
-msgstr ""
+msgstr "Anualmente"
msgctxt "selection:calendar.rrule,wkst:"
msgid "Friday"
@@ -1108,7 +1088,6 @@ msgctxt "view:calendar.event:"
msgid "General"
msgstr "General"
-#, fuzzy
msgctxt "view:calendar.event:"
msgid "Occurences"
msgstr "Ocurrencias"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index ac105e3..aaf4fd4 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -872,7 +872,7 @@ msgstr "Eventos"
msgctxt "model:ir.ui.menu,name:menu_calendar"
msgid "Calendar"
-msgstr "Calendario"
+msgstr "Calendarios"
msgctxt "model:ir.ui.menu,name:menu_calendar_form"
msgid "Calendars"
diff --git a/res.py b/res.py
index 82c8925..cd9aee4 100644
--- a/res.py
+++ b/res.py
@@ -1,27 +1,26 @@
#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 copy
-from trytond.model import ModelView, ModelSQL, fields
+from trytond.model import fields
+from trytond.pool import PoolMeta
from trytond.pyson import Bool, Eval
+__all__ = ['User']
+__metaclass__ = PoolMeta
-class User(ModelSQL, ModelView):
- _name = 'res.user'
+
+class User:
+ __name__ = 'res.user'
calendars = fields.One2Many('calendar.calendar', 'owner', 'Calendars')
- def __init__(self):
- super(User, self).__init__()
- self.email = copy.copy(self.email)
- self.email.states = copy.copy(self.email.states)
- self.email.depends = copy.copy(self.email.depends)
+ @classmethod
+ def __setup__(cls):
+ super(User, cls).__setup__()
required = Bool(Eval('calendars'))
- if not self.email.states.get('required'):
- self.email.states['required'] = required
+ if not cls.email.states.get('required'):
+ cls.email.states['required'] = required
else:
- self.email.states['required'] = (
- self.email.states['required'] | required)
- if 'calendars' not in self.email.depends:
- self.email.depends.append('calendars')
-
-User()
+ cls.email.states['required'] = (
+ cls.email.states['required'] | required)
+ if 'calendars' not in cls.email.depends:
+ cls.email.depends.append('calendars')
diff --git a/setup.py b/setup.py
index 2af98de..d0e0e98 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',
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 for 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': '.'},
packages=[
'trytond.modules.calendar',
'trytond.modules.calendar.tests',
- ],
+ ],
package_data={
'trytond.modules.calendar': info.get('xml', []) \
- + info.get('translation', []),
- },
+ + ['tryton.cfg', 'locale/*.po'],
+ },
classifiers=[
'Development Status :: 5 - Production/Stable',
'Environment :: Plugins',
@@ -57,12 +68,12 @@ setup(name='trytond_calendar',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7',
'Topic :: Office/Business',
- ],
+ ],
license='GPL-3',
install_requires=requires,
extras_require={
'test': ['caldav'],
- },
+ },
zip_safe=False,
entry_points="""
[trytond.modules]
@@ -70,4 +81,4 @@ setup(name='trytond_calendar',
""",
test_suite='tests',
test_loader='trytond.test_loader:Loader',
-)
+ )
diff --git a/tests/scenario_calendar.py b/tests/scenario_calendar.py
index 38a0344..50903f7 100644
--- a/tests/scenario_calendar.py
+++ b/tests/scenario_calendar.py
@@ -18,7 +18,7 @@ def install_module(name, config):
module, = Module.find([('name', '=', name)])
if module.state != 'installed':
Module.install([module.id], config.context)
- Wizard('ir.module.module.install_upgrade').execute('start')
+ Wizard('ir.module.module.install_upgrade').execute('upgrade')
def configure_user(login, config):
@@ -111,6 +111,8 @@ class TestCase(unittest.TestCase):
attendee.value = 'MAILTO:%s at example.com' % name
attendees.append(attendee)
vevent.attendee_list = attendees
+ caldav.Event(self.client, data=ical.serialize(),
+ parent=self.calendar).save()
Event = Model.get('calendar.event')
owner_event, = Event.find([
diff --git a/tryton.cfg b/tryton.cfg
new file mode 100644
index 0000000..3e2b6cc
--- /dev/null
+++ b/tryton.cfg
@@ -0,0 +1,8 @@
+[tryton]
+version=2.6.0
+depends:
+ ir
+ res
+ webdav
+xml:
+ calendar.xml
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index bbd4e7a..f4586fa 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,13 +1,49 @@
Metadata-Version: 1.0
Name: trytond-calendar
-Version: 2.4.2
-Summary: Add CalDAV support
+Version: 2.6.0
+Summary: Tryton module for 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
+ ================
+
+ The calendar 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.egg-info/SOURCES.txt b/trytond_calendar.egg-info/SOURCES.txt
index 5aa3999..773ccae 100644
--- a/trytond_calendar.egg-info/SOURCES.txt
+++ b/trytond_calendar.egg-info/SOURCES.txt
@@ -6,8 +6,8 @@ MANIFEST.in
README
calendar.xml
setup.py
+tryton.cfg
./__init__.py
-./__tryton__.py
./caldav.py
./calendar_.py
./res.py
diff --git a/trytond_calendar.egg-info/requires.txt b/trytond_calendar.egg-info/requires.txt
index fabff6c..050605d 100644
--- a/trytond_calendar.egg-info/requires.txt
+++ b/trytond_calendar.egg-info/requires.txt
@@ -2,7 +2,7 @@ vobject >= 0.8.0
PyWebDAV >= 0.9.8
python-dateutil
pytz
-trytond >= 2.4, < 2.5
+trytond >= 2.6, < 2.7
[test]
caldav
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index 93b5a12..fd55fc3 100644
--- a/webdav.py
+++ b/webdav.py
@@ -3,11 +3,13 @@
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.cache import Cache
from trytond.transaction import Transaction
-from trytond.pool import Pool
+from trytond.pool import Pool, PoolMeta
+
+__all__ = ['Collection']
+__metaclass__ = PoolMeta
CALDAV_NS = 'urn:ietf:params:xml:ns:caldav'
@@ -45,19 +47,16 @@ def _comp_filter_domain(dtstart, dtend):
]]
-class Collection(ModelSQL, ModelView):
-
- _name = "webdav.collection"
+class Collection:
+ __name__ = "webdav.collection"
+ _event_cache = Cache('webdav_collection.event')
- def calendar(self, uri, ics=False):
+ @staticmethod
+ def calendar(uri, ics=False):
'''
Return the calendar id in the uri
-
- :param uri: the uri
- :return: calendar id
- or None if there is no calendar
'''
- calendar_obj = Pool().get('calendar.calendar')
+ Calendar = Pool().get('calendar.calendar')
if uri and uri.startswith('Calendars/'):
calendar, uri = (uri[10:].split('/', 1) + [None])[0:2]
@@ -66,40 +65,41 @@ class Collection(ModelSQL, ModelView):
calendar = calendar[:-4]
else:
return None
- return calendar_obj.get_name(calendar)
+ return Calendar.get_name(calendar)
- @Cache('webdav_collection.event')
- def event(self, uri, calendar_id=False):
+ @classmethod
+ def event(cls, uri, calendar_id=False):
'''
Return the event id in the uri
-
- :param uri: the uri
- :param calendar_id: the calendar id
- :return: event id
- or None if there is no event
'''
- event_obj = Pool().get('calendar.event')
-
+ Event = Pool().get('calendar.event')
+
+ key = (uri, calendar_id)
+ event_id = cls._event_cache.get(key, default=-1)
+ if event_id != -1:
+ return event_id
+ else:
+ event_id = None
if uri and uri.startswith('Calendars/'):
calendar, event_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
- event_ids = event_obj.search([
- ('calendar', '=', calendar_id),
- ('uuid', '=', event_uri[:-4]),
- ('parent', '=', None),
- ], limit=1)
- if event_ids:
- return event_ids[0]
-
- def _caldav_filter_domain_calendar(self, filter):
+ events = Event.search([
+ ('calendar', '=', calendar_id),
+ ('uuid', '=', event_uri[:-4]),
+ ('parent', '=', None),
+ ], limit=1)
+ if events:
+ event_id = events[0].id
+ cls._event_cache.set(key, event_id)
+ return event_id
+
+ @staticmethod
+ def _caldav_filter_domain_calendar(filter):
'''
Return a domain for caldav filter on calendar
-
- :param filter: the DOM Element of filter
- :return: a list for domain
'''
if not filter:
return []
@@ -107,12 +107,10 @@ class Collection(ModelSQL, ModelView):
return [('id', '=', 0)]
return [('id', '=', 0)]
- def _caldav_filter_domain_event(self, filter):
+ @classmethod
+ def _caldav_filter_domain_event(cls, filter):
'''
Return a domain for caldav filter on event
-
- :param filter: the DOM Element of filter
- :return: a list for domain
'''
res = []
if not filter:
@@ -174,107 +172,111 @@ class Collection(ModelSQL, ModelView):
continue
if uri:
uri = urllib.unquote_plus(uri)
- event_id = self.event(uri)
+ event_id = cls.event(uri)
if event_id:
ids.append(event_id)
return [('id', 'in', ids)]
return res
- def get_childs(self, uri, filter=None, cache=None):
- calendar_obj = Pool().get('calendar.calendar')
- event_obj = Pool().get('calendar.event')
+ @classmethod
+ def get_childs(cls, uri, filter=None, cache=None):
+ pool = Pool()
+ Calendar = pool.get('calendar.calendar')
+ Event = pool.get('calendar.event')
if uri in ('Calendars', 'Calendars/'):
- domain = self._caldav_filter_domain_calendar(filter)
+ domain = cls._caldav_filter_domain_calendar(filter)
domain = [['OR',
('owner', '=', Transaction().user),
('read_users', '=', Transaction().user),
],
domain]
- calendar_ids = calendar_obj.search(domain)
- calendars = calendar_obj.browse(calendar_ids)
+ calendars = Calendar.search(domain)
if cache is not None:
cache.setdefault('_calendar', {})
- cache['_calendar'].setdefault(calendar_obj._name, {})
- for calendar_id in calendar_ids:
- cache['_calendar'][calendar_obj._name][calendar_id] = {}
+ cache['_calendar'].setdefault(Calendar.__name__, {})
+ for calendar in calendars:
+ cache['_calendar'][Calendar.__name__][calendar.id] = {}
return [x.name for x in calendars] + \
[x.name + '.ics' for x in calendars]
if uri 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_event(filter)
- event_ids = event_obj.search([
- ('calendar', '=', calendar_id),
- domain,
- ])
- events = event_obj.browse(event_ids)
+ domain = cls._caldav_filter_domain_event(filter)
+ events = Event.search([
+ ('calendar', '=', calendar_id),
+ domain,
+ ])
if cache is not None:
cache.setdefault('_calendar', {})
- cache['_calendar'].setdefault(event_obj._name, {})
- for event_id in event_ids:
- cache['_calendar'][event_obj._name][event_id] = {}
+ cache['_calendar'].setdefault(Event.__name__, {})
+ for event in events:
+ cache['_calendar'][Event.__name__][event.id] = {}
return [x.uuid + '.ics' for x in events]
return []
- res = super(Collection, self).get_childs(uri, filter=filter,
- cache=cache)
+ childs = super(Collection, cls).get_childs(uri, filter=filter,
+ cache=cache)
if not uri and not filter:
- res.append('Calendars')
+ childs.append('Calendars')
elif not uri and filter:
if filter.localName == 'principal-property-search':
- res.append('Calendars')
- return res
+ childs.append('Calendars')
+ return childs
- def get_resourcetype(self, uri, cache=None):
+ @classmethod
+ def get_resourcetype(cls, uri, cache=None):
from pywebdav.lib.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
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_displayname(self, uri, cache=None):
- calendar_obj = Pool().get('calendar.calendar')
+ @classmethod
+ def get_displayname(cls, uri, cache=None):
+ Calendar = Pool().get('calendar.calendar')
if uri in ('Calendars', 'Calendars/'):
return 'Calendars'
- calendar_id = self.calendar(uri)
+ calendar_id = cls.calendar(uri)
if calendar_id:
if not (uri[10:].split('/', 1) + [None])[1]:
- return calendar_obj.browse(calendar_id).rec_name
+ return Calendar(calendar_id).rec_name
return uri.split('/')[-1]
- elif self.calendar(uri, ics=True):
+ elif cls.calendar(uri, ics=True):
return uri.split('/')[-1]
- return super(Collection, self).get_displayname(uri, cache=cache)
+ return super(Collection, cls).get_displayname(uri, cache=cache)
- def get_contenttype(self, uri, cache=None):
- if self.event(uri) \
- or self.calendar(uri, ics=True):
+ @classmethod
+ def get_contenttype(cls, uri, cache=None):
+ if cls.event(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):
- calendar_obj = Pool().get('calendar.calendar')
- event_obj = Pool().get('calendar.event')
+ @classmethod
+ def get_creationdate(cls, uri, cache=None):
+ Calendar = Pool().get('calendar.calendar')
+ Event = Pool().get('calendar.event')
- 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:
if not (uri[10:].split('/', 1) + [None])[1]:
if cache is not None:
cache.setdefault('_calendar', {})
- cache['_calendar'].setdefault(calendar_obj._name, {})
- ids = cache['_calendar'][calendar_obj._name].keys()
+ cache['_calendar'].setdefault(Calendar.__name__, {})
+ ids = cache['_calendar'][Calendar.__name__].keys()
if calendar_id not in ids:
ids.append(calendar_id)
elif 'creationdate' in cache['_calendar'][
- calendar_obj._name][calendar_id]:
- return cache['_calendar'][calendar_obj._name][
+ Calendar.__name__][calendar_id]:
+ return cache['_calendar'][Calendar.__name__][
calendar_id]['creationdate']
else:
ids = [calendar_id]
@@ -285,30 +287,30 @@ class Collection(ModelSQL, ModelView):
red_sql, red_ids = reduce_ids('id', sub_ids)
cursor.execute('SELECT id, ' \
'EXTRACT(epoch FROM create_date) ' \
- 'FROM "' + calendar_obj._table + '" ' \
+ 'FROM "' + Calendar._table + '" ' \
'WHERE ' + red_sql, red_ids)
for calendar_id2, date in cursor.fetchall():
if calendar_id2 == calendar_id:
res = date
if cache is not None:
- cache['_calendar'][calendar_obj._name]\
+ cache['_calendar'][Calendar.__name__]\
.setdefault(calendar_id2, {})
- cache['_calendar'][calendar_obj._name][
+ cache['_calendar'][Calendar.__name__][
calendar_id2]['creationdate'] = date
if res is not None:
return res
else:
- event_id = self.event(uri, calendar_id=calendar_id)
+ event_id = cls.event(uri, calendar_id=calendar_id)
if event_id:
if cache is not None:
cache.setdefault('_calendar', {})
- cache['_calendar'].setdefault(event_obj._name, {})
- ids = cache['_calendar'][event_obj._name].keys()
+ cache['_calendar'].setdefault(Event.__name__, {})
+ ids = cache['_calendar'][Event.__name__].keys()
if event_id not in ids:
ids.append(event_id)
elif 'creationdate' in cache['_calendar'][
- event_obj._name][event_id]:
- return cache['_calendar'][event_obj._name][
+ Event.__name__][event_id]:
+ return cache['_calendar'][Event.__name__][
event_id]['creationdate']
else:
ids = [event_id]
@@ -319,37 +321,39 @@ class Collection(ModelSQL, ModelView):
red_sql, red_ids = reduce_ids('id', sub_ids)
cursor.execute('SELECT id, ' \
'EXTRACT(epoch FROM create_date) ' \
- 'FROM "' + event_obj._table + '" ' \
+ 'FROM "' + Event._table + '" ' \
'WHERE ' + red_sql, red_ids)
for event_id2, date in cursor.fetchall():
if event_id2 == event_id:
res = date
if cache is not None:
- cache['_calendar'][event_obj._name]\
+ cache['_calendar'][Event.__name__]\
.setdefault(event_id2, {})
- cache['_calendar'][event_obj._name][
+ cache['_calendar'][Event.__name__][
event_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):
- calendar_obj = Pool().get('calendar.calendar')
- event_obj = Pool().get('calendar.event')
+ @classmethod
+ def get_lastmodified(cls, uri, cache=None):
+ pool = Pool()
+ Calendar = pool.get('calendar.calendar')
+ Event = pool.get('calendar.event')
cursor = Transaction().cursor
- calendar_id = self.calendar(uri)
+ calendar_id = cls.calendar(uri)
if calendar_id:
if not (uri[10:].split('/', 1) + [None])[1]:
if cache is not None:
cache.setdefault('_calendar', {})
- cache['_calendar'].setdefault(calendar_obj._name, {})
- ids = cache['_calendar'][calendar_obj._name].keys()
+ cache['_calendar'].setdefault(Calendar.__name__, {})
+ ids = cache['_calendar'][Calendar.__name__].keys()
if calendar_id not in ids:
ids.append(calendar_id)
elif 'lastmodified' in cache['_calendar'][
- calendar_obj._name][calendar_id]:
- return cache['_calendar'][calendar_obj._name][
+ Calendar.__name__][calendar_id]:
+ return cache['_calendar'][Calendar.__name__][
calendar_id]['lastmodified']
else:
ids = [calendar_id]
@@ -360,30 +364,30 @@ class Collection(ModelSQL, ModelView):
cursor.execute('SELECT id, ' \
'EXTRACT(epoch FROM ' \
'COALESCE(write_date, create_date)) ' \
- 'FROM "' + calendar_obj._table + '" ' \
+ 'FROM "' + Calendar.__table__ + '" ' \
'WHERE ' + red_sql, red_ids)
for calendar_id2, date in cursor.fetchall():
if calendar_id2 == calendar_id:
res = date
if cache is not None:
- cache['_calendar'][calendar_obj._name]\
+ cache['_calendar'][Calendar.__name__]\
.setdefault(calendar_id2, {})
- cache['_calendar'][calendar_obj._name][
+ cache['_calendar'][Calendar.__name__][
calendar_id2]['lastmodified'] = date
if res is not None:
return res
else:
- event_id = self.event(uri, calendar_id=calendar_id)
+ event_id = cls.event(uri, calendar_id=calendar_id)
if event_id:
if cache is not None:
cache.setdefault('_calendar', {})
- cache['_calendar'].setdefault(event_obj._name, {})
- ids = cache['_calendar'][event_obj._name].keys()
+ cache['_calendar'].setdefault(Event.__name__, {})
+ ids = cache['_calendar'][Event.__name__].keys()
if event_id not in ids:
ids.append(event_id)
elif 'lastmodified' in cache['_calendar'][
- event_obj._name][event_id]:
- return cache['_calendar'][event_obj._name][
+ Event.__name__][event_id]:
+ return cache['_calendar'][Event.__name__][
event_id]['lastmodified']
else:
ids = [event_id]
@@ -396,7 +400,7 @@ class Collection(ModelSQL, ModelView):
cursor.execute('SELECT COALESCE(parent, id), ' \
'MAX(EXTRACT(epoch FROM ' \
'COALESCE(write_date, create_date))) ' \
- 'FROM "' + event_obj._table + '" ' \
+ 'FROM "' + Event._table + '" ' \
'WHERE ' + red_id_sql + ' ' \
'OR ' + red_parent_sql + ' ' \
'GROUP BY parent, id',
@@ -405,23 +409,23 @@ class Collection(ModelSQL, ModelView):
if event_id2 == event_id:
res = date
if cache is not None:
- cache['_calendar'][event_obj._name]\
+ cache['_calendar'][Event.__name__]\
.setdefault(event_id2, {})
- cache['_calendar'][event_obj._name][
+ cache['_calendar'][Event.__name__][
event_id2]['lastmodified'] = date
if res is not None:
return res
- calendar_ics_id = self.calendar(uri, ics=True)
+ calendar_ics_id = cls.calendar(uri, ics=True)
if calendar_ics_id:
if cache is not None:
cache.setdefault('_calendar', {})
- cache['_calendar'].setdefault(calendar_obj._name, {})
- ids = cache['_calendar'][calendar_obj._name].keys()
+ cache['_calendar'].setdefault(Calendar.__name__, {})
+ ids = cache['_calendar'][Calendar.__name__].keys()
if calendar_ics_id not in ids:
ids.append(calendar_ics_id)
elif 'lastmodified ics' in cache['_calendar'][
- calendar_obj._name][calendar_ics_id]:
- return cache['_calendar'][calendar_obj._name][
+ Calendar.__name__][calendar_ics_id]:
+ return cache['_calendar'][Calendar.__name__][
calendar_ics_id]['lastmodified ics']
else:
ids = [calendar_ics_id]
@@ -431,200 +435,210 @@ class Collection(ModelSQL, ModelView):
red_sql, red_ids = reduce_ids('calendar', sub_ids)
cursor.execute('SELECT calendar, MAX(EXTRACT(epoch FROM ' \
'COALESCE(write_date, create_date))) ' \
- 'FROM "' + event_obj._table + '" ' \
+ 'FROM "' + Event._table + '" ' \
'WHERE ' + red_sql + ' ' \
'GROUP BY calendar', red_ids)
for calendar_id2, date in cursor.fetchall():
if calendar_id2 == calendar_ics_id:
res = date
if cache is not None:
- cache['_calendar'][calendar_obj._name]\
+ cache['_calendar'][Calendar.__name__]\
.setdefault(calendar_id2, {})
- cache['_calendar'][calendar_obj._name][
+ cache['_calendar'][Calendar.__name__][
calendar_id2]['lastmodified ics'] = 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):
- event_obj = Pool().get('calendar.event')
- calendar_obj = Pool().get('calendar.calendar')
+ @classmethod
+ def get_data(cls, uri, cache=None):
+ pool = Pool()
+ Event = pool.get('calendar.event')
+ 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_NotFound
- event_id = self.event(uri, calendar_id=calendar_id)
+ event_id = cls.event(uri, calendar_id=calendar_id)
if not event_id:
raise DAV_NotFound
- ical = event_obj.event2ical(event_id)
+ ical = Event(event_id).event2ical()
return ical.serialize()
- calendar_ics_id = self.calendar(uri, ics=True)
+ calendar_ics_id = cls.calendar(uri, ics=True)
if calendar_ics_id:
- ical = calendar_obj.calendar2ical(calendar_ics_id)
+ ical = Calendar(calendar_ics_id).calendar2ical()
return ical.serialize()
- return super(Collection, self).get_data(uri, cache=cache)
+ return super(Collection, cls).get_data(uri, cache=cache)
- def get_calendar_description(self, uri, cache=None):
- calendar_obj = Pool().get('calendar.calendar')
+ @classmethod
+ def get_calendar_description(cls, uri, cache=None):
+ 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]:
if cache is not None:
cache.setdefault('_calendar', {})
- cache['_calendar'].setdefault(calendar_obj._name, {})
- ids = cache['_calendar'][calendar_obj._name].keys()
+ cache['_calendar'].setdefault(Calendar.__name__, {})
+ ids = cache['_calendar'][Calendar.__name__].keys()
if calendar_id not in ids:
ids.append(calendar_id)
elif 'calendar_description' in cache['_calendar'][
- calendar_obj._name][calendar_id]:
- res = cache['_calendar'][calendar_obj._name][
+ Calendar.__name__][calendar_id]:
+ res = cache['_calendar'][Calendar.__name__][
calendar_id]['calendar_description']
if res is not None:
return res
else:
ids = [calendar_id]
res = None
- for calendar in calendar_obj.browse(ids):
+ for calendar in Calendar.browse(ids):
if calendar.id == calendar_id:
res = calendar.description
if cache is not None:
- cache['_calendar'][calendar_obj._name]\
+ cache['_calendar'][Calendar.__name__]\
.setdefault(calendar.id, {})
- cache['_calendar'][calendar_obj._name][
+ cache['_calendar'][Calendar.__name__][
calendar.id]['calendar_description'] = \
calendar.description
if res is not None:
return res
raise DAV_NotFound
- def get_calendar_data(self, uri, cache=None):
- return self.get_data(uri, cache=cache).decode('utf-8')
+ @classmethod
+ def get_calendar_data(cls, uri, cache=None):
+ return cls.get_data(uri, cache=cache).decode('utf-8')
- def get_calendar_home_set(self, uri, cache=None):
+ @staticmethod
+ def get_calendar_home_set(uri, cache=None):
return '/Calendars'
- def get_calendar_user_address_set(self, uri, cache=None):
- user_obj = Pool().get('res.user')
- user = user_obj.browse(Transaction().user)
+ @staticmethod
+ def get_calendar_user_address_set(uri, cache=None):
+ User = Pool().get('res.user')
+ user = User(Transaction().user)
if user.email:
return user.email
raise DAV_NotFound
- def get_schedule_inbox_URL(self, uri, cache=None):
- calendar_obj = Pool().get('calendar.calendar')
+ @staticmethod
+ def get_schedule_inbox_URL(uri, cache=None):
+ Calendar = Pool().get('calendar.calendar')
user = Transaction().user
- calendar_ids = calendar_obj.search([
+ calendars = Calendar.search([
('owner', '=', user),
], limit=1)
- if not calendar_ids:
+ if not calendars:
# Sunbird failed with no value
return '/Calendars'
- calendar = calendar_obj.browse(calendar_ids[0])
+ calendar, = calendars
return '/Calendars/' + calendar.name
- def get_schedule_outbox_URL(self, uri, cache=None):
- return self.get_schedule_inbox_URL(uri, cache=cache)
+ @classmethod
+ def get_schedule_outbox_URL(cls, uri, cache=None):
+ return cls.get_schedule_inbox_URL(uri, cache=cache)
- def put(self, uri, data, content_type, cache=None):
- event_obj = Pool().get('calendar.event')
- calendar_obj = Pool().get('calendar.calendar')
+ @classmethod
+ def put(cls, uri, data, content_type, cache=None):
+ pool = Pool()
+ Event = pool.get('calendar.event')
+ 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
- event_id = self.event(uri, calendar_id=calendar_id)
+ event_id = cls.event(uri, calendar_id=calendar_id)
if not event_id:
ical = vobject.readOne(data)
- values = event_obj.ical2values(None, ical, calendar_id)
- event_id = event_obj.create(values)
- event = event_obj.browse(event_id)
- calendar = calendar_obj.browse(calendar_id)
+ values = Event.ical2values(None, ical, calendar_id)
+ event = Event.create(values)
+ calendar = Calendar(calendar_id)
return (Transaction().cursor.database_name + '/Calendars/' +
calendar.name + '/' + event.uuid + '.ics')
else:
ical = vobject.readOne(data)
- values = event_obj.ical2values(event_id, ical, calendar_id)
- event_obj.write(event_id, values)
+ values = Event.ical2values(event_id, ical, calendar_id)
+ Event.write([Event(event_id)], values)
return
- calendar_ics_id = self.calendar(uri, ics=True)
+ calendar_ics_id = cls.calendar(uri, ics=True)
if calendar_ics_id:
raise DAV_Forbidden
- return super(Collection, self).put(uri, data, content_type)
+ return super(Collection, cls).put(uri, data, content_type)
- def mkcol(self, uri, cache=None):
+ @classmethod
+ def mkcol(cls, uri, cache=None):
if uri and uri.startswith('Calendars/'):
raise DAV_Forbidden
- return super(Collection, self).mkcol(uri, cache=cache)
+ return super(Collection, cls).mkcol(uri, cache=cache)
- def rmcol(self, uri, cache=None):
- calendar_obj = Pool().get('calendar.calendar')
+ @classmethod
+ def rmcol(cls, uri, cache=None):
+ 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]:
try:
- calendar_obj.delete(calendar_id)
+ Calendar.delete([Calendar(calendar_id)])
except Exception:
raise DAV_Forbidden
return 200
raise DAV_Forbidden
- return super(Collection, self).rmcol(uri, cache=cache)
+ return super(Collection, cls).rmcol(uri, cache=cache)
- def rm(self, uri, cache=None):
- event_obj = Pool().get('calendar.event')
+ @classmethod
+ def rm(cls, uri, cache=None):
+ Event = Pool().get('calendar.event')
- calendar_id = self.calendar(uri)
+ calendar_id = cls.calendar(uri)
if calendar_id:
if not (uri[10:].split('/', 1) + [None])[1]:
return 403
- event_id = self.event(uri, calendar_id=calendar_id)
+ event_id = cls.event(uri, calendar_id=calendar_id)
if event_id:
try:
- event_obj.delete(event_id)
+ Event.delete([Event(event_id)])
except Exception:
return 403
return 200
return 404
- calendar_ics_id = self.calendar(uri, ics=True)
+ calendar_ics_id = cls.calendar(uri, ics=True)
if calendar_ics_id:
return 403
- 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.event(uri, calendar_id=calendar_id):
+ if cls.event(uri, calendar_id=calendar_id):
return 1
- calendar_ics_id = self.calendar(uri, ics=True)
+ calendar_ics_id = cls.calendar(uri, ics=True)
if calendar_ics_id:
return 1
- return super(Collection, self).exists(uri, cache=cache)
+ return super(Collection, cls).exists(uri, cache=cache)
- def current_user_privilege_set(self, uri, cache=None):
+ @classmethod
+ def current_user_privilege_set(cls, uri, cache=None):
'''
Return the privileges of the current user for uri
Privileges ares: create, read, write, delete
-
- :param uri: the uri
- :param cache: the cache
- :return: a list of privileges
'''
- calendar_obj = Pool().get('calendar.calendar')
+ Calendar = Pool().get('calendar.calendar')
if uri in ('Calendars', 'Calendars/'):
return ['create', 'read', 'write', 'delete']
if uri and uri.startswith('Calendars/'):
- calendar_id = self.calendar(uri)
+ calendar_id = cls.calendar(uri)
if calendar_id:
- calendar = calendar_obj.browse(calendar_id)
+ calendar = Calendar(calendar_id)
user = Transaction().user
if user == calendar.owner.id:
return ['create', 'read', 'write', 'delete']
@@ -635,7 +649,5 @@ class Collection(ModelSQL, ModelView):
res.extend(['read', 'write', 'delete'])
return res
return []
- return super(Collection, self).current_user_privilege_set(uri,
- cache=cache)
-
-Collection()
+ return super(Collection, cls).current_user_privilege_set(uri,
+ cache=cache)
commit 76410f325140add7b044dcf827a87ba3f29dd401
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Sep 11 13:25:50 2012 +0200
Adding upstream version 2.4.2.
diff --git a/CHANGELOG b/CHANGELOG
index 7885356..480068b 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 4022f0b..0457a01 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond_calendar
-Version: 2.4.1
+Version: 2.4.2
Summary: Add CalDAV support
Home-page: http://www.tryton.org/
Author: B2CK
diff --git a/__tryton__.py b/__tryton__.py
index 82394ba..b532430 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -11,7 +11,7 @@
'name_es_ES': 'Calendario',
'name_fr_FR': '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/calendar_.py b/calendar_.py
index fef6c1d..123e07b 100644
--- a/calendar_.py
+++ b/calendar_.py
@@ -271,7 +271,7 @@ class Calendar(ModelSQL, ModelView):
:param data: the posted data
:return: the xml with schedule-response
'''
- from DAV.errors import DAV_Forbidden
+ from pywebdav.lib.errors import DAV_Forbidden
collection_obj = Pool().get('webdav.collection')
calendar_id = collection_obj.calendar(uri)
@@ -548,8 +548,8 @@ class Event(ModelSQL, ModelView):
assert name in ('calendar_owner', 'calendar_read_users',
'calendar_write_users'), 'Invalid name'
res = {}
+ name = name[9:]
for event in self.browse(ids):
- name = name[9:]
if name in ('read_users', 'write_users'):
res[event.id] = [x.id for x in event.calendar[name]]
else:
@@ -743,6 +743,25 @@ class Event(ModelSQL, ModelView):
collection_obj.event.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 event_id in ids:
+ current_default = default.copy()
+ current_default['uuid'] = self.default_uuid()
+ new_id = super(Event, self).copy(event_id, default=current_default)
+ new_ids.append(new_id)
+
+ if int_id:
+ return new_ids[0]
+ return new_ids
+
def delete(self, ids):
attendee_obj = Pool().get('calendar.event.attendee')
collection_obj = Pool().get('webdav.collection')
@@ -1070,7 +1089,7 @@ class Event(ModelSQL, ModelView):
ical = vobject.iCalendar()
vevent = ical.add('vevent')
if event.vevent:
- ical.vevent = vobject.readOne(event.vevent)
+ ical.vevent = vobject.readOne(str(event.vevent))
vevent = ical.vevent
ical.vevent.transformToNative()
if event.summary:
@@ -1243,7 +1262,7 @@ class Alarm(ModelSQL):
'''
valarm = None
if alarm.valarm:
- valarm = vobject.readOne(alarm.valarm)
+ valarm = vobject.readOne(str(alarm.valarm))
return valarm
Alarm()
@@ -1361,7 +1380,7 @@ class Attendee(ModelSQL, ModelView):
res = None
if attendee.attendee:
res = vobject.base.textLineToContentLine(
- attendee.attendee.replace('\r\n ', ''))
+ str(attendee.attendee).replace('\r\n ', ''))
else:
res = vobject.base.ContentLine('ATTENDEE', [], '')
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index be19eb1..bbd4e7a 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond-calendar
-Version: 2.4.1
+Version: 2.4.2
Summary: Add CalDAV support
Home-page: http://www.tryton.org/
Author: B2CK
diff --git a/webdav.py b/webdav.py
index 4ce94a4..93b5a12 100644
--- a/webdav.py
+++ b/webdav.py
@@ -226,7 +226,7 @@ class Collection(ModelSQL, ModelView):
return res
def get_resourcetype(self, 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 = self.calendar(uri)
commit b73260e8aedca8b5471eebe95582d9414dcd8bf7
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Wed Apr 25 11:03:30 2012 +0200
Adding upstream version 2.4.1.
diff --git a/CHANGELOG b/CHANGELOG
index 236087d..7885356 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 7a975ed..4022f0b 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond_calendar
-Version: 2.4.0
+Version: 2.4.1
Summary: Add CalDAV support
Home-page: http://www.tryton.org/
Author: B2CK
diff --git a/__tryton__.py b/__tryton__.py
index 351343a..82394ba 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -11,7 +11,7 @@
'name_es_ES': 'Calendario',
'name_fr_FR': '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..39ec4b4 100644
--- a/locale/es_AR.po
+++ b/locale/es_AR.po
@@ -1,3 +1,1099 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.calendar:"
+msgid "A user can have only one calendar!"
+msgstr "¡Un usuario solo puede tener un calendario!"
+
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique!"
+msgstr "¡El nombre del calendario debe ser único!"
+
+msgctxt "error:calendar.category:"
+msgid "The name of calendar category must be unique!"
+msgstr "¡El nombre de la categoría del calendario debe ser único!"
+
+msgctxt "error:calendar.event:"
+msgid "Recurrence can not be recurrent!"
+msgstr "¡Una recurrencia no puede ser recurrente!"
+
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "¡UUID y recurrencia deben ser únicos en un calendario!"
+
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique!"
+msgstr "¡El nombre de la ubicación del calendario debe ser único!"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Day\""
+msgstr "Inválido «por día»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Hour\""
+msgstr "Inválido «por hora»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Minute\""
+msgstr "Inválido «por minuto»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Month Day\""
+msgstr "Inválido «por día del mes»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Month\""
+msgstr "Inválido «por mes»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Position\""
+msgstr "Inválido «por posición»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Second\""
+msgstr "Inválido «por segundos»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Week Number\""
+msgstr "Inválido «por número de semana»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Year Day\""
+msgstr "Inválido «por día del año»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set!"
+msgstr "¡Solo se puede usar o «hasta» o «Número de veces»!"
+
+msgctxt "field:calendar.alarm,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.alarm,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.alarm,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.alarm,valarm:"
+msgid "valarm"
+msgstr "valarm"
+
+msgctxt "field:calendar.alarm,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.alarm,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.attendee,attendee:"
+msgid "attendee"
+msgstr "asistentes"
+
+msgctxt "field:calendar.attendee,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.attendee,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.attendee,email:"
+msgid "Email"
+msgstr "Correo electrónico"
+
+msgctxt "field:calendar.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.attendee,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.attendee,status:"
+msgid "Participation Status"
+msgstr "Estado de participación"
+
+msgctxt "field:calendar.attendee,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.attendee,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.calendar,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.calendar,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.calendar,description:"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:calendar.calendar,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar,owner:"
+msgid "Owner"
+msgstr "Dueño"
+
+msgctxt "field:calendar.calendar,read_users:"
+msgid "Read Users"
+msgstr "Usuarios con lectura"
+
+msgctxt "field:calendar.calendar,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.calendar,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.calendar,write_users:"
+msgid "Write Users"
+msgstr "Usuarios con escritura"
+
+msgctxt "field:calendar.calendar-read-res.user,calendar:"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.calendar-read-res.user,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.calendar-read-res.user,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.calendar-read-res.user,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar-read-res.user,user:"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "field:calendar.calendar-read-res.user,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.calendar-read-res.user,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.calendar-write-res.user,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.calendar-write-res.user,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.calendar-write-res.user,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar-write-res.user,user:"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "field:calendar.calendar-write-res.user,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.calendar-write-res.user,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.category,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.category,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.date,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.date,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.date,date:"
+msgid "Is Date"
+msgstr "Es fecha"
+
+msgctxt "field:calendar.date,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "field:calendar.date,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.date,rec_name:"
+msgid "Name"
+msgstr "Nombre del campo"
+
+msgctxt "field:calendar.date,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.date,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event,alarms:"
+msgid "Alarms"
+msgstr "Alarmas"
+
+msgctxt "field:calendar.event,all_day:"
+msgid "All Day"
+msgstr "Todo el día"
+
+msgctxt "field:calendar.event,attendees:"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "field:calendar.event,calendar:"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.event,calendar_owner:"
+msgid "Owner"
+msgstr "Dueño"
+
+msgctxt "field:calendar.event,calendar_read_users:"
+msgid "Read Users"
+msgstr "Usuarios con lectura"
+
+msgctxt "field:calendar.event,calendar_write_users:"
+msgid "Write Users"
+msgstr "Usuarios con escritura"
+
+msgctxt "field:calendar.event,categories:"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "field:calendar.event,classification:"
+msgid "Classification"
+msgstr "Clasificación"
+
+msgctxt "field:calendar.event,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event,description:"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:calendar.event,dtend:"
+msgid "End Date"
+msgstr "Fecha fin"
+
+msgctxt "field:calendar.event,dtstart:"
+msgid "Start Date"
+msgstr "Fecha inicio"
+
+msgctxt "field:calendar.event,exdates:"
+msgid "Exception Dates"
+msgstr "Fechas excluidas"
+
+msgctxt "field:calendar.event,exrules:"
+msgid "Exception Rules"
+msgstr "Reglas de excepción"
+
+msgctxt "field:calendar.event,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event,location:"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "field:calendar.event,occurences:"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "field:calendar.event,organizer:"
+msgid "Organizer"
+msgstr "Organizador"
+
+msgctxt "field:calendar.event,parent:"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:calendar.event,rdates:"
+msgid "Recurrence Dates"
+msgstr "Fechas de recurrencia"
+
+msgctxt "field:calendar.event,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event,recurrence:"
+msgid "Recurrence"
+msgstr "Recurrencia"
+
+msgctxt "field:calendar.event,rrules:"
+msgid "Recurrence Rules"
+msgstr "Reglas de recurrencia"
+
+msgctxt "field:calendar.event,sequence:"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:calendar.event,status:"
+msgid "Status"
+msgstr "Estado"
+
+msgctxt "field:calendar.event,summary:"
+msgid "Summary"
+msgstr "Resumen"
+
+msgctxt "field:calendar.event,timezone:"
+msgid "Timezone"
+msgstr "Zona horaria"
+
+msgctxt "field:calendar.event,transp:"
+msgid "Time Transparency"
+msgstr "Tiempo de transparencia"
+
+msgctxt "field:calendar.event,uuid:"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.event,vevent:"
+msgid "vevent"
+msgstr "vevent"
+
+msgctxt "field:calendar.event,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event-calendar.category,category:"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "field:calendar.event-calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event-calendar.category,event:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event-calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event-calendar.category,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event-calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event-calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:"
+msgid "Calendar Alarm"
+msgstr "Alarma del calendario"
+
+msgctxt "field:calendar.event.alarm,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event.alarm,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.alarm,event:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.alarm,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.alarm,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.alarm,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:"
+msgid "Calendar Attendee"
+msgstr "Calendario de asistentes"
+
+msgctxt "field:calendar.event.attendee,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event.attendee,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.attendee,event:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.attendee,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.attendee,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.attendee,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.exdate,calendar_date:"
+msgid "Calendar Date"
+msgstr "Fecha Calendario"
+
+msgctxt "field:calendar.event.exdate,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event.exdate,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.exdate,event:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.exdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.exdate,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.exdate,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.exdate,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:"
+msgid "Calendar RRule"
+msgstr "Regla de recurrencia"
+
+msgctxt "field:calendar.event.exrule,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event.exrule,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.exrule,event:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.exrule,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.exrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.exrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.rdate,calendar_date:"
+msgid "Calendar Date"
+msgstr "Fecha Calendario"
+
+msgctxt "field:calendar.event.rdate,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event.rdate,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.rdate,event:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.rdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.rdate,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.rdate,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.rdate,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:"
+msgid "Calendar RRule"
+msgstr "Regla de recurrencia"
+
+msgctxt "field:calendar.event.rrule,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event.rrule,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.rrule,event:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.rrule,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.location,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.location,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.rrule,byday:"
+msgid "By Day"
+msgstr "Por día"
+
+msgctxt "field:calendar.rrule,byhour:"
+msgid "By Hour"
+msgstr "Por hora"
+
+msgctxt "field:calendar.rrule,byminute:"
+msgid "By Minute"
+msgstr "Por minuto"
+
+msgctxt "field:calendar.rrule,bymonth:"
+msgid "By Month"
+msgstr "Por mes"
+
+msgctxt "field:calendar.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Por día del mes"
+
+msgctxt "field:calendar.rrule,bysecond:"
+msgid "By Second"
+msgstr "Por segundo"
+
+msgctxt "field:calendar.rrule,bysetpos:"
+msgid "By Position"
+msgstr "Por posición"
+
+msgctxt "field:calendar.rrule,byweekno:"
+msgid "By Week Number"
+msgstr "Por día de la semana"
+
+msgctxt "field:calendar.rrule,byyearday:"
+msgid "By Year Day"
+msgstr "Por día del año"
+
+msgctxt "field:calendar.rrule,count:"
+msgid "Count"
+msgstr "Número de veces"
+
+msgctxt "field:calendar.rrule,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.rrule,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.rrule,freq:"
+msgid "Frequency"
+msgstr "Frecuencia"
+
+msgctxt "field:calendar.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.rrule,interval:"
+msgid "Interval"
+msgstr "Intervalo"
+
+msgctxt "field:calendar.rrule,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.rrule,until:"
+msgid "Until Date"
+msgstr "Hasta la fecha"
+
+msgctxt "field:calendar.rrule,until_date:"
+msgid "Is Date"
+msgstr "Es fecha"
+
+msgctxt "field:calendar.rrule,wkst:"
+msgid "Week Day"
+msgstr "Día de la semana"
+
+msgctxt "field:calendar.rrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.rrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:res.user,calendars:"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "help:calendar.calendar,owner:"
+msgid "The user must have an email"
+msgstr "El usuario debe tener un correo electrónico"
+
+msgctxt "help:calendar.date,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.event,uuid:"
+msgid "Universally Unique Identifier"
+msgstr "Identificador universal único"
+
+msgctxt "help:calendar.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr "Ignora la hora del campo «Hasta la fecha», y trata solo la fecha"
+
+msgctxt "model:calendar.alarm,name:"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.attendee,name:"
+msgid "Attendee"
+msgstr "Asistentes"
+
+msgctxt "model:calendar.calendar,name:"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "model:calendar.calendar-read-res.user,name:"
+msgid "Calendar - read - User"
+msgstr "Calendario - leer - usuario"
+
+msgctxt "model:calendar.calendar-write-res.user,name:"
+msgid "Calendar - write - User"
+msgstr "Calendario - escribir - usuario"
+
+msgctxt "model:calendar.category,name:"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "model:calendar.date,name:"
+msgid "Calendar Date"
+msgstr "Fecha Calendario"
+
+msgctxt "model:calendar.event,name:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "model:calendar.event-calendar.category,name:"
+msgid "Event - Category"
+msgstr "Evento - Categoría"
+
+msgctxt "model:calendar.event.alarm,name:"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.event.attendee,name:"
+msgid "Attendee"
+msgstr "Asistentes"
+
+msgctxt "model:calendar.event.exdate,name:"
+msgid "Exception Date"
+msgstr "Fecha excluida"
+
+msgctxt "model:calendar.event.exrule,name:"
+msgid "Exception Rule"
+msgstr "Regla de excepción"
+
+msgctxt "model:calendar.event.rdate,name:"
+msgid "Recurrence Date"
+msgstr "Fecha de recurrencia"
+
+msgctxt "model:calendar.event.rrule,name:"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "model:calendar.location,name:"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "model:calendar.rrule,name:"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "model:ir.action,name:act_calendar_form"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "model:ir.action,name:act_event_form"
+msgid "Events"
+msgstr "Eventos"
+
+msgctxt "model:ir.action,name:act_event_form3"
+msgid "Events"
+msgstr "Eventos"
+
+msgctxt "model:ir.ui.menu,name:menu_calendar"
+msgid "Calendar"
+msgstr "Gestión de calendario"
+
+msgctxt "model:ir.ui.menu,name:menu_calendar_form"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "model:ir.ui.menu,name:menu_event_form"
+msgid "Events"
+msgstr "Eventos"
+
+msgctxt "model:res.group,name:group_calendar_admin"
+msgid "Calendar Administration"
+msgstr "Administración de calendario"
+
+msgctxt "selection:calendar.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Accepted"
+msgstr "Aceptada"
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Declined"
+msgstr "Rehusado"
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Delegated"
+msgstr "Delegada"
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Needs Action"
+msgstr "Necesita una acción"
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Tentative"
+msgstr "Tentativa"
+
+msgctxt "selection:calendar.event,classification:"
+msgid "Confidential"
+msgstr "Confidencial"
+
+msgctxt "selection:calendar.event,classification:"
+msgid "Private"
+msgstr "Privado"
+
+msgctxt "selection:calendar.event,classification:"
+msgid "Public"
+msgstr "Público"
+
+msgctxt "selection:calendar.event,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event,status:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:calendar.event,status:"
+msgid "Confirmed"
+msgstr "Confirmada"
+
+msgctxt "selection:calendar.event,status:"
+msgid "Tentative"
+msgstr "Tentativo"
+
+msgctxt "selection:calendar.event,transp:"
+msgid "Opaque"
+msgstr "Opaco"
+
+msgctxt "selection:calendar.event,transp:"
+msgid "Transparent"
+msgstr "Transparente"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Daily"
+msgstr "Diariamente"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Minutely"
+msgstr "Cada minuto"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Monthly"
+msgstr "Mensualmente"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Secondly"
+msgstr "Cada segundo"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgctxt "view:calendar.calendar:"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "view:calendar.calendar:"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "view:calendar.calendar:"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:calendar.calendar:"
+msgid "Security"
+msgstr "Seguridad"
+
+msgctxt "view:calendar.category:"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "view:calendar.category:"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "view:calendar.event.attendee:"
+msgid "Attendee"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.event.attendee:"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.event.exdate:"
+msgid "Exception Date"
+msgstr "Fecha excluida"
+
+msgctxt "view:calendar.event.exdate:"
+msgid "Exception Dates"
+msgstr "Fechas excluidas"
+
+msgctxt "view:calendar.event.exrule:"
+msgid "Exception Rule"
+msgstr "Regla de excepción"
+
+msgctxt "view:calendar.event.exrule:"
+msgid "Exception Rules"
+msgstr "Reglas de excepciones"
+
+msgctxt "view:calendar.event.rdate:"
+msgid "Recurrence Date"
+msgstr "Fecha de recurrencia"
+
+msgctxt "view:calendar.event.rdate:"
+msgid "Recurrence Dates"
+msgstr "Fechas de recurrencia"
+
+msgctxt "view:calendar.event.rrule:"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "view:calendar.event.rrule:"
+msgid "Recurrence Rules"
+msgstr "Reglas de recurrencia"
+
+msgctxt "view:calendar.event:"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.event:"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "view:calendar.event:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "view:calendar.event:"
+msgid "Events"
+msgstr "Eventos"
+
+msgctxt "view:calendar.event:"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:calendar.event:"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "view:calendar.location:"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "view:calendar.location:"
+msgid "Locations"
+msgstr "Ubicaciones"
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index e7c3b87..be19eb1 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond-calendar
-Version: 2.4.0
+Version: 2.4.1
Summary: Add CalDAV support
Home-page: http://www.tryton.org/
Author: B2CK
commit 2ab6a5886387d9ba02f6c0a6f8ca846b8484cd1d
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Apr 24 19:30:39 2012 +0200
Adding upstream version 2.4.0.
diff --git a/CHANGELOG b/CHANGELOG
index b9c58e4..236087d 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)
* Basic support of event time-range filter
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 9a3da7b..81c19d7 100644
--- a/INSTALL
+++ b/INSTALL
@@ -4,10 +4,10 @@ Installing trytond_calendar
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 (http://vobject.skyhouseconsulting.com/)
- * pywebdav >= 0.9.3 (http://sourceforge.net/projects/pywebdav/)
+ * pywebdav >= 0.9.8 (http://sourceforge.net/projects/pywebdav/)
* python-dateutil (http://labix.org/python-dateutil)
* pytz (http://pytz.sourceforge.net/)
diff --git a/PKG-INFO b/PKG-INFO
index bf5bc32..7a975ed 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.0
Name: trytond_calendar
-Version: 2.2.0
+Version: 2.4.0
Summary: Add CalDAV support
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 a09702d..0f1995e 100644
--- a/__init__.py
+++ b/__init__.py
@@ -1,7 +1,7 @@
#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 webdav import *
-from calendar import *
-from res import *
+from . import caldav
+from .webdav import *
+from .calendar_ import *
+from .res import *
diff --git a/__tryton__.py b/__tryton__.py
index b4aa5d1..351343a 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -2,36 +2,42 @@
#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',
- 'name_bg_BG' : 'Календар',
- 'name_de_DE' : 'Kalender',
- 'name_es_CO' : 'Calendario',
- 'name_es_ES' : 'Calendario',
- 'name_fr_FR' : 'Calendrier',
- 'name_ru_RU' : 'Календарь',
- 'version' : '2.2.0',
- 'author' : 'B2CK',
+ 'name': 'Calendar',
+ 'name_bg_BG': 'Календар',
+ 'name_ca_ES': 'Calendari',
+ 'name_de_DE': 'Kalender',
+ 'name_es_AR': 'Calendario',
+ 'name_es_CO': 'Calendario',
+ 'name_es_ES': 'Calendario',
+ 'name_fr_FR': 'Calendrier',
+ 'name_ru_RU': 'Календарь',
+ 'version': '2.4.0',
+ 'author': 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
'description': 'Add CalDAV support',
- 'description_bg_BG' : 'Добавя подръжка на CalDAV',
- 'description_de_DE' : 'Fügt Unterstützung für CalDAV hinzu',
- 'description_es_CO' : 'Añade soporte para CalDAV',
- 'description_es_ES' : 'Añade soporte para CalDAV',
- 'description_fr_FR' : 'Ajoute le support CalDAV',
- 'description_ru_RU' : 'Добавление поддержки CalDAV',
- 'depends' : [
+ 'description_bg_BG': 'Добавя подръжка на CalDAV',
+ 'description_ca_ES': 'Afegeix suport per CalDAV.',
+ 'description_de_DE': 'Fügt Unterstützung für CalDAV hinzu',
+ 'description_es_AR': 'Añade soporte para CalDAV',
+ 'description_es_CO': 'Añade soporte para CalDAV',
+ 'description_es_ES': 'Añade soporte para CalDAV',
+ 'description_fr_FR': 'Ajoute le support CalDAV',
+ 'description_ru_RU': 'Добавление поддержки CalDAV',
+ 'depends': [
'ir',
'res',
'webdav',
],
- 'xml' : [
+ 'xml': [
'calendar.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 4b6d56a..2595186 100644
--- a/caldav.py
+++ b/caldav.py
@@ -4,16 +4,15 @@ import urlparse
import urllib
from string import atoi
import xml.dom.minidom
-from DAV import propfind
-from DAV.errors import *
-from DAV.utils import get_uriparentpath
-from DAV.constants import DAV_VERSION_1, DAV_VERSION_2
+from pywebdav.lib import propfind
+from pywebdav.lib.errors import DAV_NotFound, DAV_Error, DAV_Forbidden
+from pywebdav.lib.utils import get_uriparentpath
+from pywebdav.lib.constants import DAV_VERSION_1, DAV_VERSION_2
from trytond.protocols.webdav import TrytonDAVInterface, CACHE, \
WebDAVAuthRequestHandler
from trytond.pool import Pool
from trytond.transaction import Transaction
-_TRYTON_RELOAD = False
domimpl = xml.dom.minidom.getDOMImplementation()
TrytonDAVInterface.PROPS['urn:ietf:params:xml:ns:caldav'] = (
@@ -24,14 +23,15 @@ TrytonDAVInterface.PROPS['urn:ietf:params:xml:ns:caldav'] = (
'schedule-inbox-URL',
'schedule-outbox-URL',
)
-TrytonDAVInterface.PROPS['DAV:'] = tuple(list(TrytonDAVInterface.PROPS['DAV:']) \
- + ['principal-collection-set'])
+TrytonDAVInterface.PROPS['DAV:'] = tuple(list(TrytonDAVInterface.PROPS['DAV:'])
+ + ['principal-collection-set'])
TrytonDAVInterface.M_NS['urn:ietf:params:xml:ns:caldav'] = '_get_caldav'
-DAV_VERSION_1['version'] += ',calendar-access,calendar-schedule'#,calendar-auto-schedule'
-DAV_VERSION_2['version'] += ',calendar-access,calendar-schedule'#,calendar-auto-schedule'
+DAV_VERSION_1['version'] += ',calendar-access,calendar-schedule'
+DAV_VERSION_2['version'] += ',calendar-access,calendar-schedule'
_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 '')
@@ -52,6 +52,7 @@ def mk_prop_response(self, uri, good_props, bad_props, doc):
propfind.PROPFIND.mk_prop_response = mk_prop_response
+
def _get_caldav_calendar_description(self, uri):
dbname, dburi = self._get_dburi(uri)
if not dbname:
@@ -65,7 +66,7 @@ def _get_caldav_calendar_description(self, uri):
res = collection_obj.get_calendar_description(dburi, cache=CACHE)
except AttributeError:
raise DAV_NotFound
- except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+ except DAV_Error, exception:
self._log_exception(exception)
raise
except Exception, exception:
@@ -73,7 +74,9 @@ def _get_caldav_calendar_description(self, uri):
raise DAV_Error(500)
return res
-TrytonDAVInterface._get_caldav_calendar_description = _get_caldav_calendar_description
+TrytonDAVInterface._get_caldav_calendar_description = \
+ _get_caldav_calendar_description
+
def _get_caldav_calendar_data(self, uri):
dbname, dburi = self._get_dburi(uri)
@@ -88,7 +91,7 @@ def _get_caldav_calendar_data(self, uri):
res = collection_obj.get_calendar_data(dburi, cache=CACHE)
except AttributeError:
raise DAV_NotFound
- except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+ except DAV_Error, exception:
self._log_exception(exception)
raise
except Exception, exception:
@@ -98,6 +101,7 @@ def _get_caldav_calendar_data(self, uri):
TrytonDAVInterface._get_caldav_calendar_data = _get_caldav_calendar_data
+
def _get_caldav_calendar_home_set(self, uri):
dbname, dburi = self._get_dburi(uri)
if not dbname:
@@ -111,7 +115,7 @@ def _get_caldav_calendar_home_set(self, uri):
res = collection_obj.get_calendar_home_set(dburi, cache=CACHE)
except AttributeError:
raise DAV_NotFound
- except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+ except DAV_Error, exception:
self._log_exception(exception)
raise
except Exception, exception:
@@ -128,7 +132,9 @@ def _get_caldav_calendar_home_set(self, uri):
href.appendChild(huri)
return href
-TrytonDAVInterface._get_caldav_calendar_home_set = _get_caldav_calendar_home_set
+TrytonDAVInterface._get_caldav_calendar_home_set = \
+ _get_caldav_calendar_home_set
+
def _get_caldav_calendar_user_address_set(self, uri):
dbname, dburi = self._get_dburi(uri)
@@ -143,7 +149,7 @@ def _get_caldav_calendar_user_address_set(self, uri):
res = collection_obj.get_calendar_user_address_set(dburi, cache=CACHE)
except AttributeError:
raise DAV_NotFound
- except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+ except DAV_Error, exception:
self._log_exception(exception)
raise
except Exception, exception:
@@ -156,7 +162,9 @@ def _get_caldav_calendar_user_address_set(self, uri):
href.appendChild(huri)
return href
-TrytonDAVInterface._get_caldav_calendar_user_address_set = _get_caldav_calendar_user_address_set
+TrytonDAVInterface._get_caldav_calendar_user_address_set = \
+ _get_caldav_calendar_user_address_set
+
def _get_caldav_schedule_inbox_URL(self, uri):
dbname, dburi = self._get_dburi(uri)
@@ -171,7 +179,7 @@ def _get_caldav_schedule_inbox_URL(self, uri):
res = collection_obj.get_schedule_inbox_URL(dburi, cache=CACHE)
except AttributeError:
raise DAV_NotFound
- except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+ except DAV_Error, exception:
self._log_exception(exception)
raise
except Exception, exception:
@@ -186,7 +194,9 @@ def _get_caldav_schedule_inbox_URL(self, uri):
href.appendChild(huri)
return href
-TrytonDAVInterface._get_caldav_schedule_inbox_URL = _get_caldav_schedule_inbox_URL
+TrytonDAVInterface._get_caldav_schedule_inbox_URL = \
+ _get_caldav_schedule_inbox_URL
+
def _get_caldav_schedule_outbox_URL(self, uri):
dbname, dburi = self._get_dburi(uri)
@@ -201,7 +211,7 @@ def _get_caldav_schedule_outbox_URL(self, uri):
res = collection_obj.get_schedule_outbox_URL(dburi, cache=CACHE)
except AttributeError:
raise DAV_NotFound
- except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+ except DAV_Error, exception:
self._log_exception(exception)
raise
except Exception, exception:
@@ -216,12 +226,14 @@ def _get_caldav_schedule_outbox_URL(self, uri):
href.appendChild(huri)
return href
-TrytonDAVInterface._get_caldav_schedule_outbox_URL = _get_caldav_schedule_outbox_URL
+TrytonDAVInterface._get_caldav_schedule_outbox_URL = \
+ _get_caldav_schedule_outbox_URL
_prev_get_dav_principal_collection_set = hasattr(TrytonDAVInterface,
'_get_dav_principal_collection_set') and \
TrytonDAVInterface._get_dav_principal_collection_set or None
+
def _get_dav_principal_collection_set(self, uri):
dbname, dburi = self._get_dburi(uri)
if dburi.startswith('Calendars'):
@@ -237,7 +249,9 @@ def _get_dav_principal_collection_set(self, uri):
return _prev_get_dav_principal_collection_set(self, uri)
raise DAV_NotFound
-TrytonDAVInterface._get_dav_principal_collection_set = _get_dav_principal_collection_set
+TrytonDAVInterface._get_dav_principal_collection_set = \
+ _get_dav_principal_collection_set
+
def _get_caldav_post(self, uri, body, contenttype=''):
dbname, dburi = self._get_dburi(uri)
@@ -249,7 +263,7 @@ def _get_caldav_post(self, uri, body, contenttype=''):
res = calendar_obj.post(dburi, body)
except AttributeError:
raise DAV_NotFound
- except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+ except DAV_Error, exception:
self._log_exception(exception)
raise
except Exception, exception:
@@ -261,24 +275,23 @@ TrytonDAVInterface._get_caldav_post = _get_caldav_post
_prev_do_POST = WebDAVAuthRequestHandler.do_POST
+
def do_POST(self):
- dc=self.IFACE_CLASS
+ dc = self.IFACE_CLASS
- uri=urlparse.urljoin(self.get_baseuri(dc), self.path)
- uri=urllib.unquote(uri)
+ uri = urlparse.urljoin(self.get_baseuri(dc), self.path)
+ uri = urllib.unquote(uri)
dbname, dburi = TrytonDAVInterface.get_dburi(uri)
if dburi.startswith('Calendars'):
# read the body
- body=None
- if self.headers.has_key("Content-Length"):
- l=self.headers['Content-Length']
- body=self.rfile.read(atoi(l))
- ct=None
- if self.headers.has_key("Content-Type"):
- ct=self.headers['Content-Type']
-
- headers = {}
+ body = None
+ if 'Content-Length' in self.headers:
+ l = self.headers['Content-Length']
+ body = self.rfile.read(atoi(l))
+ ct = None
+ if 'Content-Type' in self.headers:
+ ct = self.headers['Content-Type']
try:
DATA = '%s\n' % dc._get_caldav_post(uri, body, ct)
diff --git a/calendar.xml b/calendar.xml
index bdf5ea1..3294b35 100644
--- a/calendar.xml
+++ b/calendar.xml
@@ -170,6 +170,7 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.ui.view" id="event_view_tree">
<field name="model">calendar.event</field>
<field name="type">tree</field>
+ <field name="priority" eval="10"/>
<field name="arch" type="xml">
<![CDATA[
<tree string="Events">
@@ -184,6 +185,24 @@ this repository contains the full copyright notices and license terms. -->
</field>
</record>
+ <record model="ir.ui.view" id="event_vieww_tree_occurence">
+ <field name="model">calendar.event</field>
+ <field name="type">tree</field>
+ <field name="priority" eval="20"/>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Events">
+ <field name="summary"/>
+ <field name="recurrence"/>
+ <field name="all_day"/>
+ <field name="dtstart"/>
+ <field name="dtend"/>
+ <field name="status"/>
+ </tree>
+ ]]>
+ </field>
+ </record>
+
<record model="ir.ui.view" id="event_view_form">
<field name="model">calendar.event</field>
<field name="type">form</field>
@@ -229,16 +248,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="Events">
- <field name="summary"/>
- <field name="recurrence"/>
- <field name="all_day"/>
- <field name="dtstart"/>
- <field name="dtend"/>
- <field name="status"/>
- </tree>
- </field>
+ <field name="occurences" colspan="4"
+ view_ids="calendar.event_vieww_tree_occurence"/>
</page>
</notebook>
<field name="parent" colspan="4" invisible="1"/>
diff --git a/calendar.py b/calendar_.py
similarity index 93%
rename from calendar.py
rename to calendar_.py
index 24d3635..fef6c1d 100644
--- a/calendar.py
+++ b/calendar_.py
@@ -23,10 +23,10 @@ class Calendar(ModelSQL, ModelView):
_description = __doc__
_name = 'calendar.calendar'
- name = fields.Char('Name', required=True, select=1)
+ name = fields.Char('Name', required=True, select=True)
description = fields.Text('Description')
- owner = fields.Many2One('res.user', 'Owner', select=1,
- domain=[('email', '!=', False)],
+ owner = fields.Many2One('res.user', 'Owner', select=True,
+ domain=[('email', '!=', None)],
help='The user must have an email')
read_users = fields.Many2Many('calendar.calendar-read-res.user',
'calendar', 'user', 'Read Users')
@@ -79,14 +79,13 @@ class Calendar(ModelSQL, ModelView):
Return the calendar id of the name
:param name: the calendar name
- :return: the calendar.calendar id or False
+ :return: the calendar.calendar id
'''
calendar_ids = self.search([
('name', '=', name),
], limit=1)
if calendar_ids:
return calendar_ids[0]
- return False
def calendar2ical(self, calendar_id):
'''
@@ -102,7 +101,7 @@ class Calendar(ModelSQL, ModelView):
ical.vevent_list = []
event_ids = event_obj.search([
('calendar', '=', calendar_id),
- ('parent', '=', False),
+ ('parent', '=', None),
])
for event in event_obj.browse(event_ids):
ical2 = event_obj.event2ical(event.id)
@@ -168,13 +167,13 @@ class Calendar(ModelSQL, ModelView):
('dtend', '<=', dtend)],
[('dtstart', '>=', dtstart),
('dtstart', '<=', dtend),
- ('dtend', '=', False)]],
- ('parent', '=', False),
- ('rdates', '=', False),
- ('rrules', '=', False),
- ('exdates', '=', False),
- ('exrules', '=', False),
- ('occurences', '=', False),
+ ('dtend', '=', None)]],
+ ('parent', '=', None),
+ ('rdates', '=', None),
+ ('rrules', '=', None),
+ ('exdates', '=', None),
+ ('exrules', '=', None),
+ ('occurences', '=', None),
('calendar', '=', calendar_id),
])
events = event_obj.browse(event_ids)
@@ -197,14 +196,14 @@ class Calendar(ModelSQL, ModelView):
with Transaction().set_user(0):
event_ids = event_obj.search([
- ('parent', '=', False),
+ ('parent', '=', None),
('dtstart', '<=', dtend),
['OR',
- ('rdates', '!=', False),
- ('rrules', '!=', False),
- ('exdates', '!=', False),
- ('exrules', '!=', False),
- ('occurences', '!=', False),
+ ('rdates', '!=', None),
+ ('rrules', '!=', None),
+ ('exdates', '!=', None),
+ ('exrules', '!=', None),
+ ('occurences', '!=', None),
],
('calendar', '=', calendar_id),
])
@@ -214,9 +213,6 @@ class Calendar(ModelSQL, ModelView):
event_ical = event_obj.event2ical(event)
if event_ical.vevent.rruleset:
between_dtstart, between_dtend = dtstart, dtend
- if event.all_day:
- between_dtstart = dtstart.replace(tzinfo=None)
- between_dtend = dtend.replace(tzinfo=None)
for freebusy_dtstart in event_ical.vevent.rruleset:
if freebusy_dtstart.replace(tzinfo=tzlocal) > dtend:
break
@@ -226,19 +222,22 @@ class Calendar(ModelSQL, ModelView):
freebusy_dtend = event.dtend.replace(tzinfo=tzlocal)\
- event.dtstart.replace(tzinfo=tzlocal) \
+ freebusy_dtstart
- if not ((freebusy_dtstart.replace(tzinfo=tzlocal) <= dtstart
- and freebusy_dtend.replace(tzinfo=tzlocal) >= dtstart)
- or (freebusy_dtstart.replace(tzinfo=tzlocal) <= dtend
- and freebusy_dtend.replace(tzinfo=tzlocal) >= dtend)
- or (freebusy_dtstart.replace(tzinfo=tzlocal) >= dtstart
- and freebusy_dtend.replace(tzinfo=tzlocal) <= dtend)):
+ f_dtstart_tz = freebusy_dtstart.replace(tzinfo=tzlocal)
+ f_dtend_tz = freebusy_dtend.replace(tzinfo=tzlocal)
+ if not ((f_dtstart_tz <= dtstart
+ and f_dtend_tz >= dtstart)
+ or (f_dtstart_tz <= dtend
+ and f_dtend_tz >= dtend)
+ or (f_dtstart_tz >= dtstart
+ and f_dtend_tz <= dtend)):
continue
freebusy_fbtype = self._fbtype(event)
all_day = event.all_day
for occurence in event.occurences:
- if occurence.recurrence.replace(tzinfo=tzlocal) == \
- freebusy_dtstart.replace(tzinfo=tzlocal):
- freebusy_dtstart = occurence.dtstart.replace(tzinfo=tzlocal)
+ if (occurence.recurrence.replace(tzinfo=tzlocal)
+ == f_dtstart_tz):
+ freebusy_dtstart = \
+ occurence.dtstart.replace(tzinfo=tzlocal)
if occurence.dtend:
freebusy_dtend = occurence.dtend\
.replace(tzinfo=tzlocal)
@@ -249,16 +248,15 @@ class Calendar(ModelSQL, ModelView):
break
freebusy = ical.vfreebusy.add('freebusy')
freebusy.fbtype_param = freebusy_fbtype
- if freebusy_dtstart.replace(tzinfo=tzlocal) <= dtstart:
+ if f_dtstart_tz <= dtstart:
freebusy_dtstart = dtstart
- if freebusy_dtend.replace(tzinfo=tzlocal) >= dtend:
+ if f_dtend_tz >= dtend:
freebusy_dtend = dtend
if all_day:
freebusy.value = [(
- freebusy_dtstart.replace(tzinfo=tzlocal)\
- .astimezone(tzutc),
- freebusy_dtend.replace(tzinfo=tzlocal)\
- .astimezone(tzutc))]
+ f_dtstart_tz.astimezone(tzutc),
+ f_dtend_tz.astimezone(tzutc),
+ )]
else:
freebusy.value = [(
freebusy_dtstart.astimezone(tzutc),
@@ -334,8 +332,9 @@ class Calendar(ModelSQL, ModelView):
vfreebusy.vfreebusy.add('attendee').value = attendee.value
status = doc.createElement('C:request-status')
- status.appendChild(doc.createTextNode(vfreebusy and \
- '2.0;Success' or '5.3;No scheduling support for user.'))
+ status.appendChild(doc.createTextNode(vfreebusy
+ and '2.0;Success'
+ or '5.3;No scheduling support for user.'))
resp.appendChild(status)
if vfreebusy:
data = doc.createElement('C:calendar-data')
@@ -353,9 +352,9 @@ class ReadUser(ModelSQL):
_name = 'calendar.calendar-read-res.user'
calendar = fields.Many2One('calendar.calendar', 'Calendar',
- ondelete='CASCADE', required=True, select=1)
+ ondelete='CASCADE', required=True, select=True)
user = fields.Many2One('res.user', 'User', ondelete='CASCADE',
- required=True, select=1)
+ required=True, select=True)
ReadUser()
@@ -366,9 +365,9 @@ class WriteUser(ModelSQL):
_name = 'calendar.calendar-write-res.user'
calendar = fields.Many2One('calendar.calendar', 'Calendar',
- ondelete='CASCADE', required=True, select=1)
+ ondelete='CASCADE', required=True, select=True)
user = fields.Many2One('res.user', 'User', ondelete='CASCADE',
- required=True, select=1)
+ required=True, select=True)
WriteUser()
@@ -378,7 +377,7 @@ class Category(ModelSQL, ModelView):
_description = __doc__
_name = 'calendar.category'
- name = fields.Char('Name', required=True, select=1)
+ name = fields.Char('Name', required=True, select=True)
def __init__(self):
super(Category, self).__init__()
@@ -396,7 +395,7 @@ class Location(ModelSQL, ModelView):
_description = __doc__
_name = 'calendar.location'
- name = fields.Char('Name', required=True, select=1)
+ name = fields.Char('Name', required=True, select=True)
def __init__(self):
super(Location, self).__init__()
@@ -416,15 +415,15 @@ class Event(ModelSQL, ModelView):
_rec_name = 'uuid'
uuid = fields.Char('UUID', required=True,
- help='Universally Unique Identifier', select=1)
+ help='Universally Unique Identifier', select=True)
calendar = fields.Many2One('calendar.calendar', 'Calendar',
- required=True, select=1, ondelete="CASCADE")
+ required=True, select=True, ondelete="CASCADE")
summary = fields.Char('Summary')
- sequence = fields.Integer('Sequence')
+ sequence = fields.Integer('Sequence', required=True)
description = fields.Text('Description')
all_day = fields.Boolean('All Day')
- dtstart = fields.DateTime('Start Date', required=True, select=1)
- dtend = fields.DateTime('End Date', select=1)
+ dtstart = fields.DateTime('Start Date', required=True, select=True)
+ dtend = fields.DateTime('End Date', select=True)
timezone = fields.Selection('timezones', 'Timezone')
categories = fields.Many2Many('calendar.event-calendar.category',
'event', 'category', 'Categories')
@@ -450,19 +449,23 @@ class Event(ModelSQL, ModelView):
('transparent', 'Transparent'),
], 'Time Transparency', required=True)
alarms = fields.One2Many('calendar.event.alarm', 'event', 'Alarms')
- rdates = fields.One2Many('calendar.event.rdate', 'event', 'Recurrence Dates',
+ rdates = fields.One2Many('calendar.event.rdate', 'event',
+ 'Recurrence Dates',
states={
'invisible': Bool(Eval('parent')),
}, depends=['parent'])
- rrules = fields.One2Many('calendar.event.rrule', 'event', 'Recurrence Rules',
+ rrules = fields.One2Many('calendar.event.rrule', 'event',
+ 'Recurrence Rules',
states={
'invisible': Bool(Eval('parent')),
}, depends=['parent'])
- exdates = fields.One2Many('calendar.event.exdate', 'event', 'Exception Dates',
+ exdates = fields.One2Many('calendar.event.exdate', 'event',
+ 'Exception Dates',
states={
'invisible': Bool(Eval('parent')),
}, depends=['parent'])
- exrules = fields.One2Many('calendar.event.exrule', 'event', 'Exception Rules',
+ exrules = fields.One2Many('calendar.event.exrule', 'event',
+ 'Exception Rules',
states={
'invisible': Bool(Eval('parent')),
}, depends=['parent'])
@@ -477,11 +480,11 @@ class Event(ModelSQL, ModelView):
parent = fields.Many2One('calendar.event', 'Parent',
domain=[
('uuid', '=', Eval('uuid')),
- ('parent', '=', False),
+ ('parent', '=', None),
('calendar', '=', Eval('calendar')),
],
ondelete='CASCADE', depends=['uuid', 'calendar'])
- 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'])
@@ -514,7 +517,7 @@ class Event(ModelSQL, ModelView):
model_data_ids = model_data_obj.search([
('fs_id', '=', 'rule_group_read_calendar_line3'),
('module', '=', module_name),
- ('inherit', '=', False),
+ ('inherit', '=', None),
], limit=1)
if model_data_ids:
model_data = model_data_obj.browse(model_data_ids[0])
@@ -577,10 +580,11 @@ class Event(ModelSQL, ModelView):
res = super(Event, self).create(values)
event = self.browse(res)
- if event.calendar.owner \
- and (event.organizer == event.calendar.owner.email \
- or (event.parent \
- and event.parent.organizer == event.parent.calendar.owner.email)):
+ if (event.calendar.owner
+ and (event.organizer == event.calendar.owner.email
+ or (event.parent
+ and event.parent.organizer == \
+ event.parent.calendar.owner.email))):
if event.organizer == event.calendar.owner.email:
attendee_emails = [x.email for x in event.attendees
if x.status != 'declined'
@@ -598,7 +602,7 @@ class Event(ModelSQL, ModelView):
for calendar_id in calendar_ids:
new_id = self.copy(event.id, default={
'calendar': calendar_id,
- 'occurences': False,
+ 'occurences': None,
})
for occurence in event.occurences:
self.copy(occurence.id, default={
@@ -610,7 +614,7 @@ class Event(ModelSQL, ModelView):
('uuid', '=', event.uuid),
('calendar.owner.email', 'in', attendee_emails),
('id', '!=', event.id),
- ('recurrence', '=', False),
+ ('recurrence', '=', None),
])
for parent in self.browse(parent_ids):
self.copy(event.id, default={
@@ -695,7 +699,7 @@ class Event(ModelSQL, ModelView):
event_ids = self.search([
('uuid', '=', event.uuid),
('id', '!=', event.id),
- ('recurrence', '=', event.recurrence or False),
+ ('recurrence', '=', event.recurrence),
])
for event2 in self.browse(event_ids):
if event2.calendar.owner.email in attendee_emails:
@@ -715,7 +719,7 @@ class Event(ModelSQL, ModelView):
for calendar_id in calendar_ids:
new_id = self.copy(event.id, default={
'calendar': calendar_id,
- 'occurences': False,
+ 'occurences': None,
})
for occurence in event.occurences:
self.copy(occurence.id, default={
@@ -724,11 +728,12 @@ class Event(ModelSQL, ModelView):
})
else:
parent_ids = self.search([
- ('uuid', '=', event.uuid),
- ('calendar.owner.email', 'in', attendee_emails),
- ('id', '!=', event.id),
- ('recurrence', '=', False),
- ])
+ ('uuid', '=', event.uuid),
+ ('calendar.owner.email', 'in',
+ attendee_emails),
+ ('id', '!=', event.id),
+ ('recurrence', '=', None),
+ ])
for parent in self.browse(parent_ids):
self.copy(event.id, default={
'calendar': parent.calendar.id,
@@ -761,7 +766,7 @@ class Event(ModelSQL, ModelView):
('uuid', '=', event.uuid),
('calendar.owner.email', 'in', attendee_emails),
('id', '!=', event.id),
- ('recurrence', '=', event.recurrence or False),
+ ('recurrence', '=', event.recurrence),
])
self.delete(event_ids)
elif event.organizer \
@@ -775,7 +780,7 @@ class Event(ModelSQL, ModelView):
('uuid', '=', event.uuid),
('calendar.owner.email', '=', organizer),
('id', '!=', event.id),
- ('recurrence', '=', event.recurrence or False),
+ ('recurrence', '=', event.recurrence),
], limit=1)
if event_ids:
event2 = self.browse(event_ids[0])
@@ -802,7 +807,6 @@ class Event(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.event.alarm')
attendee_obj = pool.get('calendar.event.attendee')
rdate_obj = pool.get('calendar.event.rdate')
@@ -832,11 +836,11 @@ class Event(ModelSQL, ModelView):
if hasattr(vevent, 'summary'):
res['summary'] = vevent.summary.value
else:
- res['summary'] = False
+ res['summary'] = None
if hasattr(vevent, 'description'):
res['description'] = vevent.description.value
else:
- res['description'] = False
+ res['description'] = None
if not isinstance(vevent.dtstart.value, datetime.datetime):
res['all_day'] = True
res['dtstart'] = datetime.datetime.combine(vevent.dtstart.value,
@@ -859,7 +863,7 @@ class Event(ModelSQL, ModelView):
elif hasattr(vevent, 'duration') and hasattr(vevent, 'dtstart'):
res['dtend'] = vevent.dtstart.value + vevent.duration.value
else:
- res['dtend'] = False
+ res['dtend'] = None
if hasattr(vevent, 'recurrence-id'):
if not isinstance(vevent.recurrence_id.value, datetime.datetime):
res['recurrence'] = datetime.datetime.combine(
@@ -872,7 +876,7 @@ class Event(ModelSQL, ModelView):
else:
res['recurrence'] = vevent.recurrence_id.value
else:
- res['recurrence'] = False
+ res['recurrence'] = None
if hasattr(vevent, 'status'):
res['status'] = vevent.status.value.lower()
else:
@@ -915,7 +919,7 @@ class Event(ModelSQL, ModelView):
location_id = location_ids[0]
res['location'] = location_id
else:
- res['location'] = False
+ res['location'] = None
res['calendar'] = calendar_id
@@ -930,7 +934,7 @@ class Event(ModelSQL, ModelView):
else:
res['organizer'] = vevent.organizer.value
else:
- res['organizer'] = False
+ res['organizer'] = None
attendees_todel = {}
if event:
@@ -1205,9 +1209,9 @@ class EventCategory(ModelSQL):
_name = 'calendar.event-calendar.category'
event = fields.Many2One('calendar.event', 'Event', 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)
EventCategory()
@@ -1252,9 +1256,9 @@ class EventAlarm(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)
event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
- required=True, select=1)
+ required=True, select=True)
def create(self, values):
event_obj = Pool().get('calendar.event')
@@ -1384,9 +1388,9 @@ class EventAttendee(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)
event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
- required=True, select=1)
+ required=True, select=True)
def create(self, values):
event_obj = Pool().get('calendar.event')
@@ -1396,10 +1400,11 @@ class EventAttendee(ModelSQL, ModelView):
res = super(EventAttendee, self).create(values)
attendee = self.browse(res)
event = attendee.event
- if event.calendar.owner \
- and (event.organizer == event.calendar.owner.email \
- or (event.parent \
- and event.parent.organizer == event.parent.calendar.owner.email)):
+ if (event.calendar.owner
+ and (event.organizer == event.calendar.owner.email
+ or (event.parent
+ and event.parent.organizer == \
+ event.parent.calendar.owner.email))):
if event.organizer == event.calendar.owner.email:
attendee_emails = [x.email for x in event.attendees
if x.email != event.organizer]
@@ -1412,7 +1417,7 @@ class EventAttendee(ModelSQL, ModelView):
('uuid', '=', event.uuid),
('calendar.owner.email', 'in', attendee_emails),
('id', '!=', event.id),
- ('recurrence', '=', event.recurrence or False),
+ ('recurrence', '=', event.recurrence),
])
for event_id in event_ids:
self.copy(res, default={
@@ -1457,7 +1462,7 @@ class EventAttendee(ModelSQL, ModelView):
attendee_emails),
('id', '!=', attendee.id),
('event.recurrence', '=',
- event.recurrence or False),
+ event.recurrence),
('email', '=', attendee.email),
])
self.write(attendee_ids, self._attendee2update(
@@ -1498,7 +1503,7 @@ class EventAttendee(ModelSQL, ModelView):
attendee_emails),
('id', '!=', attendee.id),
('event.recurrence', '=',
- event.recurrence or False),
+ event.recurrence),
('email', '=', attendee.email),
])
self.delete(attendee_ids)
@@ -1515,7 +1520,7 @@ class EventAttendee(ModelSQL, ModelView):
('event.uuid', '=', event.uuid),
('event.calendar.owner.email', '=', organizer),
('id', '!=', attendee.id),
- ('event.recurrence', '=', event.recurrence or False),
+ ('event.recurrence', '=', event.recurrence),
('email', '=', attendee.email),
])
if attendee_ids:
@@ -1634,9 +1639,9 @@ class EventRDate(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)
event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
- select=1, required=True)
+ select=True, required=True)
def init(self, module_name):
cursor = Transaction().cursor
@@ -1778,7 +1783,7 @@ class RRule(ModelSQL, ModelView):
def init(self, module_name):
cursor = Transaction().cursor
# Migrate from 1.4: unit_count replaced by until_count_only_one
- table = TableHandler(cursor, self, module_name)
+ table = TableHandler(cursor, self, module_name)
table.drop_constraint('until_count')
return super(RRule, self).init(module_name)
@@ -1985,10 +1990,9 @@ class EventRRule(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)
event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
- select=1, required=True)
-
+ select=True, required=True)
def create(self, values):
event_obj = Pool().get('calendar.event')
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
index 0c5f80b..537b2ff 100644
--- a/locale/bg_BG.po
+++ b/locale/bg_BG.po
@@ -2,519 +2,859 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
msgid "A user can have only one calendar!"
msgstr "Потребителя може да има само един календар!"
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
msgid "The name of calendar must be unique!"
msgstr "Името на календара трябва да е уникално!"
-msgctxt "error:calendar.category:0"
+msgctxt "error:calendar.category:"
msgid "The name of calendar category must be unique!"
msgstr "Името на категорията на календара трябва да е уникално!"
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
msgid "Recurrence can not be recurrent!"
msgstr "Повторението не може да е периодично!"
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
msgid "UUID and recurrence must be unique in a calendar!"
msgstr "UUID и взаимна вложеност трябва да са уникални в календар!"
-msgctxt "error:calendar.location:0"
+msgctxt "error:calendar.location:"
msgid "The name of calendar location must be unique!"
msgstr "Името на местонахождението на календара трябва да е уникално!"
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Day\""
msgstr "Невалиден \"По ден\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Hour\""
msgstr "Навалиден \"По час\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Minute\""
msgstr "Невалиден \"По минута\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Month Day\""
msgstr "Невалиден \"По ден от месец\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Month\""
msgstr "Невалидно \"По месец\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Position\""
msgstr "Невалиден \"По позиция\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Second\""
msgstr "Невалиден \"По секунда\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Week Number\""
msgstr "Невалиден \"По номер на седмица\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Year Day\""
msgstr "Невалиден \"По ден от годината\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Only one of \"until\" and \"count\" can be set!"
msgstr "\"Крайна дата\" и \"брой\" не може да се попълва по едно и също време!"
-msgctxt "field:calendar.alarm,rec_name:0"
+msgctxt "field:calendar.alarm,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.alarm,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.alarm,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.alarm,valarm:0"
+msgctxt "field:calendar.alarm,valarm:"
msgid "valarm"
msgstr ""
-msgctxt "field:calendar.attendee,attendee:0"
+msgctxt "field:calendar.alarm,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.alarm,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.attendee,attendee:"
msgid "attendee"
msgstr "присътващ"
-msgctxt "field:calendar.attendee,email:0"
+msgctxt "field:calendar.attendee,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.attendee,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.attendee,email:"
msgid "Email"
msgstr "Email"
-msgctxt "field:calendar.attendee,rec_name:0"
+msgctxt "field:calendar.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.attendee,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.attendee,status:0"
+msgctxt "field:calendar.attendee,status:"
msgid "Participation Status"
msgstr "Статус на участие"
-msgctxt "field:calendar.calendar,description:0"
+msgctxt "field:calendar.attendee,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.attendee,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.calendar,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.calendar,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.calendar,description:"
msgid "Description"
msgstr "Описание"
-msgctxt "field:calendar.calendar,name:0"
+msgctxt "field:calendar.calendar,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar,name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.calendar,owner:0"
+msgctxt "field:calendar.calendar,owner:"
msgid "Owner"
msgstr "Собственик"
-msgctxt "field:calendar.calendar,read_users:0"
+msgctxt "field:calendar.calendar,read_users:"
msgid "Read Users"
msgstr "Потребители с права за четене"
-msgctxt "field:calendar.calendar,rec_name:0"
+msgctxt "field:calendar.calendar,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.calendar,write_users:0"
+msgctxt "field:calendar.calendar,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.calendar,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.calendar,write_users:"
msgid "Write Users"
msgstr "Записване на потребители"
-msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,calendar:"
msgid "Calendar"
msgstr "Календар"
-msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-read-res.user,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.calendar-read-res.user,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.calendar-read-res.user,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgctxt "field:calendar.calendar-read-res.user,user:"
msgid "User"
msgstr "Потребител"
-msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.calendar-read-res.user,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:"
msgid "Calendar"
msgstr "Календар"
-msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-write-res.user,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.calendar-write-res.user,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.calendar-write-res.user,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgctxt "field:calendar.calendar-write-res.user,user:"
msgid "User"
msgstr "Потребител"
-msgctxt "field:calendar.category,name:0"
+msgctxt "field:calendar.calendar-write-res.user,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.calendar-write-res.user,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.category,name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.category,rec_name:0"
+msgctxt "field:calendar.category,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.date,date:0"
+msgctxt "field:calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.date,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.date,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.date,date:"
msgid "Is Date"
msgstr "Е дата"
-msgctxt "field:calendar.date,datetime:0"
+msgctxt "field:calendar.date,datetime:"
msgid "Date"
msgstr "Дата"
-msgctxt "field:calendar.date,rec_name:0"
+msgctxt "field:calendar.date,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.date,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.event,alarms:0"
+msgctxt "field:calendar.date,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.date,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.event,alarms:"
msgid "Alarms"
msgstr "Аларми"
-msgctxt "field:calendar.event,all_day:0"
+msgctxt "field:calendar.event,all_day:"
msgid "All Day"
msgstr "Всички дни"
-msgctxt "field:calendar.event,attendees:0"
+msgctxt "field:calendar.event,attendees:"
msgid "Attendees"
msgstr "Присъстващи"
-msgctxt "field:calendar.event,calendar:0"
+msgctxt "field:calendar.event,calendar:"
msgid "Calendar"
msgstr "Календар"
-msgctxt "field:calendar.event,calendar_owner:0"
+msgctxt "field:calendar.event,calendar_owner:"
msgid "Owner"
msgstr "Собственик"
-msgctxt "field:calendar.event,calendar_read_users:0"
+msgctxt "field:calendar.event,calendar_read_users:"
msgid "Read Users"
msgstr "Потребители с права за четене"
-msgctxt "field:calendar.event,calendar_write_users:0"
+msgctxt "field:calendar.event,calendar_write_users:"
msgid "Write Users"
msgstr "Записване на потребители"
-msgctxt "field:calendar.event,categories:0"
+msgctxt "field:calendar.event,categories:"
msgid "Categories"
msgstr "Категории"
-msgctxt "field:calendar.event,classification:0"
+msgctxt "field:calendar.event,classification:"
msgid "Classification"
msgstr "Класификация"
-msgctxt "field:calendar.event,description:0"
+msgctxt "field:calendar.event,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.event,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.event,description:"
msgid "Description"
msgstr "Описание"
-msgctxt "field:calendar.event,dtend:0"
+msgctxt "field:calendar.event,dtend:"
msgid "End Date"
msgstr "Крайна дата"
-msgctxt "field:calendar.event,dtstart:0"
+msgctxt "field:calendar.event,dtstart:"
msgid "Start Date"
msgstr "Начална дата"
-msgctxt "field:calendar.event,exdates:0"
+msgctxt "field:calendar.event,exdates:"
msgid "Exception Dates"
msgstr "Дати на грешките"
-msgctxt "field:calendar.event,exrules:0"
+msgctxt "field:calendar.event,exrules:"
msgid "Exception Rules"
msgstr "Правила при грешка"
-msgctxt "field:calendar.event,location:0"
+msgctxt "field:calendar.event,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event,location:"
msgid "Location"
msgstr "Местоположение"
-msgctxt "field:calendar.event,occurences:0"
+msgctxt "field:calendar.event,occurences:"
msgid "Occurences"
msgstr "Събития"
-msgctxt "field:calendar.event,organizer:0"
+msgctxt "field:calendar.event,organizer:"
msgid "Organizer"
msgstr "Организатор"
-msgctxt "field:calendar.event,parent:0"
+msgctxt "field:calendar.event,parent:"
msgid "Parent"
msgstr "Родител"
-msgctxt "field:calendar.event,rdates:0"
+msgctxt "field:calendar.event,rdates:"
msgid "Recurrence Dates"
msgstr "Дати на повторяемост"
-msgctxt "field:calendar.event,rec_name:0"
+msgctxt "field:calendar.event,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.event,recurrence:0"
+msgctxt "field:calendar.event,recurrence:"
msgid "Recurrence"
msgstr "Повторение"
-msgctxt "field:calendar.event,rrules:0"
+msgctxt "field:calendar.event,rrules:"
msgid "Recurrence Rules"
msgstr "Правила за повторяемост"
-msgctxt "field:calendar.event,sequence:0"
+msgctxt "field:calendar.event,sequence:"
msgid "Sequence"
msgstr "Последователност"
-msgctxt "field:calendar.event,status:0"
+msgctxt "field:calendar.event,status:"
msgid "Status"
msgstr "Състояние"
-msgctxt "field:calendar.event,summary:0"
+msgctxt "field:calendar.event,summary:"
msgid "Summary"
msgstr "Обобщено"
-msgctxt "field:calendar.event,timezone:0"
+msgctxt "field:calendar.event,timezone:"
msgid "Timezone"
msgstr "Времева зона"
-msgctxt "field:calendar.event,transp:0"
+msgctxt "field:calendar.event,transp:"
msgid "Time Transparency"
msgstr "Прозрачен във времето"
-msgctxt "field:calendar.event,uuid:0"
+msgctxt "field:calendar.event,uuid:"
msgid "UUID"
msgstr "UUID"
-msgctxt "field:calendar.event,vevent:0"
+msgctxt "field:calendar.event,vevent:"
msgid "vevent"
msgstr ""
-msgctxt "field:calendar.event-calendar.category,category:0"
+msgctxt "field:calendar.event,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.event,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.event-calendar.category,category:"
msgid "Category"
msgstr "Категория"
-msgctxt "field:calendar.event-calendar.category,event:0"
+msgctxt "field:calendar.event-calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.event-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.event-calendar.category,event:"
msgid "Event"
msgstr "Събитие"
-msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgctxt "field:calendar.event-calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event-calendar.category,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgctxt "field:calendar.event-calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.event-calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:"
msgid "Calendar Alarm"
msgstr "Аларма на календар"
-msgctxt "field:calendar.event.alarm,event:0"
+msgctxt "field:calendar.event.alarm,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.event.alarm,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.event.alarm,event:"
msgid "Event"
msgstr "Събитие"
-msgctxt "field:calendar.event.alarm,rec_name:0"
+msgctxt "field:calendar.event.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.alarm,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgctxt "field:calendar.event.alarm,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.event.alarm,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:"
msgid "Calendar Attendee"
msgstr "Присъстващ на календар"
-msgctxt "field:calendar.event.attendee,event:0"
+msgctxt "field:calendar.event.attendee,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.event.attendee,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.event.attendee,event:"
msgid "Event"
msgstr "Събитие"
-msgctxt "field:calendar.event.attendee,rec_name:0"
+msgctxt "field:calendar.event.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.attendee,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgctxt "field:calendar.event.attendee,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.event.attendee,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.event.exdate,calendar_date:"
msgid "Calendar Date"
msgstr "Дата от календар"
-msgctxt "field:calendar.event.exdate,event:0"
+msgctxt "field:calendar.event.exdate,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.event.exdate,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.event.exdate,event:"
msgid "Event"
msgstr "Събитие"
-msgctxt "field:calendar.event.exdate,rec_name:0"
+msgctxt "field:calendar.event.exdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.exdate,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgctxt "field:calendar.event.exdate,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.event.exdate,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr ""
-msgctxt "field:calendar.event.exrule,event:0"
+msgctxt "field:calendar.event.exrule,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.event.exrule,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.event.exrule,event:"
msgid "Event"
msgstr "Събитие"
-msgctxt "field:calendar.event.exrule,rec_name:0"
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.exrule,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgctxt "field:calendar.event.exrule,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.event.exrule,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.event.rdate,calendar_date:"
msgid "Calendar Date"
msgstr "Дата от календар"
-msgctxt "field:calendar.event.rdate,event:0"
+msgctxt "field:calendar.event.rdate,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.event.rdate,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.event.rdate,event:"
msgid "Event"
msgstr "Събитие"
-msgctxt "field:calendar.event.rdate,rec_name:0"
+msgctxt "field:calendar.event.rdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.rdate,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgctxt "field:calendar.event.rdate,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.event.rdate,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr ""
-msgctxt "field:calendar.event.rrule,event:0"
+msgctxt "field:calendar.event.rrule,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.event.rrule,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.event.rrule,event:"
msgid "Event"
msgstr "Събитие"
-msgctxt "field:calendar.event.rrule,rec_name:0"
+msgctxt "field:calendar.event.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.rrule,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.location,name:0"
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.location,name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.location,rec_name:0"
+msgctxt "field:calendar.location,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.rrule,byday:0"
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.location,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.rrule,byday:"
msgid "By Day"
msgstr "По ден"
-msgctxt "field:calendar.rrule,byhour:0"
+msgctxt "field:calendar.rrule,byhour:"
msgid "By Hour"
msgstr "По час"
-msgctxt "field:calendar.rrule,byminute:0"
+msgctxt "field:calendar.rrule,byminute:"
msgid "By Minute"
msgstr "По минута"
-msgctxt "field:calendar.rrule,bymonth:0"
+msgctxt "field:calendar.rrule,bymonth:"
msgid "By Month"
msgstr "По месец"
-msgctxt "field:calendar.rrule,bymonthday:0"
+msgctxt "field:calendar.rrule,bymonthday:"
msgid "By Month Day"
msgstr "По ден от месеца"
-msgctxt "field:calendar.rrule,bysecond:0"
+msgctxt "field:calendar.rrule,bysecond:"
msgid "By Second"
msgstr "По секунда"
-msgctxt "field:calendar.rrule,bysetpos:0"
+msgctxt "field:calendar.rrule,bysetpos:"
msgid "By Position"
msgstr "По позиция"
-msgctxt "field:calendar.rrule,byweekno:0"
+msgctxt "field:calendar.rrule,byweekno:"
msgid "By Week Number"
msgstr "По номер на седмицата"
-msgctxt "field:calendar.rrule,byyearday:0"
+msgctxt "field:calendar.rrule,byyearday:"
msgid "By Year Day"
msgstr "По ден от годината"
-msgctxt "field:calendar.rrule,count:0"
+msgctxt "field:calendar.rrule,count:"
msgid "Count"
msgstr "Брой"
-msgctxt "field:calendar.rrule,freq:0"
+msgctxt "field:calendar.rrule,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.rrule,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.rrule,freq:"
msgid "Frequency"
msgstr "Честота"
-msgctxt "field:calendar.rrule,interval:0"
+msgctxt "field:calendar.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.rrule,interval:"
msgid "Interval"
msgstr "Интервал"
-msgctxt "field:calendar.rrule,rec_name:0"
+msgctxt "field:calendar.rrule,rec_name:"
msgid "Name"
msgstr "Име"
-msgctxt "field:calendar.rrule,until:0"
+msgctxt "field:calendar.rrule,until:"
msgid "Until Date"
msgstr "До дата"
-msgctxt "field:calendar.rrule,until_date:0"
+msgctxt "field:calendar.rrule,until_date:"
msgid "Is Date"
msgstr "Е дата"
-msgctxt "field:calendar.rrule,wkst:0"
+msgctxt "field:calendar.rrule,wkst:"
msgid "Week Day"
msgstr "Ден от седмица"
-msgctxt "field:res.user,calendars:0"
+msgctxt "field:calendar.rrule,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.rrule,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:res.user,calendars:"
msgid "Calendars"
msgstr "Календари"
-msgctxt "help:calendar.calendar,owner:0"
+msgctxt "help:calendar.calendar,owner:"
msgid "The user must have an email"
msgstr "Потребителя трябва да има email"
-msgctxt "help:calendar.date,date:0"
+msgctxt "help:calendar.date,date:"
msgid "Ignore time of field \"Date\", but handle as date only."
msgstr "От полето \"Дата\" се игнорира часа и се използва само датата."
-msgctxt "help:calendar.event,uuid:0"
+msgctxt "help:calendar.event,uuid:"
msgid "Universally Unique Identifier"
msgstr "Универсален иникален идентификатор"
-msgctxt "help:calendar.rrule,until_date:0"
+msgctxt "help:calendar.rrule,until_date:"
msgid "Ignore time of field \"Until Date\", but handle as date only."
msgstr "От полето \"До дата\" се игнорира часа и се използва само датата."
-msgctxt "model:calendar.alarm,name:0"
+msgctxt "model:calendar.alarm,name:"
msgid "Alarm"
msgstr "Аларма"
-msgctxt "model:calendar.attendee,name:0"
+msgctxt "model:calendar.attendee,name:"
msgid "Attendee"
msgstr "Присъстващ"
-msgctxt "model:calendar.calendar,name:0"
+msgctxt "model:calendar.calendar,name:"
msgid "Calendar"
msgstr "Календар"
-msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgctxt "model:calendar.calendar-read-res.user,name:"
msgid "Calendar - read - User"
msgstr ""
-msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgctxt "model:calendar.calendar-write-res.user,name:"
msgid "Calendar - write - User"
msgstr ""
-msgctxt "model:calendar.category,name:0"
+msgctxt "model:calendar.category,name:"
msgid "Category"
msgstr "Категория"
-msgctxt "model:calendar.date,name:0"
+msgctxt "model:calendar.date,name:"
msgid "Calendar Date"
msgstr "Дата от календар"
-msgctxt "model:calendar.event,name:0"
+msgctxt "model:calendar.event,name:"
msgid "Event"
msgstr "Събитие"
-msgctxt "model:calendar.event-calendar.category,name:0"
+msgctxt "model:calendar.event-calendar.category,name:"
msgid "Event - Category"
msgstr "Събитие - категория"
-msgctxt "model:calendar.event.alarm,name:0"
+msgctxt "model:calendar.event.alarm,name:"
msgid "Alarm"
msgstr "Аларма"
-msgctxt "model:calendar.event.attendee,name:0"
+msgctxt "model:calendar.event.attendee,name:"
msgid "Attendee"
msgstr "Присъстващ"
-msgctxt "model:calendar.event.exdate,name:0"
+msgctxt "model:calendar.event.exdate,name:"
msgid "Exception Date"
msgstr "Дата на грешка"
-msgctxt "model:calendar.event.exrule,name:0"
+msgctxt "model:calendar.event.exrule,name:"
msgid "Exception Rule"
msgstr "Правило при грешка"
-msgctxt "model:calendar.event.rdate,name:0"
+msgctxt "model:calendar.event.rdate,name:"
msgid "Recurrence Date"
msgstr "Повтаряща се дата"
-msgctxt "model:calendar.event.rrule,name:0"
+msgctxt "model:calendar.event.rrule,name:"
msgid "Recurrence Rule"
msgstr "Правило за повторение"
-msgctxt "model:calendar.location,name:0"
+msgctxt "model:calendar.location,name:"
msgid "Location"
msgstr "Местоположение"
-msgctxt "model:calendar.rrule,name:0"
+msgctxt "model:calendar.rrule,name:"
msgid "Recurrence Rule"
msgstr "Правило за повторение"
@@ -530,7 +870,6 @@ msgctxt "model:ir.action,name:act_event_form3"
msgid "Events"
msgstr "Събития"
-#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_calendar"
msgid "Calendar"
msgstr "Управление на календари"
@@ -547,214 +886,214 @@ msgctxt "model:res.group,name:group_calendar_admin"
msgid "Calendar Administration"
msgstr "Управление на календар"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid ""
msgstr ""
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Accepted"
msgstr "Приет"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Declined"
msgstr "Отхвърлен"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Delegated"
msgstr "Делегиран"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Needs Action"
msgstr "Необходимо е действие"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Tentative"
msgstr "Пробен"
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
msgid "Confidential"
msgstr "Поверителен"
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
msgid "Private"
msgstr "Частен"
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
msgid "Public"
msgstr "Публичен"
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid ""
msgstr ""
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid "Cancelled"
msgstr "Отказан"
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid "Confirmed"
msgstr "Потвърден"
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid "Tentative"
msgstr "Пробен"
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
msgid "Opaque"
msgstr "Непрозрачен"
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
msgid "Transparent"
msgstr "Прозрачен"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Daily"
msgstr "Ежедневно"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Hourly"
msgstr "Ежечасно"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Minutely"
msgstr "Ежеминутно"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Monthly"
msgstr "Месечно"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Secondly"
msgstr "Всяка секунда"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Weekly"
msgstr "Седмично"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Yearly"
msgstr "Годишно"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Friday"
msgstr "Петък"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Monday"
msgstr "Понеделник"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Saturday"
msgstr "Събота"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Sunday"
msgstr "Неделя"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Thursday"
msgstr "Четвъртък"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Tuesday"
msgstr "Вторник"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Wednesday"
-msgstr "Четвъртък"
+msgstr "Сряда"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "Calendar"
msgstr "Календар"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "Calendars"
msgstr "Календари"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "General"
msgstr "Основен"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "Security"
msgstr "Сигурност"
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
msgid "Categories"
msgstr "Категории"
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
msgid "Category"
msgstr "Категория"
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
msgid "Attendee"
msgstr "Присъстващ"
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
msgid "Attendees"
msgstr "Присъстващи"
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
msgid "Exception Date"
msgstr "Дата на грешка"
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
msgid "Exception Dates"
msgstr "Дати на грешките"
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
msgid "Exception Rule"
msgstr "Правило при грешка"
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
msgid "Exception Rules"
msgstr "Правила при грешка"
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
msgid "Recurrence Date"
msgstr "Повтаряща се дата"
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
msgid "Recurrence Dates"
msgstr "Дати на повторяемост"
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
msgid "Recurrence Rule"
msgstr "Правило за повторение"
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
msgid "Recurrence Rules"
msgstr "Правила за повторяемост"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Attendees"
msgstr "Присъстващи"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Categories"
msgstr "Категории"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Event"
msgstr "Събитие"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Events"
msgstr "Събития"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "General"
msgstr "Основен"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Occurences"
msgstr "Събития"
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
msgid "Location"
msgstr "Местоположение"
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
msgid "Locations"
msgstr "Местонахождения"
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
new file mode 100644
index 0000000..bb1658b
--- /dev/null
+++ b/locale/ca_ES.po
@@ -0,0 +1,1121 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.calendar:"
+msgid "A user can have only one calendar!"
+msgstr "Un usuari només pot tenir un calendari"
+
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique!"
+msgstr "El nom del calendari ha de ser únic"
+
+msgctxt "error:calendar.category:"
+msgid "The name of calendar category must be unique!"
+msgstr "El nom de la categoria del calendari ha de ser únic"
+
+msgctxt "error:calendar.event:"
+msgid "Recurrence can not be recurrent!"
+msgstr "Una recurrència no pot ser recurrent"
+
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "L'UUID i la recurrència han de ser únics en un calendari"
+
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique!"
+msgstr "El nom de la ubicació del calendari ha de ser únic"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Day\""
+msgstr "Invàlid «per dia»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Hour\""
+msgstr "Invàlid «per dia»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Minute\""
+msgstr "Invàlid «per minut»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Month Day\""
+msgstr "Invàlid «per dia del mes»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Month\""
+msgstr "Invàlid «per mes»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Position\""
+msgstr "Invàlid «per posició»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Second\""
+msgstr "Invàlid «per segons»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Week Number\""
+msgstr "Invàlid «per nombre de setmana»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Year Day\""
+msgstr "Invàlid «per dia de l'any»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set!"
+msgstr "Només es pot usar o «Fins a» o «Nombre de vegades»"
+
+msgctxt "field:calendar.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.alarm,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.alarm,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.alarm,valarm:"
+msgid "valarm"
+msgstr "valarm"
+
+msgctxt "field:calendar.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.attendee,attendee:"
+msgid "attendee"
+msgstr "assistents"
+
+msgctxt "field:calendar.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.attendee,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.attendee,email:"
+msgid "Email"
+msgstr "Correu electrònic"
+
+msgctxt "field:calendar.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.attendee,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.attendee,status:"
+msgid "Participation Status"
+msgstr "Estat de participació"
+
+msgctxt "field:calendar.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.calendar,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.calendar,description:"
+msgid "Description"
+msgstr "Descripció"
+
+msgctxt "field:calendar.calendar,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.calendar,owner:"
+msgid "Owner"
+msgstr "Amo"
+
+msgctxt "field:calendar.calendar,read_users:"
+msgid "Read Users"
+msgstr "Usuaris amb lectura"
+
+msgctxt "field:calendar.calendar,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.calendar,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,write_users:"
+msgid "Write Users"
+msgstr "Usuaris amb escriptura"
+
+msgctxt "field:calendar.calendar-read-res.user,calendar:"
+msgid "Calendar"
+msgstr "Calendari"
+
+msgctxt "field:calendar.calendar-read-res.user,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.calendar-read-res.user,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.calendar-read-res.user,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.calendar-read-res.user,user:"
+msgid "User"
+msgstr "Usuari"
+
+msgctxt "field:calendar.calendar-read-res.user,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:"
+msgid "Calendar"
+msgstr "Calendari"
+
+msgctxt "field:calendar.calendar-write-res.user,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.calendar-write-res.user,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.calendar-write-res.user,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.calendar-write-res.user,user:"
+msgid "User"
+msgstr "Usuari"
+
+msgctxt "field:calendar.calendar-write-res.user,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.category,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.category,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.date,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.date,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+#, fuzzy
+msgctxt "field:calendar.date,date:"
+msgid "Is Date"
+msgstr "És data"
+
+#, fuzzy
+msgctxt "field:calendar.date,datetime:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:calendar.date,id:"
+msgid "ID"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.date,rec_name:"
+msgid "Name"
+msgstr "Nom del camp"
+
+msgctxt "field:calendar.date,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.date,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event,alarms:"
+msgid "Alarms"
+msgstr "Alarmes"
+
+msgctxt "field:calendar.event,all_day:"
+msgid "All Day"
+msgstr "Tot el dia"
+
+msgctxt "field:calendar.event,attendees:"
+msgid "Attendees"
+msgstr "Assistents"
+
+msgctxt "field:calendar.event,calendar:"
+msgid "Calendar"
+msgstr "Calendari"
+
+msgctxt "field:calendar.event,calendar_owner:"
+msgid "Owner"
+msgstr "Amo"
+
+msgctxt "field:calendar.event,calendar_read_users:"
+msgid "Read Users"
+msgstr "Usuaris amb lectura"
+
+msgctxt "field:calendar.event,calendar_write_users:"
+msgid "Write Users"
+msgstr "Usuaris amb escriptura"
+
+msgctxt "field:calendar.event,categories:"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "field:calendar.event,classification:"
+msgid "Classification"
+msgstr "Classificació"
+
+msgctxt "field:calendar.event,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.event,description:"
+msgid "Description"
+msgstr "Descripció"
+
+msgctxt "field:calendar.event,dtend:"
+msgid "End Date"
+msgstr "Data final"
+
+msgctxt "field:calendar.event,dtstart:"
+msgid "Start Date"
+msgstr "Data inici"
+
+msgctxt "field:calendar.event,exdates:"
+msgid "Exception Dates"
+msgstr "Dates excloses"
+
+msgctxt "field:calendar.event,exrules:"
+msgid "Exception Rules"
+msgstr "Regles d'excepció"
+
+msgctxt "field:calendar.event,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event,location:"
+msgid "Location"
+msgstr "Ubicació"
+
+msgctxt "field:calendar.event,occurences:"
+msgid "Occurences"
+msgstr "Ocurrències"
+
+msgctxt "field:calendar.event,organizer:"
+msgid "Organizer"
+msgstr "Organitzador"
+
+msgctxt "field:calendar.event,parent:"
+msgid "Parent"
+msgstr "Pare"
+
+msgctxt "field:calendar.event,rdates:"
+msgid "Recurrence Dates"
+msgstr "Dates de recurrència"
+
+msgctxt "field:calendar.event,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event,recurrence:"
+msgid "Recurrence"
+msgstr "Recurrència"
+
+msgctxt "field:calendar.event,rrules:"
+msgid "Recurrence Rules"
+msgstr "Regles de recurrència"
+
+msgctxt "field:calendar.event,sequence:"
+msgid "Sequence"
+msgstr "Seqüència"
+
+msgctxt "field:calendar.event,status:"
+msgid "Status"
+msgstr "Estat"
+
+msgctxt "field:calendar.event,summary:"
+msgid "Summary"
+msgstr "Resum"
+
+msgctxt "field:calendar.event,timezone:"
+msgid "Timezone"
+msgstr "Zona horària"
+
+msgctxt "field:calendar.event,transp:"
+msgid "Time Transparency"
+msgstr "Temps de transparència"
+
+msgctxt "field:calendar.event,uuid:"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.event,vevent:"
+msgid "vevent"
+msgstr "vevent"
+
+msgctxt "field:calendar.event,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,category:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "field:calendar.event-calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.event-calendar.category,event:"
+msgid "Event"
+msgstr "Esdeveniment"
+
+msgctxt "field:calendar.event-calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event-calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:"
+msgid "Calendar Alarm"
+msgstr "Alarma del calendari"
+
+msgctxt "field:calendar.event.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.alarm,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.event.alarm,event:"
+msgid "Event"
+msgstr "Esdeveniment"
+
+msgctxt "field:calendar.event.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:"
+msgid "Calendar Attendee"
+msgstr "Calendari d'assistents"
+
+msgctxt "field:calendar.event.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.attendee,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.event.attendee,event:"
+msgid "Event"
+msgstr "Esdeveniment"
+
+msgctxt "field:calendar.event.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,calendar_date:"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.exdate,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.event.exdate,event:"
+msgid "Event"
+msgstr "Esdeveniment"
+
+msgctxt "field:calendar.event.exdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.exdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:"
+msgid "Calendar RRule"
+msgstr "Regla de recurrència"
+
+msgctxt "field:calendar.event.exrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.exrule,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.event.exrule,event:"
+msgid "Event"
+msgstr "Esdeveniment"
+
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.exrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,calendar_date:"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.rdate,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.event.rdate,event:"
+msgid "Event"
+msgstr "Esdeveniment"
+
+msgctxt "field:calendar.event.rdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.rdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:"
+msgid "Calendar RRule"
+msgstr "Regla de recurrència"
+
+msgctxt "field:calendar.event.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.rrule,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.event.rrule,event:"
+msgid "Event"
+msgstr "Esdeveniment"
+
+msgctxt "field:calendar.event.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.location,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.location,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.location,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byday:"
+msgid "By Day"
+msgstr "Per dia"
+
+msgctxt "field:calendar.rrule,byhour:"
+msgid "By Hour"
+msgstr "Per hora"
+
+msgctxt "field:calendar.rrule,byminute:"
+msgid "By Minute"
+msgstr "Per minut"
+
+msgctxt "field:calendar.rrule,bymonth:"
+msgid "By Month"
+msgstr "Per mes"
+
+msgctxt "field:calendar.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Per dia del mes"
+
+msgctxt "field:calendar.rrule,bysecond:"
+msgid "By Second"
+msgstr "Per segon"
+
+msgctxt "field:calendar.rrule,bysetpos:"
+msgid "By Position"
+msgstr "Per posició"
+
+msgctxt "field:calendar.rrule,byweekno:"
+msgid "By Week Number"
+msgstr "Per dia de la setmana"
+
+msgctxt "field:calendar.rrule,byyearday:"
+msgid "By Year Day"
+msgstr "Per dia de l'any"
+
+msgctxt "field:calendar.rrule,count:"
+msgid "Count"
+msgstr "Nombre de vegades"
+
+msgctxt "field:calendar.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.rrule,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.rrule,freq:"
+msgid "Frequency"
+msgstr "Freqüència"
+
+msgctxt "field:calendar.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.rrule,interval:"
+msgid "Interval"
+msgstr "Interval"
+
+msgctxt "field:calendar.rrule,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.rrule,until:"
+msgid "Until Date"
+msgstr "Fins a la data"
+
+msgctxt "field:calendar.rrule,until_date:"
+msgid "Is Date"
+msgstr "És data"
+
+msgctxt "field:calendar.rrule,wkst:"
+msgid "Week Day"
+msgstr "Dia de la setmana"
+
+msgctxt "field:calendar.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:res.user,calendars:"
+msgid "Calendars"
+msgstr "Calendaris"
+
+msgctxt "help:calendar.calendar,owner:"
+msgid "The user must have an email"
+msgstr "L'usuari ha de tenir un correu electrònic"
+
+msgctxt "help:calendar.date,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.event,uuid:"
+msgid "Universally Unique Identifier"
+msgstr "Identificador universal únic"
+
+msgctxt "help:calendar.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr "Ignora l'hora del camp «Fins a la data» i tracta'l com a data."
+
+msgctxt "model:calendar.alarm,name:"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.attendee,name:"
+msgid "Attendee"
+msgstr "Assistents"
+
+msgctxt "model:calendar.calendar,name:"
+msgid "Calendar"
+msgstr "Calendari"
+
+msgctxt "model:calendar.calendar-read-res.user,name:"
+msgid "Calendar - read - User"
+msgstr "Calendari - llegir - usuari"
+
+msgctxt "model:calendar.calendar-write-res.user,name:"
+msgid "Calendar - write - User"
+msgstr "Calendari - escriure - usuari"
+
+msgctxt "model:calendar.category,name:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "model:calendar.date,name:"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "model:calendar.event,name:"
+msgid "Event"
+msgstr "Esdeveniment"
+
+msgctxt "model:calendar.event-calendar.category,name:"
+msgid "Event - Category"
+msgstr "Esdeveniment - Categoria"
+
+msgctxt "model:calendar.event.alarm,name:"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.event.attendee,name:"
+msgid "Attendee"
+msgstr "Assistents"
+
+msgctxt "model:calendar.event.exdate,name:"
+msgid "Exception Date"
+msgstr "Data exclosa"
+
+msgctxt "model:calendar.event.exrule,name:"
+msgid "Exception Rule"
+msgstr "Regla d'excepció"
+
+msgctxt "model:calendar.event.rdate,name:"
+msgid "Recurrence Date"
+msgstr "Data de recurrència"
+
+msgctxt "model:calendar.event.rrule,name:"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrència"
+
+msgctxt "model:calendar.location,name:"
+msgid "Location"
+msgstr "Ubicació"
+
+msgctxt "model:calendar.rrule,name:"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrència"
+
+msgctxt "model:ir.action,name:act_calendar_form"
+msgid "Calendars"
+msgstr "Calendaris"
+
+msgctxt "model:ir.action,name:act_event_form"
+msgid "Events"
+msgstr "Esdeveniments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_event_form3"
+msgid "Events"
+msgstr "Esdeveniments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_calendar"
+msgid "Calendar"
+msgstr "Gestió de calendari"
+
+msgctxt "model:ir.ui.menu,name:menu_calendar_form"
+msgid "Calendars"
+msgstr "Calendaris"
+
+msgctxt "model:ir.ui.menu,name:menu_event_form"
+msgid "Events"
+msgstr "Esdeveniments"
+
+msgctxt "model:res.group,name:group_calendar_admin"
+msgid "Calendar Administration"
+msgstr "Administració de calendari"
+
+msgctxt "selection:calendar.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Accepted"
+msgstr "Acceptada"
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Declined"
+msgstr "Refusat"
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Delegated"
+msgstr "Delegada"
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Needs Action"
+msgstr "Necessita una acció"
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Tentative"
+msgstr "Temptativa"
+
+msgctxt "selection:calendar.event,classification:"
+msgid "Confidential"
+msgstr "Confidencial"
+
+msgctxt "selection:calendar.event,classification:"
+msgid "Private"
+msgstr "Privat"
+
+msgctxt "selection:calendar.event,classification:"
+msgid "Public"
+msgstr "Públic"
+
+msgctxt "selection:calendar.event,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event,status:"
+msgid "Cancelled"
+msgstr "Cancel·lat"
+
+msgctxt "selection:calendar.event,status:"
+msgid "Confirmed"
+msgstr "Confirmada"
+
+msgctxt "selection:calendar.event,status:"
+msgid "Tentative"
+msgstr "Temptatiu"
+
+msgctxt "selection:calendar.event,transp:"
+msgid "Opaque"
+msgstr "Opac"
+
+msgctxt "selection:calendar.event,transp:"
+msgid "Transparent"
+msgstr "Transparent"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Daily"
+msgstr "Diàriament"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Minutely"
+msgstr "Cada minut"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Monthly"
+msgstr "Mensualment"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Secondly"
+msgstr "Cada segon"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Weekly"
+msgstr "Setmanalment"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Yearly"
+msgstr "Anualment"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Friday"
+msgstr "Divendres"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Monday"
+msgstr "Dilluns"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Saturday"
+msgstr "Dissabte"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Sunday"
+msgstr "Diumenge"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Thursday"
+msgstr "Dijous"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Dimarts"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Dimecres"
+
+msgctxt "view:calendar.calendar:"
+msgid "Calendar"
+msgstr "Calendari"
+
+msgctxt "view:calendar.calendar:"
+msgid "Calendars"
+msgstr "Calendaris"
+
+msgctxt "view:calendar.calendar:"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:calendar.calendar:"
+msgid "Security"
+msgstr "Seguretat"
+
+msgctxt "view:calendar.category:"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "view:calendar.category:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "view:calendar.event.attendee:"
+msgid "Attendee"
+msgstr "Assistents"
+
+msgctxt "view:calendar.event.attendee:"
+msgid "Attendees"
+msgstr "Assistents"
+
+msgctxt "view:calendar.event.exdate:"
+msgid "Exception Date"
+msgstr "Data exclosa"
+
+msgctxt "view:calendar.event.exdate:"
+msgid "Exception Dates"
+msgstr "Dates excloses"
+
+msgctxt "view:calendar.event.exrule:"
+msgid "Exception Rule"
+msgstr "Regla d'excepció"
+
+msgctxt "view:calendar.event.exrule:"
+msgid "Exception Rules"
+msgstr "Regles d'excepcions"
+
+msgctxt "view:calendar.event.rdate:"
+msgid "Recurrence Date"
+msgstr "Data de recurrència"
+
+msgctxt "view:calendar.event.rdate:"
+msgid "Recurrence Dates"
+msgstr "Dates de recurrència"
+
+msgctxt "view:calendar.event.rrule:"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrència"
+
+msgctxt "view:calendar.event.rrule:"
+msgid "Recurrence Rules"
+msgstr "Regles de recurrència"
+
+msgctxt "view:calendar.event:"
+msgid "Attendees"
+msgstr "Assistents"
+
+msgctxt "view:calendar.event:"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "view:calendar.event:"
+msgid "Event"
+msgstr "Esdeveniment"
+
+msgctxt "view:calendar.event:"
+msgid "Events"
+msgstr "Esdeveniments"
+
+msgctxt "view:calendar.event:"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:calendar.event:"
+msgid "Occurences"
+msgstr "Ocurrències"
+
+msgctxt "view:calendar.location:"
+msgid "Location"
+msgstr "Ubicació"
+
+msgctxt "view:calendar.location:"
+msgid "Locations"
+msgstr "Ubicacions"
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
index 72d4400..4d23715 100644
--- a/locale/cs_CZ.po
+++ b/locale/cs_CZ.po
@@ -2,519 +2,859 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
msgid "A user can have only one calendar!"
msgstr ""
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
msgid "The name of calendar must be unique!"
msgstr ""
-msgctxt "error:calendar.category:0"
+msgctxt "error:calendar.category:"
msgid "The name of calendar category must be unique!"
msgstr ""
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
msgid "Recurrence can not be recurrent!"
msgstr ""
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
msgid "UUID and recurrence must be unique in a calendar!"
msgstr ""
-msgctxt "error:calendar.location:0"
+msgctxt "error:calendar.location:"
msgid "The name of calendar location must be unique!"
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Day\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Hour\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Minute\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Month Day\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Month\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Position\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Second\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Week Number\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Year Day\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Only one of \"until\" and \"count\" can be set!"
msgstr ""
-msgctxt "field:calendar.alarm,rec_name:0"
+msgctxt "field:calendar.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.alarm,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.alarm,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.alarm,valarm:0"
+msgctxt "field:calendar.alarm,valarm:"
msgid "valarm"
msgstr ""
-msgctxt "field:calendar.attendee,attendee:0"
+msgctxt "field:calendar.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.attendee,attendee:"
msgid "attendee"
msgstr ""
-msgctxt "field:calendar.attendee,email:0"
+msgctxt "field:calendar.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.attendee,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.attendee,email:"
msgid "Email"
msgstr ""
-msgctxt "field:calendar.attendee,rec_name:0"
+msgctxt "field:calendar.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.attendee,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.attendee,status:0"
+msgctxt "field:calendar.attendee,status:"
msgid "Participation Status"
msgstr ""
-msgctxt "field:calendar.calendar,description:0"
+msgctxt "field:calendar.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,description:"
msgid "Description"
msgstr ""
-msgctxt "field:calendar.calendar,name:0"
+msgctxt "field:calendar.calendar,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar,name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.calendar,owner:0"
+msgctxt "field:calendar.calendar,owner:"
msgid "Owner"
msgstr ""
-msgctxt "field:calendar.calendar,read_users:0"
+msgctxt "field:calendar.calendar,read_users:"
msgid "Read Users"
msgstr ""
-msgctxt "field:calendar.calendar,rec_name:0"
+msgctxt "field:calendar.calendar,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.calendar,write_users:0"
+msgctxt "field:calendar.calendar,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,write_users:"
msgid "Write Users"
msgstr ""
-msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,calendar:"
msgid "Calendar"
msgstr ""
-msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-read-res.user,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgctxt "field:calendar.calendar-read-res.user,user:"
msgid "User"
msgstr ""
-msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:"
msgid "Calendar"
msgstr ""
-msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-write-res.user,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgctxt "field:calendar.calendar-write-res.user,user:"
msgid "User"
msgstr ""
-msgctxt "field:calendar.category,name:0"
+msgctxt "field:calendar.calendar-write-res.user,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.category,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.category,name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.category,rec_name:0"
+msgctxt "field:calendar.category,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.date,date:0"
+msgctxt "field:calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.date,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.date,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.date,date:"
msgid "Is Date"
msgstr ""
-msgctxt "field:calendar.date,datetime:0"
+msgctxt "field:calendar.date,datetime:"
msgid "Date"
msgstr ""
-msgctxt "field:calendar.date,rec_name:0"
+msgctxt "field:calendar.date,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.date,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.event,alarms:0"
+msgctxt "field:calendar.date,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.date,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event,alarms:"
msgid "Alarms"
msgstr ""
-msgctxt "field:calendar.event,all_day:0"
+msgctxt "field:calendar.event,all_day:"
msgid "All Day"
msgstr ""
-msgctxt "field:calendar.event,attendees:0"
+msgctxt "field:calendar.event,attendees:"
msgid "Attendees"
msgstr ""
-msgctxt "field:calendar.event,calendar:0"
+msgctxt "field:calendar.event,calendar:"
msgid "Calendar"
msgstr ""
-msgctxt "field:calendar.event,calendar_owner:0"
+msgctxt "field:calendar.event,calendar_owner:"
msgid "Owner"
msgstr ""
-msgctxt "field:calendar.event,calendar_read_users:0"
+msgctxt "field:calendar.event,calendar_read_users:"
msgid "Read Users"
msgstr ""
-msgctxt "field:calendar.event,calendar_write_users:0"
+msgctxt "field:calendar.event,calendar_write_users:"
msgid "Write Users"
msgstr ""
-msgctxt "field:calendar.event,categories:0"
+msgctxt "field:calendar.event,categories:"
msgid "Categories"
msgstr ""
-msgctxt "field:calendar.event,classification:0"
+msgctxt "field:calendar.event,classification:"
msgid "Classification"
msgstr ""
-msgctxt "field:calendar.event,description:0"
+msgctxt "field:calendar.event,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event,description:"
msgid "Description"
msgstr ""
-msgctxt "field:calendar.event,dtend:0"
+msgctxt "field:calendar.event,dtend:"
msgid "End Date"
msgstr ""
-msgctxt "field:calendar.event,dtstart:0"
+msgctxt "field:calendar.event,dtstart:"
msgid "Start Date"
msgstr ""
-msgctxt "field:calendar.event,exdates:0"
+msgctxt "field:calendar.event,exdates:"
msgid "Exception Dates"
msgstr ""
-msgctxt "field:calendar.event,exrules:0"
+msgctxt "field:calendar.event,exrules:"
msgid "Exception Rules"
msgstr ""
-msgctxt "field:calendar.event,location:0"
+msgctxt "field:calendar.event,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event,location:"
msgid "Location"
msgstr ""
-msgctxt "field:calendar.event,occurences:0"
+msgctxt "field:calendar.event,occurences:"
msgid "Occurences"
msgstr ""
-msgctxt "field:calendar.event,organizer:0"
+msgctxt "field:calendar.event,organizer:"
msgid "Organizer"
msgstr ""
-msgctxt "field:calendar.event,parent:0"
+msgctxt "field:calendar.event,parent:"
msgid "Parent"
msgstr ""
-msgctxt "field:calendar.event,rdates:0"
+msgctxt "field:calendar.event,rdates:"
msgid "Recurrence Dates"
msgstr ""
-msgctxt "field:calendar.event,rec_name:0"
+msgctxt "field:calendar.event,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.event,recurrence:0"
+msgctxt "field:calendar.event,recurrence:"
msgid "Recurrence"
msgstr ""
-msgctxt "field:calendar.event,rrules:0"
+msgctxt "field:calendar.event,rrules:"
msgid "Recurrence Rules"
msgstr ""
-msgctxt "field:calendar.event,sequence:0"
+msgctxt "field:calendar.event,sequence:"
msgid "Sequence"
msgstr ""
-msgctxt "field:calendar.event,status:0"
+msgctxt "field:calendar.event,status:"
msgid "Status"
msgstr ""
-msgctxt "field:calendar.event,summary:0"
+msgctxt "field:calendar.event,summary:"
msgid "Summary"
msgstr ""
-msgctxt "field:calendar.event,timezone:0"
+msgctxt "field:calendar.event,timezone:"
msgid "Timezone"
msgstr ""
-msgctxt "field:calendar.event,transp:0"
+msgctxt "field:calendar.event,transp:"
msgid "Time Transparency"
msgstr ""
-msgctxt "field:calendar.event,uuid:0"
+msgctxt "field:calendar.event,uuid:"
msgid "UUID"
msgstr ""
-msgctxt "field:calendar.event,vevent:0"
+msgctxt "field:calendar.event,vevent:"
msgid "vevent"
msgstr ""
-msgctxt "field:calendar.event-calendar.category,category:0"
+msgctxt "field:calendar.event,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,category:"
msgid "Category"
msgstr ""
-msgctxt "field:calendar.event-calendar.category,event:0"
+msgctxt "field:calendar.event-calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,event:"
msgid "Event"
msgstr ""
-msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgctxt "field:calendar.event-calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgctxt "field:calendar.event-calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:"
msgid "Calendar Alarm"
msgstr ""
-msgctxt "field:calendar.event.alarm,event:0"
+msgctxt "field:calendar.event.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,event:"
msgid "Event"
msgstr ""
-msgctxt "field:calendar.event.alarm,rec_name:0"
+msgctxt "field:calendar.event.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgctxt "field:calendar.event.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:"
msgid "Calendar Attendee"
msgstr ""
-msgctxt "field:calendar.event.attendee,event:0"
+msgctxt "field:calendar.event.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,event:"
msgid "Event"
msgstr ""
-msgctxt "field:calendar.event.attendee,rec_name:0"
+msgctxt "field:calendar.event.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgctxt "field:calendar.event.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,calendar_date:"
msgid "Calendar Date"
msgstr ""
-msgctxt "field:calendar.event.exdate,event:0"
+msgctxt "field:calendar.event.exdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,event:"
msgid "Event"
msgstr ""
-msgctxt "field:calendar.event.exdate,rec_name:0"
+msgctxt "field:calendar.event.exdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgctxt "field:calendar.event.exdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr ""
-msgctxt "field:calendar.event.exrule,event:0"
+msgctxt "field:calendar.event.exrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,event:"
msgid "Event"
msgstr ""
-msgctxt "field:calendar.event.exrule,rec_name:0"
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgctxt "field:calendar.event.exrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,calendar_date:"
msgid "Calendar Date"
msgstr ""
-msgctxt "field:calendar.event.rdate,event:0"
+msgctxt "field:calendar.event.rdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,event:"
msgid "Event"
msgstr ""
-msgctxt "field:calendar.event.rdate,rec_name:0"
+msgctxt "field:calendar.event.rdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgctxt "field:calendar.event.rdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr ""
-msgctxt "field:calendar.event.rrule,event:0"
+msgctxt "field:calendar.event.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,event:"
msgid "Event"
msgstr ""
-msgctxt "field:calendar.event.rrule,rec_name:0"
+msgctxt "field:calendar.event.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.location,name:0"
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.location,name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.location,rec_name:0"
+msgctxt "field:calendar.location,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.rrule,byday:0"
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.location,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byday:"
msgid "By Day"
msgstr ""
-msgctxt "field:calendar.rrule,byhour:0"
+msgctxt "field:calendar.rrule,byhour:"
msgid "By Hour"
msgstr ""
-msgctxt "field:calendar.rrule,byminute:0"
+msgctxt "field:calendar.rrule,byminute:"
msgid "By Minute"
msgstr ""
-msgctxt "field:calendar.rrule,bymonth:0"
+msgctxt "field:calendar.rrule,bymonth:"
msgid "By Month"
msgstr ""
-msgctxt "field:calendar.rrule,bymonthday:0"
+msgctxt "field:calendar.rrule,bymonthday:"
msgid "By Month Day"
msgstr ""
-msgctxt "field:calendar.rrule,bysecond:0"
+msgctxt "field:calendar.rrule,bysecond:"
msgid "By Second"
msgstr ""
-msgctxt "field:calendar.rrule,bysetpos:0"
+msgctxt "field:calendar.rrule,bysetpos:"
msgid "By Position"
msgstr ""
-msgctxt "field:calendar.rrule,byweekno:0"
+msgctxt "field:calendar.rrule,byweekno:"
msgid "By Week Number"
msgstr ""
-msgctxt "field:calendar.rrule,byyearday:0"
+msgctxt "field:calendar.rrule,byyearday:"
msgid "By Year Day"
msgstr ""
-msgctxt "field:calendar.rrule,count:0"
+msgctxt "field:calendar.rrule,count:"
msgid "Count"
msgstr ""
-msgctxt "field:calendar.rrule,freq:0"
+msgctxt "field:calendar.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.rrule,freq:"
msgid "Frequency"
msgstr ""
-msgctxt "field:calendar.rrule,interval:0"
+msgctxt "field:calendar.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.rrule,interval:"
msgid "Interval"
msgstr ""
-msgctxt "field:calendar.rrule,rec_name:0"
+msgctxt "field:calendar.rrule,rec_name:"
msgid "Name"
msgstr ""
-msgctxt "field:calendar.rrule,until:0"
+msgctxt "field:calendar.rrule,until:"
msgid "Until Date"
msgstr ""
-msgctxt "field:calendar.rrule,until_date:0"
+msgctxt "field:calendar.rrule,until_date:"
msgid "Is Date"
msgstr ""
-msgctxt "field:calendar.rrule,wkst:0"
+msgctxt "field:calendar.rrule,wkst:"
msgid "Week Day"
msgstr ""
-msgctxt "field:res.user,calendars:0"
+msgctxt "field:calendar.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:res.user,calendars:"
msgid "Calendars"
msgstr ""
-msgctxt "help:calendar.calendar,owner:0"
+msgctxt "help:calendar.calendar,owner:"
msgid "The user must have an email"
msgstr ""
-msgctxt "help:calendar.date,date:0"
+msgctxt "help:calendar.date,date:"
msgid "Ignore time of field \"Date\", but handle as date only."
msgstr ""
-msgctxt "help:calendar.event,uuid:0"
+msgctxt "help:calendar.event,uuid:"
msgid "Universally Unique Identifier"
msgstr ""
-msgctxt "help:calendar.rrule,until_date:0"
+msgctxt "help:calendar.rrule,until_date:"
msgid "Ignore time of field \"Until Date\", but handle as date only."
msgstr ""
-msgctxt "model:calendar.alarm,name:0"
+msgctxt "model:calendar.alarm,name:"
msgid "Alarm"
msgstr ""
-msgctxt "model:calendar.attendee,name:0"
+msgctxt "model:calendar.attendee,name:"
msgid "Attendee"
msgstr ""
-msgctxt "model:calendar.calendar,name:0"
+msgctxt "model:calendar.calendar,name:"
msgid "Calendar"
msgstr ""
-msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgctxt "model:calendar.calendar-read-res.user,name:"
msgid "Calendar - read - User"
msgstr ""
-msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgctxt "model:calendar.calendar-write-res.user,name:"
msgid "Calendar - write - User"
msgstr ""
-msgctxt "model:calendar.category,name:0"
+msgctxt "model:calendar.category,name:"
msgid "Category"
msgstr ""
-msgctxt "model:calendar.date,name:0"
+msgctxt "model:calendar.date,name:"
msgid "Calendar Date"
msgstr ""
-msgctxt "model:calendar.event,name:0"
+msgctxt "model:calendar.event,name:"
msgid "Event"
msgstr ""
-msgctxt "model:calendar.event-calendar.category,name:0"
+msgctxt "model:calendar.event-calendar.category,name:"
msgid "Event - Category"
msgstr ""
-msgctxt "model:calendar.event.alarm,name:0"
+msgctxt "model:calendar.event.alarm,name:"
msgid "Alarm"
msgstr ""
-msgctxt "model:calendar.event.attendee,name:0"
+msgctxt "model:calendar.event.attendee,name:"
msgid "Attendee"
msgstr ""
-msgctxt "model:calendar.event.exdate,name:0"
+msgctxt "model:calendar.event.exdate,name:"
msgid "Exception Date"
msgstr ""
-msgctxt "model:calendar.event.exrule,name:0"
+msgctxt "model:calendar.event.exrule,name:"
msgid "Exception Rule"
msgstr ""
-msgctxt "model:calendar.event.rdate,name:0"
+msgctxt "model:calendar.event.rdate,name:"
msgid "Recurrence Date"
msgstr ""
-msgctxt "model:calendar.event.rrule,name:0"
+msgctxt "model:calendar.event.rrule,name:"
msgid "Recurrence Rule"
msgstr ""
-msgctxt "model:calendar.location,name:0"
+msgctxt "model:calendar.location,name:"
msgid "Location"
msgstr ""
-msgctxt "model:calendar.rrule,name:0"
+msgctxt "model:calendar.rrule,name:"
msgid "Recurrence Rule"
msgstr ""
@@ -546,214 +886,214 @@ msgctxt "model:res.group,name:group_calendar_admin"
msgid "Calendar Administration"
msgstr ""
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid ""
msgstr ""
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Accepted"
msgstr ""
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Declined"
msgstr ""
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Delegated"
msgstr ""
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Needs Action"
msgstr ""
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Tentative"
msgstr ""
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
msgid "Confidential"
msgstr ""
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
msgid "Private"
msgstr ""
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
msgid "Public"
msgstr ""
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid ""
msgstr ""
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid "Cancelled"
msgstr ""
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid "Confirmed"
msgstr ""
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid "Tentative"
msgstr ""
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
msgid "Opaque"
msgstr ""
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
msgid "Transparent"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Daily"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Hourly"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Minutely"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Monthly"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Secondly"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Weekly"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Yearly"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Friday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Monday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Saturday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Sunday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Thursday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Tuesday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Wednesday"
msgstr ""
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "Calendar"
msgstr ""
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "Calendars"
msgstr ""
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "General"
msgstr ""
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "Security"
msgstr ""
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
msgid "Categories"
msgstr ""
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
msgid "Category"
msgstr ""
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
msgid "Attendee"
msgstr ""
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
msgid "Attendees"
msgstr ""
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
msgid "Exception Date"
msgstr ""
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
msgid "Exception Dates"
msgstr ""
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
msgid "Exception Rule"
msgstr ""
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
msgid "Exception Rules"
msgstr ""
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
msgid "Recurrence Date"
msgstr ""
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
msgid "Recurrence Dates"
msgstr ""
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
msgid "Recurrence Rule"
msgstr ""
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
msgid "Recurrence Rules"
msgstr ""
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Attendees"
msgstr ""
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Categories"
msgstr ""
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Event"
msgstr ""
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Events"
msgstr ""
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "General"
msgstr ""
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Occurences"
msgstr ""
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
msgid "Location"
msgstr ""
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
msgid "Locations"
msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
index f4c7715..fd10881 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -2,521 +2,861 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
msgid "A user can have only one calendar!"
msgstr "Es ist nur ein Kalender pro Benutzer möglich!"
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
msgid "The name of calendar must be unique!"
msgstr "Kalendername kann nicht mehrfach vergeben werden!"
-msgctxt "error:calendar.category:0"
+msgctxt "error:calendar.category:"
msgid "The name of calendar category must be unique!"
msgstr "Name für Kalenderkategorie kann nicht mehrfach vergeben werden!"
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
msgid "Recurrence can not be recurrent!"
msgstr "Wiederholungen können nicht rekursiv sein!"
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
msgid "UUID and recurrence must be unique in a calendar!"
msgstr ""
"UUID und Wiederholung können in einem Kalender nicht mehrfach vergeben "
"werden!"
-msgctxt "error:calendar.location:0"
+msgctxt "error:calendar.location:"
msgid "The name of calendar location must be unique!"
msgstr "Name für Kalenderort kann nicht mehrfach vergeben werden!"
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Day\""
msgstr "Ungültig \"Für Tag\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Hour\""
msgstr "Ungültig \"Für Stunde\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Minute\""
msgstr "Ungültig \"Für Minute\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Month Day\""
msgstr "Ungültig \"Für Tag des Monats\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Month\""
msgstr "Ungültig \"Für Monat\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Position\""
msgstr "Ungültig \"Für Position\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Second\""
msgstr "Ungültig \"Für Sekunde\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Week Number\""
msgstr "Ungültig \"Für Woche Nummer\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Year Day\""
msgstr "Ungültig \"Für Tag des Jahres\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Only one of \"until\" and \"count\" can be set!"
msgstr "Es kann nur entweder \"Bis\" oder \"Anzahl\" gesetzt werden!"
-msgctxt "field:calendar.alarm,rec_name:0"
+msgctxt "field:calendar.alarm,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.alarm,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.alarm,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.alarm,valarm:0"
+msgctxt "field:calendar.alarm,valarm:"
msgid "valarm"
msgstr "valarm"
-msgctxt "field:calendar.attendee,attendee:0"
+msgctxt "field:calendar.alarm,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.alarm,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.attendee,attendee:"
msgid "attendee"
msgstr "Teilnehmer"
-msgctxt "field:calendar.attendee,email:0"
+msgctxt "field:calendar.attendee,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.attendee,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.attendee,email:"
msgid "Email"
msgstr "E-Mail"
-msgctxt "field:calendar.attendee,rec_name:0"
+msgctxt "field:calendar.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.attendee,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.attendee,status:0"
+msgctxt "field:calendar.attendee,status:"
msgid "Participation Status"
msgstr "Teilnahmestatus"
-msgctxt "field:calendar.calendar,description:0"
+msgctxt "field:calendar.attendee,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.attendee,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.calendar,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.calendar,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.calendar,description:"
msgid "Description"
msgstr "Bezeichnung"
-msgctxt "field:calendar.calendar,name:0"
+msgctxt "field:calendar.calendar,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar,name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.calendar,owner:0"
+msgctxt "field:calendar.calendar,owner:"
msgid "Owner"
msgstr "Besitzer"
-msgctxt "field:calendar.calendar,read_users:0"
+msgctxt "field:calendar.calendar,read_users:"
msgid "Read Users"
msgstr "Benutzer mit Leseberechtigung"
-msgctxt "field:calendar.calendar,rec_name:0"
+msgctxt "field:calendar.calendar,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.calendar,write_users:0"
+msgctxt "field:calendar.calendar,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.calendar,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.calendar,write_users:"
msgid "Write Users"
msgstr "Benutzer mit Schreibberechtigung"
-msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,calendar:"
msgid "Calendar"
msgstr "Kalender"
-msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-read-res.user,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.calendar-read-res.user,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.calendar-read-res.user,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgctxt "field:calendar.calendar-read-res.user,user:"
msgid "User"
msgstr "Benutzer"
-msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.calendar-read-res.user,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:"
msgid "Calendar"
msgstr "Kalender"
-msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-write-res.user,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.calendar-write-res.user,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.calendar-write-res.user,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgctxt "field:calendar.calendar-write-res.user,user:"
msgid "User"
msgstr "Benutzer"
-msgctxt "field:calendar.category,name:0"
+msgctxt "field:calendar.calendar-write-res.user,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.calendar-write-res.user,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.category,name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.category,rec_name:0"
+msgctxt "field:calendar.category,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.date,date:0"
+msgctxt "field:calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.date,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.date,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.date,date:"
msgid "Is Date"
msgstr "Als Datum"
-msgctxt "field:calendar.date,datetime:0"
+msgctxt "field:calendar.date,datetime:"
msgid "Date"
msgstr "Zeitpunkt"
-msgctxt "field:calendar.date,rec_name:0"
+msgctxt "field:calendar.date,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.date,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.event,alarms:0"
+msgctxt "field:calendar.date,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.date,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.event,alarms:"
msgid "Alarms"
msgstr "Alarm"
-msgctxt "field:calendar.event,all_day:0"
+msgctxt "field:calendar.event,all_day:"
msgid "All Day"
msgstr "Ganztägig"
-msgctxt "field:calendar.event,attendees:0"
+msgctxt "field:calendar.event,attendees:"
msgid "Attendees"
msgstr "Teilnehmer"
-msgctxt "field:calendar.event,calendar:0"
+msgctxt "field:calendar.event,calendar:"
msgid "Calendar"
msgstr "Kalender"
-msgctxt "field:calendar.event,calendar_owner:0"
+msgctxt "field:calendar.event,calendar_owner:"
msgid "Owner"
msgstr "Besitzer"
-msgctxt "field:calendar.event,calendar_read_users:0"
+msgctxt "field:calendar.event,calendar_read_users:"
msgid "Read Users"
msgstr "Benutzer mit Leseberechtigung"
-msgctxt "field:calendar.event,calendar_write_users:0"
+msgctxt "field:calendar.event,calendar_write_users:"
msgid "Write Users"
msgstr "Benutzer mit Schreibberechtigung"
-msgctxt "field:calendar.event,categories:0"
+msgctxt "field:calendar.event,categories:"
msgid "Categories"
msgstr "Kategorien"
-msgctxt "field:calendar.event,classification:0"
+msgctxt "field:calendar.event,classification:"
msgid "Classification"
msgstr "Klassifizierung"
-msgctxt "field:calendar.event,description:0"
+msgctxt "field:calendar.event,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.event,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.event,description:"
msgid "Description"
msgstr "Bezeichnung"
-msgctxt "field:calendar.event,dtend:0"
+msgctxt "field:calendar.event,dtend:"
msgid "End Date"
msgstr "Enddatum"
-msgctxt "field:calendar.event,dtstart:0"
+msgctxt "field:calendar.event,dtstart:"
msgid "Start Date"
msgstr "Anfangsdatum"
-msgctxt "field:calendar.event,exdates:0"
+msgctxt "field:calendar.event,exdates:"
msgid "Exception Dates"
msgstr "Ausnahmedaten"
-msgctxt "field:calendar.event,exrules:0"
+msgctxt "field:calendar.event,exrules:"
msgid "Exception Rules"
msgstr "Ausnahmeregeln"
-msgctxt "field:calendar.event,location:0"
+msgctxt "field:calendar.event,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event,location:"
msgid "Location"
msgstr "Ort"
-msgctxt "field:calendar.event,occurences:0"
+msgctxt "field:calendar.event,occurences:"
msgid "Occurences"
msgstr "Ereignisse"
-msgctxt "field:calendar.event,organizer:0"
+msgctxt "field:calendar.event,organizer:"
msgid "Organizer"
msgstr "Organisator"
-msgctxt "field:calendar.event,parent:0"
+msgctxt "field:calendar.event,parent:"
msgid "Parent"
msgstr "Übergeordnet (Termin)"
-msgctxt "field:calendar.event,rdates:0"
+msgctxt "field:calendar.event,rdates:"
msgid "Recurrence Dates"
msgstr "Wiederholungsdaten"
-msgctxt "field:calendar.event,rec_name:0"
+msgctxt "field:calendar.event,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.event,recurrence:0"
+msgctxt "field:calendar.event,recurrence:"
msgid "Recurrence"
msgstr "Wiederholung"
-msgctxt "field:calendar.event,rrules:0"
+msgctxt "field:calendar.event,rrules:"
msgid "Recurrence Rules"
msgstr "Wiederholungsregeln"
-msgctxt "field:calendar.event,sequence:0"
+msgctxt "field:calendar.event,sequence:"
msgid "Sequence"
msgstr "Revision"
-msgctxt "field:calendar.event,status:0"
+msgctxt "field:calendar.event,status:"
msgid "Status"
msgstr "Status"
-msgctxt "field:calendar.event,summary:0"
+msgctxt "field:calendar.event,summary:"
msgid "Summary"
msgstr "Zusammenfassung"
-msgctxt "field:calendar.event,timezone:0"
+msgctxt "field:calendar.event,timezone:"
msgid "Timezone"
msgstr "Zeitzone"
-msgctxt "field:calendar.event,transp:0"
+msgctxt "field:calendar.event,transp:"
msgid "Time Transparency"
msgstr "Zeittransparenz"
-msgctxt "field:calendar.event,uuid:0"
+msgctxt "field:calendar.event,uuid:"
msgid "UUID"
msgstr "UUID"
-msgctxt "field:calendar.event,vevent:0"
+msgctxt "field:calendar.event,vevent:"
msgid "vevent"
msgstr "vevent"
-msgctxt "field:calendar.event-calendar.category,category:0"
+msgctxt "field:calendar.event,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.event,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.event-calendar.category,category:"
msgid "Category"
msgstr "Kategorie"
-msgctxt "field:calendar.event-calendar.category,event:0"
+msgctxt "field:calendar.event-calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.event-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.event-calendar.category,event:"
msgid "Event"
msgstr "Termin"
-msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgctxt "field:calendar.event-calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event-calendar.category,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgctxt "field:calendar.event-calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.event-calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:"
msgid "Calendar Alarm"
msgstr "Kalender Alarm"
-msgctxt "field:calendar.event.alarm,event:0"
+msgctxt "field:calendar.event.alarm,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.event.alarm,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.event.alarm,event:"
msgid "Event"
msgstr "Termin"
-msgctxt "field:calendar.event.alarm,rec_name:0"
+msgctxt "field:calendar.event.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.alarm,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgctxt "field:calendar.event.alarm,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.event.alarm,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:"
msgid "Calendar Attendee"
msgstr "Kalender Teilnehmer"
-msgctxt "field:calendar.event.attendee,event:0"
+msgctxt "field:calendar.event.attendee,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.event.attendee,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.event.attendee,event:"
msgid "Event"
msgstr "Termin"
-msgctxt "field:calendar.event.attendee,rec_name:0"
+msgctxt "field:calendar.event.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.attendee,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgctxt "field:calendar.event.attendee,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.event.attendee,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.event.exdate,calendar_date:"
msgid "Calendar Date"
msgstr "Kalender Datum"
-msgctxt "field:calendar.event.exdate,event:0"
+msgctxt "field:calendar.event.exdate,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.event.exdate,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.event.exdate,event:"
msgid "Event"
msgstr "Termin"
-msgctxt "field:calendar.event.exdate,rec_name:0"
+msgctxt "field:calendar.event.exdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.exdate,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgctxt "field:calendar.event.exdate,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.event.exdate,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr "Kalender WRegel"
-msgctxt "field:calendar.event.exrule,event:0"
+msgctxt "field:calendar.event.exrule,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.event.exrule,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.event.exrule,event:"
msgid "Event"
msgstr "Termin"
-msgctxt "field:calendar.event.exrule,rec_name:0"
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.exrule,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgctxt "field:calendar.event.exrule,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.event.exrule,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.event.rdate,calendar_date:"
msgid "Calendar Date"
msgstr "Kalender Datum"
-msgctxt "field:calendar.event.rdate,event:0"
+msgctxt "field:calendar.event.rdate,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.event.rdate,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.event.rdate,event:"
msgid "Event"
msgstr "Termin"
-msgctxt "field:calendar.event.rdate,rec_name:0"
+msgctxt "field:calendar.event.rdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.rdate,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgctxt "field:calendar.event.rdate,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.event.rdate,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr "Kalender WRegel"
-msgctxt "field:calendar.event.rrule,event:0"
+msgctxt "field:calendar.event.rrule,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.event.rrule,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.event.rrule,event:"
msgid "Event"
msgstr "Termin"
-msgctxt "field:calendar.event.rrule,rec_name:0"
+msgctxt "field:calendar.event.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.rrule,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.location,name:0"
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.location,name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.location,rec_name:0"
+msgctxt "field:calendar.location,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.rrule,byday:0"
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.location,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.rrule,byday:"
msgid "By Day"
msgstr "Für Tag"
-msgctxt "field:calendar.rrule,byhour:0"
+msgctxt "field:calendar.rrule,byhour:"
msgid "By Hour"
msgstr "Für Stunde"
-msgctxt "field:calendar.rrule,byminute:0"
+msgctxt "field:calendar.rrule,byminute:"
msgid "By Minute"
msgstr "Für Minute"
-msgctxt "field:calendar.rrule,bymonth:0"
+msgctxt "field:calendar.rrule,bymonth:"
msgid "By Month"
msgstr "Für Monat"
-msgctxt "field:calendar.rrule,bymonthday:0"
+msgctxt "field:calendar.rrule,bymonthday:"
msgid "By Month Day"
msgstr "Für Tag des Monats"
-msgctxt "field:calendar.rrule,bysecond:0"
+msgctxt "field:calendar.rrule,bysecond:"
msgid "By Second"
msgstr "Für Sekunde"
-msgctxt "field:calendar.rrule,bysetpos:0"
+msgctxt "field:calendar.rrule,bysetpos:"
msgid "By Position"
msgstr "Für Position"
-msgctxt "field:calendar.rrule,byweekno:0"
+msgctxt "field:calendar.rrule,byweekno:"
msgid "By Week Number"
msgstr "Für Woche Nummer"
-msgctxt "field:calendar.rrule,byyearday:0"
+msgctxt "field:calendar.rrule,byyearday:"
msgid "By Year Day"
msgstr "Für Tag des Jahres"
-msgctxt "field:calendar.rrule,count:0"
+msgctxt "field:calendar.rrule,count:"
msgid "Count"
msgstr "Anzahl"
-msgctxt "field:calendar.rrule,freq:0"
+msgctxt "field:calendar.rrule,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.rrule,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.rrule,freq:"
msgid "Frequency"
msgstr "Häufigkeit"
-msgctxt "field:calendar.rrule,interval:0"
+msgctxt "field:calendar.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.rrule,interval:"
msgid "Interval"
msgstr "Intervall"
-msgctxt "field:calendar.rrule,rec_name:0"
+msgctxt "field:calendar.rrule,rec_name:"
msgid "Name"
msgstr "Name"
-msgctxt "field:calendar.rrule,until:0"
+msgctxt "field:calendar.rrule,until:"
msgid "Until Date"
msgstr "Bis Zeitpunkt"
-msgctxt "field:calendar.rrule,until_date:0"
+msgctxt "field:calendar.rrule,until_date:"
msgid "Is Date"
msgstr "Als Datum"
-msgctxt "field:calendar.rrule,wkst:0"
+msgctxt "field:calendar.rrule,wkst:"
msgid "Week Day"
msgstr "Wochentag"
-msgctxt "field:res.user,calendars:0"
+msgctxt "field:calendar.rrule,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.rrule,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:res.user,calendars:"
msgid "Calendars"
msgstr "Kalender"
-msgctxt "help:calendar.calendar,owner:0"
+msgctxt "help:calendar.calendar,owner:"
msgid "The user must have an email"
msgstr "Dem Benutzer muss eine E-Mail-Adresse zugeordnet sein!"
-msgctxt "help:calendar.date,date:0"
+msgctxt "help:calendar.date,date:"
msgid "Ignore time of field \"Date\", but handle as date only."
msgstr "Verwende von Feld \"Zeitpunkt\" nur das Datum ohne den Zeitanteil."
-msgctxt "help:calendar.event,uuid:0"
+msgctxt "help:calendar.event,uuid:"
msgid "Universally Unique Identifier"
msgstr "Universally Unique Identifier"
-msgctxt "help:calendar.rrule,until_date:0"
+msgctxt "help:calendar.rrule,until_date:"
msgid "Ignore time of field \"Until Date\", but handle as date only."
msgstr "Verwende von Feld \"Bis Zeitpunkt\" nur das Datum ohne den Zeitanteil."
-msgctxt "model:calendar.alarm,name:0"
+msgctxt "model:calendar.alarm,name:"
msgid "Alarm"
msgstr "Alarm"
-msgctxt "model:calendar.attendee,name:0"
+msgctxt "model:calendar.attendee,name:"
msgid "Attendee"
msgstr "Teilnehmer"
-msgctxt "model:calendar.calendar,name:0"
+msgctxt "model:calendar.calendar,name:"
msgid "Calendar"
msgstr "Kalender"
-msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgctxt "model:calendar.calendar-read-res.user,name:"
msgid "Calendar - read - User"
msgstr "Kalender - Schreiben - Benutzer"
-msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgctxt "model:calendar.calendar-write-res.user,name:"
msgid "Calendar - write - User"
msgstr "Kalender - Lesen - Benutzer"
-msgctxt "model:calendar.category,name:0"
+msgctxt "model:calendar.category,name:"
msgid "Category"
msgstr "Kategorie"
-msgctxt "model:calendar.date,name:0"
+msgctxt "model:calendar.date,name:"
msgid "Calendar Date"
msgstr "Kalender Datum"
-msgctxt "model:calendar.event,name:0"
+msgctxt "model:calendar.event,name:"
msgid "Event"
msgstr "Termin"
-msgctxt "model:calendar.event-calendar.category,name:0"
+msgctxt "model:calendar.event-calendar.category,name:"
msgid "Event - Category"
msgstr "Termin - Kategorie"
-msgctxt "model:calendar.event.alarm,name:0"
+msgctxt "model:calendar.event.alarm,name:"
msgid "Alarm"
msgstr "Alarm"
-msgctxt "model:calendar.event.attendee,name:0"
+msgctxt "model:calendar.event.attendee,name:"
msgid "Attendee"
msgstr "Teilnehmer"
-msgctxt "model:calendar.event.exdate,name:0"
+msgctxt "model:calendar.event.exdate,name:"
msgid "Exception Date"
msgstr "Ausnahmedatum"
-msgctxt "model:calendar.event.exrule,name:0"
+msgctxt "model:calendar.event.exrule,name:"
msgid "Exception Rule"
msgstr "Ausnahmeregel"
-msgctxt "model:calendar.event.rdate,name:0"
+msgctxt "model:calendar.event.rdate,name:"
msgid "Recurrence Date"
msgstr "Wiederholungsdatum"
-msgctxt "model:calendar.event.rrule,name:0"
+msgctxt "model:calendar.event.rrule,name:"
msgid "Recurrence Rule"
msgstr "Wiederholungsregel"
-msgctxt "model:calendar.location,name:0"
+msgctxt "model:calendar.location,name:"
msgid "Location"
msgstr "Ort"
-msgctxt "model:calendar.rrule,name:0"
+msgctxt "model:calendar.rrule,name:"
msgid "Recurrence Rule"
msgstr "Wiederholungsregel"
@@ -548,218 +888,218 @@ msgctxt "model:res.group,name:group_calendar_admin"
msgid "Calendar Administration"
msgstr "Kalender Administration"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid ""
msgstr ""
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Accepted"
msgstr "Angenommen"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Declined"
msgstr "Abgelehnt"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Delegated"
msgstr "Delegiert"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Needs Action"
msgstr "Aktion erforderlich"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Tentative"
msgstr "Unter Vorbehalt"
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
msgid "Confidential"
msgstr "Vertraulich"
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
msgid "Private"
msgstr "Privat"
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
msgid "Public"
msgstr "Öffentlich"
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid ""
msgstr ""
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid "Cancelled"
msgstr "Abgesagt"
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid "Confirmed"
msgstr "Bestätigt"
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid "Tentative"
msgstr "Unter Vorbehalt"
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
msgid "Opaque"
msgstr "Opak"
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
msgid "Transparent"
msgstr "Transparent"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Daily"
msgstr "Täglich"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Hourly"
msgstr "Stündlich"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Minutely"
msgstr "Minütlich"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Monthly"
msgstr "Monatlich"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Secondly"
msgstr "Sekündlich"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Weekly"
msgstr "Wöchentlich"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Yearly"
msgstr "Jährlich"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Friday"
msgstr "Freitag"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Monday"
msgstr "Montag"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Saturday"
msgstr "Samstag"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Sunday"
msgstr "Sonntag"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Thursday"
msgstr "Donnerstag"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Tuesday"
msgstr "Dienstag"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Wednesday"
msgstr "Mittwoch"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "Calendar"
msgstr "Kalender"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "Calendars"
msgstr "Kalender"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "General"
msgstr "Allgemein"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "Security"
msgstr "Sicherheit"
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
msgid "Categories"
msgstr "Kategorien"
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
msgid "Category"
msgstr "Kategorie"
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
msgid "Attendee"
msgstr "Teilnehmer"
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
msgid "Attendees"
msgstr "Teilnehmer"
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
msgid "Exception Date"
msgstr "Ausnahmedatum"
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
msgid "Exception Dates"
msgstr "Ausnahmedaten"
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
msgid "Exception Rule"
msgstr "Ausnahmeregel"
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
msgid "Exception Rules"
msgstr "Ausnahmeregeln"
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
msgid "Recurrence Date"
msgstr "Wiederholungsdatum"
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
msgid "Recurrence Dates"
msgstr "Wiederholungsdaten"
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
msgid "Recurrence Rule"
msgstr "Wiederholungsregel"
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
msgid "Recurrence Rules"
msgstr "Wiederholungsregeln"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Attendees"
msgstr "Teilnehmer"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Categories"
msgstr "Kategorien"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Event"
msgstr "Termin"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Events"
msgstr "Termine"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "General"
msgstr "Allgemein"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Occurences"
msgstr "Ereignisse"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Recurrences"
msgstr "Wiederholungen"
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
msgid "Location"
msgstr "Ort"
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
msgid "Locations"
msgstr "Orte"
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 da25b87..707e3dc 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -2,523 +2,880 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
msgid "A user can have only one calendar!"
msgstr "¡Un usuario puede tener a lo sumo un calendario!"
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
msgid "The name of calendar must be unique!"
msgstr "¡El nombre del calendario es único!"
-msgctxt "error:calendar.category:0"
+msgctxt "error:calendar.category:"
msgid "The name of calendar category must be unique!"
msgstr "¡El nombre de la categoría de calendario debe ser único!"
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
msgid "Recurrence can not be recurrent!"
msgstr "¡La repetición no puede repetirse!"
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
msgid "UUID and recurrence must be unique in a calendar!"
msgstr "¡El UUID y la recurrencia deben ser únicos por calendario! "
-msgctxt "error:calendar.location:0"
+msgctxt "error:calendar.location:"
msgid "The name of calendar location must be unique!"
msgstr "¡El nombre del lugar del calendario debe ser único!"
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Day\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Hour\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Minute\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Month Day\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Month\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Position\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Second\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Week Number\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Year Day\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Only one of \"until\" and \"count\" can be set!"
msgstr ""
-msgctxt "field:calendar.alarm,rec_name:0"
+msgctxt "field:calendar.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.alarm,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.alarm,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.alarm,valarm:0"
+msgctxt "field:calendar.alarm,valarm:"
msgid "valarm"
msgstr ""
-msgctxt "field:calendar.attendee,attendee:0"
+msgctxt "field:calendar.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.attendee,attendee:"
msgid "attendee"
msgstr ""
-msgctxt "field:calendar.attendee,email:0"
+msgctxt "field:calendar.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.attendee,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.attendee,email:"
msgid "Email"
msgstr "Correo Electrónico"
-msgctxt "field:calendar.attendee,rec_name:0"
+msgctxt "field:calendar.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.attendee,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.attendee,status:0"
+msgctxt "field:calendar.attendee,status:"
msgid "Participation Status"
msgstr ""
-msgctxt "field:calendar.calendar,description:0"
+msgctxt "field:calendar.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.calendar,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.calendar,description:"
msgid "Description"
msgstr "Descripción"
-msgctxt "field:calendar.calendar,name:0"
+msgctxt "field:calendar.calendar,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar,name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.calendar,owner:0"
+msgctxt "field:calendar.calendar,owner:"
msgid "Owner"
msgstr "Propietario"
-msgctxt "field:calendar.calendar,read_users:0"
+msgctxt "field:calendar.calendar,read_users:"
msgid "Read Users"
msgstr "Usuarios que pueden Leer"
-msgctxt "field:calendar.calendar,rec_name:0"
+msgctxt "field:calendar.calendar,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.calendar,write_users:0"
+msgctxt "field:calendar.calendar,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,write_users:"
msgid "Write Users"
msgstr "Escribir Usuarios"
-msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,calendar:"
msgid "Calendar"
msgstr "Calendario"
-msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-read-res.user,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.calendar-read-res.user,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.calendar-read-res.user,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgctxt "field:calendar.calendar-read-res.user,user:"
msgid "User"
msgstr "Usuario"
-msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:"
msgid "Calendar"
msgstr "Calendario"
-msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-write-res.user,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.calendar-write-res.user,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.calendar-write-res.user,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgctxt "field:calendar.calendar-write-res.user,user:"
msgid "User"
msgstr "Usuario"
-msgctxt "field:calendar.category,name:0"
+msgctxt "field:calendar.calendar-write-res.user,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.category,name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.category,rec_name:0"
+msgctxt "field:calendar.category,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.date,date:0"
+msgctxt "field:calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.date,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.date,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.date,date:"
msgid "Is Date"
msgstr "Es Fecha"
#, fuzzy
-msgctxt "field:calendar.date,datetime:0"
+msgctxt "field:calendar.date,datetime:"
msgid "Date"
msgstr "Fecha"
+msgctxt "field:calendar.date,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.date,rec_name:0"
+msgctxt "field:calendar.date,rec_name:"
msgid "Name"
msgstr "Nombre de Contacto"
-msgctxt "field:calendar.event,alarms:0"
+msgctxt "field:calendar.date,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.date,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event,alarms:"
msgid "Alarms"
msgstr "Alarmas"
-msgctxt "field:calendar.event,all_day:0"
+msgctxt "field:calendar.event,all_day:"
msgid "All Day"
msgstr "Todo el Día"
-msgctxt "field:calendar.event,attendees:0"
+msgctxt "field:calendar.event,attendees:"
msgid "Attendees"
msgstr "Asistentes"
-msgctxt "field:calendar.event,calendar:0"
+msgctxt "field:calendar.event,calendar:"
msgid "Calendar"
msgstr "Calendario"
-msgctxt "field:calendar.event,calendar_owner:0"
+msgctxt "field:calendar.event,calendar_owner:"
msgid "Owner"
msgstr "Propietario"
-msgctxt "field:calendar.event,calendar_read_users:0"
+msgctxt "field:calendar.event,calendar_read_users:"
msgid "Read Users"
msgstr "Usuarios que pueden Leer"
-msgctxt "field:calendar.event,calendar_write_users:0"
+msgctxt "field:calendar.event,calendar_write_users:"
msgid "Write Users"
msgstr "Escribir Usuarios"
-msgctxt "field:calendar.event,categories:0"
+msgctxt "field:calendar.event,categories:"
msgid "Categories"
msgstr "Categorías"
-msgctxt "field:calendar.event,classification:0"
+msgctxt "field:calendar.event,classification:"
msgid "Classification"
msgstr "Clasificación"
-msgctxt "field:calendar.event,description:0"
+msgctxt "field:calendar.event,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.event,description:"
msgid "Description"
msgstr "Descripción"
-msgctxt "field:calendar.event,dtend:0"
+msgctxt "field:calendar.event,dtend:"
msgid "End Date"
msgstr "Fecha Fin"
-msgctxt "field:calendar.event,dtstart:0"
+msgctxt "field:calendar.event,dtstart:"
msgid "Start Date"
msgstr "Fecha Inicial"
-msgctxt "field:calendar.event,exdates:0"
+msgctxt "field:calendar.event,exdates:"
msgid "Exception Dates"
msgstr "Fechas de Excepción"
-msgctxt "field:calendar.event,exrules:0"
+msgctxt "field:calendar.event,exrules:"
msgid "Exception Rules"
msgstr "Reglas de Excepción"
-msgctxt "field:calendar.event,location:0"
+msgctxt "field:calendar.event,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event,location:"
msgid "Location"
msgstr "Lugar"
#, fuzzy
-msgctxt "field:calendar.event,occurences:0"
+msgctxt "field:calendar.event,occurences:"
msgid "Occurences"
msgstr "Ocurrencias"
-msgctxt "field:calendar.event,organizer:0"
+msgctxt "field:calendar.event,organizer:"
msgid "Organizer"
msgstr "Organizador"
-msgctxt "field:calendar.event,parent:0"
+msgctxt "field:calendar.event,parent:"
msgid "Parent"
msgstr "Padre"
-msgctxt "field:calendar.event,rdates:0"
+msgctxt "field:calendar.event,rdates:"
msgid "Recurrence Dates"
msgstr "Fechas de Repetición"
-msgctxt "field:calendar.event,rec_name:0"
+msgctxt "field:calendar.event,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.event,recurrence:0"
+msgctxt "field:calendar.event,recurrence:"
msgid "Recurrence"
msgstr "Repetición"
-msgctxt "field:calendar.event,rrules:0"
+msgctxt "field:calendar.event,rrules:"
msgid "Recurrence Rules"
msgstr "Reglas de Repetición"
-msgctxt "field:calendar.event,sequence:0"
+msgctxt "field:calendar.event,sequence:"
msgid "Sequence"
msgstr "Secuencia"
-msgctxt "field:calendar.event,status:0"
+msgctxt "field:calendar.event,status:"
msgid "Status"
msgstr "Estado"
-msgctxt "field:calendar.event,summary:0"
+msgctxt "field:calendar.event,summary:"
msgid "Summary"
msgstr "Resumen"
-msgctxt "field:calendar.event,timezone:0"
+msgctxt "field:calendar.event,timezone:"
msgid "Timezone"
msgstr "Zona horaria"
-msgctxt "field:calendar.event,transp:0"
+msgctxt "field:calendar.event,transp:"
msgid "Time Transparency"
msgstr "Transparencia de Tiempo"
-msgctxt "field:calendar.event,uuid:0"
+msgctxt "field:calendar.event,uuid:"
msgid "UUID"
msgstr "UUID"
-msgctxt "field:calendar.event,vevent:0"
+msgctxt "field:calendar.event,vevent:"
msgid "vevent"
msgstr "vevento"
-msgctxt "field:calendar.event-calendar.category,category:0"
+msgctxt "field:calendar.event,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,category:"
msgid "Category"
msgstr "Categoría"
-msgctxt "field:calendar.event-calendar.category,event:0"
+msgctxt "field:calendar.event-calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.event-calendar.category,event:"
msgid "Event"
msgstr "Evento"
-msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgctxt "field:calendar.event-calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgctxt "field:calendar.event-calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:"
msgid "Calendar Alarm"
msgstr ""
-msgctxt "field:calendar.event.alarm,event:0"
+msgctxt "field:calendar.event.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.alarm,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.event.alarm,event:"
msgid "Event"
msgstr "Evento"
-msgctxt "field:calendar.event.alarm,rec_name:0"
+msgctxt "field:calendar.event.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgctxt "field:calendar.event.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:"
msgid "Calendar Attendee"
msgstr ""
-msgctxt "field:calendar.event.attendee,event:0"
+msgctxt "field:calendar.event.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.attendee,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.event.attendee,event:"
msgid "Event"
msgstr "Evento"
-msgctxt "field:calendar.event.attendee,rec_name:0"
+msgctxt "field:calendar.event.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgctxt "field:calendar.event.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,calendar_date:"
msgid "Calendar Date"
msgstr "Fecha Calendario"
-msgctxt "field:calendar.event.exdate,event:0"
+msgctxt "field:calendar.event.exdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.exdate,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.event.exdate,event:"
msgid "Event"
msgstr "Evento"
-msgctxt "field:calendar.event.exdate,rec_name:0"
+msgctxt "field:calendar.event.exdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgctxt "field:calendar.event.exdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr ""
-msgctxt "field:calendar.event.exrule,event:0"
+msgctxt "field:calendar.event.exrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.exrule,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.event.exrule,event:"
msgid "Event"
msgstr "Evento"
-msgctxt "field:calendar.event.exrule,rec_name:0"
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgctxt "field:calendar.event.exrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,calendar_date:"
msgid "Calendar Date"
msgstr "Fecha Calendario"
-msgctxt "field:calendar.event.rdate,event:0"
+msgctxt "field:calendar.event.rdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.rdate,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.event.rdate,event:"
msgid "Event"
msgstr "Evento"
-msgctxt "field:calendar.event.rdate,rec_name:0"
+msgctxt "field:calendar.event.rdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgctxt "field:calendar.event.rdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr ""
-msgctxt "field:calendar.event.rrule,event:0"
+msgctxt "field:calendar.event.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.rrule,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.event.rrule,event:"
msgid "Event"
msgstr "Evento"
-msgctxt "field:calendar.event.rrule,rec_name:0"
+msgctxt "field:calendar.event.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.location,name:0"
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.location,name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.location,rec_name:0"
+msgctxt "field:calendar.location,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.rrule,byday:0"
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.location,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byday:"
msgid "By Day"
msgstr ""
-msgctxt "field:calendar.rrule,byhour:0"
+msgctxt "field:calendar.rrule,byhour:"
msgid "By Hour"
msgstr ""
-msgctxt "field:calendar.rrule,byminute:0"
+msgctxt "field:calendar.rrule,byminute:"
msgid "By Minute"
msgstr ""
-msgctxt "field:calendar.rrule,bymonth:0"
+msgctxt "field:calendar.rrule,bymonth:"
msgid "By Month"
msgstr ""
-msgctxt "field:calendar.rrule,bymonthday:0"
+msgctxt "field:calendar.rrule,bymonthday:"
msgid "By Month Day"
msgstr ""
-msgctxt "field:calendar.rrule,bysecond:0"
+msgctxt "field:calendar.rrule,bysecond:"
msgid "By Second"
msgstr ""
-msgctxt "field:calendar.rrule,bysetpos:0"
+msgctxt "field:calendar.rrule,bysetpos:"
msgid "By Position"
msgstr ""
-msgctxt "field:calendar.rrule,byweekno:0"
+msgctxt "field:calendar.rrule,byweekno:"
msgid "By Week Number"
msgstr ""
-msgctxt "field:calendar.rrule,byyearday:0"
+msgctxt "field:calendar.rrule,byyearday:"
msgid "By Year Day"
msgstr ""
-msgctxt "field:calendar.rrule,count:0"
+msgctxt "field:calendar.rrule,count:"
msgid "Count"
msgstr ""
-msgctxt "field:calendar.rrule,freq:0"
+msgctxt "field:calendar.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.rrule,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.rrule,freq:"
msgid "Frequency"
msgstr ""
-msgctxt "field:calendar.rrule,interval:0"
+msgctxt "field:calendar.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.rrule,interval:"
msgid "Interval"
msgstr ""
-msgctxt "field:calendar.rrule,rec_name:0"
+msgctxt "field:calendar.rrule,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.rrule,until:0"
+msgctxt "field:calendar.rrule,until:"
msgid "Until Date"
msgstr ""
#, fuzzy
-msgctxt "field:calendar.rrule,until_date:0"
+msgctxt "field:calendar.rrule,until_date:"
msgid "Is Date"
msgstr "Es Fecha"
-msgctxt "field:calendar.rrule,wkst:0"
+msgctxt "field:calendar.rrule,wkst:"
msgid "Week Day"
msgstr "Día de la Semana"
-msgctxt "field:res.user,calendars:0"
+msgctxt "field:calendar.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:res.user,calendars:"
msgid "Calendars"
msgstr "Calendarios"
-msgctxt "help:calendar.calendar,owner:0"
+msgctxt "help:calendar.calendar,owner:"
msgid "The user must have an email"
msgstr ""
-msgctxt "help:calendar.date,date:0"
+msgctxt "help:calendar.date,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.event,uuid:0"
+msgctxt "help:calendar.event,uuid:"
msgid "Universally Unique Identifier"
msgstr "Idenitificador Universal Único"
-msgctxt "help:calendar.rrule,until_date:0"
+msgctxt "help:calendar.rrule,until_date:"
msgid "Ignore time of field \"Until Date\", but handle as date only."
msgstr ""
-msgctxt "model:calendar.alarm,name:0"
+msgctxt "model:calendar.alarm,name:"
msgid "Alarm"
msgstr "Alarma"
-msgctxt "model:calendar.attendee,name:0"
+msgctxt "model:calendar.attendee,name:"
msgid "Attendee"
msgstr "Asistente"
-msgctxt "model:calendar.calendar,name:0"
+msgctxt "model:calendar.calendar,name:"
msgid "Calendar"
msgstr "Calendario"
-msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgctxt "model:calendar.calendar-read-res.user,name:"
msgid "Calendar - read - User"
msgstr "Calendario - leer - Usuario"
-msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgctxt "model:calendar.calendar-write-res.user,name:"
msgid "Calendar - write - User"
msgstr "Calendario - escribir - Usuario"
-msgctxt "model:calendar.category,name:0"
+msgctxt "model:calendar.category,name:"
msgid "Category"
msgstr "Categoría"
-msgctxt "model:calendar.date,name:0"
+msgctxt "model:calendar.date,name:"
msgid "Calendar Date"
msgstr "Fecha Calendario"
-msgctxt "model:calendar.event,name:0"
+msgctxt "model:calendar.event,name:"
msgid "Event"
msgstr "Evento"
-msgctxt "model:calendar.event-calendar.category,name:0"
+msgctxt "model:calendar.event-calendar.category,name:"
msgid "Event - Category"
msgstr "Evento - Categoría"
-msgctxt "model:calendar.event.alarm,name:0"
+msgctxt "model:calendar.event.alarm,name:"
msgid "Alarm"
msgstr "Alarma"
-msgctxt "model:calendar.event.attendee,name:0"
+msgctxt "model:calendar.event.attendee,name:"
msgid "Attendee"
msgstr "Asistente"
-msgctxt "model:calendar.event.exdate,name:0"
+msgctxt "model:calendar.event.exdate,name:"
msgid "Exception Date"
msgstr "Fecha de Excepción"
-msgctxt "model:calendar.event.exrule,name:0"
+msgctxt "model:calendar.event.exrule,name:"
msgid "Exception Rule"
msgstr "Regla de Excepción"
-msgctxt "model:calendar.event.rdate,name:0"
+msgctxt "model:calendar.event.rdate,name:"
msgid "Recurrence Date"
msgstr "Fecha de Repetición"
-msgctxt "model:calendar.event.rrule,name:0"
+msgctxt "model:calendar.event.rrule,name:"
msgid "Recurrence Rule"
msgstr "Regla de Repetición"
-msgctxt "model:calendar.location,name:0"
+msgctxt "model:calendar.location,name:"
msgid "Location"
msgstr "Lugar"
-msgctxt "model:calendar.rrule,name:0"
+msgctxt "model:calendar.rrule,name:"
msgid "Recurrence Rule"
msgstr "Regla de Repetición"
@@ -551,219 +908,219 @@ msgctxt "model:res.group,name:group_calendar_admin"
msgid "Calendar Administration"
msgstr "Administrar Calendario"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid ""
msgstr ""
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Accepted"
msgstr ""
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Declined"
msgstr ""
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Delegated"
msgstr ""
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Needs Action"
msgstr ""
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Tentative"
msgstr "Tentativa"
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
msgid "Confidential"
msgstr "Confidencial"
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
msgid "Private"
msgstr "Privado"
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
msgid "Public"
msgstr "Público"
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid ""
msgstr ""
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid "Cancelled"
msgstr "Cancelado"
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid "Confirmed"
msgstr "Confirmado"
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid "Tentative"
msgstr "Tentativa"
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
msgid "Opaque"
msgstr "Opaco"
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
msgid "Transparent"
msgstr "Transparente"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Daily"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Hourly"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Minutely"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Monthly"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Secondly"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Weekly"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Yearly"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Friday"
msgstr "Viernes"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Monday"
msgstr "Lunes"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Saturday"
msgstr "Sábado"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Sunday"
msgstr "Domingo"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Thursday"
msgstr "Jueves"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Tuesday"
msgstr "Martes"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Wednesday"
msgstr "Miércoles"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "Calendar"
msgstr "Calendario"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "Calendars"
msgstr "Calendarios"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "General"
msgstr "General"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "Security"
msgstr "Seguridad"
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
msgid "Categories"
msgstr "Categorías"
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
msgid "Category"
msgstr "Categoría"
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
msgid "Attendee"
msgstr "Asistente"
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
msgid "Attendees"
msgstr "Asistentes"
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
msgid "Exception Date"
msgstr "Fecha de Excepción"
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
msgid "Exception Dates"
msgstr "Fechas de Excepción"
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
msgid "Exception Rule"
msgstr "Regla de Excepción"
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
msgid "Exception Rules"
msgstr "Reglas de Excepción"
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
msgid "Recurrence Date"
msgstr "Fecha de Repetición"
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
msgid "Recurrence Dates"
msgstr "Fechas de Repetición"
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
msgid "Recurrence Rule"
msgstr "Regla de Repetición"
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
msgid "Recurrence Rules"
msgstr "Reglas de Repetición"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Attendees"
msgstr "Asistentes"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Categories"
msgstr "Categorías"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Event"
msgstr "Evento"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Events"
msgstr "Eventos"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "General"
msgstr "General"
#, fuzzy
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Occurences"
msgstr "Ocurrencias"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Recurrences"
msgstr "Repeticiones"
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
msgid "Location"
msgstr "Lugar"
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
msgid "Locations"
msgstr "Lugares"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index d905bdc..ac105e3 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -2,522 +2,859 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
msgid "A user can have only one calendar!"
-msgstr "Un usuario solo puede tener un calendario"
+msgstr "Un usuario sólo puede tener un calendario."
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
msgid "The name of calendar must be unique!"
-msgstr "El nombre del calendario debe ser único"
+msgstr "El nombre del calendario debe ser único."
-msgctxt "error:calendar.category:0"
+msgctxt "error:calendar.category:"
msgid "The name of calendar category must be unique!"
-msgstr "El nombre de la categoría del calendario debe ser único"
+msgstr "El nombre de la categoría del calendario debe ser único."
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
msgid "Recurrence can not be recurrent!"
-msgstr "Una recurrencia no puede ser recurrente"
+msgstr "Una recurrencia no puede ser recurrente."
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
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 "error:calendar.location:0"
+msgctxt "error:calendar.location:"
msgid "The name of calendar location must be unique!"
-msgstr "El nombre de la ubicación del calendario debe ser único"
+msgstr "El nombre de la ubicación del calendario debe ser único."
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Day\""
-msgstr "Inválido «por día»"
+msgstr "\"Por día\" no es correcto."
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Hour\""
-msgstr "Inválido «por hora»"
+msgstr "\"Por hora\" no es correcto."
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Minute\""
-msgstr "Inválido «por minuto»"
+msgstr "\"Por minuto\" no es correcto."
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Month Day\""
-msgstr "Inválido «por día del mes»"
+msgstr "\"Por día del mes\" no es correcto."
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Month\""
-msgstr "Inválido «por mes»"
+msgstr "\"Por mes\" no es correcto."
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Position\""
-msgstr "Inválido «por posición»"
+msgstr "\"Por posición\" no es correcto."
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Second\""
-msgstr "Inválido «por segundos»"
+msgstr "\"Por segundos\" no es correcto."
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Week Number\""
-msgstr "Inválido «por número de semana»"
+msgstr "\"Por número de semana\" no es correcto."
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Year Day\""
-msgstr "Inválido «por día del año»"
+msgstr "\"Por día del año\" no es correcto."
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Only one of \"until\" and \"count\" can be set!"
-msgstr "Solo se puede usar o «hasta» o «Número de veces»"
+msgstr "Sólo se puede usar o \"Hasta\" o \"Número de veces\"."
-msgctxt "field:calendar.alarm,rec_name:0"
+msgctxt "field:calendar.alarm,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.alarm,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.alarm,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.alarm,valarm:0"
+msgctxt "field:calendar.alarm,valarm:"
msgid "valarm"
msgstr "valarm"
-msgctxt "field:calendar.attendee,attendee:0"
+msgctxt "field:calendar.alarm,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.alarm,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.attendee,attendee:"
msgid "attendee"
msgstr "asistentes"
-msgctxt "field:calendar.attendee,email:0"
+msgctxt "field:calendar.attendee,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.attendee,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.attendee,email:"
msgid "Email"
msgstr "Correo electrónico"
-msgctxt "field:calendar.attendee,rec_name:0"
+msgctxt "field:calendar.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.attendee,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.attendee,status:0"
+msgctxt "field:calendar.attendee,status:"
msgid "Participation Status"
msgstr "Estado de participación"
-msgctxt "field:calendar.calendar,description:0"
+msgctxt "field:calendar.attendee,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.attendee,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.calendar,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.calendar,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.calendar,description:"
msgid "Description"
msgstr "Descripción"
-msgctxt "field:calendar.calendar,name:0"
+msgctxt "field:calendar.calendar,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar,name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.calendar,owner:0"
+msgctxt "field:calendar.calendar,owner:"
msgid "Owner"
-msgstr "Dueño"
+msgstr "Propietario"
-msgctxt "field:calendar.calendar,read_users:0"
+msgctxt "field:calendar.calendar,read_users:"
msgid "Read Users"
msgstr "Usuarios con lectura"
-msgctxt "field:calendar.calendar,rec_name:0"
+msgctxt "field:calendar.calendar,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.calendar,write_users:0"
+msgctxt "field:calendar.calendar,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.calendar,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.calendar,write_users:"
msgid "Write Users"
msgstr "Usuarios con escritura"
-msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,calendar:"
msgid "Calendar"
msgstr "Calendario"
-msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-read-res.user,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.calendar-read-res.user,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.calendar-read-res.user,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgctxt "field:calendar.calendar-read-res.user,user:"
msgid "User"
msgstr "Usuario"
-msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.calendar-read-res.user,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:"
msgid "Calendar"
msgstr "Calendario"
-msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-write-res.user,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.calendar-write-res.user,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.calendar-write-res.user,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgctxt "field:calendar.calendar-write-res.user,user:"
msgid "User"
msgstr "Usuario"
-msgctxt "field:calendar.category,name:0"
+msgctxt "field:calendar.calendar-write-res.user,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.calendar-write-res.user,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.category,name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.category,rec_name:0"
+msgctxt "field:calendar.category,rec_name:"
msgid "Name"
msgstr "Nombre"
-#, fuzzy
-msgctxt "field:calendar.date,date:0"
+msgctxt "field:calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.date,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.date,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.date,date:"
msgid "Is Date"
msgstr "Es fecha"
-#, fuzzy
-msgctxt "field:calendar.date,datetime:0"
+msgctxt "field:calendar.date,datetime:"
msgid "Date"
msgstr "Fecha"
-#, fuzzy
-msgctxt "field:calendar.date,rec_name:0"
+msgctxt "field:calendar.date,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.date,rec_name:"
msgid "Name"
-msgstr "Nombre del campo"
+msgstr "Nombre"
+
+msgctxt "field:calendar.date,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
-msgctxt "field:calendar.event,alarms:0"
+msgctxt "field:calendar.date,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event,alarms:"
msgid "Alarms"
msgstr "Alarmas"
-msgctxt "field:calendar.event,all_day:0"
+msgctxt "field:calendar.event,all_day:"
msgid "All Day"
msgstr "Todo el día"
-msgctxt "field:calendar.event,attendees:0"
+msgctxt "field:calendar.event,attendees:"
msgid "Attendees"
msgstr "Asistentes"
-msgctxt "field:calendar.event,calendar:0"
+msgctxt "field:calendar.event,calendar:"
msgid "Calendar"
msgstr "Calendario"
-msgctxt "field:calendar.event,calendar_owner:0"
+msgctxt "field:calendar.event,calendar_owner:"
msgid "Owner"
-msgstr "Dueño"
+msgstr "Propietario"
-msgctxt "field:calendar.event,calendar_read_users:0"
+msgctxt "field:calendar.event,calendar_read_users:"
msgid "Read Users"
msgstr "Usuarios con lectura"
-msgctxt "field:calendar.event,calendar_write_users:0"
+msgctxt "field:calendar.event,calendar_write_users:"
msgid "Write Users"
msgstr "Usuarios con escritura"
-msgctxt "field:calendar.event,categories:0"
+msgctxt "field:calendar.event,categories:"
msgid "Categories"
msgstr "Categorías"
-msgctxt "field:calendar.event,classification:0"
+msgctxt "field:calendar.event,classification:"
msgid "Classification"
msgstr "Clasificación"
-msgctxt "field:calendar.event,description:0"
+msgctxt "field:calendar.event,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event,description:"
msgid "Description"
msgstr "Descripción"
-msgctxt "field:calendar.event,dtend:0"
+msgctxt "field:calendar.event,dtend:"
msgid "End Date"
-msgstr "Fecha fin"
+msgstr "Fecha final"
-msgctxt "field:calendar.event,dtstart:0"
+msgctxt "field:calendar.event,dtstart:"
msgid "Start Date"
-msgstr "Fecha inicio"
+msgstr "Fecha inicial"
-msgctxt "field:calendar.event,exdates:0"
+msgctxt "field:calendar.event,exdates:"
msgid "Exception Dates"
msgstr "Fechas excluidas"
-msgctxt "field:calendar.event,exrules:0"
+msgctxt "field:calendar.event,exrules:"
msgid "Exception Rules"
msgstr "Reglas de excepción"
-msgctxt "field:calendar.event,location:0"
+msgctxt "field:calendar.event,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event,location:"
msgid "Location"
msgstr "Ubicación"
-msgctxt "field:calendar.event,occurences:0"
+msgctxt "field:calendar.event,occurences:"
msgid "Occurences"
msgstr "Ocurrencias"
-msgctxt "field:calendar.event,organizer:0"
+msgctxt "field:calendar.event,organizer:"
msgid "Organizer"
msgstr "Organizador"
-msgctxt "field:calendar.event,parent:0"
+msgctxt "field:calendar.event,parent:"
msgid "Parent"
msgstr "Padre"
-msgctxt "field:calendar.event,rdates:0"
+msgctxt "field:calendar.event,rdates:"
msgid "Recurrence Dates"
msgstr "Fechas de recurrencia"
-msgctxt "field:calendar.event,rec_name:0"
+msgctxt "field:calendar.event,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.event,recurrence:0"
+msgctxt "field:calendar.event,recurrence:"
msgid "Recurrence"
msgstr "Recurrencia"
-msgctxt "field:calendar.event,rrules:0"
+msgctxt "field:calendar.event,rrules:"
msgid "Recurrence Rules"
msgstr "Reglas de recurrencia"
-msgctxt "field:calendar.event,sequence:0"
+msgctxt "field:calendar.event,sequence:"
msgid "Sequence"
msgstr "Secuencia"
-msgctxt "field:calendar.event,status:0"
+msgctxt "field:calendar.event,status:"
msgid "Status"
msgstr "Estado"
-msgctxt "field:calendar.event,summary:0"
+msgctxt "field:calendar.event,summary:"
msgid "Summary"
msgstr "Resumen"
-msgctxt "field:calendar.event,timezone:0"
+msgctxt "field:calendar.event,timezone:"
msgid "Timezone"
msgstr "Zona horaria"
-msgctxt "field:calendar.event,transp:0"
+msgctxt "field:calendar.event,transp:"
msgid "Time Transparency"
msgstr "Tiempo de transparencia"
-msgctxt "field:calendar.event,uuid:0"
+msgctxt "field:calendar.event,uuid:"
msgid "UUID"
msgstr "UUID"
-msgctxt "field:calendar.event,vevent:0"
+msgctxt "field:calendar.event,vevent:"
msgid "vevent"
msgstr "vevent"
-msgctxt "field:calendar.event-calendar.category,category:0"
+msgctxt "field:calendar.event,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event-calendar.category,category:"
msgid "Category"
msgstr "Categoría"
-msgctxt "field:calendar.event-calendar.category,event:0"
+msgctxt "field:calendar.event-calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event-calendar.category,event:"
msgid "Event"
msgstr "Evento"
-msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgctxt "field:calendar.event-calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event-calendar.category,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgctxt "field:calendar.event-calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event-calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:"
msgid "Calendar Alarm"
msgstr "Alarma del calendario"
-msgctxt "field:calendar.event.alarm,event:0"
+msgctxt "field:calendar.event.alarm,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event.alarm,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.alarm,event:"
msgid "Event"
msgstr "Evento"
-msgctxt "field:calendar.event.alarm,rec_name:0"
+msgctxt "field:calendar.event.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.alarm,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgctxt "field:calendar.event.alarm,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.alarm,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:"
msgid "Calendar Attendee"
msgstr "Calendario de asistentes"
-msgctxt "field:calendar.event.attendee,event:0"
+msgctxt "field:calendar.event.attendee,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event.attendee,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.attendee,event:"
msgid "Event"
msgstr "Evento"
-msgctxt "field:calendar.event.attendee,rec_name:0"
+msgctxt "field:calendar.event.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.attendee,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgctxt "field:calendar.event.attendee,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.attendee,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.exdate,calendar_date:"
msgid "Calendar Date"
-msgstr ""
+msgstr "Fecha calendario"
+
+msgctxt "field:calendar.event.exdate,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
-msgctxt "field:calendar.event.exdate,event:0"
+msgctxt "field:calendar.event.exdate,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.exdate,event:"
msgid "Event"
msgstr "Evento"
-msgctxt "field:calendar.event.exdate,rec_name:0"
+msgctxt "field:calendar.event.exdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.exdate,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgctxt "field:calendar.event.exdate,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.exdate,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr "Regla de recurrencia"
-msgctxt "field:calendar.event.exrule,event:0"
+msgctxt "field:calendar.event.exrule,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event.exrule,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.exrule,event:"
msgid "Event"
msgstr "Evento"
-msgctxt "field:calendar.event.exrule,rec_name:0"
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.exrule,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgctxt "field:calendar.event.exrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.exrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.rdate,calendar_date:"
msgid "Calendar Date"
-msgstr ""
+msgstr "Fecha calendario"
+
+msgctxt "field:calendar.event.rdate,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
-msgctxt "field:calendar.event.rdate,event:0"
+msgctxt "field:calendar.event.rdate,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.rdate,event:"
msgid "Event"
msgstr "Evento"
-msgctxt "field:calendar.event.rdate,rec_name:0"
+msgctxt "field:calendar.event.rdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.rdate,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgctxt "field:calendar.event.rdate,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.rdate,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr "Regla de recurrencia"
-msgctxt "field:calendar.event.rrule,event:0"
+msgctxt "field:calendar.event.rrule,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event.rrule,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.rrule,event:"
msgid "Event"
msgstr "Evento"
-msgctxt "field:calendar.event.rrule,rec_name:0"
+msgctxt "field:calendar.event.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.rrule,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.location,name:0"
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.location,name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.location,rec_name:0"
+msgctxt "field:calendar.location,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.rrule,byday:0"
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.location,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.rrule,byday:"
msgid "By Day"
msgstr "Por día"
-msgctxt "field:calendar.rrule,byhour:0"
+msgctxt "field:calendar.rrule,byhour:"
msgid "By Hour"
msgstr "Por hora"
-msgctxt "field:calendar.rrule,byminute:0"
+msgctxt "field:calendar.rrule,byminute:"
msgid "By Minute"
msgstr "Por minuto"
-msgctxt "field:calendar.rrule,bymonth:0"
+msgctxt "field:calendar.rrule,bymonth:"
msgid "By Month"
msgstr "Por mes"
-msgctxt "field:calendar.rrule,bymonthday:0"
+msgctxt "field:calendar.rrule,bymonthday:"
msgid "By Month Day"
msgstr "Por día del mes"
-msgctxt "field:calendar.rrule,bysecond:0"
+msgctxt "field:calendar.rrule,bysecond:"
msgid "By Second"
msgstr "Por segundo"
-msgctxt "field:calendar.rrule,bysetpos:0"
+msgctxt "field:calendar.rrule,bysetpos:"
msgid "By Position"
msgstr "Por posición"
-msgctxt "field:calendar.rrule,byweekno:0"
+msgctxt "field:calendar.rrule,byweekno:"
msgid "By Week Number"
-msgstr "Por día de la semana"
+msgstr "Por número de semana"
-msgctxt "field:calendar.rrule,byyearday:0"
+msgctxt "field:calendar.rrule,byyearday:"
msgid "By Year Day"
msgstr "Por día del año"
-msgctxt "field:calendar.rrule,count:0"
+msgctxt "field:calendar.rrule,count:"
msgid "Count"
msgstr "Número de veces"
-msgctxt "field:calendar.rrule,freq:0"
+msgctxt "field:calendar.rrule,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.rrule,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.rrule,freq:"
msgid "Frequency"
msgstr "Frecuencia"
-msgctxt "field:calendar.rrule,interval:0"
+msgctxt "field:calendar.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.rrule,interval:"
msgid "Interval"
msgstr "Intervalo"
-msgctxt "field:calendar.rrule,rec_name:0"
+msgctxt "field:calendar.rrule,rec_name:"
msgid "Name"
msgstr "Nombre"
-msgctxt "field:calendar.rrule,until:0"
+msgctxt "field:calendar.rrule,until:"
msgid "Until Date"
msgstr "Hasta la fecha"
-msgctxt "field:calendar.rrule,until_date:0"
+msgctxt "field:calendar.rrule,until_date:"
msgid "Is Date"
msgstr "Es fecha"
-msgctxt "field:calendar.rrule,wkst:0"
+msgctxt "field:calendar.rrule,wkst:"
msgid "Week Day"
msgstr "Día de la semana"
-msgctxt "field:res.user,calendars:0"
+msgctxt "field:calendar.rrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.rrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:res.user,calendars:"
msgid "Calendars"
msgstr "Calendarios"
-msgctxt "help:calendar.calendar,owner:0"
+msgctxt "help:calendar.calendar,owner:"
msgid "The user must have an email"
-msgstr "El usuario debe tener un correo electrónico"
+msgstr "El usuario debe tener un correo electrónico."
-msgctxt "help:calendar.date,date:0"
+msgctxt "help:calendar.date,date:"
msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr ""
+msgstr "Ignora la hora del campo \"Fecha\" y trata sólo la fecha."
-msgctxt "help:calendar.event,uuid:0"
+msgctxt "help:calendar.event,uuid:"
msgid "Universally Unique Identifier"
-msgstr "Identificador universal único"
+msgstr "Identificador universal único."
-msgctxt "help:calendar.rrule,until_date:0"
+msgctxt "help:calendar.rrule,until_date:"
msgid "Ignore time of field \"Until Date\", but handle as date only."
-msgstr "Ignora la hora del campo «Hasta la fecha», y trata solo la fecha"
+msgstr "Ignora la hora del campo \"Hasta la fecha\" y trata sólo la fecha."
-msgctxt "model:calendar.alarm,name:0"
+msgctxt "model:calendar.alarm,name:"
msgid "Alarm"
msgstr "Alarma"
-msgctxt "model:calendar.attendee,name:0"
+msgctxt "model:calendar.attendee,name:"
msgid "Attendee"
msgstr "Asistentes"
-msgctxt "model:calendar.calendar,name:0"
+msgctxt "model:calendar.calendar,name:"
msgid "Calendar"
msgstr "Calendario"
-msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgctxt "model:calendar.calendar-read-res.user,name:"
msgid "Calendar - read - User"
-msgstr "Calendario - leer - usuario"
+msgstr "Calendario - leer - Usuario"
-msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgctxt "model:calendar.calendar-write-res.user,name:"
msgid "Calendar - write - User"
-msgstr "Calendario - escribir - usuario"
+msgstr "Calendario - escribir - Usuario"
-msgctxt "model:calendar.category,name:0"
+msgctxt "model:calendar.category,name:"
msgid "Category"
msgstr "Categoría"
-msgctxt "model:calendar.date,name:0"
+msgctxt "model:calendar.date,name:"
msgid "Calendar Date"
-msgstr ""
+msgstr "Fecha calendario"
-msgctxt "model:calendar.event,name:0"
+msgctxt "model:calendar.event,name:"
msgid "Event"
msgstr "Evento"
-msgctxt "model:calendar.event-calendar.category,name:0"
+msgctxt "model:calendar.event-calendar.category,name:"
msgid "Event - Category"
msgstr "Evento - Categoría"
-msgctxt "model:calendar.event.alarm,name:0"
+msgctxt "model:calendar.event.alarm,name:"
msgid "Alarm"
msgstr "Alarma"
-msgctxt "model:calendar.event.attendee,name:0"
+msgctxt "model:calendar.event.attendee,name:"
msgid "Attendee"
msgstr "Asistentes"
-msgctxt "model:calendar.event.exdate,name:0"
+msgctxt "model:calendar.event.exdate,name:"
msgid "Exception Date"
msgstr "Fecha excluida"
-msgctxt "model:calendar.event.exrule,name:0"
+msgctxt "model:calendar.event.exrule,name:"
msgid "Exception Rule"
msgstr "Regla de excepción"
-msgctxt "model:calendar.event.rdate,name:0"
+msgctxt "model:calendar.event.rdate,name:"
msgid "Recurrence Date"
msgstr "Fecha de recurrencia"
-msgctxt "model:calendar.event.rrule,name:0"
+msgctxt "model:calendar.event.rrule,name:"
msgid "Recurrence Rule"
msgstr "Regla de recurrencia"
-msgctxt "model:calendar.location,name:0"
+msgctxt "model:calendar.location,name:"
msgid "Location"
msgstr "Ubicación"
-msgctxt "model:calendar.rrule,name:0"
+msgctxt "model:calendar.rrule,name:"
msgid "Recurrence Rule"
msgstr "Regla de recurrencia"
@@ -529,15 +866,13 @@ msgctxt "model:ir.action,name:act_event_form"
msgid "Events"
msgstr "Eventos"
-#, fuzzy
msgctxt "model:ir.action,name:act_event_form3"
msgid "Events"
msgstr "Eventos"
-#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_calendar"
msgid "Calendar"
-msgstr "Gestión de calendario"
+msgstr "Calendario"
msgctxt "model:ir.ui.menu,name:menu_calendar_form"
msgid "Calendars"
@@ -551,214 +886,214 @@ msgctxt "model:res.group,name:group_calendar_admin"
msgid "Calendar Administration"
msgstr "Administración de calendario"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid ""
msgstr ""
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Accepted"
msgstr "Aceptada"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Declined"
-msgstr "Rehusado"
+msgstr "Rehusada"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Delegated"
msgstr "Delegada"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Needs Action"
-msgstr "Necesita una acción"
+msgstr "Necesita acción"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Tentative"
msgstr "Tentativa"
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
msgid "Confidential"
msgstr "Confidencial"
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
msgid "Private"
msgstr "Privado"
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
msgid "Public"
msgstr "Público"
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid ""
msgstr ""
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid "Cancelled"
msgstr "Cancelado"
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid "Confirmed"
-msgstr "Confirmada"
+msgstr "Confirmado"
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid "Tentative"
msgstr "Tentativo"
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
msgid "Opaque"
msgstr "Opaco"
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
msgid "Transparent"
msgstr "Transparente"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Daily"
msgstr "Diariamente"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Hourly"
msgstr "Cada hora"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Minutely"
msgstr "Cada minuto"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Monthly"
msgstr "Mensualmente"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Secondly"
msgstr "Cada segundo"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Weekly"
msgstr "Semanalmente"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Yearly"
msgstr "Anualmente"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Friday"
msgstr "Viernes"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Monday"
msgstr "Lunes"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Saturday"
msgstr "Sábado"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Sunday"
msgstr "Domingo"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Thursday"
msgstr "Jueves"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Tuesday"
msgstr "Martes"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Wednesday"
msgstr "Miércoles"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "Calendar"
msgstr "Calendario"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "Calendars"
msgstr "Calendarios"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "General"
msgstr "General"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "Security"
msgstr "Seguridad"
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
msgid "Categories"
msgstr "Categorías"
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
msgid "Category"
msgstr "Categoría"
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
msgid "Attendee"
msgstr "Asistentes"
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
msgid "Attendees"
msgstr "Asistentes"
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
msgid "Exception Date"
msgstr "Fecha excluida"
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
msgid "Exception Dates"
msgstr "Fechas excluidas"
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
msgid "Exception Rule"
msgstr "Regla de excepción"
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
msgid "Exception Rules"
msgstr "Reglas de excepciones"
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
msgid "Recurrence Date"
msgstr "Fecha de recurrencia"
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
msgid "Recurrence Dates"
msgstr "Fechas de recurrencia"
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
msgid "Recurrence Rule"
msgstr "Regla de recurrencia"
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
msgid "Recurrence Rules"
msgstr "Reglas de recurrencia"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Attendees"
msgstr "Asistentes"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Categories"
msgstr "Categorías"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Event"
msgstr "Evento"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Events"
msgstr "Eventos"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "General"
msgstr "General"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Occurences"
msgstr "Ocurrencias"
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
msgid "Location"
msgstr "Ubicación"
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
msgid "Locations"
msgstr "Ubicaciones"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index 69bc39e..19822de 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -2,519 +2,923 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
msgid "A user can have only one calendar!"
msgstr "Un utilisateur ne peut avoir qu'un seul calendrier !"
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
+msgid "A user can have only one calendar!"
+msgstr "Un utilisateur ne peut avoir qu'un seul calendrier !"
+
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique!"
+msgstr "Le nom du calendrier doit être unique !"
+
+msgctxt "error:calendar.calendar:"
msgid "The name of calendar must be unique!"
msgstr "Le nom du calendrier doit être unique !"
-msgctxt "error:calendar.category:0"
+msgctxt "error:calendar.category:"
msgid "The name of calendar category must be unique!"
msgstr "Le nom de la catégorie de calendrier doit être unique"
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.category:"
+msgid "The name of calendar category must be unique!"
+msgstr "Le nom de la catégorie de calendrier doit être unique"
+
+msgctxt "error:calendar.event:"
msgid "Recurrence can not be recurrent!"
msgstr "Une récurrence ne peut pas être récurrente !"
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
+msgid "Recurrence can not be recurrent!"
+msgstr "Une récurrence ne peut pas être récurrente !"
+
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "UUID et récurrence doivent être uniques sur un calendrier !"
+
+msgctxt "error:calendar.event:"
msgid "UUID and recurrence must be unique in a calendar!"
msgstr "UUID et récurrence doivent être uniques sur un calendrier !"
-msgctxt "error:calendar.location:0"
+msgctxt "error:calendar.location:"
msgid "The name of calendar location must be unique!"
msgstr "Le nom de l'emplacement doit être unique !"
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique!"
+msgstr "Le nom de l'emplacement doit être unique !"
+
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Day\""
msgstr "\"Par jour\" invalide"
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Day\""
+msgstr "\"Par jour\" invalide"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Hour\""
+msgstr "\"Par heure\" invalide"
+
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Hour\""
msgstr "\"Par heure\" invalide"
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Minute\""
msgstr "\"Par minute\" invalide"
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Minute\""
+msgstr "\"Par minute\" invalide"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Month Day\""
+msgstr "\"Par jour du mois\" invalide"
+
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Month Day\""
msgstr "\"Par jour du mois\" invalide"
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Month\""
+msgstr "\"Par mois\" invalide"
+
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Month\""
msgstr "\"Par mois\" invalide"
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Position\""
msgstr "\"Par position\" invalide"
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Position\""
+msgstr "\"Par position\" invalide"
+
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Second\""
msgstr "\"Par seconde\" invalide"
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Second\""
+msgstr "\"Par seconde\" invalide"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Week Number\""
+msgstr "\"Par jour de la semaine\" invalide"
+
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Week Number\""
msgstr "\"Par jour de la semaine\" invalide"
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Year Day\""
msgstr "\"Par jour de l'année\" invalide"
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Year Day\""
+msgstr "\"Par jour de l'année\" invalide"
+
+msgctxt "error:calendar.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set!"
+msgstr "\"Date de fin\" et \"Répétitions\" ne peuvent être remplis en même temps !"
+
+msgctxt "error:calendar.rrule:"
msgid "Only one of \"until\" and \"count\" can be set!"
msgstr "\"Date de fin\" et \"Répétitions\" ne peuvent être remplis en même temps !"
-msgctxt "field:calendar.alarm,rec_name:0"
+msgctxt "field:calendar.alarm,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.alarm,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.alarm,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.alarm,valarm:0"
+msgctxt "field:calendar.alarm,valarm:"
msgid "valarm"
msgstr "valarm"
-msgctxt "field:calendar.attendee,attendee:0"
+msgctxt "field:calendar.alarm,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.alarm,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.attendee,attendee:"
msgid "attendee"
msgstr "participant"
-msgctxt "field:calendar.attendee,email:0"
+msgctxt "field:calendar.attendee,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.attendee,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.attendee,email:"
msgid "Email"
msgstr "E-mail"
-msgctxt "field:calendar.attendee,rec_name:0"
+msgctxt "field:calendar.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.attendee,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.attendee,status:0"
+msgctxt "field:calendar.attendee,status:"
msgid "Participation Status"
msgstr "Statut de participation"
-msgctxt "field:calendar.calendar,description:0"
+msgctxt "field:calendar.attendee,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.attendee,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.calendar,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.calendar,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.calendar,description:"
msgid "Description"
msgstr "Description"
-msgctxt "field:calendar.calendar,name:0"
+msgctxt "field:calendar.calendar,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar,name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.calendar,owner:0"
+msgctxt "field:calendar.calendar,owner:"
msgid "Owner"
msgstr "Propriétaire"
-msgctxt "field:calendar.calendar,read_users:0"
+msgctxt "field:calendar.calendar,read_users:"
msgid "Read Users"
msgstr "Utilisateurs en lecture"
-msgctxt "field:calendar.calendar,rec_name:0"
+msgctxt "field:calendar.calendar,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.calendar,write_users:0"
+msgctxt "field:calendar.calendar,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.calendar,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.calendar,write_users:"
msgid "Write Users"
msgstr "Utilisateurs en écriture"
-msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,calendar:"
msgid "Calendar"
msgstr "Calendrier"
-msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-read-res.user,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.calendar-read-res.user,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.calendar-read-res.user,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgctxt "field:calendar.calendar-read-res.user,user:"
msgid "User"
msgstr "Utilisateur"
-msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.calendar-read-res.user,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:"
msgid "Calendar"
msgstr "Calendrier"
-msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-write-res.user,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.calendar-write-res.user,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.calendar-write-res.user,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgctxt "field:calendar.calendar-write-res.user,user:"
msgid "User"
msgstr "Utilisateur"
-msgctxt "field:calendar.category,name:0"
+msgctxt "field:calendar.calendar-write-res.user,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.calendar-write-res.user,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.category,name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.category,rec_name:0"
+msgctxt "field:calendar.category,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.date,date:0"
+msgctxt "field:calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.date,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.date,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.date,date:"
msgid "Is Date"
msgstr "Est une date"
-msgctxt "field:calendar.date,datetime:0"
+msgctxt "field:calendar.date,datetime:"
msgid "Date"
msgstr "Date"
-msgctxt "field:calendar.date,rec_name:0"
+msgctxt "field:calendar.date,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.date,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.event,alarms:0"
+msgctxt "field:calendar.date,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.date,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.event,alarms:"
msgid "Alarms"
msgstr "Alarmes"
-msgctxt "field:calendar.event,all_day:0"
+msgctxt "field:calendar.event,all_day:"
msgid "All Day"
msgstr "Toute la journée"
-msgctxt "field:calendar.event,attendees:0"
+msgctxt "field:calendar.event,attendees:"
msgid "Attendees"
msgstr "Participants"
-msgctxt "field:calendar.event,calendar:0"
+msgctxt "field:calendar.event,calendar:"
msgid "Calendar"
msgstr "Calendrier"
-msgctxt "field:calendar.event,calendar_owner:0"
+msgctxt "field:calendar.event,calendar_owner:"
msgid "Owner"
msgstr "Propriétaire"
-msgctxt "field:calendar.event,calendar_read_users:0"
+msgctxt "field:calendar.event,calendar_read_users:"
msgid "Read Users"
msgstr "Utilisateurs en lecture"
-msgctxt "field:calendar.event,calendar_write_users:0"
+msgctxt "field:calendar.event,calendar_write_users:"
msgid "Write Users"
msgstr "Utilisateurs en écriture"
-msgctxt "field:calendar.event,categories:0"
+msgctxt "field:calendar.event,categories:"
msgid "Categories"
msgstr "Catégories"
-msgctxt "field:calendar.event,classification:0"
+msgctxt "field:calendar.event,classification:"
msgid "Classification"
msgstr "Classification"
-msgctxt "field:calendar.event,description:0"
+msgctxt "field:calendar.event,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.event,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.event,description:"
msgid "Description"
msgstr "Description"
-msgctxt "field:calendar.event,dtend:0"
+msgctxt "field:calendar.event,dtend:"
msgid "End Date"
msgstr "Date de fin"
-msgctxt "field:calendar.event,dtstart:0"
+msgctxt "field:calendar.event,dtstart:"
msgid "Start Date"
msgstr "Date de début"
-msgctxt "field:calendar.event,exdates:0"
+msgctxt "field:calendar.event,exdates:"
msgid "Exception Dates"
msgstr "Dates d'exception"
-msgctxt "field:calendar.event,exrules:0"
+msgctxt "field:calendar.event,exrules:"
msgid "Exception Rules"
msgstr "Règles d'exception"
-msgctxt "field:calendar.event,location:0"
+msgctxt "field:calendar.event,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event,location:"
msgid "Location"
msgstr "Emplacement"
-msgctxt "field:calendar.event,occurences:0"
+msgctxt "field:calendar.event,occurences:"
msgid "Occurences"
msgstr "Occurrences"
-msgctxt "field:calendar.event,organizer:0"
+msgctxt "field:calendar.event,organizer:"
msgid "Organizer"
msgstr "Organisateur"
-msgctxt "field:calendar.event,parent:0"
+msgctxt "field:calendar.event,parent:"
msgid "Parent"
msgstr "Parent"
-msgctxt "field:calendar.event,rdates:0"
+msgctxt "field:calendar.event,rdates:"
msgid "Recurrence Dates"
msgstr "Dates de récurrence"
-msgctxt "field:calendar.event,rec_name:0"
+msgctxt "field:calendar.event,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.event,recurrence:0"
+msgctxt "field:calendar.event,recurrence:"
msgid "Recurrence"
msgstr "Récurrence"
-msgctxt "field:calendar.event,rrules:0"
+msgctxt "field:calendar.event,rrules:"
msgid "Recurrence Rules"
msgstr "Règles de récurrence"
-msgctxt "field:calendar.event,sequence:0"
+msgctxt "field:calendar.event,sequence:"
msgid "Sequence"
msgstr "Séquence"
-msgctxt "field:calendar.event,status:0"
+msgctxt "field:calendar.event,status:"
msgid "Status"
msgstr "Statut"
-msgctxt "field:calendar.event,summary:0"
+msgctxt "field:calendar.event,summary:"
msgid "Summary"
msgstr "Résumé"
-msgctxt "field:calendar.event,timezone:0"
+msgctxt "field:calendar.event,timezone:"
msgid "Timezone"
msgstr "Fuseau Horaire"
-msgctxt "field:calendar.event,transp:0"
+msgctxt "field:calendar.event,transp:"
msgid "Time Transparency"
msgstr "Transparence"
-msgctxt "field:calendar.event,uuid:0"
+msgctxt "field:calendar.event,uuid:"
msgid "UUID"
msgstr "UUID"
-msgctxt "field:calendar.event,vevent:0"
+msgctxt "field:calendar.event,vevent:"
msgid "vevent"
msgstr "vevent"
-msgctxt "field:calendar.event-calendar.category,category:0"
+msgctxt "field:calendar.event,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.event,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.event-calendar.category,category:"
msgid "Category"
msgstr "Catégorie"
-msgctxt "field:calendar.event-calendar.category,event:0"
+msgctxt "field:calendar.event-calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.event-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.event-calendar.category,event:"
msgid "Event"
msgstr "Événement"
-msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgctxt "field:calendar.event-calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event-calendar.category,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgctxt "field:calendar.event-calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.event-calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:"
msgid "Calendar Alarm"
msgstr "Alarme calendrier"
-msgctxt "field:calendar.event.alarm,event:0"
+msgctxt "field:calendar.event.alarm,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.event.alarm,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.event.alarm,event:"
msgid "Event"
msgstr "Événement"
-msgctxt "field:calendar.event.alarm,rec_name:0"
+msgctxt "field:calendar.event.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.alarm,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgctxt "field:calendar.event.alarm,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.event.alarm,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:"
msgid "Calendar Attendee"
msgstr "Participant calendrier"
-msgctxt "field:calendar.event.attendee,event:0"
+msgctxt "field:calendar.event.attendee,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.event.attendee,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.event.attendee,event:"
msgid "Event"
msgstr "Événement"
-msgctxt "field:calendar.event.attendee,rec_name:0"
+msgctxt "field:calendar.event.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.attendee,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgctxt "field:calendar.event.attendee,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.event.attendee,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.event.exdate,calendar_date:"
msgid "Calendar Date"
msgstr "Date calendrier"
-msgctxt "field:calendar.event.exdate,event:0"
+msgctxt "field:calendar.event.exdate,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.event.exdate,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.event.exdate,event:"
msgid "Event"
msgstr "Événement"
-msgctxt "field:calendar.event.exdate,rec_name:0"
+msgctxt "field:calendar.event.exdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.exdate,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgctxt "field:calendar.event.exdate,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.event.exdate,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr "Règle de récurrence"
-msgctxt "field:calendar.event.exrule,event:0"
+msgctxt "field:calendar.event.exrule,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.event.exrule,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.event.exrule,event:"
msgid "Event"
msgstr "Événement"
-msgctxt "field:calendar.event.exrule,rec_name:0"
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.exrule,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgctxt "field:calendar.event.exrule,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.event.exrule,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.event.rdate,calendar_date:"
msgid "Calendar Date"
msgstr "Date calendrier"
-msgctxt "field:calendar.event.rdate,event:0"
+msgctxt "field:calendar.event.rdate,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.event.rdate,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.event.rdate,event:"
msgid "Event"
msgstr "Événement"
-msgctxt "field:calendar.event.rdate,rec_name:0"
+msgctxt "field:calendar.event.rdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.rdate,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgctxt "field:calendar.event.rdate,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.event.rdate,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr "Règle de récurrence"
-msgctxt "field:calendar.event.rrule,event:0"
+msgctxt "field:calendar.event.rrule,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.event.rrule,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.event.rrule,event:"
msgid "Event"
msgstr "Événement"
-msgctxt "field:calendar.event.rrule,rec_name:0"
+msgctxt "field:calendar.event.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.rrule,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.location,name:0"
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.location,name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.location,rec_name:0"
+msgctxt "field:calendar.location,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.rrule,byday:0"
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.location,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.rrule,byday:"
msgid "By Day"
msgstr "Par jour"
-msgctxt "field:calendar.rrule,byhour:0"
+msgctxt "field:calendar.rrule,byhour:"
msgid "By Hour"
msgstr "Par heure"
-msgctxt "field:calendar.rrule,byminute:0"
+msgctxt "field:calendar.rrule,byminute:"
msgid "By Minute"
msgstr "Par minute"
-msgctxt "field:calendar.rrule,bymonth:0"
+msgctxt "field:calendar.rrule,bymonth:"
msgid "By Month"
msgstr "Par mois"
-msgctxt "field:calendar.rrule,bymonthday:0"
+msgctxt "field:calendar.rrule,bymonthday:"
msgid "By Month Day"
msgstr "Par jour du mois"
-msgctxt "field:calendar.rrule,bysecond:0"
+msgctxt "field:calendar.rrule,bysecond:"
msgid "By Second"
msgstr "Par seconde"
-msgctxt "field:calendar.rrule,bysetpos:0"
+msgctxt "field:calendar.rrule,bysetpos:"
msgid "By Position"
msgstr "Par position"
-msgctxt "field:calendar.rrule,byweekno:0"
+msgctxt "field:calendar.rrule,byweekno:"
msgid "By Week Number"
msgstr "Par numéro de semaine"
-msgctxt "field:calendar.rrule,byyearday:0"
+msgctxt "field:calendar.rrule,byyearday:"
msgid "By Year Day"
msgstr "Par jour de l'année"
-msgctxt "field:calendar.rrule,count:0"
+msgctxt "field:calendar.rrule,count:"
msgid "Count"
msgstr "Répétitions"
-msgctxt "field:calendar.rrule,freq:0"
+msgctxt "field:calendar.rrule,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.rrule,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.rrule,freq:"
msgid "Frequency"
msgstr "Fréquence"
-msgctxt "field:calendar.rrule,interval:0"
+msgctxt "field:calendar.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.rrule,interval:"
msgid "Interval"
msgstr "Intervalle"
-msgctxt "field:calendar.rrule,rec_name:0"
+msgctxt "field:calendar.rrule,rec_name:"
msgid "Name"
msgstr "Nom"
-msgctxt "field:calendar.rrule,until:0"
+msgctxt "field:calendar.rrule,until:"
msgid "Until Date"
msgstr "Date de fin"
-msgctxt "field:calendar.rrule,until_date:0"
+msgctxt "field:calendar.rrule,until_date:"
msgid "Is Date"
msgstr "Est une date"
-msgctxt "field:calendar.rrule,wkst:0"
+msgctxt "field:calendar.rrule,wkst:"
msgid "Week Day"
msgstr "Jour de la semaine"
-msgctxt "field:res.user,calendars:0"
+msgctxt "field:calendar.rrule,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.rrule,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:res.user,calendars:"
msgid "Calendars"
msgstr "Calendriers"
-msgctxt "help:calendar.calendar,owner:0"
+msgctxt "help:calendar.calendar,owner:"
msgid "The user must have an email"
msgstr "L'utilisateur doit avoir une adresse mail"
-msgctxt "help:calendar.date,date:0"
+msgctxt "help:calendar.date,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.event,uuid:0"
+msgctxt "help:calendar.event,uuid:"
msgid "Universally Unique Identifier"
msgstr "Identificateur unique universel"
-msgctxt "help:calendar.rrule,until_date:0"
+msgctxt "help:calendar.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.alarm,name:0"
+msgctxt "model:calendar.alarm,name:"
msgid "Alarm"
msgstr "Alarme"
-msgctxt "model:calendar.attendee,name:0"
+msgctxt "model:calendar.attendee,name:"
msgid "Attendee"
msgstr "Participant"
-msgctxt "model:calendar.calendar,name:0"
+msgctxt "model:calendar.calendar,name:"
msgid "Calendar"
msgstr "Calendrier"
-msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgctxt "model:calendar.calendar-read-res.user,name:"
msgid "Calendar - read - User"
msgstr "Calendrier - Lecture - Utilisateur"
-msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgctxt "model:calendar.calendar-write-res.user,name:"
msgid "Calendar - write - User"
msgstr "Calendrier - Écriture - Utilisateur"
-msgctxt "model:calendar.category,name:0"
+msgctxt "model:calendar.category,name:"
msgid "Category"
msgstr "Catégorie"
-msgctxt "model:calendar.date,name:0"
+msgctxt "model:calendar.date,name:"
msgid "Calendar Date"
msgstr "Date calendrier"
-msgctxt "model:calendar.event,name:0"
+msgctxt "model:calendar.event,name:"
msgid "Event"
msgstr "Événement"
-msgctxt "model:calendar.event-calendar.category,name:0"
+msgctxt "model:calendar.event-calendar.category,name:"
msgid "Event - Category"
msgstr "Évenement - Catégorie"
-msgctxt "model:calendar.event.alarm,name:0"
+msgctxt "model:calendar.event.alarm,name:"
msgid "Alarm"
msgstr "Alarme"
-msgctxt "model:calendar.event.attendee,name:0"
+msgctxt "model:calendar.event.attendee,name:"
msgid "Attendee"
msgstr "Participant"
-msgctxt "model:calendar.event.exdate,name:0"
+msgctxt "model:calendar.event.exdate,name:"
msgid "Exception Date"
msgstr "Date d'exception"
-msgctxt "model:calendar.event.exrule,name:0"
+msgctxt "model:calendar.event.exrule,name:"
msgid "Exception Rule"
msgstr "Règle d'exception"
-msgctxt "model:calendar.event.rdate,name:0"
+msgctxt "model:calendar.event.rdate,name:"
msgid "Recurrence Date"
msgstr "Date de récurrence"
-msgctxt "model:calendar.event.rrule,name:0"
+msgctxt "model:calendar.event.rrule,name:"
msgid "Recurrence Rule"
msgstr "Règle de récurrence"
-msgctxt "model:calendar.location,name:0"
+msgctxt "model:calendar.location,name:"
msgid "Location"
msgstr "Emplacement"
-msgctxt "model:calendar.rrule,name:0"
+msgctxt "model:calendar.rrule,name:"
msgid "Recurrence Rule"
msgstr "Règle de récurrence"
@@ -546,214 +950,426 @@ msgctxt "model:res.group,name:group_calendar_admin"
msgid "Calendar Administration"
msgstr "Administration calendrier"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid ""
msgstr ""
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Accepted"
+msgstr "Accepté"
+
+msgctxt "selection:calendar.attendee,status:"
msgid "Accepted"
msgstr "Accepté"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
+msgid "Declined"
+msgstr "Décliné"
+
+msgctxt "selection:calendar.attendee,status:"
msgid "Declined"
msgstr "Décliné"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Delegated"
msgstr "Délégué"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
+msgid "Delegated"
+msgstr "Délégué"
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Needs Action"
+msgstr "Nécessite une action"
+
+msgctxt "selection:calendar.attendee,status:"
msgid "Needs Action"
msgstr "Nécessite une action"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
+msgid "Tentative"
+msgstr "Tentative"
+
+msgctxt "selection:calendar.attendee,status:"
msgid "Tentative"
msgstr "Tentative"
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
msgid "Confidential"
msgstr "Confidentiel"
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
+msgid "Confidential"
+msgstr "Confidentiel"
+
+msgctxt "selection:calendar.event,classification:"
msgid "Private"
msgstr "Privé"
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
+msgid "Private"
+msgstr "Privé"
+
+msgctxt "selection:calendar.event,classification:"
msgid "Public"
msgstr "Publique"
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,classification:"
+msgid "Public"
+msgstr "Publique"
+
+msgctxt "selection:calendar.event,status:"
msgid ""
msgstr ""
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event,status:"
msgid "Cancelled"
msgstr "Annulé"
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
+msgid "Cancelled"
+msgstr "Annulé"
+
+msgctxt "selection:calendar.event,status:"
msgid "Confirmed"
msgstr "Confirmé"
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
+msgid "Confirmed"
+msgstr "Confirmé"
+
+msgctxt "selection:calendar.event,status:"
msgid "Tentative"
msgstr "Tentative"
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,status:"
+msgid "Tentative"
+msgstr "Tentative"
+
+msgctxt "selection:calendar.event,transp:"
+msgid "Opaque"
+msgstr "Opaque"
+
+msgctxt "selection:calendar.event,transp:"
msgid "Opaque"
msgstr "Opaque"
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
msgid "Transparent"
msgstr "transparent"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.event,transp:"
+msgid "Transparent"
+msgstr "transparent"
+
+msgctxt "selection:calendar.rrule,freq:"
msgid "Daily"
msgstr "Journalier"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Daily"
+msgstr "Journalier"
+
+msgctxt "selection:calendar.rrule,freq:"
msgid "Hourly"
msgstr "Horaire"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Hourly"
+msgstr "Horaire"
+
+msgctxt "selection:calendar.rrule,freq:"
msgid "Minutely"
msgstr "Chaque minute"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Minutely"
+msgstr "Chaque minute"
+
+msgctxt "selection:calendar.rrule,freq:"
msgid "Monthly"
msgstr "Mensuel"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Monthly"
+msgstr "Mensuel"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Secondly"
+msgstr "Chaque seconde"
+
+msgctxt "selection:calendar.rrule,freq:"
msgid "Secondly"
msgstr "Chaque seconde"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Weekly"
msgstr "hebdomadaire"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Weekly"
+msgstr "hebdomadaire"
+
+msgctxt "selection:calendar.rrule,freq:"
msgid "Yearly"
msgstr "Annuel"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Yearly"
+msgstr "Annuel"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Friday"
+msgstr "Vendredi"
+
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Friday"
msgstr "Vendredi"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Monday"
msgstr "Lundi"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Monday"
+msgstr "Lundi"
+
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Saturday"
msgstr "Samedi"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Saturday"
+msgstr "Samedi"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Sunday"
+msgstr "Dimanche"
+
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Sunday"
msgstr "Dimanche"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Thursday"
msgstr "Jeudi"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Thursday"
+msgstr "Jeudi"
+
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Tuesday"
msgstr "Mardi"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Mardi"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Mercredi"
+
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Wednesday"
msgstr "Mercredi"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "Calendar"
msgstr "Calendrier"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
+msgid "Calendar"
+msgstr "Calendrier"
+
+msgctxt "view:calendar.calendar:"
+msgid "Calendars"
+msgstr "Calendriers"
+
+msgctxt "view:calendar.calendar:"
msgid "Calendars"
msgstr "Calendriers"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:calendar.calendar:"
msgid "General"
msgstr "Général"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "Security"
msgstr "Sécurité"
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.calendar:"
+msgid "Security"
+msgstr "Sécurité"
+
+msgctxt "view:calendar.category:"
msgid "Categories"
msgstr "Catégories"
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "view:calendar.category:"
+msgid "Category"
+msgstr "Catégorie"
+
+msgctxt "view:calendar.category:"
msgid "Category"
msgstr "Catégorie"
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
msgid "Attendee"
msgstr "Participant"
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
+msgid "Attendee"
+msgstr "Participant"
+
+msgctxt "view:calendar.event.attendee:"
msgid "Attendees"
msgstr "Participants"
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.attendee:"
+msgid "Attendees"
+msgstr "Participants"
+
+msgctxt "view:calendar.event.exdate:"
+msgid "Exception Date"
+msgstr "Date d'exception"
+
+msgctxt "view:calendar.event.exdate:"
msgid "Exception Date"
msgstr "Date d'exception"
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
msgid "Exception Dates"
msgstr "Dates d'exception"
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exdate:"
+msgid "Exception Dates"
+msgstr "Dates d'exception"
+
+msgctxt "view:calendar.event.exrule:"
msgid "Exception Rule"
msgstr "Règle d'exception"
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
+msgid "Exception Rule"
+msgstr "Règle d'exception"
+
+msgctxt "view:calendar.event.exrule:"
+msgid "Exception Rules"
+msgstr "Règles d'exception"
+
+msgctxt "view:calendar.event.exrule:"
msgid "Exception Rules"
msgstr "Règles d'exception"
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
msgid "Recurrence Date"
msgstr "Date de récurrence"
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
+msgid "Recurrence Date"
+msgstr "Date de récurrence"
+
+msgctxt "view:calendar.event.rdate:"
msgid "Recurrence Dates"
msgstr "Dates de récurrence"
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rdate:"
+msgid "Recurrence Dates"
+msgstr "Dates de récurrence"
+
+msgctxt "view:calendar.event.rrule:"
+msgid "Recurrence Rule"
+msgstr "Règle de récurrence"
+
+msgctxt "view:calendar.event.rrule:"
msgid "Recurrence Rule"
msgstr "Règle de récurrence"
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
msgid "Recurrence Rules"
msgstr "Règles de récurrence"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event.rrule:"
+msgid "Recurrence Rules"
+msgstr "Règles de récurrence"
+
+msgctxt "view:calendar.event:"
msgid "Attendees"
msgstr "Participants"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
+msgid "Attendees"
+msgstr "Participants"
+
+msgctxt "view:calendar.event:"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "view:calendar.event:"
msgid "Categories"
msgstr "Catégories"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Event"
msgstr "Événement"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
+msgid "Event"
+msgstr "Événement"
+
+msgctxt "view:calendar.event:"
msgid "Events"
msgstr "Événements"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
+msgid "Events"
+msgstr "Événements"
+
+msgctxt "view:calendar.event:"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:calendar.event:"
msgid "General"
msgstr "Général"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Occurences"
msgstr "Occurrences"
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.event:"
+msgid "Occurences"
+msgstr "Occurrences"
+
+msgctxt "view:calendar.location:"
msgid "Location"
msgstr "Emplacement"
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
+msgid "Location"
+msgstr "Emplacement"
+
+msgctxt "view:calendar.location:"
+msgid "Locations"
+msgstr "Emplacements"
+
+msgctxt "view:calendar.location:"
msgid "Locations"
msgstr "Emplacements"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
index d4aa135..96ff8d9 100644
--- a/locale/nl_NL.po
+++ b/locale/nl_NL.po
@@ -2,552 +2,892 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
msgid "A user can have only one calendar!"
msgstr ""
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
msgid "The name of calendar must be unique!"
msgstr ""
-msgctxt "error:calendar.category:0"
+msgctxt "error:calendar.category:"
msgid "The name of calendar category must be unique!"
msgstr ""
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
msgid "Recurrence can not be recurrent!"
msgstr ""
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
msgid "UUID and recurrence must be unique in a calendar!"
msgstr ""
-msgctxt "error:calendar.location:0"
+msgctxt "error:calendar.location:"
msgid "The name of calendar location must be unique!"
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Day\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Hour\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Minute\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Month Day\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Month\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Position\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Second\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Week Number\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Year Day\""
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Only one of \"until\" and \"count\" can be set!"
msgstr ""
+msgctxt "field:calendar.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.alarm,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.alarm,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.alarm,rec_name:0"
+msgctxt "field:calendar.alarm,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.alarm,valarm:0"
+msgctxt "field:calendar.alarm,valarm:"
msgid "valarm"
msgstr ""
-msgctxt "field:calendar.attendee,attendee:0"
+msgctxt "field:calendar.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.attendee,attendee:"
msgid "attendee"
msgstr ""
+msgctxt "field:calendar.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.attendee,create_uid:"
+msgid "Create User"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.attendee,email:0"
+msgctxt "field:calendar.attendee,email:"
msgid "Email"
msgstr "E-mail"
+msgctxt "field:calendar.attendee,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.attendee,rec_name:0"
+msgctxt "field:calendar.attendee,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.attendee,status:0"
+msgctxt "field:calendar.attendee,status:"
msgid "Participation Status"
msgstr ""
+msgctxt "field:calendar.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar,create_uid:"
+msgid "Create User"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.calendar,description:0"
+msgctxt "field:calendar.calendar,description:"
msgid "Description"
msgstr "Specificatie"
+msgctxt "field:calendar.calendar,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.calendar,name:0"
+msgctxt "field:calendar.calendar,name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.calendar,owner:0"
+msgctxt "field:calendar.calendar,owner:"
msgid "Owner"
msgstr ""
-msgctxt "field:calendar.calendar,read_users:0"
+msgctxt "field:calendar.calendar,read_users:"
msgid "Read Users"
msgstr ""
#, fuzzy
-msgctxt "field:calendar.calendar,rec_name:0"
+msgctxt "field:calendar.calendar,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.calendar,write_users:0"
+msgctxt "field:calendar.calendar,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,write_users:"
msgid "Write Users"
msgstr ""
-msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,calendar:"
msgid "Calendar"
msgstr ""
+msgctxt "field:calendar.calendar-read-res.user,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-read-res.user,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
#, fuzzy
-msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgctxt "field:calendar.calendar-read-res.user,user:"
msgid "User"
msgstr "Gebruiker"
-msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:"
msgid "Calendar"
msgstr ""
+msgctxt "field:calendar.calendar-write-res.user,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-write-res.user,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
#, fuzzy
-msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgctxt "field:calendar.calendar-write-res.user,user:"
msgid "User"
msgstr "Gebruiker"
+msgctxt "field:calendar.calendar-write-res.user,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.category,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.category,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.category,name:0"
+msgctxt "field:calendar.category,name:"
msgid "Name"
msgstr "Naam bijlage"
#, fuzzy
-msgctxt "field:calendar.category,rec_name:0"
+msgctxt "field:calendar.category,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.date,date:0"
+msgctxt "field:calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.date,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.date,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.date,date:"
msgid "Is Date"
msgstr ""
#, fuzzy
-msgctxt "field:calendar.date,datetime:0"
+msgctxt "field:calendar.date,datetime:"
msgid "Date"
msgstr "Vervaldatum"
+msgctxt "field:calendar.date,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.date,rec_name:0"
+msgctxt "field:calendar.date,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.event,alarms:0"
+msgctxt "field:calendar.date,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.date,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event,alarms:"
msgid "Alarms"
msgstr ""
-msgctxt "field:calendar.event,all_day:0"
+msgctxt "field:calendar.event,all_day:"
msgid "All Day"
msgstr ""
-msgctxt "field:calendar.event,attendees:0"
+msgctxt "field:calendar.event,attendees:"
msgid "Attendees"
msgstr ""
-msgctxt "field:calendar.event,calendar:0"
+msgctxt "field:calendar.event,calendar:"
msgid "Calendar"
msgstr ""
-msgctxt "field:calendar.event,calendar_owner:0"
+msgctxt "field:calendar.event,calendar_owner:"
msgid "Owner"
msgstr ""
-msgctxt "field:calendar.event,calendar_read_users:0"
+msgctxt "field:calendar.event,calendar_read_users:"
msgid "Read Users"
msgstr ""
-msgctxt "field:calendar.event,calendar_write_users:0"
+msgctxt "field:calendar.event,calendar_write_users:"
msgid "Write Users"
msgstr ""
#, fuzzy
-msgctxt "field:calendar.event,categories:0"
+msgctxt "field:calendar.event,categories:"
msgid "Categories"
msgstr "Categorieën"
-msgctxt "field:calendar.event,classification:0"
+msgctxt "field:calendar.event,classification:"
msgid "Classification"
msgstr ""
+msgctxt "field:calendar.event,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event,create_uid:"
+msgid "Create User"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.event,description:0"
+msgctxt "field:calendar.event,description:"
msgid "Description"
msgstr "Specificatie"
#, fuzzy
-msgctxt "field:calendar.event,dtend:0"
+msgctxt "field:calendar.event,dtend:"
msgid "End Date"
msgstr "Eind datum"
#, fuzzy
-msgctxt "field:calendar.event,dtstart:0"
+msgctxt "field:calendar.event,dtstart:"
msgid "Start Date"
msgstr "Start datum"
-msgctxt "field:calendar.event,exdates:0"
+msgctxt "field:calendar.event,exdates:"
msgid "Exception Dates"
msgstr ""
-msgctxt "field:calendar.event,exrules:0"
+msgctxt "field:calendar.event,exrules:"
msgid "Exception Rules"
msgstr ""
-msgctxt "field:calendar.event,location:0"
+msgctxt "field:calendar.event,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event,location:"
msgid "Location"
msgstr ""
-msgctxt "field:calendar.event,occurences:0"
+msgctxt "field:calendar.event,occurences:"
msgid "Occurences"
msgstr ""
-msgctxt "field:calendar.event,organizer:0"
+msgctxt "field:calendar.event,organizer:"
msgid "Organizer"
msgstr ""
#, fuzzy
-msgctxt "field:calendar.event,parent:0"
+msgctxt "field:calendar.event,parent:"
msgid "Parent"
msgstr "Bovenliggend niveau"
-msgctxt "field:calendar.event,rdates:0"
+msgctxt "field:calendar.event,rdates:"
msgid "Recurrence Dates"
msgstr ""
#, fuzzy
-msgctxt "field:calendar.event,rec_name:0"
+msgctxt "field:calendar.event,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.event,recurrence:0"
+msgctxt "field:calendar.event,recurrence:"
msgid "Recurrence"
msgstr ""
-msgctxt "field:calendar.event,rrules:0"
+msgctxt "field:calendar.event,rrules:"
msgid "Recurrence Rules"
msgstr ""
#, fuzzy
-msgctxt "field:calendar.event,sequence:0"
+msgctxt "field:calendar.event,sequence:"
msgid "Sequence"
msgstr "Reeks"
-msgctxt "field:calendar.event,status:0"
+msgctxt "field:calendar.event,status:"
msgid "Status"
msgstr ""
-msgctxt "field:calendar.event,summary:0"
+msgctxt "field:calendar.event,summary:"
msgid "Summary"
msgstr ""
-msgctxt "field:calendar.event,timezone:0"
+msgctxt "field:calendar.event,timezone:"
msgid "Timezone"
msgstr ""
-msgctxt "field:calendar.event,transp:0"
+msgctxt "field:calendar.event,transp:"
msgid "Time Transparency"
msgstr ""
-msgctxt "field:calendar.event,uuid:0"
+msgctxt "field:calendar.event,uuid:"
msgid "UUID"
msgstr ""
-msgctxt "field:calendar.event,vevent:0"
+msgctxt "field:calendar.event,vevent:"
msgid "vevent"
msgstr ""
+msgctxt "field:calendar.event,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event,write_uid:"
+msgid "Write User"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.event-calendar.category,category:0"
+msgctxt "field:calendar.event-calendar.category,category:"
msgid "Category"
msgstr "Categorie"
-msgctxt "field:calendar.event-calendar.category,event:0"
+msgctxt "field:calendar.event-calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,event:"
msgid "Event"
msgstr ""
+msgctxt "field:calendar.event-calendar.category,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgctxt "field:calendar.event-calendar.category,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgctxt "field:calendar.event-calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:"
msgid "Calendar Alarm"
msgstr ""
-msgctxt "field:calendar.event.alarm,event:0"
+msgctxt "field:calendar.event.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,event:"
msgid "Event"
msgstr ""
+msgctxt "field:calendar.event.alarm,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.event.alarm,rec_name:0"
+msgctxt "field:calendar.event.alarm,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgctxt "field:calendar.event.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:"
msgid "Calendar Attendee"
msgstr ""
-msgctxt "field:calendar.event.attendee,event:0"
+msgctxt "field:calendar.event.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,event:"
msgid "Event"
msgstr ""
+msgctxt "field:calendar.event.attendee,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.event.attendee,rec_name:0"
+msgctxt "field:calendar.event.attendee,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgctxt "field:calendar.event.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,calendar_date:"
msgid "Calendar Date"
msgstr ""
-msgctxt "field:calendar.event.exdate,event:0"
+msgctxt "field:calendar.event.exdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,event:"
msgid "Event"
msgstr ""
+msgctxt "field:calendar.event.exdate,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.event.exdate,rec_name:0"
+msgctxt "field:calendar.event.exdate,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgctxt "field:calendar.event.exdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr ""
-msgctxt "field:calendar.event.exrule,event:0"
+msgctxt "field:calendar.event.exrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,event:"
msgid "Event"
msgstr ""
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.event.exrule,rec_name:0"
+msgctxt "field:calendar.event.exrule,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgctxt "field:calendar.event.exrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,calendar_date:"
msgid "Calendar Date"
msgstr ""
-msgctxt "field:calendar.event.rdate,event:0"
+msgctxt "field:calendar.event.rdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,event:"
msgid "Event"
msgstr ""
+msgctxt "field:calendar.event.rdate,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.event.rdate,rec_name:0"
+msgctxt "field:calendar.event.rdate,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgctxt "field:calendar.event.rdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr ""
-msgctxt "field:calendar.event.rrule,event:0"
+msgctxt "field:calendar.event.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,event:"
msgid "Event"
msgstr ""
+msgctxt "field:calendar.event.rrule,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.event.rrule,rec_name:0"
+msgctxt "field:calendar.event.rrule,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr ""
+
#, fuzzy
-msgctxt "field:calendar.location,name:0"
+msgctxt "field:calendar.location,name:"
msgid "Name"
msgstr "Naam bijlage"
#, fuzzy
-msgctxt "field:calendar.location,rec_name:0"
+msgctxt "field:calendar.location,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.rrule,byday:0"
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.location,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byday:"
msgid "By Day"
msgstr ""
-msgctxt "field:calendar.rrule,byhour:0"
+msgctxt "field:calendar.rrule,byhour:"
msgid "By Hour"
msgstr ""
-msgctxt "field:calendar.rrule,byminute:0"
+msgctxt "field:calendar.rrule,byminute:"
msgid "By Minute"
msgstr ""
-msgctxt "field:calendar.rrule,bymonth:0"
+msgctxt "field:calendar.rrule,bymonth:"
msgid "By Month"
msgstr ""
-msgctxt "field:calendar.rrule,bymonthday:0"
+msgctxt "field:calendar.rrule,bymonthday:"
msgid "By Month Day"
msgstr ""
-msgctxt "field:calendar.rrule,bysecond:0"
+msgctxt "field:calendar.rrule,bysecond:"
msgid "By Second"
msgstr ""
-msgctxt "field:calendar.rrule,bysetpos:0"
+msgctxt "field:calendar.rrule,bysetpos:"
msgid "By Position"
msgstr ""
-msgctxt "field:calendar.rrule,byweekno:0"
+msgctxt "field:calendar.rrule,byweekno:"
msgid "By Week Number"
msgstr ""
-msgctxt "field:calendar.rrule,byyearday:0"
+msgctxt "field:calendar.rrule,byyearday:"
msgid "By Year Day"
msgstr ""
-msgctxt "field:calendar.rrule,count:0"
+msgctxt "field:calendar.rrule,count:"
msgid "Count"
msgstr ""
-msgctxt "field:calendar.rrule,freq:0"
+msgctxt "field:calendar.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.rrule,freq:"
msgid "Frequency"
msgstr ""
-msgctxt "field:calendar.rrule,interval:0"
+msgctxt "field:calendar.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.rrule,interval:"
msgid "Interval"
msgstr ""
#, fuzzy
-msgctxt "field:calendar.rrule,rec_name:0"
+msgctxt "field:calendar.rrule,rec_name:"
msgid "Name"
msgstr "Naam bijlage"
-msgctxt "field:calendar.rrule,until:0"
+msgctxt "field:calendar.rrule,until:"
msgid "Until Date"
msgstr ""
-msgctxt "field:calendar.rrule,until_date:0"
+msgctxt "field:calendar.rrule,until_date:"
msgid "Is Date"
msgstr ""
-msgctxt "field:calendar.rrule,wkst:0"
+msgctxt "field:calendar.rrule,wkst:"
msgid "Week Day"
msgstr ""
-msgctxt "field:res.user,calendars:0"
+msgctxt "field:calendar.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:res.user,calendars:"
msgid "Calendars"
msgstr ""
-msgctxt "help:calendar.calendar,owner:0"
+msgctxt "help:calendar.calendar,owner:"
msgid "The user must have an email"
msgstr ""
-msgctxt "help:calendar.date,date:0"
+msgctxt "help:calendar.date,date:"
msgid "Ignore time of field \"Date\", but handle as date only."
msgstr ""
-msgctxt "help:calendar.event,uuid:0"
+msgctxt "help:calendar.event,uuid:"
msgid "Universally Unique Identifier"
msgstr ""
-msgctxt "help:calendar.rrule,until_date:0"
+msgctxt "help:calendar.rrule,until_date:"
msgid "Ignore time of field \"Until Date\", but handle as date only."
msgstr ""
-msgctxt "model:calendar.alarm,name:0"
+msgctxt "model:calendar.alarm,name:"
msgid "Alarm"
msgstr ""
-msgctxt "model:calendar.attendee,name:0"
+msgctxt "model:calendar.attendee,name:"
msgid "Attendee"
msgstr ""
-msgctxt "model:calendar.calendar,name:0"
+msgctxt "model:calendar.calendar,name:"
msgid "Calendar"
msgstr ""
-msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgctxt "model:calendar.calendar-read-res.user,name:"
msgid "Calendar - read - User"
msgstr ""
-msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgctxt "model:calendar.calendar-write-res.user,name:"
msgid "Calendar - write - User"
msgstr ""
#, fuzzy
-msgctxt "model:calendar.category,name:0"
+msgctxt "model:calendar.category,name:"
msgid "Category"
msgstr "Categorie"
-msgctxt "model:calendar.date,name:0"
+msgctxt "model:calendar.date,name:"
msgid "Calendar Date"
msgstr ""
-msgctxt "model:calendar.event,name:0"
+msgctxt "model:calendar.event,name:"
msgid "Event"
msgstr ""
-msgctxt "model:calendar.event-calendar.category,name:0"
+msgctxt "model:calendar.event-calendar.category,name:"
msgid "Event - Category"
msgstr ""
-msgctxt "model:calendar.event.alarm,name:0"
+msgctxt "model:calendar.event.alarm,name:"
msgid "Alarm"
msgstr ""
-msgctxt "model:calendar.event.attendee,name:0"
+msgctxt "model:calendar.event.attendee,name:"
msgid "Attendee"
msgstr ""
-msgctxt "model:calendar.event.exdate,name:0"
+msgctxt "model:calendar.event.exdate,name:"
msgid "Exception Date"
msgstr ""
-msgctxt "model:calendar.event.exrule,name:0"
+msgctxt "model:calendar.event.exrule,name:"
msgid "Exception Rule"
msgstr ""
-msgctxt "model:calendar.event.rdate,name:0"
+msgctxt "model:calendar.event.rdate,name:"
msgid "Recurrence Date"
msgstr ""
-msgctxt "model:calendar.event.rrule,name:0"
+msgctxt "model:calendar.event.rrule,name:"
msgid "Recurrence Rule"
msgstr ""
-msgctxt "model:calendar.location,name:0"
+msgctxt "model:calendar.location,name:"
msgid "Location"
msgstr ""
-msgctxt "model:calendar.rrule,name:0"
+msgctxt "model:calendar.rrule,name:"
msgid "Recurrence Rule"
msgstr ""
@@ -579,220 +919,220 @@ msgctxt "model:res.group,name:group_calendar_admin"
msgid "Calendar Administration"
msgstr ""
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid ""
msgstr ""
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Accepted"
msgstr ""
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Declined"
msgstr ""
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Delegated"
msgstr ""
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Needs Action"
msgstr ""
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Tentative"
msgstr ""
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
msgid "Confidential"
msgstr ""
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
msgid "Private"
msgstr ""
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
msgid "Public"
msgstr ""
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid ""
msgstr ""
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid "Cancelled"
msgstr ""
#, fuzzy
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid "Confirmed"
msgstr "Bevestigd"
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid "Tentative"
msgstr ""
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
msgid "Opaque"
msgstr ""
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
msgid "Transparent"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Daily"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Hourly"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Minutely"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Monthly"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Secondly"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Weekly"
msgstr ""
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Yearly"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Friday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Monday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Saturday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Sunday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Thursday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Tuesday"
msgstr ""
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Wednesday"
msgstr ""
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "Calendar"
msgstr ""
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "Calendars"
msgstr ""
#, fuzzy
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "General"
msgstr "Algemeen"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "Security"
msgstr ""
#, fuzzy
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
msgid "Categories"
msgstr "Categorieën"
#, fuzzy
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
msgid "Category"
msgstr "Categorie"
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
msgid "Attendee"
msgstr ""
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
msgid "Attendees"
msgstr ""
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
msgid "Exception Date"
msgstr ""
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
msgid "Exception Dates"
msgstr ""
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
msgid "Exception Rule"
msgstr ""
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
msgid "Exception Rules"
msgstr ""
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
msgid "Recurrence Date"
msgstr ""
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
msgid "Recurrence Dates"
msgstr ""
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
msgid "Recurrence Rule"
msgstr ""
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
msgid "Recurrence Rules"
msgstr ""
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Attendees"
msgstr ""
#, fuzzy
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Categories"
msgstr "Categorieën"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Event"
msgstr ""
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Events"
msgstr ""
#, fuzzy
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "General"
msgstr "Algemeen"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Occurences"
msgstr ""
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
msgid "Location"
msgstr ""
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
msgid "Locations"
msgstr ""
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
index 0ab492d..4c2e639 100644
--- a/locale/ru_RU.po
+++ b/locale/ru_RU.po
@@ -2,519 +2,859 @@
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
msgid "A user can have only one calendar!"
msgstr "Пользователь может иметь только Один календарь!"
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
msgid "The name of calendar must be unique!"
msgstr "Имя календаря должно быть уникально"
-msgctxt "error:calendar.category:0"
+msgctxt "error:calendar.category:"
msgid "The name of calendar category must be unique!"
msgstr ""
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
msgid "Recurrence can not be recurrent!"
msgstr ""
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
msgid "UUID and recurrence must be unique in a calendar!"
msgstr ""
-msgctxt "error:calendar.location:0"
+msgctxt "error:calendar.location:"
msgid "The name of calendar location must be unique!"
msgstr ""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Day\""
msgstr "Неверное поле \"По дням\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Hour\""
msgstr "Неверное поле \"По часам\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Minute\""
msgstr "Неверное поле \"По минутам\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Month Day\""
msgstr "Неверное поле \"По дням месяца\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Month\""
msgstr "Неверное поле \"По месяцам\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Position\""
msgstr "Неверное поле \"По позиции\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Second\""
msgstr "Неверное поле \"По секундам\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Week Number\""
msgstr "Неверное поле \"По номерам недель\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Invalid \"By Year Day\""
msgstr "Неверный \"По дням года\""
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
msgid "Only one of \"until\" and \"count\" can be set!"
msgstr ""
-msgctxt "field:calendar.alarm,rec_name:0"
+msgctxt "field:calendar.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.alarm,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.alarm,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.alarm,valarm:0"
+msgctxt "field:calendar.alarm,valarm:"
msgid "valarm"
msgstr ""
-msgctxt "field:calendar.attendee,attendee:0"
+msgctxt "field:calendar.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.attendee,attendee:"
msgid "attendee"
msgstr "участник"
-msgctxt "field:calendar.attendee,email:0"
+msgctxt "field:calendar.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.attendee,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.attendee,email:"
msgid "Email"
msgstr "Эл.почта"
-msgctxt "field:calendar.attendee,rec_name:0"
+msgctxt "field:calendar.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.attendee,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.attendee,status:0"
+msgctxt "field:calendar.attendee,status:"
msgid "Participation Status"
msgstr "Статус участия"
-msgctxt "field:calendar.calendar,description:0"
+msgctxt "field:calendar.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,description:"
msgid "Description"
msgstr "Описание"
-msgctxt "field:calendar.calendar,name:0"
+msgctxt "field:calendar.calendar,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar,name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.calendar,owner:0"
+msgctxt "field:calendar.calendar,owner:"
msgid "Owner"
msgstr "Владелец"
-msgctxt "field:calendar.calendar,read_users:0"
+msgctxt "field:calendar.calendar,read_users:"
msgid "Read Users"
msgstr "Пользователи могут читать"
-msgctxt "field:calendar.calendar,rec_name:0"
+msgctxt "field:calendar.calendar,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.calendar,write_users:0"
+msgctxt "field:calendar.calendar,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,write_users:"
msgid "Write Users"
msgstr "Пользователи могут писать"
-msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,calendar:"
msgid "Calendar"
msgstr "Календар"
-msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-read-res.user,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgctxt "field:calendar.calendar-read-res.user,user:"
msgid "User"
msgstr "Пользователь"
-msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:"
msgid "Calendar"
msgstr "Календарь"
-msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-write-res.user,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgctxt "field:calendar.calendar-write-res.user,user:"
msgid "User"
msgstr "Пользователь"
-msgctxt "field:calendar.category,name:0"
+msgctxt "field:calendar.calendar-write-res.user,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.category,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.category,name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.category,rec_name:0"
+msgctxt "field:calendar.category,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.date,date:0"
+msgctxt "field:calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.date,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.date,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.date,date:"
msgid "Is Date"
msgstr "Весь день"
-msgctxt "field:calendar.date,datetime:0"
+msgctxt "field:calendar.date,datetime:"
msgid "Date"
msgstr "Дата"
-msgctxt "field:calendar.date,rec_name:0"
+msgctxt "field:calendar.date,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.date,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.event,alarms:0"
+msgctxt "field:calendar.date,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.date,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event,alarms:"
msgid "Alarms"
msgstr "Вызовы"
-msgctxt "field:calendar.event,all_day:0"
+msgctxt "field:calendar.event,all_day:"
msgid "All Day"
msgstr "Все дни"
-msgctxt "field:calendar.event,attendees:0"
+msgctxt "field:calendar.event,attendees:"
msgid "Attendees"
msgstr "Участники"
-msgctxt "field:calendar.event,calendar:0"
+msgctxt "field:calendar.event,calendar:"
msgid "Calendar"
msgstr "Календарь"
-msgctxt "field:calendar.event,calendar_owner:0"
+msgctxt "field:calendar.event,calendar_owner:"
msgid "Owner"
msgstr "Владелец"
-msgctxt "field:calendar.event,calendar_read_users:0"
+msgctxt "field:calendar.event,calendar_read_users:"
msgid "Read Users"
msgstr "Пользователи могут читать"
-msgctxt "field:calendar.event,calendar_write_users:0"
+msgctxt "field:calendar.event,calendar_write_users:"
msgid "Write Users"
msgstr "Пользователи могут писать"
-msgctxt "field:calendar.event,categories:0"
+msgctxt "field:calendar.event,categories:"
msgid "Categories"
msgstr "Категория"
-msgctxt "field:calendar.event,classification:0"
+msgctxt "field:calendar.event,classification:"
msgid "Classification"
msgstr "Классификация"
-msgctxt "field:calendar.event,description:0"
+msgctxt "field:calendar.event,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event,description:"
msgid "Description"
msgstr "Описание"
-msgctxt "field:calendar.event,dtend:0"
+msgctxt "field:calendar.event,dtend:"
msgid "End Date"
msgstr "Дата окончания"
-msgctxt "field:calendar.event,dtstart:0"
+msgctxt "field:calendar.event,dtstart:"
msgid "Start Date"
msgstr "Дата начала"
-msgctxt "field:calendar.event,exdates:0"
+msgctxt "field:calendar.event,exdates:"
msgid "Exception Dates"
msgstr "Дата исключения"
-msgctxt "field:calendar.event,exrules:0"
+msgctxt "field:calendar.event,exrules:"
msgid "Exception Rules"
msgstr "Правила исключения"
-msgctxt "field:calendar.event,location:0"
+msgctxt "field:calendar.event,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event,location:"
msgid "Location"
msgstr "Местоположение"
-msgctxt "field:calendar.event,occurences:0"
+msgctxt "field:calendar.event,occurences:"
msgid "Occurences"
msgstr "Дополнительные задачи"
-msgctxt "field:calendar.event,organizer:0"
+msgctxt "field:calendar.event,organizer:"
msgid "Organizer"
msgstr "Организатор"
-msgctxt "field:calendar.event,parent:0"
+msgctxt "field:calendar.event,parent:"
msgid "Parent"
msgstr "Основной"
-msgctxt "field:calendar.event,rdates:0"
+msgctxt "field:calendar.event,rdates:"
msgid "Recurrence Dates"
msgstr "Даты повторения"
-msgctxt "field:calendar.event,rec_name:0"
+msgctxt "field:calendar.event,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.event,recurrence:0"
+msgctxt "field:calendar.event,recurrence:"
msgid "Recurrence"
msgstr "Повторение"
-msgctxt "field:calendar.event,rrules:0"
+msgctxt "field:calendar.event,rrules:"
msgid "Recurrence Rules"
msgstr "Правила повторения"
-msgctxt "field:calendar.event,sequence:0"
+msgctxt "field:calendar.event,sequence:"
msgid "Sequence"
msgstr "Последовательность"
-msgctxt "field:calendar.event,status:0"
+msgctxt "field:calendar.event,status:"
msgid "Status"
msgstr "Состояние"
-msgctxt "field:calendar.event,summary:0"
+msgctxt "field:calendar.event,summary:"
msgid "Summary"
msgstr "Резюме"
-msgctxt "field:calendar.event,timezone:0"
+msgctxt "field:calendar.event,timezone:"
msgid "Timezone"
msgstr "Зона времени"
-msgctxt "field:calendar.event,transp:0"
+msgctxt "field:calendar.event,transp:"
msgid "Time Transparency"
msgstr "Время Прозрачность"
-msgctxt "field:calendar.event,uuid:0"
+msgctxt "field:calendar.event,uuid:"
msgid "UUID"
msgstr ""
-msgctxt "field:calendar.event,vevent:0"
+msgctxt "field:calendar.event,vevent:"
msgid "vevent"
msgstr ""
-msgctxt "field:calendar.event-calendar.category,category:0"
+msgctxt "field:calendar.event,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,category:"
msgid "Category"
msgstr "Категории"
-msgctxt "field:calendar.event-calendar.category,event:0"
+msgctxt "field:calendar.event-calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,event:"
msgid "Event"
msgstr "Событие"
-msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgctxt "field:calendar.event-calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgctxt "field:calendar.event-calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:"
msgid "Calendar Alarm"
msgstr "Сигнала календаря"
-msgctxt "field:calendar.event.alarm,event:0"
+msgctxt "field:calendar.event.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,event:"
msgid "Event"
msgstr "Событие"
-msgctxt "field:calendar.event.alarm,rec_name:0"
+msgctxt "field:calendar.event.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgctxt "field:calendar.event.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:"
msgid "Calendar Attendee"
msgstr "Календарь участников"
-msgctxt "field:calendar.event.attendee,event:0"
+msgctxt "field:calendar.event.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,event:"
msgid "Event"
msgstr "Событие"
-msgctxt "field:calendar.event.attendee,rec_name:0"
+msgctxt "field:calendar.event.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgctxt "field:calendar.event.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,calendar_date:"
msgid "Calendar Date"
msgstr "День календаря"
-msgctxt "field:calendar.event.exdate,event:0"
+msgctxt "field:calendar.event.exdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,event:"
msgid "Event"
msgstr "Событие"
-msgctxt "field:calendar.event.exdate,rec_name:0"
+msgctxt "field:calendar.event.exdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgctxt "field:calendar.event.exdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr "Правила календаря"
-msgctxt "field:calendar.event.exrule,event:0"
+msgctxt "field:calendar.event.exrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,event:"
msgid "Event"
msgstr "Событие"
-msgctxt "field:calendar.event.exrule,rec_name:0"
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgctxt "field:calendar.event.exrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,calendar_date:"
msgid "Calendar Date"
msgstr "День календаря"
-msgctxt "field:calendar.event.rdate,event:0"
+msgctxt "field:calendar.event.rdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,event:"
msgid "Event"
msgstr "Событие"
-msgctxt "field:calendar.event.rdate,rec_name:0"
+msgctxt "field:calendar.event.rdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgctxt "field:calendar.event.rdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:"
msgid "Calendar RRule"
msgstr "Правила календаря"
-msgctxt "field:calendar.event.rrule,event:0"
+msgctxt "field:calendar.event.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,event:"
msgid "Event"
msgstr "Событие"
-msgctxt "field:calendar.event.rrule,rec_name:0"
+msgctxt "field:calendar.event.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.location,name:0"
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.location,name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.location,rec_name:0"
+msgctxt "field:calendar.location,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.rrule,byday:0"
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.location,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byday:"
msgid "By Day"
msgstr "По дням"
-msgctxt "field:calendar.rrule,byhour:0"
+msgctxt "field:calendar.rrule,byhour:"
msgid "By Hour"
msgstr "По часам"
-msgctxt "field:calendar.rrule,byminute:0"
+msgctxt "field:calendar.rrule,byminute:"
msgid "By Minute"
msgstr "По минутам"
-msgctxt "field:calendar.rrule,bymonth:0"
+msgctxt "field:calendar.rrule,bymonth:"
msgid "By Month"
msgstr "По месячно"
-msgctxt "field:calendar.rrule,bymonthday:0"
+msgctxt "field:calendar.rrule,bymonthday:"
msgid "By Month Day"
msgstr "По дням месяца"
-msgctxt "field:calendar.rrule,bysecond:0"
+msgctxt "field:calendar.rrule,bysecond:"
msgid "By Second"
msgstr "По секундам"
-msgctxt "field:calendar.rrule,bysetpos:0"
+msgctxt "field:calendar.rrule,bysetpos:"
msgid "By Position"
msgstr "По позиции"
-msgctxt "field:calendar.rrule,byweekno:0"
+msgctxt "field:calendar.rrule,byweekno:"
msgid "By Week Number"
msgstr "По номерам недель"
-msgctxt "field:calendar.rrule,byyearday:0"
+msgctxt "field:calendar.rrule,byyearday:"
msgid "By Year Day"
msgstr "По дням года"
-msgctxt "field:calendar.rrule,count:0"
+msgctxt "field:calendar.rrule,count:"
msgid "Count"
msgstr "Количество"
-msgctxt "field:calendar.rrule,freq:0"
+msgctxt "field:calendar.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.rrule,freq:"
msgid "Frequency"
msgstr "Частота"
-msgctxt "field:calendar.rrule,interval:0"
+msgctxt "field:calendar.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.rrule,interval:"
msgid "Interval"
msgstr "Внутренний"
-msgctxt "field:calendar.rrule,rec_name:0"
+msgctxt "field:calendar.rrule,rec_name:"
msgid "Name"
msgstr "Наименование"
-msgctxt "field:calendar.rrule,until:0"
+msgctxt "field:calendar.rrule,until:"
msgid "Until Date"
msgstr "До даты"
-msgctxt "field:calendar.rrule,until_date:0"
+msgctxt "field:calendar.rrule,until_date:"
msgid "Is Date"
msgstr "Весь день"
-msgctxt "field:calendar.rrule,wkst:0"
+msgctxt "field:calendar.rrule,wkst:"
msgid "Week Day"
msgstr "День недели"
-msgctxt "field:res.user,calendars:0"
+msgctxt "field:calendar.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:res.user,calendars:"
msgid "Calendars"
msgstr "Календари"
-msgctxt "help:calendar.calendar,owner:0"
+msgctxt "help:calendar.calendar,owner:"
msgid "The user must have an email"
msgstr ""
-msgctxt "help:calendar.date,date:0"
+msgctxt "help:calendar.date,date:"
msgid "Ignore time of field \"Date\", but handle as date only."
msgstr "Время игнорируется в поле \"Дата\", действует только дата"
-msgctxt "help:calendar.event,uuid:0"
+msgctxt "help:calendar.event,uuid:"
msgid "Universally Unique Identifier"
msgstr "Универсальный уникальный идентификатор"
-msgctxt "help:calendar.rrule,until_date:0"
+msgctxt "help:calendar.rrule,until_date:"
msgid "Ignore time of field \"Until Date\", but handle as date only."
msgstr "Время игнорируется в поле \"До даты\", действует только дата"
-msgctxt "model:calendar.alarm,name:0"
+msgctxt "model:calendar.alarm,name:"
msgid "Alarm"
msgstr "Вызов"
-msgctxt "model:calendar.attendee,name:0"
+msgctxt "model:calendar.attendee,name:"
msgid "Attendee"
msgstr "Участник"
-msgctxt "model:calendar.calendar,name:0"
+msgctxt "model:calendar.calendar,name:"
msgid "Calendar"
msgstr "Календарь"
-msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgctxt "model:calendar.calendar-read-res.user,name:"
msgid "Calendar - read - User"
msgstr "Пользователи могут читать"
-msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgctxt "model:calendar.calendar-write-res.user,name:"
msgid "Calendar - write - User"
msgstr "Пользователи могут писать"
-msgctxt "model:calendar.category,name:0"
+msgctxt "model:calendar.category,name:"
msgid "Category"
msgstr "Категории"
-msgctxt "model:calendar.date,name:0"
+msgctxt "model:calendar.date,name:"
msgid "Calendar Date"
msgstr "День календаря"
-msgctxt "model:calendar.event,name:0"
+msgctxt "model:calendar.event,name:"
msgid "Event"
msgstr "Событие"
-msgctxt "model:calendar.event-calendar.category,name:0"
+msgctxt "model:calendar.event-calendar.category,name:"
msgid "Event - Category"
msgstr "Категории - События"
-msgctxt "model:calendar.event.alarm,name:0"
+msgctxt "model:calendar.event.alarm,name:"
msgid "Alarm"
msgstr "Вызов"
-msgctxt "model:calendar.event.attendee,name:0"
+msgctxt "model:calendar.event.attendee,name:"
msgid "Attendee"
msgstr "Участник"
-msgctxt "model:calendar.event.exdate,name:0"
+msgctxt "model:calendar.event.exdate,name:"
msgid "Exception Date"
msgstr "Дата исключения"
-msgctxt "model:calendar.event.exrule,name:0"
+msgctxt "model:calendar.event.exrule,name:"
msgid "Exception Rule"
msgstr "Правило исключения"
-msgctxt "model:calendar.event.rdate,name:0"
+msgctxt "model:calendar.event.rdate,name:"
msgid "Recurrence Date"
msgstr "Даты повторения"
-msgctxt "model:calendar.event.rrule,name:0"
+msgctxt "model:calendar.event.rrule,name:"
msgid "Recurrence Rule"
msgstr "Правила повторения"
-msgctxt "model:calendar.location,name:0"
+msgctxt "model:calendar.location,name:"
msgid "Location"
msgstr "Местоположение"
-msgctxt "model:calendar.rrule,name:0"
+msgctxt "model:calendar.rrule,name:"
msgid "Recurrence Rule"
msgstr "Правила повторения"
@@ -549,216 +889,214 @@ msgctxt "model:res.group,name:group_calendar_admin"
msgid "Calendar Administration"
msgstr "Управление календарем"
-#, fuzzy
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid ""
-msgstr "Резервный счет"
+msgstr ""
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Accepted"
msgstr "Подтверждено"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Declined"
msgstr "Отклонено"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Delegated"
msgstr "Делегировано"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Needs Action"
msgstr "Требуется действие"
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
msgid "Tentative"
msgstr "Предварительный"
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
msgid "Confidential"
msgstr "Конфиденциальное"
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
msgid "Private"
msgstr "Личное"
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
msgid "Public"
msgstr "Публичное"
-#, fuzzy
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid ""
-msgstr "Резервный счет"
+msgstr ""
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid "Cancelled"
msgstr "Отмененно"
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid "Confirmed"
msgstr "Подтвержденно"
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
msgid "Tentative"
msgstr "Предварительный"
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
msgid "Opaque"
msgstr "Непрозрачный"
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
msgid "Transparent"
msgstr "Прозрачный"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Daily"
msgstr "Ежедневный"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Hourly"
msgstr "Ежечасный"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Minutely"
msgstr "Ежеминутно"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Monthly"
msgstr "Ежемесячно"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Secondly"
msgstr "Ежесекудно"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Weekly"
msgstr "Еженедельно"
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
msgid "Yearly"
msgstr "Ежегодно"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Friday"
msgstr "Пятница"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Monday"
msgstr "Понедельник"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Saturday"
msgstr "Суббота"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Sunday"
msgstr "Воскресенье"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Thursday"
msgstr "Четверг"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Tuesday"
msgstr "Вторник"
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
msgid "Wednesday"
msgstr "Среда"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "Calendar"
msgstr "Календарь"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "Calendars"
msgstr "Календари"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "General"
msgstr "Основной"
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
msgid "Security"
msgstr "Доступ"
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
msgid "Categories"
msgstr "Категория"
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
msgid "Category"
msgstr "Категории"
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
msgid "Attendee"
msgstr "Участник"
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
msgid "Attendees"
msgstr "Участники"
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
msgid "Exception Date"
msgstr "Дата исключения"
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
msgid "Exception Dates"
msgstr "Дата исключения"
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
msgid "Exception Rule"
msgstr "Правило исключения"
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
msgid "Exception Rules"
msgstr "Правила исключения"
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
msgid "Recurrence Date"
msgstr "Даты повторения"
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
msgid "Recurrence Dates"
msgstr "Даты повторения"
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
msgid "Recurrence Rule"
msgstr "Правила повторения"
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
msgid "Recurrence Rules"
msgstr "Правила повторения"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Attendees"
msgstr "Участники"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Categories"
msgstr "Категория"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Event"
msgstr "Событие"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Events"
msgstr "События"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "General"
msgstr "Основной"
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
msgid "Occurences"
msgstr "Повторение"
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
msgid "Location"
msgstr "Местоположение"
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
msgid "Locations"
msgstr "Местоположения"
diff --git a/setup.py b/setup.py
index 94fef71..2af98de 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 8b786f9..40ec561 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 import suite
+from .test_calendar import suite
diff --git a/tests/scenario_calendar.py b/tests/scenario_calendar.py
index 649e47e..38a0344 100644
--- a/tests/scenario_calendar.py
+++ b/tests/scenario_calendar.py
@@ -12,13 +12,15 @@ import caldav
import vobject
from proteus import config, Model, Wizard
+
def install_module(name, config):
Module = Model.get('ir.module.module')
module, = Module.find([('name', '=', name)])
if module.state != 'installed':
- Module.button_install([module.id], config.context)
+ Module.install([module.id], config.context)
Wizard('ir.module.module.install_upgrade').execute('start')
+
def configure_user(login, config):
User = Model.get('res.user')
users = User.find([('login', '=', login)])
@@ -30,6 +32,7 @@ def configure_user(login, config):
user.email = email
user.save()
+
def create_calendar(login, user, config):
Calendar = Model.get('calendar.calendar')
User = Model.get('res.user')
@@ -64,7 +67,8 @@ class TestCase(unittest.TestCase):
vevent.add('summary')
vevent.summary.value = 'Test event'
vevent.add('dtstart')
- vevent.dtstart.value = datetime.datetime.now() + relativedelta(months=1)
+ vevent.dtstart.value = (datetime.datetime.now()
+ + relativedelta(months=1))
vevent.add('dtend')
vevent.dtend.value = datetime.datetime.now() + relativedelta(months=1,
hours=1)
@@ -107,8 +111,6 @@ class TestCase(unittest.TestCase):
attendee.value = 'MAILTO:%s at example.com' % name
attendees.append(attendee)
vevent.attendee_list = attendees
- event = caldav.Event(self.client, data=ical.serialize(),
- parent=self.calendar).save()
Event = Model.get('calendar.event')
owner_event, = Event.find([
@@ -124,7 +126,8 @@ class TestCase(unittest.TestCase):
'Update status of attendee'
for event in self.calendar.events():
event.load()
- if event.instance.vevent.summary.value == 'Test event with attendee':
+ value = event.instance.vevent.summary.value
+ if value == 'Test event with attendee':
break
for attendee in event.instance.vevent.attendee_list:
attendee.partstat_param = 'accepted'
@@ -141,7 +144,8 @@ class TestCase(unittest.TestCase):
'Delete attendee'
for event in self.calendar.events():
event.load()
- if event.instance.vevent.summary.value == 'Test event with attendee':
+ value = event.instance.vevent.summary.value
+ if value == 'Test event with attendee':
break
event.instance.vevent.attendee_list = []
event.save()
diff --git a/tests/test_calendar.py b/tests/test_calendar.py
index 207654b..55fabea 100644
--- a/tests/test_calendar.py
+++ b/tests/test_calendar.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 CalendarTestCase(unittest.TestCase):
'''
test_depends()
+
def suite():
suite = trytond.tests.test_tryton.suite()
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index 7a50dec..e7c3b87 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.0
Name: trytond-calendar
-Version: 2.2.0
+Version: 2.4.0
Summary: Add CalDAV support
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.egg-info/SOURCES.txt b/trytond_calendar.egg-info/SOURCES.txt
index 24835cd..5aa3999 100644
--- a/trytond_calendar.egg-info/SOURCES.txt
+++ b/trytond_calendar.egg-info/SOURCES.txt
@@ -9,15 +9,17 @@ setup.py
./__init__.py
./__tryton__.py
./caldav.py
-./calendar.py
+./calendar_.py
./res.py
./webdav.py
./tests/__init__.py
./tests/scenario_calendar.py
./tests/test_calendar.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.egg-info/requires.txt b/trytond_calendar.egg-info/requires.txt
index fe966b1..fabff6c 100644
--- a/trytond_calendar.egg-info/requires.txt
+++ b/trytond_calendar.egg-info/requires.txt
@@ -1,8 +1,8 @@
vobject >= 0.8.0
-PyWebDAV >= 0.9.3
+PyWebDAV >= 0.9.8
python-dateutil
pytz
-trytond >= 2.2, < 2.3
+trytond >= 2.4, < 2.5
[test]
caldav
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index 03186fe..4ce94a4 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.cache import Cache
@@ -11,6 +11,7 @@ from trytond.pool import Pool
CALDAV_NS = 'urn:ietf:params:xml:ns:caldav'
+
def _comp_filter_domain(dtstart, dtend):
return ['OR',
[
@@ -23,37 +24,38 @@ def _comp_filter_domain(dtstart, dtend):
('dtend', '<=', dtend)],
[('dtstart', '>=', dtstart),
('dtstart', '<=', dtend),
- ('dtend', '=', False)]],
- ('parent', '=', False),
- ('rdates', '=', False),
- ('rrules', '=', False),
- ('exdates', '=', False),
- ('exrules', '=', False),
- ('occurences', '=', False),
+ ('dtend', '=', None)]],
+ ('parent', '=', None),
+ ('rdates', '=', None),
+ ('rrules', '=', None),
+ ('exdates', '=', None),
+ ('exrules', '=', None),
+ ('occurences', '=', None),
],
- [ #TODO manage better recurring event
- ('parent', '=', False),
+ [ # TODO manage better recurring event
+ ('parent', '=', None),
('dtstart', '<=', dtend),
['OR',
- ('rdates', '!=', False),
- ('rrules', '!=', False),
- ('exdates', '!=', False),
- ('exrules', '!=', False),
- ('occurences', '!=', False),
+ ('rdates', '!=', None),
+ ('rrules', '!=', None),
+ ('exdates', '!=', None),
+ ('exrules', '!=', None),
+ ('occurences', '!=', None),
]
]]
+
class Collection(ModelSQL, ModelView):
_name = "webdav.collection"
def calendar(self, uri, ics=False):
'''
- Return the calendar id in the uri or False
+ Return the calendar id in the uri
:param uri: the uri
:return: calendar id
- or False if there is no calendar
+ or None if there is no calendar
'''
calendar_obj = Pool().get('calendar.calendar')
@@ -63,19 +65,18 @@ class Collection(ModelSQL, ModelView):
if calendar.endswith('.ics'):
calendar = calendar[:-4]
else:
- return False
+ return None
return calendar_obj.get_name(calendar)
- return False
@Cache('webdav_collection.event')
def event(self, uri, calendar_id=False):
'''
- Return the event id in the uri or False
+ Return the event id in the uri
:param uri: the uri
:param calendar_id: the calendar id
:return: event id
- or False if there is no event
+ or None if there is no event
'''
event_obj = Pool().get('calendar.event')
@@ -84,15 +85,14 @@ class Collection(ModelSQL, ModelView):
if not calendar_id:
calendar_id = self.calendar(uri)
if not calendar_id:
- return False
+ return None
event_ids = event_obj.search([
('calendar', '=', calendar_id),
('uuid', '=', event_uri[:-4]),
- ('parent', '=', False),
+ ('parent', '=', None),
], limit=1)
if event_ids:
return event_ids[0]
- return False
def _caldav_filter_domain_calendar(self, filter):
'''
@@ -186,8 +186,11 @@ class Collection(ModelSQL, ModelView):
if uri in ('Calendars', 'Calendars/'):
domain = self._caldav_filter_domain_calendar(filter)
- domain = [['OR', ('owner', '=', Transaction().user), ('read_users', '=', Transaction().user)],
- domain]
+ domain = [['OR',
+ ('owner', '=', Transaction().user),
+ ('read_users', '=', Transaction().user),
+ ],
+ domain]
calendar_ids = calendar_obj.search(domain)
calendars = calendar_obj.browse(calendar_ids)
if cache is not None:
@@ -269,10 +272,10 @@ class Collection(ModelSQL, ModelView):
ids = cache['_calendar'][calendar_obj._name].keys()
if calendar_id not in ids:
ids.append(calendar_id)
- elif 'creationdate' in cache['_calendar']\
- [calendar_obj._name][calendar_id]:
- return cache['_calendar'][calendar_obj._name]\
- [calendar_id]['creationdate']
+ elif 'creationdate' in cache['_calendar'][
+ calendar_obj._name][calendar_id]:
+ return cache['_calendar'][calendar_obj._name][
+ calendar_id]['creationdate']
else:
ids = [calendar_id]
res = None
@@ -290,8 +293,8 @@ class Collection(ModelSQL, ModelView):
if cache is not None:
cache['_calendar'][calendar_obj._name]\
.setdefault(calendar_id2, {})
- cache['_calendar'][calendar_obj._name]\
- [calendar_id2]['creationdate'] = date
+ cache['_calendar'][calendar_obj._name][
+ calendar_id2]['creationdate'] = date
if res is not None:
return res
else:
@@ -303,10 +306,10 @@ class Collection(ModelSQL, ModelView):
ids = cache['_calendar'][event_obj._name].keys()
if event_id not in ids:
ids.append(event_id)
- elif 'creationdate' in cache['_calendar']\
- [event_obj._name][event_id]:
- return cache['_calendar'][event_obj._name]\
- [event_id]['creationdate']
+ elif 'creationdate' in cache['_calendar'][
+ event_obj._name][event_id]:
+ return cache['_calendar'][event_obj._name][
+ event_id]['creationdate']
else:
ids = [event_id]
res = None
@@ -324,8 +327,8 @@ class Collection(ModelSQL, ModelView):
if cache is not None:
cache['_calendar'][event_obj._name]\
.setdefault(event_id2, {})
- cache['_calendar'][event_obj._name]\
- [event_id2]['creationdate'] = date
+ cache['_calendar'][event_obj._name][
+ event_id2]['creationdate'] = date
if res is not None:
return res
return super(Collection, self).get_creationdate(uri, cache=cache)
@@ -344,10 +347,10 @@ class Collection(ModelSQL, ModelView):
ids = cache['_calendar'][calendar_obj._name].keys()
if calendar_id not in ids:
ids.append(calendar_id)
- elif 'lastmodified' in cache['_calendar']\
- [calendar_obj._name][calendar_id]:
- return cache['_calendar'][calendar_obj._name]\
- [calendar_id]['lastmodified']
+ elif 'lastmodified' in cache['_calendar'][
+ calendar_obj._name][calendar_id]:
+ return cache['_calendar'][calendar_obj._name][
+ calendar_id]['lastmodified']
else:
ids = [calendar_id]
res = None
@@ -365,8 +368,8 @@ class Collection(ModelSQL, ModelView):
if cache is not None:
cache['_calendar'][calendar_obj._name]\
.setdefault(calendar_id2, {})
- cache['_calendar'][calendar_obj._name]\
- [calendar_id2]['lastmodified'] = date
+ cache['_calendar'][calendar_obj._name][
+ calendar_id2]['lastmodified'] = date
if res is not None:
return res
else:
@@ -378,15 +381,15 @@ class Collection(ModelSQL, ModelView):
ids = cache['_calendar'][event_obj._name].keys()
if event_id not in ids:
ids.append(event_id)
- elif 'lastmodified' in cache['_calendar']\
- [event_obj._name][event_id]:
- return cache['_calendar'][event_obj._name]\
- [event_id]['lastmodified']
+ elif 'lastmodified' in cache['_calendar'][
+ event_obj._name][event_id]:
+ return cache['_calendar'][event_obj._name][
+ event_id]['lastmodified']
else:
ids = [event_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)
@@ -404,8 +407,8 @@ class Collection(ModelSQL, ModelView):
if cache is not None:
cache['_calendar'][event_obj._name]\
.setdefault(event_id2, {})
- cache['_calendar'][event_obj._name]\
- [event_id2]['lastmodified'] = date
+ cache['_calendar'][event_obj._name][
+ event_id2]['lastmodified'] = date
if res is not None:
return res
calendar_ics_id = self.calendar(uri, ics=True)
@@ -416,10 +419,10 @@ class Collection(ModelSQL, ModelView):
ids = cache['_calendar'][calendar_obj._name].keys()
if calendar_ics_id not in ids:
ids.append(calendar_ics_id)
- elif 'lastmodified ics' in cache['_calendar']\
- [calendar_obj._name][calendar_ics_id]:
- return cache['_calendar'][calendar_obj._name]\
- [calendar_ics_id]['lastmodified ics']
+ elif 'lastmodified ics' in cache['_calendar'][
+ calendar_obj._name][calendar_ics_id]:
+ return cache['_calendar'][calendar_obj._name][
+ calendar_ics_id]['lastmodified ics']
else:
ids = [calendar_ics_id]
res = None
@@ -437,8 +440,8 @@ class Collection(ModelSQL, ModelView):
if cache is not None:
cache['_calendar'][calendar_obj._name]\
.setdefault(calendar_id2, {})
- cache['_calendar'][calendar_obj._name]\
- [calendar_id2]['lastmodified ics'] = date
+ cache['_calendar'][calendar_obj._name][
+ calendar_id2]['lastmodified ics'] = date
if res is not None:
return res
return super(Collection, self).get_lastmodified(uri, cache=cache)
@@ -474,10 +477,10 @@ class Collection(ModelSQL, ModelView):
ids = cache['_calendar'][calendar_obj._name].keys()
if calendar_id not in ids:
ids.append(calendar_id)
- elif 'calendar_description' in cache['_calendar']\
- [calendar_obj._name][calendar_id]:
- res = cache['_calendar'][calendar_obj._name]\
- [calendar_id]['calendar_description']
+ elif 'calendar_description' in cache['_calendar'][
+ calendar_obj._name][calendar_id]:
+ res = cache['_calendar'][calendar_obj._name][
+ calendar_id]['calendar_description']
if res is not None:
return res
else:
@@ -489,8 +492,8 @@ class Collection(ModelSQL, ModelView):
if cache is not None:
cache['_calendar'][calendar_obj._name]\
.setdefault(calendar.id, {})
- cache['_calendar'][calendar_obj._name]\
- [calendar.id]['calendar_description'] = \
+ cache['_calendar'][calendar_obj._name][
+ calendar.id]['calendar_description'] = \
calendar.description
if res is not None:
return res
commit cd31eebdff7da1f03bd6cb4682b11816dcdc6975
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Mon Oct 31 16:20:33 2011 +0100
Adding upstream version 2.2.0.
diff --git a/CHANGELOG b/CHANGELOG
index 698aff4..b9c58e4 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,7 @@
+Version 2.2.0 - 2011-10-24
+* Bug fixes (see mercurial logs for details)
+* Basic support of event time-range filter
+
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 c8be40d..bf5bc32 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,29 +1,31 @@
Metadata-Version: 1.0
Name: trytond_calendar
-Version: 2.0.0
+Version: 2.2.0
Summary: Add CalDAV support
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 fce5345..b4aa5d1 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -9,7 +9,7 @@
'name_es_ES' : 'Calendario',
'name_fr_FR' : 'Calendrier',
'name_ru_RU' : 'Календарь',
- 'version' : '2.0.0',
+ 'version' : '2.2.0',
'author' : 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
@@ -29,11 +29,13 @@
'calendar.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 0a8f1c9..0000000
--- a/bg_BG.csv
+++ /dev/null
@@ -1,194 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.calendar,0,A user can have only one calendar!,Потребителя може да има само един календар!,0
-error,calendar.calendar,0,The name of calendar must be unique!,Името на календара трябва да е уникално!,0
-error,calendar.category,0,The name of calendar category must be unique!,Името на категорията на календара трябва да е уникално!,0
-error,calendar.event,0,Recurrence can not be recurrent!,Повторението не може да е периодично!,0
-error,calendar.event,0,UUID and recurrence must be unique in a calendar!,UUID и взаимна вложеност трябва да са уникални в календар!,0
-error,calendar.location,0,The name of calendar location must be unique!,Името на местонахождението на календара трябва да е уникално!,0
-error,calendar.rrule,0,"Invalid ""By Day""","Невалиден ""По ден""",0
-error,calendar.rrule,0,"Invalid ""By Hour""","Навалиден ""По час""",0
-error,calendar.rrule,0,"Invalid ""By Minute""","Невалиден ""По минута""",0
-error,calendar.rrule,0,"Invalid ""By Month Day""","Невалиден ""По ден от месец""",0
-error,calendar.rrule,0,"Invalid ""By Month""","Невалидно ""По месец""",0
-error,calendar.rrule,0,"Invalid ""By Position""","Невалиден ""По позиция""",0
-error,calendar.rrule,0,"Invalid ""By Second""","Невалиден ""По секунда""",0
-error,calendar.rrule,0,"Invalid ""By Week Number""","Невалиден ""По номер на седмица""",0
-error,calendar.rrule,0,"Invalid ""By Year Day""","Невалиден ""По ден от годината""",0
-error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!","""Крайна дата"" и ""брой"" не може да се попълва по едно и също време!",0
-field,"calendar.alarm,rec_name",0,Name,Име,0
-field,"calendar.alarm,valarm",0,valarm,,0
-field,"calendar.attendee,attendee",0,attendee,присътващ,0
-field,"calendar.attendee,email",0,Email,Email,0
-field,"calendar.attendee,rec_name",0,Name,Име,0
-field,"calendar.attendee,status",0,Participation Status,Статус на участие,0
-field,"calendar.calendar,description",0,Description,Описание,0
-field,"calendar.calendar,name",0,Name,Име,0
-field,"calendar.calendar,owner",0,Owner,Собственик,0
-field,"calendar.calendar,read_users",0,Read Users,Потребители с права за четене,0
-field,"calendar.calendar,rec_name",0,Name,Име,0
-field,"calendar.calendar,write_users",0,Write Users,Записване на потребители,0
-field,"calendar.calendar-read-res.user,calendar",0,Calendar,Календар,0
-field,"calendar.calendar-read-res.user,rec_name",0,Name,Име,0
-field,"calendar.calendar-read-res.user,user",0,User,Потребител,0
-field,"calendar.calendar-write-res.user,calendar",0,Calendar,Календар,0
-field,"calendar.calendar-write-res.user,rec_name",0,Name,Име,0
-field,"calendar.calendar-write-res.user,user",0,User,Потребител,0
-field,"calendar.category,name",0,Name,Име,0
-field,"calendar.category,rec_name",0,Name,Име,0
-field,"calendar.date,date",0,Is Date,Е дата,0
-field,"calendar.date,datetime",0,Date,Дата,0
-field,"calendar.date,rec_name",0,Name,Име,0
-field,"calendar.event,alarms",0,Alarms,Аларми,0
-field,"calendar.event,all_day",0,All Day,Всички дни,0
-field,"calendar.event,attendees",0,Attendees,Присъстващи,0
-field,"calendar.event,calendar",0,Calendar,Календар,0
-field,"calendar.event,calendar_owner",0,Owner,Собственик,0
-field,"calendar.event,calendar_read_users",0,Read Users,Потребители с права за четене,0
-field,"calendar.event,calendar_write_users",0,Write Users,Записване на потребители,0
-field,"calendar.event,categories",0,Categories,Категории,0
-field,"calendar.event,classification",0,Classification,Класификация,0
-field,"calendar.event,description",0,Description,Описание,0
-field,"calendar.event,dtend",0,End Date,Крайна дата,0
-field,"calendar.event,dtstart",0,Start Date,Начална дата,0
-field,"calendar.event,exdates",0,Exception Dates,Дати на грешките,0
-field,"calendar.event,exrules",0,Exception Rules,Правила при грешка,0
-field,"calendar.event,location",0,Location,Местоположение,0
-field,"calendar.event,occurences",0,Occurences,Събития,0
-field,"calendar.event,organizer",0,Organizer,Организатор,0
-field,"calendar.event,parent",0,Parent,Родител,0
-field,"calendar.event,rdates",0,Recurrence Dates,Дати на повторяемост,0
-field,"calendar.event,rec_name",0,Name,Име,0
-field,"calendar.event,recurrence",0,Recurrence,Повторение,0
-field,"calendar.event,rrules",0,Recurrence Rules,Правила за повторяемост,0
-field,"calendar.event,sequence",0,Sequence,Последователност,0
-field,"calendar.event,status",0,Status,Състояние,0
-field,"calendar.event,summary",0,Summary,Обобщено,0
-field,"calendar.event,timezone",0,Timezone,Времева зона,0
-field,"calendar.event,transp",0,Time Transparency,Прозрачен във времето,0
-field,"calendar.event,uuid",0,UUID,UUID,0
-field,"calendar.event,vevent",0,vevent,,0
-field,"calendar.event-calendar.category,category",0,Category,Категория,0
-field,"calendar.event-calendar.category,event",0,Event,Събитие,0
-field,"calendar.event-calendar.category,rec_name",0,Name,Име,0
-field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Аларма на календар,0
-field,"calendar.event.alarm,event",0,Event,Събитие,0
-field,"calendar.event.alarm,rec_name",0,Name,Име,0
-field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Присъстващ на календар,0
-field,"calendar.event.attendee,event",0,Event,Събитие,0
-field,"calendar.event.attendee,rec_name",0,Name,Име,0
-field,"calendar.event.exdate,calendar_date",0,Calendar Date,Дата от календар,0
-field,"calendar.event.exdate,event",0,Event,Събитие,0
-field,"calendar.event.exdate,rec_name",0,Name,Име,0
-field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,,0
-field,"calendar.event.exrule,event",0,Event,Събитие,0
-field,"calendar.event.exrule,rec_name",0,Name,Име,0
-field,"calendar.event.rdate,calendar_date",0,Calendar Date,Дата от календар,0
-field,"calendar.event.rdate,event",0,Event,Събитие,0
-field,"calendar.event.rdate,rec_name",0,Name,Име,0
-field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,,0
-field,"calendar.event.rrule,event",0,Event,Събитие,0
-field,"calendar.event.rrule,rec_name",0,Name,Име,0
-field,"calendar.location,name",0,Name,Име,0
-field,"calendar.location,rec_name",0,Name,Име,0
-field,"calendar.rrule,byday",0,By Day,По ден,0
-field,"calendar.rrule,byhour",0,By Hour,По час,0
-field,"calendar.rrule,byminute",0,By Minute,По минута,0
-field,"calendar.rrule,bymonth",0,By Month,По месец,0
-field,"calendar.rrule,bymonthday",0,By Month Day,По ден от месеца,0
-field,"calendar.rrule,bysecond",0,By Second,По секунда,0
-field,"calendar.rrule,bysetpos",0,By Position,По позиция,0
-field,"calendar.rrule,byweekno",0,By Week Number,По номер на седмицата,0
-field,"calendar.rrule,byyearday",0,By Year Day,По ден от годината,0
-field,"calendar.rrule,count",0,Count,Брой,0
-field,"calendar.rrule,freq",0,Frequency,Честота,0
-field,"calendar.rrule,interval",0,Interval,Интервал,0
-field,"calendar.rrule,rec_name",0,Name,Име,0
-field,"calendar.rrule,until",0,Until Date,До дата,0
-field,"calendar.rrule,until_date",0,Is Date,Е дата,0
-field,"calendar.rrule,wkst",0,Week Day,Ден от седмица,0
-field,"res.user,calendars",0,Calendars,Календари,0
-help,"calendar.calendar,owner",0,The user must have an email,Потребителя трябва да има email,0
-help,"calendar.date,date",0,"Ignore time of field ""Date"", but handle as date only.","От полето ""Дата"" се игнорира часа и се използва само датата.",0
-help,"calendar.event,uuid",0,Universally Unique Identifier,Универсален иникален идентификатор,0
-help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","От полето ""До дата"" се игнорира часа и се използва само датата.",0
-model,"calendar.alarm,name",0,Alarm,Аларма,0
-model,"calendar.attendee,name",0,Attendee,Присъстващ,0
-model,"calendar.calendar,name",0,Calendar,Календар,0
-model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,,0
-model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,,0
-model,"calendar.category,name",0,Category,Категория,0
-model,"calendar.date,name",0,Calendar Date,Дата от календар,0
-model,"calendar.event,name",0,Event,Събитие,0
-model,"calendar.event-calendar.category,name",0,Event - Category,Събитие - категория,0
-model,"calendar.event.alarm,name",0,Alarm,Аларма,0
-model,"calendar.event.attendee,name",0,Attendee,Присъстващ,0
-model,"calendar.event.exdate,name",0,Exception Date,Дата на грешка,0
-model,"calendar.event.exrule,name",0,Exception Rule,Правило при грешка,0
-model,"calendar.event.rdate,name",0,Recurrence Date,Повтаряща се дата,0
-model,"calendar.event.rrule,name",0,Recurrence Rule,Правило за повторение,0
-model,"calendar.location,name",0,Location,Местоположение,0
-model,"calendar.rrule,name",0,Recurrence Rule,Правило за повторение,0
-model,"ir.action,name",act_calendar_form,Calendars,Календари,0
-model,"ir.action,name",act_calendar_form2,Calendars,Календари,0
-model,"ir.action,name",act_event_form,Events,Събития,0
-model,"ir.action,name",act_event_form2,Events,Събития,0
-model,"ir.action,name",act_event_form3,Events,Събития,0
-model,"ir.ui.menu,name",menu_calendar,Calendar Management,Управление на календари,0
-model,"ir.ui.menu,name",menu_calendar_form,Calendars,Календари,0
-model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Нов календар,0
-model,"ir.ui.menu,name",menu_event_form,Events,Събития,0
-model,"ir.ui.menu,name",menu_event_form2,New Event,Ново събитие,0
-model,"res.group,name",group_calendar_admin,Calendar Administration,Управление на календар,0
-selection,"calendar.attendee,status",0,,,0
-selection,"calendar.attendee,status",0,Accepted,Приет,0
-selection,"calendar.attendee,status",0,Declined,Отхвърлен,0
-selection,"calendar.attendee,status",0,Delegated,Делегиран,0
-selection,"calendar.attendee,status",0,Needs Action,Необходимо е действие,0
-selection,"calendar.attendee,status",0,Tentative,Пробен,0
-selection,"calendar.event,classification",0,Confidential,Поверителен,0
-selection,"calendar.event,classification",0,Private,Частен,0
-selection,"calendar.event,classification",0,Public,Публичен,0
-selection,"calendar.event,status",0,,,0
-selection,"calendar.event,status",0,Cancelled,Отказан,0
-selection,"calendar.event,status",0,Confirmed,Потвърден,0
-selection,"calendar.event,status",0,Tentative,Пробен,0
-selection,"calendar.event,transp",0,Opaque,Непрозрачен,0
-selection,"calendar.event,transp",0,Transparent,Прозрачен,0
-selection,"calendar.rrule,freq",0,Daily,Ежедневно,0
-selection,"calendar.rrule,freq",0,Hourly,Ежечасно,0
-selection,"calendar.rrule,freq",0,Minutely,Ежеминутно,0
-selection,"calendar.rrule,freq",0,Monthly,Месечно,0
-selection,"calendar.rrule,freq",0,Secondly,Всяка секунда,0
-selection,"calendar.rrule,freq",0,Weekly,Седмично,0
-selection,"calendar.rrule,freq",0,Yearly,Годишно,0
-selection,"calendar.rrule,wkst",0,Friday,Петък,0
-selection,"calendar.rrule,wkst",0,Monday,Понеделник,0
-selection,"calendar.rrule,wkst",0,Saturday,Събота,0
-selection,"calendar.rrule,wkst",0,Sunday,Неделя,0
-selection,"calendar.rrule,wkst",0,Thursday,Четвъртък,0
-selection,"calendar.rrule,wkst",0,Tuesday,Вторник,0
-selection,"calendar.rrule,wkst",0,Wednesday,Четвъртък,0
-view,calendar.calendar,0,Calendar,Календар,0
-view,calendar.calendar,0,Calendars,Календари,0
-view,calendar.calendar,0,General,Основен,0
-view,calendar.calendar,0,Security,Сигурност,0
-view,calendar.category,0,Categories,Категории,0
-view,calendar.category,0,Category,Категория,0
-view,calendar.event,0,Attendees,Присъстващи,0
-view,calendar.event,0,Categories,Категории,0
-view,calendar.event,0,Event,Събитие,0
-view,calendar.event,0,Events,Събития,0
-view,calendar.event,0,General,Основен,0
-view,calendar.event,0,Occurences,Събития,0
-view,calendar.event.attendee,0,Attendee,Присъстващ,0
-view,calendar.event.attendee,0,Attendees,Присъстващи,0
-view,calendar.event.exdate,0,Exception Date,Дата на грешка,0
-view,calendar.event.exdate,0,Exception Dates,Дати на грешките,0
-view,calendar.event.exrule,0,Exception Rule,Правило при грешка,0
-view,calendar.event.exrule,0,Exception Rules,Правила при грешка,0
-view,calendar.event.rdate,0,Recurrence Date,Повтаряща се дата,0
-view,calendar.event.rdate,0,Recurrence Dates,Дати на повторяемост,0
-view,calendar.event.rrule,0,Recurrence Rule,Правило за повторение,0
-view,calendar.event.rrule,0,Recurrence Rules,Правила за повторяемост,0
-view,calendar.location,0,Location,Местоположение,0
-view,calendar.location,0,Locations,Местонахождения,0
diff --git a/calendar.py b/calendar.py
index d5204e8..24d3635 100644
--- a/calendar.py
+++ b/calendar.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,9 +9,10 @@ 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 If, Bool, Not, Eval, Greater
+from trytond.pyson import If, Bool, Eval
from trytond.transaction import Transaction
from trytond.cache import Cache
+from trytond.pool import Pool
tzlocal = dateutil.tz.tzlocal()
tzutc = dateutil.tz.tzutc()
domimpl = xml.dom.minidom.getDOMImplementation()
@@ -96,7 +96,7 @@ class Calendar(ModelSQL, ModelView):
:param calendar_id: an id of calendar.calendar
:return: an iCalendar
'''
- event_obj = self.pool.get('calendar.event')
+ event_obj = Pool().get('calendar.event')
ical = vobject.iCalendar()
ical.vevent_list = []
@@ -139,7 +139,7 @@ class Calendar(ModelSQL, ModelView):
:param dtend: a date of datetime
:return: an iCalendar
'''
- event_obj = self.pool.get('calendar.event')
+ event_obj = Pool().get('calendar.event')
ical = vobject.iCalendar()
ical.add('method').value = 'REPLY'
@@ -274,13 +274,13 @@ class Calendar(ModelSQL, ModelView):
:return: the xml with schedule-response
'''
from DAV.errors import DAV_Forbidden
- collection_obj = self.pool.get('webdav.collection')
+ collection_obj = Pool().get('webdav.collection')
calendar_id = collection_obj.calendar(uri)
if not calendar_id:
raise DAV_Forbidden
calendar = self.browse(calendar_id)
- if calendar.owner.id != user:
+ if calendar.owner.id != Transaction().user:
raise DAV_Forbidden
ical = vobject.readOne(data)
if ical.method.value == 'REQUEST' \
@@ -441,8 +441,8 @@ class Event(ModelSQL, ModelView):
('cancelled', 'Cancelled'),
], 'Status')
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.event.attendee', 'event',
'Attendees')
transp = fields.Selection([
@@ -451,40 +451,40 @@ class Event(ModelSQL, ModelView):
], 'Time Transparency', required=True)
alarms = fields.One2Many('calendar.event.alarm', 'event', 'Alarms')
rdates = fields.One2Many('calendar.event.rdate', 'event', 'Recurrence Dates',
- states={
- 'invisible': Bool(Eval('parent')),
+ states={
+ 'invisible': Bool(Eval('parent')),
}, depends=['parent'])
rrules = fields.One2Many('calendar.event.rrule', 'event', 'Recurrence Rules',
- states={
- 'invisible': Bool(Eval('parent')),
+ states={
+ 'invisible': Bool(Eval('parent')),
}, depends=['parent'])
exdates = fields.One2Many('calendar.event.exdate', 'event', 'Exception Dates',
- states={
- 'invisible': Bool(Eval('parent')),
+ states={
+ 'invisible': Bool(Eval('parent')),
}, depends=['parent'])
exrules = fields.One2Many('calendar.event.exrule', 'event', 'Exception Rules',
- states={
- 'invisible': Bool(Eval('parent')),
+ states={
+ 'invisible': Bool(Eval('parent')),
}, depends=['parent'])
occurences = fields.One2Many('calendar.event', 'parent', 'Occurences',
- domain=[
- ('uuid', '=', Eval('uuid')),
- ('calendar', '=', Eval('calendar')),
+ domain=[
+ ('uuid', '=', Eval('uuid')),
+ ('calendar', '=', Eval('calendar')),
],
- states={
- 'invisible': Bool(Eval('parent')),
+ states={
+ 'invisible': Bool(Eval('parent')),
}, depends=['uuid', 'calendar', 'parent'])
parent = fields.Many2One('calendar.event', 'Parent',
- domain=[
- ('uuid', '=', Eval('uuid')),
- ('parent', '=', False),
- ('calendar', '=', Eval('calendar')),
+ domain=[
+ ('uuid', '=', Eval('uuid')),
+ ('parent', '=', False),
+ ('calendar', '=', Eval('calendar')),
],
- ondelete='CASCADE', depends=['uuid', 'calendar'])
+ ondelete='CASCADE', depends=['uuid', 'calendar'])
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'])
calendar_owner = fields.Function(fields.Many2One('res.user', 'Owner'),
'get_calendar_field', searcher='search_calendar_field')
calendar_read_users = fields.Function(fields.Many2One('res.user',
@@ -508,8 +508,8 @@ class Event(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_calendar_line3'),
@@ -534,7 +534,7 @@ class Event(ModelSQL, ModelView):
return 'opaque'
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
@@ -572,8 +572,8 @@ class Event(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(Event, self).create(values)
event = self.browse(res)
@@ -622,10 +622,11 @@ class Event(ModelSQL, ModelView):
return res
def _event2update(self, event):
- rdate_obj = self.pool.get('calendar.event.rdate')
- exdate_obj = self.pool.get('calendar.event.exdate')
- rrule_obj = self.pool.get('calendar.event.rrule')
- exrule_obj = self.pool.get('calendar.event.exrule')
+ pool = Pool()
+ rdate_obj = pool.get('calendar.event.rdate')
+ exdate_obj = pool.get('calendar.event.exdate')
+ rrule_obj = pool.get('calendar.event.rrule')
+ exrule_obj = pool.get('calendar.event.exrule')
res = {}
res['summary'] = event.summary
@@ -655,8 +656,8 @@ class Event(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
values = values.copy()
@@ -675,6 +676,8 @@ class Event(ModelSQL, ModelView):
'SET sequence = sequence + 1 ' \
'WHERE ' + red_sql, red_ids)
+ if not values:
+ return res
for event in self.browse(ids):
if event.calendar.owner \
and (event.organizer == event.calendar.owner.email \
@@ -688,18 +691,20 @@ class Event(ModelSQL, ModelView):
attendee_emails = [x.email for x in event.parent.attendees
if x.status != 'declined'
and x.email != event.parent.organizer]
- if attendee_emails:
- with Transaction().set_user(0):
- event_ids = self.search([
- ('uuid', '=', event.uuid),
- ('calendar.owner.email', 'in', attendee_emails),
- ('id', '!=', event.id),
- ('recurrence', '=', event.recurrence or False),
- ])
- for event2 in self.browse(event_ids):
- if event2.calendar.owner.email in attendee_emails:
- attendee_emails.remove(
- event2.calendar.owner.email)
+ with Transaction().set_user(0):
+ event_ids = self.search([
+ ('uuid', '=', event.uuid),
+ ('id', '!=', event.id),
+ ('recurrence', '=', event.recurrence or False),
+ ])
+ for event2 in self.browse(event_ids):
+ if event2.calendar.owner.email in attendee_emails:
+ attendee_emails.remove(
+ event2.calendar.owner.email)
+ else:
+ event_ids.remove(event2.id)
+ self.delete(event2.id)
+ if event_ids:
self.write(event_ids, self._event2update(event))
if attendee_emails:
with Transaction().set_user(0):
@@ -734,8 +739,8 @@ class Event(ModelSQL, ModelView):
return res
def delete(self, ids):
- attendee_obj = self.pool.get('calendar.event.attendee')
- collection_obj = self.pool.get('webdav.collection')
+ attendee_obj = Pool().get('calendar.event.attendee')
+ collection_obj = Pool().get('webdav.collection')
if isinstance(ids, (int, long)):
ids = [ids]
@@ -794,15 +799,16 @@ class Event(ModelSQL, ModelView):
:param vevent: the vevent 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.event.alarm')
- attendee_obj = self.pool.get('calendar.event.attendee')
- rdate_obj = self.pool.get('calendar.event.rdate')
- exdate_obj = self.pool.get('calendar.event.exdate')
- rrule_obj = self.pool.get('calendar.event.rrule')
- exrule_obj = self.pool.get('calendar.event.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.event.alarm')
+ attendee_obj = pool.get('calendar.event.attendee')
+ rdate_obj = pool.get('calendar.event.rdate')
+ exdate_obj = pool.get('calendar.event.exdate')
+ rrule_obj = pool.get('calendar.event.rrule')
+ exrule_obj = pool.get('calendar.event.exrule')
vevents = []
if not vevent:
@@ -1037,13 +1043,14 @@ class Event(ModelSQL, ModelView):
or a calendar.calendar id
:return: an iCalendar instance of vobject
'''
- user_obj = self.pool.get('res.user')
- alarm_obj = self.pool.get('calendar.event.alarm')
- attendee_obj = self.pool.get('calendar.event.attendee')
- rdate_obj = self.pool.get('calendar.event.rdate')
- exdate_obj = self.pool.get('calendar.event.exdate')
- rrule_obj = self.pool.get('calendar.event.rrule')
- exrule_obj = self.pool.get('calendar.event.exrule')
+ pool = Pool()
+ user_obj = pool.get('res.user')
+ alarm_obj = pool.get('calendar.event.alarm')
+ attendee_obj = pool.get('calendar.event.attendee')
+ rdate_obj = pool.get('calendar.event.rdate')
+ exdate_obj = pool.get('calendar.event.exdate')
+ rrule_obj = pool.get('calendar.event.rrule')
+ exrule_obj = pool.get('calendar.event.exrule')
if isinstance(event, (int, long)):
event = self.browse(event)
@@ -1250,14 +1257,14 @@ class EventAlarm(ModelSQL):
required=True, select=1)
def create(self, values):
- event_obj = self.pool.get('calendar.event')
+ event_obj = Pool().get('calendar.event')
if values.get('event'):
# Update write_date of event
event_obj.write(values['event'], {})
return super(EventAlarm, self).create(values)
def write(self, ids, values):
- event_obj = self.pool.get('calendar.event')
+ event_obj = Pool().get('calendar.event')
if isinstance(ids, (int, long)):
ids = [ids]
event_ids = [x.event.id for x in self.browse(ids)]
@@ -1269,8 +1276,8 @@ class EventAlarm(ModelSQL):
return super(EventAlarm, self).write(ids, values)
def delete(self, ids):
- event_obj = self.pool.get('calendar.event')
- alarm_obj = self.pool.get('calendar.alarm')
+ event_obj = Pool().get('calendar.event')
+ alarm_obj = Pool().get('calendar.alarm')
if isinstance(ids, (int, long)):
ids = [ids]
event_alarms = self.browse(ids)
@@ -1285,11 +1292,11 @@ class EventAlarm(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)
EventAlarm()
@@ -1301,8 +1308,8 @@ class Attendee(ModelSQL, ModelView):
_name = 'calendar.attendee'
email = fields.Char('Email', required=True, states={
- 'readonly': Greater(Eval('active_id', 0), 0),
- })
+ 'readonly': Eval('id', 0) > 0,
+ }, depends=['id'])
status = fields.Selection([
('', ''),
('needs-action', 'Needs Action'),
@@ -1382,7 +1389,7 @@ class EventAttendee(ModelSQL, ModelView):
required=True, select=1)
def create(self, values):
- event_obj = self.pool.get('calendar.event')
+ event_obj = Pool().get('calendar.event')
if values.get('event'):
# Update write_date of event
event_obj.write(values['event'], {})
@@ -1414,7 +1421,7 @@ class EventAttendee(ModelSQL, ModelView):
return res
def write(self, ids, values):
- event_obj = self.pool.get('calendar.event')
+ event_obj = Pool().get('calendar.event')
if isinstance(ids, (int, long)):
ids = [ids]
event_ids = [x.event.id for x in self.browse(ids)]
@@ -1458,8 +1465,8 @@ class EventAttendee(ModelSQL, ModelView):
return res
def delete(self, ids):
- event_obj = self.pool.get('calendar.event')
- attendee_obj = self.pool.get('calendar.attendee')
+ event_obj = Pool().get('calendar.event')
+ attendee_obj = Pool().get('calendar.attendee')
if isinstance(ids, (int, long)):
ids = [ids]
@@ -1521,7 +1528,7 @@ class EventAttendee(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)):
@@ -1542,15 +1549,15 @@ class EventAttendee(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)
EventAttendee()
@@ -1642,14 +1649,14 @@ class EventRDate(ModelSQL, ModelView):
return super(EventRDate, self).init(module_name)
def create(self, values):
- event_obj = self.pool.get('calendar.event')
+ event_obj = Pool().get('calendar.event')
if values.get('event'):
# Update write_date of event
event_obj.write(values['event'], {})
return super(EventRDate, self).create(values)
def write(self, ids, values):
- event_obj = self.pool.get('calendar.event')
+ event_obj = Pool().get('calendar.event')
if isinstance(ids, (int, long)):
ids = [ids]
event_ids = [x.event.id for x in self.browse(ids)]
@@ -1661,8 +1668,8 @@ class EventRDate(ModelSQL, ModelView):
return super(EventRDate, self).write(ids, values)
def delete(self, ids):
- event_obj = self.pool.get('calendar.event')
- rdate_obj = self.pool.get('calendar.date')
+ event_obj = Pool().get('calendar.event')
+ rdate_obj = Pool().get('calendar.date')
if isinstance(ids, (int, long)):
ids = [ids]
event_rdates = self.browse(ids)
@@ -1677,15 +1684,15 @@ class EventRDate(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)
EventRDate()
@@ -1984,14 +1991,14 @@ class EventRRule(ModelSQL, ModelView):
def create(self, values):
- event_obj = self.pool.get('calendar.event')
+ event_obj = Pool().get('calendar.event')
if values.get('event'):
# Update write_date of event
event_obj.write(values['event'], {})
return super(EventRRule, self).create(values)
def write(self, ids, values):
- event_obj = self.pool.get('calendar.event')
+ event_obj = Pool().get('calendar.event')
if isinstance(ids, (int, long)):
ids = [ids]
event_ids = [x.event.id for x in self.browse(ids)]
@@ -2003,8 +2010,8 @@ class EventRRule(ModelSQL, ModelView):
return super(EventRRule, self).write(ids, values)
def delete(self, ids):
- event_obj = self.pool.get('calendar.event')
- rrule_obj = self.pool.get('calendar.rrule')
+ event_obj = Pool().get('calendar.event')
+ rrule_obj = Pool().get('calendar.rrule')
if isinstance(ids, (int, long)):
ids = [ids]
event_rrules = self.browse(ids)
@@ -2019,15 +2026,15 @@ class EventRRule(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)
EventRRule()
diff --git a/calendar.xml b/calendar.xml
index c668799..bdf5ea1 100644
--- a/calendar.xml
+++ b/calendar.xml
@@ -7,14 +7,18 @@ this repository contains the full copyright notices and license terms. -->
<record model="res.group" id="group_calendar_admin">
<field name="name">Calendar Administration</field>
</record>
- <record model="res.user" id="res.user_admin">
- <field name="groups" eval="[('add', ref('group_calendar_admin'))]"/>
+ <record model="res.user-res.group"
+ id="user_admin_group_calendar_admin">
+ <field name="user" ref="res.user_admin"/>
+ <field name="group" ref="group_calendar_admin"/>
</record>
- <record model="res.user" id="res.user_trigger">
- <field name="groups" eval="[('add', ref('group_calendar_admin'))]"/>
+ <record model="res.user-res.group"
+ id="user_trigger_group_calendar_admin">
+ <field name="user" ref="res.user_trigger"/>
+ <field name="group" ref="group_calendar_admin"/>
</record>
- <menuitem name="Calendar Management" sequence="8" id="menu_calendar"/>
+ <menuitem name="Calendar" sequence="8" id="menu_calendar"/>
<record model="ir.ui.view" id="calendar_view_tree">
<field name="model">calendar.calendar</field>
@@ -22,8 +26,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Calendars">
- <field name="name" select="1"/>
- <field name="owner" select="1"/>
+ <field name="name"/>
+ <field name="owner"/>
</tree>
]]>
</field>
@@ -44,9 +48,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="description" colspan="4"/>
</page>
<page string="Security" id="security">
- <separator name="read_users" colspan="4"/>
<field name="read_users" colspan="4"/>
- <separator name="write_users" colspan="4"/>
<field name="write_users" colspan="4"/>
</page>
</notebook>
@@ -70,22 +72,6 @@ this repository contains the full copyright notices and license terms. -->
</record>
<menuitem parent="menu_calendar" sequence="1"
action="act_calendar_form" id="menu_calendar_form"/>
- <record model="ir.action.act_window" id="act_calendar_form2">
- <field name="name">Calendars</field>
- <field name="res_model">calendar.calendar</field>
- </record>
- <record model="ir.action.act_window.view" id="act_calendar_form2_view1">
- <field name="sequence" eval="10"/>
- <field name="view" ref="calendar_view_form"/>
- <field name="act_window" ref="act_calendar_form2"/>
- </record>
- <record model="ir.action.act_window.view" id="act_calendar_form2_view2">
- <field name="sequence" eval="20"/>
- <field name="view" ref="calendar_view_tree"/>
- <field name="act_window" ref="act_calendar_form2"/>
- </record>
- <menuitem name="New Calendar" parent="menu_calendar_form" sequence="10"
- action="act_calendar_form2" id="menu_calendar_form2"/>
<record model="ir.rule.group" id="rule_group_read_calendar">
<field name="model" search="[('model', '=', 'calendar.event')]"/>
@@ -137,7 +123,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Categories">
- <field name="name" select="1"/>
+ <field name="name"/>
</tree>
]]>
</field>
@@ -162,7 +148,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Locations">
- <field name="name" select="1"/>
+ <field name="name"/>
</tree>
]]>
</field>
@@ -187,12 +173,12 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Events">
- <field name="calendar" select="1"/>
- <field name="summary" select="1"/>
+ <field name="calendar"/>
+ <field name="summary"/>
<field name="all_day"/>
- <field name="dtstart" select="1"/>
- <field name="dtend" select="2"/>
- <field name="status" select="2"/>
+ <field name="dtstart"/>
+ <field name="dtend"/>
+ <field name="status"/>
</tree>
]]>
</field>
@@ -230,7 +216,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">
@@ -246,12 +231,12 @@ this repository contains the full copyright notices and license terms. -->
<field name="exdates" colspan="2"/>
<field name="occurences" colspan="4">
<tree string="Events">
- <field name="summary" select="1"/>
- <field name="recurrence" select="1"/>
+ <field name="summary"/>
+ <field name="recurrence"/>
<field name="all_day"/>
- <field name="dtstart" select="2"/>
- <field name="dtend" select="2"/>
- <field name="status" select="2"/>
+ <field name="dtstart"/>
+ <field name="dtend"/>
+ <field name="status"/>
</tree>
</field>
</page>
@@ -279,23 +264,6 @@ this repository contains the full copyright notices and license terms. -->
</record>
<menuitem parent="menu_calendar_form" sequence="20"
action="act_event_form" id="menu_event_form"/>
- <record model="ir.action.act_window" id="act_event_form2">
- <field name="name">Events</field>
- <field name="res_model">calendar.event</field>
- <field name="domain">[('parent', '=', False)]</field>
- </record>
- <record model="ir.action.act_window.view" id="act_event_form2_view1">
- <field name="sequence" eval="10"/>
- <field name="view" ref="event_view_form"/>
- <field name="act_window" ref="act_event_form2"/>
- </record>
- <record model="ir.action.act_window.view" id="act_event_form2_view2">
- <field name="sequence" eval="20"/>
- <field name="view" ref="event_view_tree"/>
- <field name="act_window" ref="act_event_form2"/>
- </record>
- <menuitem name="New Event" parent="menu_event_form" sequence="10"
- action="act_event_form2" id="menu_event_form2"/>
<record model="ir.action.act_window" id="act_event_form3">
<field name="name">Events</field>
@@ -315,7 +283,7 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.keyword"
id="act_open_event_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_event_form3"/>
</record>
@@ -325,9 +293,9 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Attendees">
- <field name="event" select="1"/>
- <field name="email" select="1"/>
- <field name="status" select="1"/>
+ <field name="event"/>
+ <field name="email"/>
+ <field name="status"/>
</tree>
]]>
</field>
@@ -356,9 +324,9 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Recurrence Dates">
- <field name="event" select="1"/>
- <field name="datetime" select="1"/>
- <field name="date" select="2"/>
+ <field name="event"/>
+ <field name="datetime"/>
+ <field name="date"/>
</tree>
]]>
</field>
@@ -387,9 +355,9 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Exception Dates">
- <field name="event" select="1"/>
- <field name="datetime" select="1"/>
- <field name="date" select="2"/>
+ <field name="event"/>
+ <field name="datetime"/>
+ <field name="date"/>
</tree>
]]>
</field>
@@ -418,8 +386,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Recurrence Rules">
- <field name="event" select="1"/>
- <field name="freq" select="1"/>
+ <field name="event"/>
+ <field name="freq"/>
</tree>
]]>
</field>
@@ -474,8 +442,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Exception Rules">
- <field name="event" select="1"/>
- <field name="freq" select="1"/>
+ <field name="event"/>
+ <field name="freq"/>
</tree>
]]>
</field>
diff --git a/de_DE.csv b/de_DE.csv
deleted file mode 100644
index 7202432..0000000
--- a/de_DE.csv
+++ /dev/null
@@ -1,195 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.calendar,0,A user can have only one calendar!,Es ist nur ein Kalender pro Benutzer möglich!,0
-error,calendar.calendar,0,The name of calendar must be unique!,Kalendername kann nicht mehrfach vergeben werden!,0
-error,calendar.category,0,The name of calendar category must be unique!,Name für Kalenderkategorie kann nicht mehrfach vergeben werden!,0
-error,calendar.event,0,Recurrence can not be recurrent!,Wiederholungen können nicht rekursiv sein!,0
-error,calendar.event,0,UUID and recurrence must be unique in a calendar!,UUID und Wiederholung können in einem Kalender nicht mehrfach vergeben werden!,0
-error,calendar.location,0,The name of calendar location must be unique!,Name für Kalenderort kann nicht mehrfach vergeben werden!,0
-error,calendar.rrule,0,"Invalid ""By Day""","Ungültig ""Für Tag""",0
-error,calendar.rrule,0,"Invalid ""By Hour""","Ungültig ""Für Stunde""",0
-error,calendar.rrule,0,"Invalid ""By Minute""","Ungültig ""Für Minute""",0
-error,calendar.rrule,0,"Invalid ""By Month Day""","Ungültig ""Für Tag des Monats""",0
-error,calendar.rrule,0,"Invalid ""By Month""","Ungültig ""Für Monat""",0
-error,calendar.rrule,0,"Invalid ""By Position""","Ungültig ""Für Position""",0
-error,calendar.rrule,0,"Invalid ""By Second""","Ungültig ""Für Sekunde""",0
-error,calendar.rrule,0,"Invalid ""By Week Number""","Ungültig ""Für Woche Nummer""",0
-error,calendar.rrule,0,"Invalid ""By Year Day""","Ungültig ""Für Tag des Jahres""",0
-error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!","Es kann nur entweder ""Bis"" oder ""Anzahl"" gesetzt werden!",0
-field,"calendar.alarm,rec_name",0,Name,Name,0
-field,"calendar.alarm,valarm",0,valarm,valarm,0
-field,"calendar.attendee,attendee",0,attendee,Teilnehmer,0
-field,"calendar.attendee,email",0,Email,E-Mail,0
-field,"calendar.attendee,rec_name",0,Name,Name,0
-field,"calendar.attendee,status",0,Participation Status,Teilnahmestatus,0
-field,"calendar.calendar,description",0,Description,Bezeichnung,0
-field,"calendar.calendar,name",0,Name,Name,0
-field,"calendar.calendar,owner",0,Owner,Besitzer,0
-field,"calendar.calendar,read_users",0,Read Users,Benutzer mit Leseberechtigung,0
-field,"calendar.calendar,rec_name",0,Name,Name,0
-field,"calendar.calendar,write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
-field,"calendar.calendar-read-res.user,calendar",0,Calendar,Kalender,0
-field,"calendar.calendar-read-res.user,rec_name",0,Name,Name,0
-field,"calendar.calendar-read-res.user,user",0,User,Benutzer,0
-field,"calendar.calendar-write-res.user,calendar",0,Calendar,Kalender,0
-field,"calendar.calendar-write-res.user,rec_name",0,Name,Name,0
-field,"calendar.calendar-write-res.user,user",0,User,Benutzer,0
-field,"calendar.category,name",0,Name,Name,0
-field,"calendar.category,rec_name",0,Name,Name,0
-field,"calendar.date,date",0,Is Date,Als Datum,0
-field,"calendar.date,datetime",0,Date,Zeitpunkt,0
-field,"calendar.date,rec_name",0,Name,Name,0
-field,"calendar.event,alarms",0,Alarms,Alarm,0
-field,"calendar.event,all_day",0,All Day,Ganztägig,0
-field,"calendar.event,attendees",0,Attendees,Teilnehmer,0
-field,"calendar.event,calendar",0,Calendar,Kalender,0
-field,"calendar.event,calendar_owner",0,Owner,Besitzer,0
-field,"calendar.event,calendar_read_users",0,Read Users,Benutzer mit Leseberechtigung,0
-field,"calendar.event,calendar_write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
-field,"calendar.event,categories",0,Categories,Kategorien,0
-field,"calendar.event,classification",0,Classification,Klassifizierung,0
-field,"calendar.event,description",0,Description,Bezeichnung,0
-field,"calendar.event,dtend",0,End Date,Enddatum,0
-field,"calendar.event,dtstart",0,Start Date,Anfangsdatum,0
-field,"calendar.event,exdates",0,Exception Dates,Ausnahmedaten,0
-field,"calendar.event,exrules",0,Exception Rules,Ausnahmeregeln,0
-field,"calendar.event,location",0,Location,Ort,0
-field,"calendar.event,occurences",0,Occurences,Ereignisse,0
-field,"calendar.event,organizer",0,Organizer,Organisator,0
-field,"calendar.event,parent",0,Parent,Übergeordnet (Termin),0
-field,"calendar.event,rdates",0,Recurrence Dates,Wiederholungsdaten,0
-field,"calendar.event,rec_name",0,Name,Name,0
-field,"calendar.event,recurrence",0,Recurrence,Wiederholung,0
-field,"calendar.event,rrules",0,Recurrence Rules,Wiederholungsregeln,0
-field,"calendar.event,sequence",0,Sequence,Revision,0
-field,"calendar.event,status",0,Status,Status,0
-field,"calendar.event,summary",0,Summary,Zusammenfassung,0
-field,"calendar.event,timezone",0,Timezone,Zeitzone,0
-field,"calendar.event,transp",0,Time Transparency,Zeittransparenz,0
-field,"calendar.event,uuid",0,UUID,UUID,0
-field,"calendar.event,vevent",0,vevent,vevent,0
-field,"calendar.event-calendar.category,category",0,Category,Kategorie,0
-field,"calendar.event-calendar.category,event",0,Event,Termin,0
-field,"calendar.event-calendar.category,rec_name",0,Name,Name,0
-field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Kalender Alarm,0
-field,"calendar.event.alarm,event",0,Event,Termin,0
-field,"calendar.event.alarm,rec_name",0,Name,Name,0
-field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Kalender Teilnehmer,0
-field,"calendar.event.attendee,event",0,Event,Termin,0
-field,"calendar.event.attendee,rec_name",0,Name,Name,0
-field,"calendar.event.exdate,calendar_date",0,Calendar Date,Kalender Datum,0
-field,"calendar.event.exdate,event",0,Event,Termin,0
-field,"calendar.event.exdate,rec_name",0,Name,Name,0
-field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
-field,"calendar.event.exrule,event",0,Event,Termin,0
-field,"calendar.event.exrule,rec_name",0,Name,Name,0
-field,"calendar.event.rdate,calendar_date",0,Calendar Date,Kalender Datum,0
-field,"calendar.event.rdate,event",0,Event,Termin,0
-field,"calendar.event.rdate,rec_name",0,Name,Name,0
-field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
-field,"calendar.event.rrule,event",0,Event,Termin,0
-field,"calendar.event.rrule,rec_name",0,Name,Name,0
-field,"calendar.location,name",0,Name,Name,0
-field,"calendar.location,rec_name",0,Name,Name,0
-field,"calendar.rrule,byday",0,By Day,Für Tag,0
-field,"calendar.rrule,byhour",0,By Hour,Für Stunde,0
-field,"calendar.rrule,byminute",0,By Minute,Für Minute,0
-field,"calendar.rrule,bymonth",0,By Month,Für Monat,0
-field,"calendar.rrule,bymonthday",0,By Month Day,Für Tag des Monats,0
-field,"calendar.rrule,bysecond",0,By Second,Für Sekunde,0
-field,"calendar.rrule,bysetpos",0,By Position,Für Position,0
-field,"calendar.rrule,byweekno",0,By Week Number,Für Woche Nummer,0
-field,"calendar.rrule,byyearday",0,By Year Day,Für Tag des Jahres,0
-field,"calendar.rrule,count",0,Count,Anzahl,0
-field,"calendar.rrule,freq",0,Frequency,Häufigkeit,0
-field,"calendar.rrule,interval",0,Interval,Intervall,0
-field,"calendar.rrule,rec_name",0,Name,Name,0
-field,"calendar.rrule,until",0,Until Date,Bis Zeitpunkt,0
-field,"calendar.rrule,until_date",0,Is Date,Als Datum,0
-field,"calendar.rrule,wkst",0,Week Day,Wochentag,0
-field,"res.user,calendars",0,Calendars,Kalender,0
-help,"calendar.calendar,owner",0,The user must have an email,Dem Benutzer muss eine E-Mail-Adresse zugeordnet sein!,0
-help,"calendar.date,date",0,"Ignore time of field ""Date"", but handle as date only.","Verwende von Feld ""Zeitpunkt"" nur das Datum ohne den Zeitanteil.",0
-help,"calendar.event,uuid",0,Universally Unique Identifier,Universally Unique Identifier,0
-help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","Verwende von Feld ""Bis Zeitpunkt"" nur das Datum ohne den Zeitanteil.",0
-model,"calendar.alarm,name",0,Alarm,Alarm,0
-model,"calendar.attendee,name",0,Attendee,Teilnehmer,0
-model,"calendar.calendar,name",0,Calendar,Kalender,0
-model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Kalender - Schreiben - Benutzer,0
-model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Kalender - Lesen - Benutzer,0
-model,"calendar.category,name",0,Category,Kategorie,0
-model,"calendar.date,name",0,Calendar Date,Kalender Datum,0
-model,"calendar.event,name",0,Event,Termin,0
-model,"calendar.event-calendar.category,name",0,Event - Category,Termin - Kategorie,0
-model,"calendar.event.alarm,name",0,Alarm,Alarm,0
-model,"calendar.event.attendee,name",0,Attendee,Teilnehmer,0
-model,"calendar.event.exdate,name",0,Exception Date,Ausnahmedatum,0
-model,"calendar.event.exrule,name",0,Exception Rule,Ausnahmeregel,0
-model,"calendar.event.rdate,name",0,Recurrence Date,Wiederholungsdatum,0
-model,"calendar.event.rrule,name",0,Recurrence Rule,Wiederholungsregel,0
-model,"calendar.location,name",0,Location,Ort,0
-model,"calendar.rrule,name",0,Recurrence Rule,Wiederholungsregel,0
-model,"ir.action,name",act_calendar_form,Calendars,Kalender,0
-model,"ir.action,name",act_calendar_form2,Calendars,Kalender,0
-model,"ir.action,name",act_event_form,Events,Termine,0
-model,"ir.action,name",act_event_form2,Events,Termine,0
-model,"ir.action,name",act_event_form3,Events,Termine,0
-model,"ir.ui.menu,name",menu_calendar,Calendar Management,Kalender,0
-model,"ir.ui.menu,name",menu_calendar_form,Calendars,Kalender,0
-model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Neuer Kalender,0
-model,"ir.ui.menu,name",menu_event_form,Events,Termine,0
-model,"ir.ui.menu,name",menu_event_form2,New Event,Neuer Termin,0
-model,"res.group,name",group_calendar_admin,Calendar Administration,Kalender Administration,0
-selection,"calendar.attendee,status",0,,,0
-selection,"calendar.attendee,status",0,Accepted,Angenommen,0
-selection,"calendar.attendee,status",0,Declined,Abgelehnt,0
-selection,"calendar.attendee,status",0,Delegated,Delegiert,0
-selection,"calendar.attendee,status",0,Needs Action,Aktion erforderlich,0
-selection,"calendar.attendee,status",0,Tentative,Unter Vorbehalt,0
-selection,"calendar.event,classification",0,Confidential,Vertraulich,0
-selection,"calendar.event,classification",0,Private,Privat,0
-selection,"calendar.event,classification",0,Public,Öffentlich,0
-selection,"calendar.event,status",0,,,0
-selection,"calendar.event,status",0,Cancelled,Abgesagt,0
-selection,"calendar.event,status",0,Confirmed,Bestätigt,0
-selection,"calendar.event,status",0,Tentative,Unter Vorbehalt,0
-selection,"calendar.event,transp",0,Opaque,Opak,0
-selection,"calendar.event,transp",0,Transparent,Transparent,0
-selection,"calendar.rrule,freq",0,Daily,Täglich,0
-selection,"calendar.rrule,freq",0,Hourly,Stündlich,0
-selection,"calendar.rrule,freq",0,Minutely,Minütlich,0
-selection,"calendar.rrule,freq",0,Monthly,Monatlich,0
-selection,"calendar.rrule,freq",0,Secondly,Sekündlich,0
-selection,"calendar.rrule,freq",0,Weekly,Wöchentlich,0
-selection,"calendar.rrule,freq",0,Yearly,Jährlich,0
-selection,"calendar.rrule,wkst",0,Friday,Freitag,0
-selection,"calendar.rrule,wkst",0,Monday,Montag,0
-selection,"calendar.rrule,wkst",0,Saturday,Samstag,0
-selection,"calendar.rrule,wkst",0,Sunday,Sonntag,0
-selection,"calendar.rrule,wkst",0,Thursday,Donnerstag,0
-selection,"calendar.rrule,wkst",0,Tuesday,Dienstag,0
-selection,"calendar.rrule,wkst",0,Wednesday,Mittwoch,0
-view,calendar.calendar,0,Calendar,Kalender,0
-view,calendar.calendar,0,Calendars,Kalender,0
-view,calendar.calendar,0,General,Allgemein,0
-view,calendar.calendar,0,Security,Sicherheit,0
-view,calendar.category,0,Categories,Kategorien,0
-view,calendar.category,0,Category,Kategorie,0
-view,calendar.event,0,Attendees,Teilnehmer,0
-view,calendar.event,0,Categories,Kategorien,0
-view,calendar.event,0,Event,Termin,0
-view,calendar.event,0,Events,Termine,0
-view,calendar.event,0,General,Allgemein,0
-view,calendar.event,0,Occurences,Ereignisse,0
-view,calendar.event,0,Recurrences,Wiederholungen,0
-view,calendar.event.attendee,0,Attendee,Teilnehmer,0
-view,calendar.event.attendee,0,Attendees,Teilnehmer,0
-view,calendar.event.exdate,0,Exception Date,Ausnahmedatum,0
-view,calendar.event.exdate,0,Exception Dates,Ausnahmedaten,0
-view,calendar.event.exrule,0,Exception Rule,Ausnahmeregel,0
-view,calendar.event.exrule,0,Exception Rules,Ausnahmeregeln,0
-view,calendar.event.rdate,0,Recurrence Date,Wiederholungsdatum,0
-view,calendar.event.rdate,0,Recurrence Dates,Wiederholungsdaten,0
-view,calendar.event.rrule,0,Recurrence Rule,Wiederholungsregel,0
-view,calendar.event.rrule,0,Recurrence Rules,Wiederholungsregeln,0
-view,calendar.location,0,Location,Ort,0
-view,calendar.location,0,Locations,Orte,0
diff --git a/es_CO.csv b/es_CO.csv
deleted file mode 100644
index 6b16971..0000000
--- a/es_CO.csv
+++ /dev/null
@@ -1,195 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.calendar,0,A user can have only one calendar!,¡Un usuario puede tener a lo sumo un calendario!,0
-error,calendar.calendar,0,The name of calendar must be unique!,¡El nombre del calendario es único!,0
-error,calendar.category,0,The name of calendar category must be unique!,¡El nombre de la categoría de calendario debe ser único!,0
-error,calendar.event,0,Recurrence can not be recurrent!,¡La repetición no puede repetirse!,0
-error,calendar.event,0,UUID and recurrence must be unique in a calendar!,¡El UUID y la recurrencia deben ser únicos por calendario! ,0
-error,calendar.location,0,The name of calendar location must be unique!,¡El nombre del lugar del calendario debe ser único!,0
-error,calendar.rrule,0,"Invalid ""By Day""",,0
-error,calendar.rrule,0,"Invalid ""By Hour""",,0
-error,calendar.rrule,0,"Invalid ""By Minute""",,0
-error,calendar.rrule,0,"Invalid ""By Month""",,0
-error,calendar.rrule,0,"Invalid ""By Month Day""",,0
-error,calendar.rrule,0,"Invalid ""By Position""",,0
-error,calendar.rrule,0,"Invalid ""By Second""",,0
-error,calendar.rrule,0,"Invalid ""By Week Number""",,0
-error,calendar.rrule,0,"Invalid ""By Year Day""",,0
-error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!",,0
-field,"calendar.alarm,rec_name",0,Name,Nombre,0
-field,"calendar.alarm,valarm",0,valarm,,0
-field,"calendar.attendee,attendee",0,attendee,,0
-field,"calendar.attendee,email",0,Email,Correo Electrónico,0
-field,"calendar.attendee,rec_name",0,Name,Nombre,0
-field,"calendar.attendee,status",0,Participation Status,,0
-field,"calendar.calendar,description",0,Description,Descripción,0
-field,"calendar.calendar,name",0,Name,Nombre,0
-field,"calendar.calendar,owner",0,Owner,Propietario,0
-field,"calendar.calendar-read-res.user,calendar",0,Calendar,Calendario,0
-field,"calendar.calendar-read-res.user,rec_name",0,Name,Nombre,0
-field,"calendar.calendar-read-res.user,user",0,User,Usuario,0
-field,"calendar.calendar,read_users",0,Read Users,Usuarios que pueden Leer,0
-field,"calendar.calendar,rec_name",0,Name,Nombre,0
-field,"calendar.calendar-write-res.user,calendar",0,Calendar,Calendario,0
-field,"calendar.calendar-write-res.user,rec_name",0,Name,Nombre,0
-field,"calendar.calendar-write-res.user,user",0,User,Usuario,0
-field,"calendar.calendar,write_users",0,Write Users,Escribir Usuarios,0
-field,"calendar.category,name",0,Name,Nombre,0
-field,"calendar.category,rec_name",0,Name,Nombre,0
-field,"calendar.date,date",0,Is Date,Es Fecha,0
-field,"calendar.date,datetime",0,Date,Fecha,1
-field,"calendar.date,rec_name",0,Name,Nombre de Contacto,1
-field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,,0
-field,"calendar.event.alarm,event",0,Event,Evento,0
-field,"calendar.event.alarm,rec_name",0,Name,Nombre,0
-field,"calendar.event,alarms",0,Alarms,Alarmas,0
-field,"calendar.event,all_day",0,All Day,Todo el Día,0
-field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,,0
-field,"calendar.event.attendee,event",0,Event,Evento,0
-field,"calendar.event.attendee,rec_name",0,Name,Nombre,0
-field,"calendar.event,attendees",0,Attendees,Asistentes,0
-field,"calendar.event,calendar",0,Calendar,Calendario,0
-field,"calendar.event-calendar.category,category",0,Category,Categoría,0
-field,"calendar.event-calendar.category,event",0,Event,Evento,0
-field,"calendar.event-calendar.category,rec_name",0,Name,Nombre,0
-field,"calendar.event,calendar_owner",0,Owner,Propietario,0
-field,"calendar.event,calendar_read_users",0,Read Users,Usuarios que pueden Leer,0
-field,"calendar.event,calendar_write_users",0,Write Users,Escribir Usuarios,0
-field,"calendar.event,categories",0,Categories,Categorías,0
-field,"calendar.event,classification",0,Classification,Clasificación,0
-field,"calendar.event,description",0,Description,Descripción,0
-field,"calendar.event,dtend",0,End Date,Fecha Fin,0
-field,"calendar.event,dtstart",0,Start Date,Fecha Inicial,0
-field,"calendar.event.exdate,calendar_date",0,Calendar Date,Fecha Calendario,0
-field,"calendar.event.exdate,event",0,Event,Evento,0
-field,"calendar.event.exdate,rec_name",0,Name,Nombre,0
-field,"calendar.event,exdates",0,Exception Dates,Fechas de Excepción,0
-field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,,0
-field,"calendar.event.exrule,event",0,Event,Evento,0
-field,"calendar.event.exrule,rec_name",0,Name,Nombre,0
-field,"calendar.event,exrules",0,Exception Rules,Reglas de Excepción,0
-field,"calendar.event,location",0,Location,Lugar,0
-field,"calendar.event,occurences",0,Occurences,Ocurrencias,1
-field,"calendar.event,organizer",0,Organizer,Organizador,0
-field,"calendar.event,parent",0,Parent,Padre,0
-field,"calendar.event.rdate,calendar_date",0,Calendar Date,Fecha Calendario,0
-field,"calendar.event.rdate,event",0,Event,Evento,0
-field,"calendar.event.rdate,rec_name",0,Name,Nombre,0
-field,"calendar.event,rdates",0,Recurrence Dates,Fechas de Repetición,0
-field,"calendar.event,rec_name",0,Name,Nombre,0
-field,"calendar.event,recurrence",0,Recurrence,Repetición,0
-field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,,0
-field,"calendar.event.rrule,event",0,Event,Evento,0
-field,"calendar.event.rrule,rec_name",0,Name,Nombre,0
-field,"calendar.event,rrules",0,Recurrence Rules,Reglas de Repetición,0
-field,"calendar.event,sequence",0,Sequence,Secuencia,0
-field,"calendar.event,status",0,Status,Estado,0
-field,"calendar.event,summary",0,Summary,Resumen,0
-field,"calendar.event,timezone",0,Timezone,Zona horaria,0
-field,"calendar.event,transp",0,Time Transparency,Transparencia de Tiempo,0
-field,"calendar.event,uuid",0,UUID,UUID,0
-field,"calendar.event,vevent",0,vevent,vevento,0
-field,"calendar.location,name",0,Name,Nombre,0
-field,"calendar.location,rec_name",0,Name,Nombre,0
-field,"calendar.rrule,byday",0,By Day,,0
-field,"calendar.rrule,byhour",0,By Hour,,0
-field,"calendar.rrule,byminute",0,By Minute,,0
-field,"calendar.rrule,bymonth",0,By Month,,0
-field,"calendar.rrule,bymonthday",0,By Month Day,,0
-field,"calendar.rrule,bysecond",0,By Second,,0
-field,"calendar.rrule,bysetpos",0,By Position,,0
-field,"calendar.rrule,byweekno",0,By Week Number,,0
-field,"calendar.rrule,byyearday",0,By Year Day,,0
-field,"calendar.rrule,count",0,Count,,0
-field,"calendar.rrule,freq",0,Frequency,,0
-field,"calendar.rrule,interval",0,Interval,,0
-field,"calendar.rrule,rec_name",0,Name,Nombre,0
-field,"calendar.rrule,until",0,Until Date,,0
-field,"calendar.rrule,until_date",0,Is Date,,0
-field,"calendar.rrule,wkst",0,Week Day,Día de la Semana,0
-field,"res.user,calendars",0,Calendars,Calendarios,0
-help,"calendar.calendar,owner",0,The user must have an email,,0
-help,"calendar.date,date",0,"Ignore time of field ""Date"", but handle as date only.","Ignore tiempo del campo ""Fecha"", pero manejelo como fecha solamente.",0
-help,"calendar.event,uuid",0,Universally Unique Identifier,Idenitificador Universal Único,0
-help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.",,0
-model,"calendar.alarm,name",0,Alarm,Alarma,0
-model,"calendar.attendee,name",0,Attendee,Asistente,0
-model,"calendar.calendar,name",0,Calendar,Calendario,0
-model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Calendario - leer - Usuario,0
-model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Calendario - escribir - Usuario,0
-model,"calendar.category,name",0,Category,Categoría,0
-model,"calendar.date,name",0,Calendar Date,Fecha Calendario,0
-model,"calendar.event.alarm,name",0,Alarm,Alarma,0
-model,"calendar.event.attendee,name",0,Attendee,Asistente,0
-model,"calendar.event-calendar.category,name",0,Event - Category,Evento - Categoría,0
-model,"calendar.event.exdate,name",0,Exception Date,Fecha de Excepción,0
-model,"calendar.event.exrule,name",0,Exception Rule,Regla de Excepción,0
-model,"calendar.event,name",0,Event,Evento,0
-model,"calendar.event.rdate,name",0,Recurrence Date,Fecha de Repetición,0
-model,"calendar.event.rrule,name",0,Recurrence Rule,Regla de Repetición,0
-model,"calendar.location,name",0,Location,Lugar,0
-model,"calendar.rrule,name",0,Recurrence Rule,Regla de Repetición,0
-model,"ir.action,name",act_calendar_form,Calendars,Calendarios,0
-model,"ir.action,name",act_calendar_form2,Calendars,Calendarios,0
-model,"ir.action,name",act_event_form,Events,Eventos,0
-model,"ir.action,name",act_event_form2,Events,Eventos,0
-model,"ir.action,name",act_event_form3,Events,Eventos,0
-model,"ir.ui.menu,name",menu_calendar,Calendar Management,Calendario,0
-model,"ir.ui.menu,name",menu_calendar_form,Calendars,Calendarios,0
-model,"ir.ui.menu,name",menu_event_form,Events,Eventos,0
-model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Nuevo Calendario,0
-model,"ir.ui.menu,name",menu_event_form2,New Event,Nuevo Evento,0
-model,"res.group,name",group_calendar_admin,Calendar Administration,Administrar Calendario,0
-selection,"calendar.attendee,status",0,,,0
-selection,"calendar.attendee,status",0,Accepted,,0
-selection,"calendar.attendee,status",0,Declined,,0
-selection,"calendar.attendee,status",0,Delegated,,0
-selection,"calendar.attendee,status",0,Needs Action,,0
-selection,"calendar.attendee,status",0,Tentative,Tentativa,0
-selection,"calendar.event,classification",0,Confidential,Confidencial,0
-selection,"calendar.event,classification",0,Private,Privado,0
-selection,"calendar.event,classification",0,Public,Público,0
-selection,"calendar.event,status",0,,,0
-selection,"calendar.event,status",0,Cancelled,Cancelado,0
-selection,"calendar.event,status",0,Confirmed,Confirmado,0
-selection,"calendar.event,status",0,Tentative,Tentativa,0
-selection,"calendar.event,transp",0,Opaque,Opaco,0
-selection,"calendar.event,transp",0,Transparent,Transparente,0
-selection,"calendar.rrule,freq",0,Daily,,0
-selection,"calendar.rrule,freq",0,Hourly,,0
-selection,"calendar.rrule,freq",0,Minutely,,0
-selection,"calendar.rrule,freq",0,Monthly,,0
-selection,"calendar.rrule,freq",0,Secondly,,0
-selection,"calendar.rrule,freq",0,Weekly,,0
-selection,"calendar.rrule,freq",0,Yearly,,0
-selection,"calendar.rrule,wkst",0,Friday,Viernes,0
-selection,"calendar.rrule,wkst",0,Monday,Lunes,0
-selection,"calendar.rrule,wkst",0,Saturday,Sábado,0
-selection,"calendar.rrule,wkst",0,Sunday,Domingo,0
-selection,"calendar.rrule,wkst",0,Thursday,Jueves,0
-selection,"calendar.rrule,wkst",0,Tuesday,Martes,0
-selection,"calendar.rrule,wkst",0,Wednesday,Miércoles,0
-view,calendar.calendar,0,Calendar,Calendario,0
-view,calendar.calendar,0,Calendars,Calendarios,0
-view,calendar.calendar,0,General,General,0
-view,calendar.calendar,0,Security,Seguridad,0
-view,calendar.category,0,Categories,Categorías,0
-view,calendar.category,0,Category,Categoría,0
-view,calendar.event,0,Attendees,Asistentes,0
-view,calendar.event,0,Categories,Categorías,0
-view,calendar.event,0,Event,Evento,0
-view,calendar.event,0,Events,Eventos,0
-view,calendar.event,0,General,General,0
-view,calendar.event,0,Occurences,Ocurrencias,1
-view,calendar.event,0,Recurrences,Repeticiones,0
-view,calendar.event.attendee,0,Attendee,Asistente,0
-view,calendar.event.attendee,0,Attendees,Asistentes,0
-view,calendar.event.exdate,0,Exception Date,Fecha de Excepción,0
-view,calendar.event.exdate,0,Exception Dates,Fechas de Excepción,0
-view,calendar.event.exrule,0,Exception Rule,Regla de Excepción,0
-view,calendar.event.exrule,0,Exception Rules,Reglas de Excepción,0
-view,calendar.event.rdate,0,Recurrence Date,Fecha de Repetición,0
-view,calendar.event.rdate,0,Recurrence Dates,Fechas de Repetición,0
-view,calendar.event.rrule,0,Recurrence Rule,Regla de Repetición,0
-view,calendar.event.rrule,0,Recurrence Rules,Reglas de Repetición,0
-view,calendar.location,0,Location,Lugar,0
-view,calendar.location,0,Locations,Lugares,0
diff --git a/es_ES.csv b/es_ES.csv
deleted file mode 100644
index 6feec26..0000000
--- a/es_ES.csv
+++ /dev/null
@@ -1,190 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.calendar,0,A user can have only one calendar!,Un usuario solo puede tener un calendario,0
-error,calendar.calendar,0,The name of calendar must be unique!,El nombre del calendario debe ser único,0
-error,calendar.category,0,The name of calendar category must be unique!,El nombre de la categoría del calendario debe ser único,0
-error,calendar.event,0,Recurrence can not be recurrent!,Una recurrencia no puede ser recurrente,0
-error,calendar.event,0,UUID and recurrence must be unique in a calendar!,UUID y recurrencia deben ser únicos en un calendario,0
-error,calendar.location,0,The name of calendar location must be unique!,El nombre de la ubicación del calendario debe ser único,0
-error,calendar.rrule,0,"Invalid ""By Day""",Inválido «por día»,0
-error,calendar.rrule,0,"Invalid ""By Hour""",Inválido «por hora»,0
-error,calendar.rrule,0,"Invalid ""By Minute""",Inválido «por minuto»,0
-error,calendar.rrule,0,"Invalid ""By Month""",Inválido «por mes»,0
-error,calendar.rrule,0,"Invalid ""By Month Day""",Inválido «por día del mes»,0
-error,calendar.rrule,0,"Invalid ""By Position""",Inválido «por posición»,0
-error,calendar.rrule,0,"Invalid ""By Second""",Inválido «por segundos»,0
-error,calendar.rrule,0,"Invalid ""By Week Number""",Inválido «por número de semana»,0
-error,calendar.rrule,0,"Invalid ""By Year Day""",Inválido «por día del año»,0
-error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!",Solo se puede usar o «hasta» o «Número de veces»,0
-field,"calendar.alarm,rec_name",0,Name,Nombre,0
-field,"calendar.alarm,valarm",0,valarm,valarm,0
-field,"calendar.attendee,attendee",0,attendee,asistentes,0
-field,"calendar.attendee,email",0,Email,Correo electrónico,0
-field,"calendar.attendee,rec_name",0,Name,Nombre,0
-field,"calendar.attendee,status",0,Participation Status,Estado de participación,0
-field,"calendar.calendar,description",0,Description,Descripción,0
-field,"calendar.calendar,name",0,Name,Nombre,0
-field,"calendar.calendar,owner",0,Owner,Dueño,0
-field,"calendar.calendar-read-res.user,calendar",0,Calendar,Calendario,0
-field,"calendar.calendar-read-res.user,rec_name",0,Name,Nombre,0
-field,"calendar.calendar-read-res.user,user",0,User,Usuario,0
-field,"calendar.calendar,read_users",0,Read Users,Usuarios con lectura,0
-field,"calendar.calendar,rec_name",0,Name,Nombre,0
-field,"calendar.calendar-write-res.user,calendar",0,Calendar,Calendario,0
-field,"calendar.calendar-write-res.user,rec_name",0,Name,Nombre,0
-field,"calendar.calendar-write-res.user,user",0,User,Usuario,0
-field,"calendar.calendar,write_users",0,Write Users,Usuarios con escritura,0
-field,"calendar.category,name",0,Name,Nombre,0
-field,"calendar.category,rec_name",0,Name,Nombre,0
-field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Alarma del calendario,0
-field,"calendar.event.alarm,event",0,Event,Evento,0
-field,"calendar.event.alarm,rec_name",0,Name,Nombre,0
-field,"calendar.event,alarms",0,Alarms,Alarmas,0
-field,"calendar.event,all_day",0,All Day,Todo el día,0
-field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Calendario de asistentes,0
-field,"calendar.event.attendee,event",0,Event,Evento,0
-field,"calendar.event.attendee,rec_name",0,Name,Nombre,0
-field,"calendar.event,attendees",0,Attendees,Asistentes,0
-field,"calendar.event,calendar",0,Calendar,Calendario,0
-field,"calendar.event-calendar.category,category",0,Category,Categoría,0
-field,"calendar.event-calendar.category,event",0,Event,Evento,0
-field,"calendar.event-calendar.category,rec_name",0,Name,Nombre,0
-field,"calendar.event,calendar_owner",0,Owner,Dueño,0
-field,"calendar.event,calendar_read_users",0,Read Users,Usuarios con lectura,0
-field,"calendar.event,calendar_write_users",0,Write Users,Usuarios con escritura,0
-field,"calendar.event,categories",0,Categories,Categorías,0
-field,"calendar.event,classification",0,Classification,Clasificación,0
-field,"calendar.event,classification_public",0,Classification Public,Clasificación pública,0
-field,"calendar.event,description",0,Description,Descripción,0
-field,"calendar.event,dtend",0,End Date,Fecha fin,0
-field,"calendar.event,dtstart",0,Start Date,Fecha inicio,0
-field,"calendar.event.exdate,calendar_rdate",0,Calendar RDate,Fecha de recurrencia,0
-field,"calendar.event.exdate,event",0,Event,Evento,0
-field,"calendar.event.exdate,rec_name",0,Name,Nombre,0
-field,"calendar.event,exdates",0,Exception Dates,Fechas excluidas,0
-field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Regla de recurrencia,0
-field,"calendar.event.exrule,event",0,Event,Evento,0
-field,"calendar.event.exrule,rec_name",0,Name,Nombre,0
-field,"calendar.event,exrules",0,Exception Rules,Reglas de excepción,0
-field,"calendar.event,location",0,Location,Ubicación,0
-field,"calendar.event,occurences",0,Occurences,Ocurrencias,0
-field,"calendar.event,organizer",0,Organizer,Organizador,0
-field,"calendar.event,parent",0,Parent,Padre,0
-field,"calendar.event.rdate,calendar_rdate",0,Calendar RDate,Fecha de recurrencia,0
-field,"calendar.event.rdate,event",0,Event,Evento,0
-field,"calendar.event.rdate,rec_name",0,Name,Nombre,0
-field,"calendar.event,rdates",0,Recurrence Dates,Fechas de recurrencia,0
-field,"calendar.event,rec_name",0,Name,Nombre,0
-field,"calendar.event,recurrence",0,Recurrence,Recurrencia,0
-field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Regla de recurrencia,0
-field,"calendar.event.rrule,event",0,Event,Evento,0
-field,"calendar.event.rrule,rec_name",0,Name,Nombre,0
-field,"calendar.event,rrules",0,Recurrence Rules,Reglas de recurrencia,0
-field,"calendar.event,sequence",0,Sequence,Secuencia,0
-field,"calendar.event,status",0,Status,Estado,0
-field,"calendar.event,summary",0,Summary,Resumen,0
-field,"calendar.event,timezone",0,Timezone,Zona horaria,0
-field,"calendar.event,transp",0,Time Transparency,Tiempo de transparencia,0
-field,"calendar.event,uuid",0,UUID,UUID,0
-field,"calendar.event,vevent",0,vevent,vevent,0
-field,"calendar.location,name",0,Name,Nombre,0
-field,"calendar.location,rec_name",0,Name,Nombre,0
-field,"calendar.rdate,date",0,Is Date,Es fecha,0
-field,"calendar.rdate,datetime",0,Date,Fecha,0
-field,"calendar.rdate,rec_name",0,Name,Nombre,0
-field,"calendar.rrule,byday",0,By Day,Por día,0
-field,"calendar.rrule,byhour",0,By Hour,Por hora,0
-field,"calendar.rrule,byminute",0,By Minute,Por minuto,0
-field,"calendar.rrule,bymonth",0,By Month,Por mes,0
-field,"calendar.rrule,bymonthday",0,By Month Day,Por día del mes,0
-field,"calendar.rrule,bysecond",0,By Second,Por segundo,0
-field,"calendar.rrule,bysetpos",0,By Position,Por posición,0
-field,"calendar.rrule,byweekno",0,By Week Number,Por día de la semana,0
-field,"calendar.rrule,byyearday",0,By Year Day,Por día del año,0
-field,"calendar.rrule,count",0,Count,Número de veces,0
-field,"calendar.rrule,freq",0,Frequency,Frecuencia,0
-field,"calendar.rrule,interval",0,Interval,Intervalo,0
-field,"calendar.rrule,rec_name",0,Name,Nombre,0
-field,"calendar.rrule,until",0,Until Date,Hasta la fecha,0
-field,"calendar.rrule,until_date",0,Is Date,Es fecha,0
-field,"calendar.rrule,wkst",0,Week Day,Día de la semana,0
-field,"res.user,calendars",0,Calendars,Calendarios,0
-help,"calendar.calendar,owner",0,The user must have an email,El usuario debe tener un correo electrónico,0
-help,"calendar.event,uuid",0,Universally Unique Identifier,Identificador universal único,0
-help,"calendar.rdate,date",0,"Ignore time of field ""Date"", but handle as date only.",Ignora la hora del campo «Fecha» y lo trata como fecha.,0
-help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","Ignora la hora del campo «Hasta la fecha», y trata solo la fecha",0
-model,"calendar.alarm,name",0,Alarm,Alarma,0
-model,"calendar.attendee,name",0,Attendee,Asistentes,0
-model,"calendar.calendar,name",0,Calendar,Calendario,0
-model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Calendario - leer - usuario,0
-model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Calendario - escribir - usuario,0
-model,"calendar.category,name",0,Category,Categoría,0
-model,"calendar.event.alarm,name",0,Alarm,Alarma,0
-model,"calendar.event.attendee,name",0,Attendee,Asistentes,0
-model,"calendar.event-calendar.category,name",0,Event - Category,Evento - Categoría,0
-model,"calendar.event.exdate,name",0,Exception Date,Fecha excluida,0
-model,"calendar.event.exrule,name",0,Exception Rule,Regla de excepción,0
-model,"calendar.event,name",0,Event,Evento,0
-model,"calendar.event.rdate,name",0,Recurrence Date,Fecha de recurrencia,0
-model,"calendar.event.rrule,name",0,Recurrence Rule,Regla de recurrencia,0
-model,"calendar.location,name",0,Location,Ubicación,0
-model,"calendar.rdate,name",0,Recurrence Date,Fecha de recurrencia,0
-model,"calendar.rrule,name",0,Recurrence Rule,Regla de recurrencia,0
-model,"ir.action,name",act_calendar_form,Calendars,Calendarios,0
-model,"ir.action,name",act_event_form,Events,Eventos,0
-model,"ir.ui.menu,name",menu_calendar,Calendar Management,Gestión de calendario,0
-model,"ir.ui.menu,name",menu_calendar_form,Calendars,Calendarios,0
-model,"ir.ui.menu,name",menu_event_form,Events,Eventos,0
-model,"res.group,name",group_calendar_admin,Calendar Administration,Administración de calendario,0
-selection,"calendar.attendee,status",0,,,0
-selection,"calendar.attendee,status",0,Accepted,Aceptada,0
-selection,"calendar.attendee,status",0,Declined,Rehusado,0
-selection,"calendar.attendee,status",0,Delegated,Delegada,0
-selection,"calendar.attendee,status",0,Needs Action,Necesita una acción,0
-selection,"calendar.attendee,status",0,Tentative,Tentativa,0
-selection,"calendar.event,classification",0,Confidential,Confidencial,0
-selection,"calendar.event,classification",0,Private,Privado,0
-selection,"calendar.event,classification",0,Public,Público,0
-selection,"calendar.event,status",0,,,0
-selection,"calendar.event,status",0,Cancelled,Cancelado,0
-selection,"calendar.event,status",0,Confirmed,Confirmada,0
-selection,"calendar.event,status",0,Tentative,Tentativo,0
-selection,"calendar.event,transp",0,Opaque,Opaco,0
-selection,"calendar.event,transp",0,Transparent,Transparente,0
-selection,"calendar.rrule,freq",0,Daily,Diariamente,0
-selection,"calendar.rrule,freq",0,Hourly,Cada hora,0
-selection,"calendar.rrule,freq",0,Minutely,Cada minuto,0
-selection,"calendar.rrule,freq",0,Monthly,Mensualmente,0
-selection,"calendar.rrule,freq",0,Secondly,Cada segundo,0
-selection,"calendar.rrule,freq",0,Weekly,Semanalmente,0
-selection,"calendar.rrule,freq",0,Yearly,Anualmente,0
-selection,"calendar.rrule,wkst",0,Friday,Viernes,0
-selection,"calendar.rrule,wkst",0,Monday,Lunes,0
-selection,"calendar.rrule,wkst",0,Saturday,Sábado,0
-selection,"calendar.rrule,wkst",0,Sunday,Domingo,0
-selection,"calendar.rrule,wkst",0,Thursday,Jueves,0
-selection,"calendar.rrule,wkst",0,Tuesday,Martes,0
-selection,"calendar.rrule,wkst",0,Wednesday,Miércoles,0
-view,calendar.calendar,0,Calendar,Calendario,0
-view,calendar.calendar,0,Calendars,Calendarios,0
-view,calendar.calendar,0,General,General,0
-view,calendar.calendar,0,Security,Seguridad,0
-view,calendar.category,0,Categories,Categorías,0
-view,calendar.category,0,Category,Categoría,0
-view,calendar.event,0,Attendees,Asistentes,0
-view,calendar.event,0,Categories,Categorías,0
-view,calendar.event,0,Event,Evento,0
-view,calendar.event,0,Events,Eventos,0
-view,calendar.event,0,General,General,0
-view,calendar.event,0,Occurences,Ocurrencias,0
-view,calendar.event.attendee,0,Attendee,Asistentes,0
-view,calendar.event.attendee,0,Attendees,Asistentes,0
-view,calendar.event.exdate,0,Exception Date,Fecha excluida,0
-view,calendar.event.exdate,0,Exception Dates,Fechas excluidas,0
-view,calendar.event.exrule,0,Exception Rule,Regla de excepción,0
-view,calendar.event.exrule,0,Exception Rules,Reglas de excepciones,0
-view,calendar.event.rdate,0,Recurrence Date,Fecha de recurrencia,0
-view,calendar.event.rdate,0,Recurrence Dates,Fechas de recurrencia,0
-view,calendar.event.rrule,0,Recurrence Rule,Regla de recurrencia,0
-view,calendar.event.rrule,0,Recurrence Rules,Reglas de recurrencia,0
-view,calendar.location,0,Location,Ubicación,0
-view,calendar.location,0,Locations,Ubicaciones,0
diff --git a/fr_FR.csv b/fr_FR.csv
deleted file mode 100644
index b814ecf..0000000
--- a/fr_FR.csv
+++ /dev/null
@@ -1,194 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.calendar,0,A user can have only one calendar!,Un utilisateur ne peut avoir qu'un seul calendrier !,0
-error,calendar.calendar,0,The name of calendar must be unique!,Le nom du calendrier doit être unique !,0
-error,calendar.category,0,The name of calendar category must be unique!,Le nom de la catégorie de calendrier doit être unique,0
-error,calendar.event,0,Recurrence can not be recurrent!,Une récurrence ne peut pas être récurrente !,0
-error,calendar.event,0,UUID and recurrence must be unique in a calendar!,UUID et récurrence doivent être uniques sur un calendrier !,0
-error,calendar.location,0,The name of calendar location must be unique!,Le nom de l'emplacement doit être unique !,0
-error,calendar.rrule,0,"Invalid ""By Day""","""Par jour"" invalide",0
-error,calendar.rrule,0,"Invalid ""By Hour""","""Par heure"" invalide",0
-error,calendar.rrule,0,"Invalid ""By Minute""","""Par minute"" invalide",0
-error,calendar.rrule,0,"Invalid ""By Month Day""","""Par jour du mois"" invalide",0
-error,calendar.rrule,0,"Invalid ""By Month""","""Par mois"" invalide",0
-error,calendar.rrule,0,"Invalid ""By Position""","""Par position"" invalide",0
-error,calendar.rrule,0,"Invalid ""By Second""","""Par seconde"" invalide",0
-error,calendar.rrule,0,"Invalid ""By Week Number""","""Par jour de la semaine"" invalide",0
-error,calendar.rrule,0,"Invalid ""By Year Day""","""Par jour de l'année"" invalide",0
-error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!","""Date de fin"" et ""Répétitions"" ne peuvent être remplis en même temps !",0
-field,"calendar.alarm,rec_name",0,Name,Nom,0
-field,"calendar.alarm,valarm",0,valarm,valarm,0
-field,"calendar.attendee,attendee",0,attendee,participant,0
-field,"calendar.attendee,email",0,Email,E-mail,0
-field,"calendar.attendee,rec_name",0,Name,Nom,0
-field,"calendar.attendee,status",0,Participation Status,Statut de participation,0
-field,"calendar.calendar,description",0,Description,Description,0
-field,"calendar.calendar,name",0,Name,Nom,0
-field,"calendar.calendar,owner",0,Owner,Propriétaire,0
-field,"calendar.calendar,read_users",0,Read Users,Utilisateurs en lecture,0
-field,"calendar.calendar,rec_name",0,Name,Nom,0
-field,"calendar.calendar,write_users",0,Write Users,Utilisateurs en écriture,0
-field,"calendar.calendar-read-res.user,calendar",0,Calendar,Calendrier,0
-field,"calendar.calendar-read-res.user,rec_name",0,Name,Nom,0
-field,"calendar.calendar-read-res.user,user",0,User,Utilisateur,0
-field,"calendar.calendar-write-res.user,calendar",0,Calendar,Calendrier,0
-field,"calendar.calendar-write-res.user,rec_name",0,Name,Nom,0
-field,"calendar.calendar-write-res.user,user",0,User,Utilisateur,0
-field,"calendar.category,name",0,Name,Nom,0
-field,"calendar.category,rec_name",0,Name,Nom,0
-field,"calendar.date,date",0,Is Date,Est une date,0
-field,"calendar.date,datetime",0,Date,Date,0
-field,"calendar.date,rec_name",0,Name,Nom,0
-field,"calendar.event,alarms",0,Alarms,Alarmes,0
-field,"calendar.event,all_day",0,All Day,Toute la journée,0
-field,"calendar.event,attendees",0,Attendees,Participants,0
-field,"calendar.event,calendar",0,Calendar,Calendrier,0
-field,"calendar.event,calendar_owner",0,Owner,Propriétaire,0
-field,"calendar.event,calendar_read_users",0,Read Users,Utilisateurs en lecture,0
-field,"calendar.event,calendar_write_users",0,Write Users,Utilisateurs en écriture,0
-field,"calendar.event,categories",0,Categories,Catégories,0
-field,"calendar.event,classification",0,Classification,Classification,0
-field,"calendar.event,description",0,Description,Description,0
-field,"calendar.event,dtend",0,End Date,Date de fin,0
-field,"calendar.event,dtstart",0,Start Date,Date de début,0
-field,"calendar.event,exdates",0,Exception Dates,Dates d'exception,0
-field,"calendar.event,exrules",0,Exception Rules,Règles d'exception,0
-field,"calendar.event,location",0,Location,Emplacement,0
-field,"calendar.event,occurences",0,Occurences,Occurrences,0
-field,"calendar.event,organizer",0,Organizer,Organisateur,0
-field,"calendar.event,parent",0,Parent,Parent,0
-field,"calendar.event,rdates",0,Recurrence Dates,Dates de récurrence,0
-field,"calendar.event,rec_name",0,Name,Nom,0
-field,"calendar.event,recurrence",0,Recurrence,Récurrence,0
-field,"calendar.event,rrules",0,Recurrence Rules,Règles de récurrence,0
-field,"calendar.event,sequence",0,Sequence,Séquence,0
-field,"calendar.event,status",0,Status,Statut,0
-field,"calendar.event,summary",0,Summary,Résumé,0
-field,"calendar.event,timezone",0,Timezone,Fuseau Horaire,0
-field,"calendar.event,transp",0,Time Transparency,Transparence,0
-field,"calendar.event,uuid",0,UUID,UUID,0
-field,"calendar.event,vevent",0,vevent,vevent,0
-field,"calendar.event-calendar.category,category",0,Category,Catégorie,0
-field,"calendar.event-calendar.category,event",0,Event,Événement,0
-field,"calendar.event-calendar.category,rec_name",0,Name,Nom,0
-field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Alarme calendrier,0
-field,"calendar.event.alarm,event",0,Event,Événement,0
-field,"calendar.event.alarm,rec_name",0,Name,Nom,0
-field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Participant calendrier,0
-field,"calendar.event.attendee,event",0,Event,Événement,0
-field,"calendar.event.attendee,rec_name",0,Name,Nom,0
-field,"calendar.event.exdate,calendar_date",0,Calendar Date,Date calendrier,0
-field,"calendar.event.exdate,event",0,Event,Événement,0
-field,"calendar.event.exdate,rec_name",0,Name,Nom,0
-field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
-field,"calendar.event.exrule,event",0,Event,Événement,0
-field,"calendar.event.exrule,rec_name",0,Name,Nom,0
-field,"calendar.event.rdate,calendar_date",0,Calendar Date,Date calendrier,0
-field,"calendar.event.rdate,event",0,Event,Événement,0
-field,"calendar.event.rdate,rec_name",0,Name,Nom,0
-field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
-field,"calendar.event.rrule,event",0,Event,Événement,0
-field,"calendar.event.rrule,rec_name",0,Name,Nom,0
-field,"calendar.location,name",0,Name,Nom,0
-field,"calendar.location,rec_name",0,Name,Nom,0
-field,"calendar.rrule,byday",0,By Day,Par jour,0
-field,"calendar.rrule,byhour",0,By Hour,Par heure,0
-field,"calendar.rrule,byminute",0,By Minute,Par minute,0
-field,"calendar.rrule,bymonth",0,By Month,Par mois,0
-field,"calendar.rrule,bymonthday",0,By Month Day,Par jour du mois,0
-field,"calendar.rrule,bysecond",0,By Second,Par seconde,0
-field,"calendar.rrule,bysetpos",0,By Position,Par position,0
-field,"calendar.rrule,byweekno",0,By Week Number,Par numéro de semaine,0
-field,"calendar.rrule,byyearday",0,By Year Day,Par jour de l'année,0
-field,"calendar.rrule,count",0,Count,Répétitions,0
-field,"calendar.rrule,freq",0,Frequency,Fréquence,0
-field,"calendar.rrule,interval",0,Interval,Intervalle,0
-field,"calendar.rrule,rec_name",0,Name,Nom,0
-field,"calendar.rrule,until",0,Until Date,Date de fin,0
-field,"calendar.rrule,until_date",0,Is Date,Est une date,0
-field,"calendar.rrule,wkst",0,Week Day,Jour de la semaine,0
-field,"res.user,calendars",0,Calendars,Calendriers,0
-help,"calendar.calendar,owner",0,The user must have an email,L'utilisateur doit avoir une adresse mail,0
-help,"calendar.date,date",0,"Ignore time of field ""Date"", but handle as date only.","Ignorer l'heure du champ ""Date"" et considérer uniquement la date",0
-help,"calendar.event,uuid",0,Universally Unique Identifier,Identificateur unique universel,0
-help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","Ignorer l'heure du champ ""Date de fin"" et considérer uniquement la date",0
-model,"calendar.alarm,name",0,Alarm,Alarme,0
-model,"calendar.attendee,name",0,Attendee,Participant,0
-model,"calendar.calendar,name",0,Calendar,Calendrier,0
-model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Calendrier - Lecture - Utilisateur,0
-model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Calendrier - Écriture - Utilisateur,0
-model,"calendar.category,name",0,Category,Catégorie,0
-model,"calendar.date,name",0,Calendar Date,Date calendrier,0
-model,"calendar.event,name",0,Event,Événement,0
-model,"calendar.event-calendar.category,name",0,Event - Category,Évenement - Catégorie,0
-model,"calendar.event.alarm,name",0,Alarm,Alarme,0
-model,"calendar.event.attendee,name",0,Attendee,Participant,0
-model,"calendar.event.exdate,name",0,Exception Date,Date d'exception,0
-model,"calendar.event.exrule,name",0,Exception Rule,Règle d'exception,0
-model,"calendar.event.rdate,name",0,Recurrence Date,Date de récurrence,0
-model,"calendar.event.rrule,name",0,Recurrence Rule,Règle de récurrence,0
-model,"calendar.location,name",0,Location,Emplacement,0
-model,"calendar.rrule,name",0,Recurrence Rule,Règle de récurrence,0
-model,"ir.action,name",act_calendar_form,Calendars,Calendriers,0
-model,"ir.action,name",act_calendar_form2,Calendars,Calendriers,0
-model,"ir.action,name",act_event_form,Events,Événement,0
-model,"ir.action,name",act_event_form2,Events,Événements,0
-model,"ir.action,name",act_event_form3,Events,Événements,0
-model,"ir.ui.menu,name",menu_calendar,Calendar Management,Gestion de calendrier,0
-model,"ir.ui.menu,name",menu_calendar_form,Calendars,Calendriers,0
-model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Nouveau calendrier,0
-model,"ir.ui.menu,name",menu_event_form,Events,Évenement,0
-model,"ir.ui.menu,name",menu_event_form2,New Event,Nouvel événement,0
-model,"res.group,name",group_calendar_admin,Calendar Administration,Administration calendrier,0
-selection,"calendar.attendee,status",0,,,0
-selection,"calendar.attendee,status",0,Accepted,Accepté,0
-selection,"calendar.attendee,status",0,Declined,Décliné,0
-selection,"calendar.attendee,status",0,Delegated,Délégué,0
-selection,"calendar.attendee,status",0,Needs Action,Nécessite une action,0
-selection,"calendar.attendee,status",0,Tentative,Tentative,0
-selection,"calendar.event,classification",0,Confidential,Confidentiel,0
-selection,"calendar.event,classification",0,Private,Privé,0
-selection,"calendar.event,classification",0,Public,Publique,0
-selection,"calendar.event,status",0,,,0
-selection,"calendar.event,status",0,Cancelled,Annulé,0
-selection,"calendar.event,status",0,Confirmed,Confirmé,0
-selection,"calendar.event,status",0,Tentative,Tentative,0
-selection,"calendar.event,transp",0,Opaque,Opaque,0
-selection,"calendar.event,transp",0,Transparent,transparent,0
-selection,"calendar.rrule,freq",0,Daily,Journalier,0
-selection,"calendar.rrule,freq",0,Hourly,Horaire,0
-selection,"calendar.rrule,freq",0,Minutely,Chaque minute,0
-selection,"calendar.rrule,freq",0,Monthly,Mensuel,0
-selection,"calendar.rrule,freq",0,Secondly,Chaque seconde,0
-selection,"calendar.rrule,freq",0,Weekly,hebdomadaire,0
-selection,"calendar.rrule,freq",0,Yearly,Annuel,0
-selection,"calendar.rrule,wkst",0,Friday,Vendredi,0
-selection,"calendar.rrule,wkst",0,Monday,Lundi,0
-selection,"calendar.rrule,wkst",0,Saturday,Samedi,0
-selection,"calendar.rrule,wkst",0,Sunday,Dimanche,0
-selection,"calendar.rrule,wkst",0,Thursday,Jeudi,0
-selection,"calendar.rrule,wkst",0,Tuesday,Mardi,0
-selection,"calendar.rrule,wkst",0,Wednesday,Mercredi,0
-view,calendar.calendar,0,Calendar,Calendrier,0
-view,calendar.calendar,0,Calendars,Calendriers,0
-view,calendar.calendar,0,General,Général,0
-view,calendar.calendar,0,Security,Sécurité,0
-view,calendar.category,0,Categories,Catégories,0
-view,calendar.category,0,Category,Catégorie,0
-view,calendar.event,0,Attendees,Participants,0
-view,calendar.event,0,Categories,Catégories,0
-view,calendar.event,0,Event,Événement,0
-view,calendar.event,0,Events,Événements,0
-view,calendar.event,0,General,Général,0
-view,calendar.event,0,Occurences,Occurrences,0
-view,calendar.event.attendee,0,Attendee,Participant,0
-view,calendar.event.attendee,0,Attendees,Participants,0
-view,calendar.event.exdate,0,Exception Date,Date d'exception,0
-view,calendar.event.exdate,0,Exception Dates,Dates d'exception,0
-view,calendar.event.exrule,0,Exception Rule,Règle d'exception,0
-view,calendar.event.exrule,0,Exception Rules,Règles d'exception,0
-view,calendar.event.rdate,0,Recurrence Date,Date de récurrence,0
-view,calendar.event.rdate,0,Recurrence Dates,Dates de récurrence,0
-view,calendar.event.rrule,0,Recurrence Rule,Règle de récurrence,0
-view,calendar.event.rrule,0,Recurrence Rules,Règles de récurrence,0
-view,calendar.location,0,Location,Emplacement,0
-view,calendar.location,0,Locations,Emplacements,0
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
new file mode 100644
index 0000000..0c5f80b
--- /dev/null
+++ b/locale/bg_BG.po
@@ -0,0 +1,760 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.calendar:0"
+msgid "A user can have only one calendar!"
+msgstr "Потребителя може да има само един календар!"
+
+msgctxt "error:calendar.calendar:0"
+msgid "The name of calendar must be unique!"
+msgstr "Името на календара трябва да е уникално!"
+
+msgctxt "error:calendar.category:0"
+msgid "The name of calendar category must be unique!"
+msgstr "Името на категорията на календара трябва да е уникално!"
+
+msgctxt "error:calendar.event:0"
+msgid "Recurrence can not be recurrent!"
+msgstr "Повторението не може да е периодично!"
+
+msgctxt "error:calendar.event:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "UUID и взаимна вложеност трябва да са уникални в календар!"
+
+msgctxt "error:calendar.location:0"
+msgid "The name of calendar location must be unique!"
+msgstr "Името на местонахождението на календара трябва да е уникално!"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Day\""
+msgstr "Невалиден \"По ден\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Hour\""
+msgstr "Навалиден \"По час\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Minute\""
+msgstr "Невалиден \"По минута\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month Day\""
+msgstr "Невалиден \"По ден от месец\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month\""
+msgstr "Невалидно \"По месец\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Position\""
+msgstr "Невалиден \"По позиция\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Second\""
+msgstr "Невалиден \"По секунда\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Week Number\""
+msgstr "Невалиден \"По номер на седмица\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Year Day\""
+msgstr "Невалиден \"По ден от годината\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Only one of \"until\" and \"count\" can be set!"
+msgstr "\"Крайна дата\" и \"брой\" не може да се попълва по едно и също време!"
+
+msgctxt "field:calendar.alarm,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.alarm,valarm:0"
+msgid "valarm"
+msgstr ""
+
+msgctxt "field:calendar.attendee,attendee:0"
+msgid "attendee"
+msgstr "присътващ"
+
+msgctxt "field:calendar.attendee,email:0"
+msgid "Email"
+msgstr "Email"
+
+msgctxt "field:calendar.attendee,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.attendee,status:0"
+msgid "Participation Status"
+msgstr "Статус на участие"
+
+msgctxt "field:calendar.calendar,description:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:calendar.calendar,name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.calendar,owner:0"
+msgid "Owner"
+msgstr "Собственик"
+
+msgctxt "field:calendar.calendar,read_users:0"
+msgid "Read Users"
+msgstr "Потребители с права за четене"
+
+msgctxt "field:calendar.calendar,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.calendar,write_users:0"
+msgid "Write Users"
+msgstr "Записване на потребители"
+
+msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Календар"
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgid "User"
+msgstr "Потребител"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Календар"
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgid "User"
+msgstr "Потребител"
+
+msgctxt "field:calendar.category,name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.date,date:0"
+msgid "Is Date"
+msgstr "Е дата"
+
+msgctxt "field:calendar.date,datetime:0"
+msgid "Date"
+msgstr "Дата"
+
+msgctxt "field:calendar.date,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.event,alarms:0"
+msgid "Alarms"
+msgstr "Аларми"
+
+msgctxt "field:calendar.event,all_day:0"
+msgid "All Day"
+msgstr "Всички дни"
+
+msgctxt "field:calendar.event,attendees:0"
+msgid "Attendees"
+msgstr "Присъстващи"
+
+msgctxt "field:calendar.event,calendar:0"
+msgid "Calendar"
+msgstr "Календар"
+
+msgctxt "field:calendar.event,calendar_owner:0"
+msgid "Owner"
+msgstr "Собственик"
+
+msgctxt "field:calendar.event,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Потребители с права за четене"
+
+msgctxt "field:calendar.event,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Записване на потребители"
+
+msgctxt "field:calendar.event,categories:0"
+msgid "Categories"
+msgstr "Категории"
+
+msgctxt "field:calendar.event,classification:0"
+msgid "Classification"
+msgstr "Класификация"
+
+msgctxt "field:calendar.event,description:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:calendar.event,dtend:0"
+msgid "End Date"
+msgstr "Крайна дата"
+
+msgctxt "field:calendar.event,dtstart:0"
+msgid "Start Date"
+msgstr "Начална дата"
+
+msgctxt "field:calendar.event,exdates:0"
+msgid "Exception Dates"
+msgstr "Дати на грешките"
+
+msgctxt "field:calendar.event,exrules:0"
+msgid "Exception Rules"
+msgstr "Правила при грешка"
+
+msgctxt "field:calendar.event,location:0"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "field:calendar.event,occurences:0"
+msgid "Occurences"
+msgstr "Събития"
+
+msgctxt "field:calendar.event,organizer:0"
+msgid "Organizer"
+msgstr "Организатор"
+
+msgctxt "field:calendar.event,parent:0"
+msgid "Parent"
+msgstr "Родител"
+
+msgctxt "field:calendar.event,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Дати на повторяемост"
+
+msgctxt "field:calendar.event,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.event,recurrence:0"
+msgid "Recurrence"
+msgstr "Повторение"
+
+msgctxt "field:calendar.event,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Правила за повторяемост"
+
+msgctxt "field:calendar.event,sequence:0"
+msgid "Sequence"
+msgstr "Последователност"
+
+msgctxt "field:calendar.event,status:0"
+msgid "Status"
+msgstr "Състояние"
+
+msgctxt "field:calendar.event,summary:0"
+msgid "Summary"
+msgstr "Обобщено"
+
+msgctxt "field:calendar.event,timezone:0"
+msgid "Timezone"
+msgstr "Времева зона"
+
+msgctxt "field:calendar.event,transp:0"
+msgid "Time Transparency"
+msgstr "Прозрачен във времето"
+
+msgctxt "field:calendar.event,uuid:0"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.event,vevent:0"
+msgid "vevent"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,category:0"
+msgid "Category"
+msgstr "Категория"
+
+msgctxt "field:calendar.event-calendar.category,event:0"
+msgid "Event"
+msgstr "Събитие"
+
+msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr "Аларма на календар"
+
+msgctxt "field:calendar.event.alarm,event:0"
+msgid "Event"
+msgstr "Събитие"
+
+msgctxt "field:calendar.event.alarm,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr "Присъстващ на календар"
+
+msgctxt "field:calendar.event.attendee,event:0"
+msgid "Event"
+msgstr "Събитие"
+
+msgctxt "field:calendar.event.attendee,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Дата от календар"
+
+msgctxt "field:calendar.event.exdate,event:0"
+msgid "Event"
+msgstr "Събитие"
+
+msgctxt "field:calendar.event.exdate,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,event:0"
+msgid "Event"
+msgstr "Събитие"
+
+msgctxt "field:calendar.event.exrule,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Дата от календар"
+
+msgctxt "field:calendar.event.rdate,event:0"
+msgid "Event"
+msgstr "Събитие"
+
+msgctxt "field:calendar.event.rdate,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,event:0"
+msgid "Event"
+msgstr "Събитие"
+
+msgctxt "field:calendar.event.rrule,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.location,name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.location,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.rrule,byday:0"
+msgid "By Day"
+msgstr "По ден"
+
+msgctxt "field:calendar.rrule,byhour:0"
+msgid "By Hour"
+msgstr "По час"
+
+msgctxt "field:calendar.rrule,byminute:0"
+msgid "By Minute"
+msgstr "По минута"
+
+msgctxt "field:calendar.rrule,bymonth:0"
+msgid "By Month"
+msgstr "По месец"
+
+msgctxt "field:calendar.rrule,bymonthday:0"
+msgid "By Month Day"
+msgstr "По ден от месеца"
+
+msgctxt "field:calendar.rrule,bysecond:0"
+msgid "By Second"
+msgstr "По секунда"
+
+msgctxt "field:calendar.rrule,bysetpos:0"
+msgid "By Position"
+msgstr "По позиция"
+
+msgctxt "field:calendar.rrule,byweekno:0"
+msgid "By Week Number"
+msgstr "По номер на седмицата"
+
+msgctxt "field:calendar.rrule,byyearday:0"
+msgid "By Year Day"
+msgstr "По ден от годината"
+
+msgctxt "field:calendar.rrule,count:0"
+msgid "Count"
+msgstr "Брой"
+
+msgctxt "field:calendar.rrule,freq:0"
+msgid "Frequency"
+msgstr "Честота"
+
+msgctxt "field:calendar.rrule,interval:0"
+msgid "Interval"
+msgstr "Интервал"
+
+msgctxt "field:calendar.rrule,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.rrule,until:0"
+msgid "Until Date"
+msgstr "До дата"
+
+msgctxt "field:calendar.rrule,until_date:0"
+msgid "Is Date"
+msgstr "Е дата"
+
+msgctxt "field:calendar.rrule,wkst:0"
+msgid "Week Day"
+msgstr "Ден от седмица"
+
+msgctxt "field:res.user,calendars:0"
+msgid "Calendars"
+msgstr "Календари"
+
+msgctxt "help:calendar.calendar,owner:0"
+msgid "The user must have an email"
+msgstr "Потребителя трябва да има email"
+
+msgctxt "help:calendar.date,date:0"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "От полето \"Дата\" се игнорира часа и се използва само датата."
+
+msgctxt "help:calendar.event,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Универсален иникален идентификатор"
+
+msgctxt "help:calendar.rrule,until_date:0"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr "От полето \"До дата\" се игнорира часа и се използва само датата."
+
+msgctxt "model:calendar.alarm,name:0"
+msgid "Alarm"
+msgstr "Аларма"
+
+msgctxt "model:calendar.attendee,name:0"
+msgid "Attendee"
+msgstr "Присъстващ"
+
+msgctxt "model:calendar.calendar,name:0"
+msgid "Calendar"
+msgstr "Календар"
+
+msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgid "Calendar - read - User"
+msgstr ""
+
+msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgid "Calendar - write - User"
+msgstr ""
+
+msgctxt "model:calendar.category,name:0"
+msgid "Category"
+msgstr "Категория"
+
+msgctxt "model:calendar.date,name:0"
+msgid "Calendar Date"
+msgstr "Дата от календар"
+
+msgctxt "model:calendar.event,name:0"
+msgid "Event"
+msgstr "Събитие"
+
+msgctxt "model:calendar.event-calendar.category,name:0"
+msgid "Event - Category"
+msgstr "Събитие - категория"
+
+msgctxt "model:calendar.event.alarm,name:0"
+msgid "Alarm"
+msgstr "Аларма"
+
+msgctxt "model:calendar.event.attendee,name:0"
+msgid "Attendee"
+msgstr "Присъстващ"
+
+msgctxt "model:calendar.event.exdate,name:0"
+msgid "Exception Date"
+msgstr "Дата на грешка"
+
+msgctxt "model:calendar.event.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Правило при грешка"
+
+msgctxt "model:calendar.event.rdate,name:0"
+msgid "Recurrence Date"
+msgstr "Повтаряща се дата"
+
+msgctxt "model:calendar.event.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Правило за повторение"
+
+msgctxt "model:calendar.location,name:0"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "model:calendar.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Правило за повторение"
+
+msgctxt "model:ir.action,name:act_calendar_form"
+msgid "Calendars"
+msgstr "Календари"
+
+msgctxt "model:ir.action,name:act_event_form"
+msgid "Events"
+msgstr "Събития"
+
+msgctxt "model:ir.action,name:act_event_form3"
+msgid "Events"
+msgstr "Събития"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_calendar"
+msgid "Calendar"
+msgstr "Управление на календари"
+
+msgctxt "model:ir.ui.menu,name:menu_calendar_form"
+msgid "Calendars"
+msgstr "Календари"
+
+msgctxt "model:ir.ui.menu,name:menu_event_form"
+msgid "Events"
+msgstr "Събития"
+
+msgctxt "model:res.group,name:group_calendar_admin"
+msgid "Calendar Administration"
+msgstr "Управление на календар"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Accepted"
+msgstr "Приет"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Declined"
+msgstr "Отхвърлен"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Delegated"
+msgstr "Делегиран"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Needs Action"
+msgstr "Необходимо е действие"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Tentative"
+msgstr "Пробен"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Confidential"
+msgstr "Поверителен"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Private"
+msgstr "Частен"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Public"
+msgstr "Публичен"
+
+msgctxt "selection:calendar.event,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Cancelled"
+msgstr "Отказан"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Confirmed"
+msgstr "Потвърден"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Tentative"
+msgstr "Пробен"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Opaque"
+msgstr "Непрозрачен"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Transparent"
+msgstr "Прозрачен"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Daily"
+msgstr "Ежедневно"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Hourly"
+msgstr "Ежечасно"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Minutely"
+msgstr "Ежеминутно"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Monthly"
+msgstr "Месечно"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Secondly"
+msgstr "Всяка секунда"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Weekly"
+msgstr "Седмично"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Yearly"
+msgstr "Годишно"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Friday"
+msgstr "Петък"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Monday"
+msgstr "Понеделник"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Saturday"
+msgstr "Събота"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Sunday"
+msgstr "Неделя"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Thursday"
+msgstr "Четвъртък"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Tuesday"
+msgstr "Вторник"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Wednesday"
+msgstr "Четвъртък"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendar"
+msgstr "Календар"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendars"
+msgstr "Календари"
+
+msgctxt "view:calendar.calendar:0"
+msgid "General"
+msgstr "Основен"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Security"
+msgstr "Сигурност"
+
+msgctxt "view:calendar.category:0"
+msgid "Categories"
+msgstr "Категории"
+
+msgctxt "view:calendar.category:0"
+msgid "Category"
+msgstr "Категория"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendee"
+msgstr "Присъстващ"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendees"
+msgstr "Присъстващи"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Date"
+msgstr "Дата на грешка"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Dates"
+msgstr "Дати на грешките"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rule"
+msgstr "Правило при грешка"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rules"
+msgstr "Правила при грешка"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Date"
+msgstr "Повтаряща се дата"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Дати на повторяемост"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Правило за повторение"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Правила за повторяемост"
+
+msgctxt "view:calendar.event:0"
+msgid "Attendees"
+msgstr "Присъстващи"
+
+msgctxt "view:calendar.event:0"
+msgid "Categories"
+msgstr "Категории"
+
+msgctxt "view:calendar.event:0"
+msgid "Event"
+msgstr "Събитие"
+
+msgctxt "view:calendar.event:0"
+msgid "Events"
+msgstr "Събития"
+
+msgctxt "view:calendar.event:0"
+msgid "General"
+msgstr "Основен"
+
+msgctxt "view:calendar.event:0"
+msgid "Occurences"
+msgstr "Събития"
+
+msgctxt "view:calendar.location:0"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "view:calendar.location:0"
+msgid "Locations"
+msgstr "Местонахождения"
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
new file mode 100644
index 0000000..72d4400
--- /dev/null
+++ b/locale/cs_CZ.po
@@ -0,0 +1,759 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.calendar:0"
+msgid "A user can have only one calendar!"
+msgstr ""
+
+msgctxt "error:calendar.calendar:0"
+msgid "The name of calendar must be unique!"
+msgstr ""
+
+msgctxt "error:calendar.category:0"
+msgid "The name of calendar category must be unique!"
+msgstr ""
+
+msgctxt "error:calendar.event:0"
+msgid "Recurrence can not be recurrent!"
+msgstr ""
+
+msgctxt "error:calendar.event:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr ""
+
+msgctxt "error:calendar.location:0"
+msgid "The name of calendar location must be unique!"
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Day\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Hour\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Minute\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month Day\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Position\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Second\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Week Number\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Year Day\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Only one of \"until\" and \"count\" can be set!"
+msgstr ""
+
+msgctxt "field:calendar.alarm,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.alarm,valarm:0"
+msgid "valarm"
+msgstr ""
+
+msgctxt "field:calendar.attendee,attendee:0"
+msgid "attendee"
+msgstr ""
+
+msgctxt "field:calendar.attendee,email:0"
+msgid "Email"
+msgstr ""
+
+msgctxt "field:calendar.attendee,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.attendee,status:0"
+msgid "Participation Status"
+msgstr ""
+
+msgctxt "field:calendar.calendar,description:0"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:calendar.calendar,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.calendar,owner:0"
+msgid "Owner"
+msgstr ""
+
+msgctxt "field:calendar.calendar,read_users:0"
+msgid "Read Users"
+msgstr ""
+
+msgctxt "field:calendar.calendar,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.calendar,write_users:0"
+msgid "Write Users"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgid "User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgid "User"
+msgstr ""
+
+msgctxt "field:calendar.category,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.category,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.date,date:0"
+msgid "Is Date"
+msgstr ""
+
+msgctxt "field:calendar.date,datetime:0"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:calendar.date,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.event,alarms:0"
+msgid "Alarms"
+msgstr ""
+
+msgctxt "field:calendar.event,all_day:0"
+msgid "All Day"
+msgstr ""
+
+msgctxt "field:calendar.event,attendees:0"
+msgid "Attendees"
+msgstr ""
+
+msgctxt "field:calendar.event,calendar:0"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "field:calendar.event,calendar_owner:0"
+msgid "Owner"
+msgstr ""
+
+msgctxt "field:calendar.event,calendar_read_users:0"
+msgid "Read Users"
+msgstr ""
+
+msgctxt "field:calendar.event,calendar_write_users:0"
+msgid "Write Users"
+msgstr ""
+
+msgctxt "field:calendar.event,categories:0"
+msgid "Categories"
+msgstr ""
+
+msgctxt "field:calendar.event,classification:0"
+msgid "Classification"
+msgstr ""
+
+msgctxt "field:calendar.event,description:0"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:calendar.event,dtend:0"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:calendar.event,dtstart:0"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:calendar.event,exdates:0"
+msgid "Exception Dates"
+msgstr ""
+
+msgctxt "field:calendar.event,exrules:0"
+msgid "Exception Rules"
+msgstr ""
+
+msgctxt "field:calendar.event,location:0"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:calendar.event,occurences:0"
+msgid "Occurences"
+msgstr ""
+
+msgctxt "field:calendar.event,organizer:0"
+msgid "Organizer"
+msgstr ""
+
+msgctxt "field:calendar.event,parent:0"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:calendar.event,rdates:0"
+msgid "Recurrence Dates"
+msgstr ""
+
+msgctxt "field:calendar.event,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.event,recurrence:0"
+msgid "Recurrence"
+msgstr ""
+
+msgctxt "field:calendar.event,rrules:0"
+msgid "Recurrence Rules"
+msgstr ""
+
+msgctxt "field:calendar.event,sequence:0"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "field:calendar.event,status:0"
+msgid "Status"
+msgstr ""
+
+msgctxt "field:calendar.event,summary:0"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:calendar.event,timezone:0"
+msgid "Timezone"
+msgstr ""
+
+msgctxt "field:calendar.event,transp:0"
+msgid "Time Transparency"
+msgstr ""
+
+msgctxt "field:calendar.event,uuid:0"
+msgid "UUID"
+msgstr ""
+
+msgctxt "field:calendar.event,vevent:0"
+msgid "vevent"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,category:0"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,event:0"
+msgid "Event"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,event:0"
+msgid "Event"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,event:0"
+msgid "Event"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,event:0"
+msgid "Event"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,event:0"
+msgid "Event"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,event:0"
+msgid "Event"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,event:0"
+msgid "Event"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.location,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.location,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byday:0"
+msgid "By Day"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byhour:0"
+msgid "By Hour"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byminute:0"
+msgid "By Minute"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bymonth:0"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bymonthday:0"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bysecond:0"
+msgid "By Second"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bysetpos:0"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byweekno:0"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byyearday:0"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:calendar.rrule,count:0"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:calendar.rrule,freq:0"
+msgid "Frequency"
+msgstr ""
+
+msgctxt "field:calendar.rrule,interval:0"
+msgid "Interval"
+msgstr ""
+
+msgctxt "field:calendar.rrule,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.rrule,until:0"
+msgid "Until Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,until_date:0"
+msgid "Is Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,wkst:0"
+msgid "Week Day"
+msgstr ""
+
+msgctxt "field:res.user,calendars:0"
+msgid "Calendars"
+msgstr ""
+
+msgctxt "help:calendar.calendar,owner:0"
+msgid "The user must have an email"
+msgstr ""
+
+msgctxt "help:calendar.date,date:0"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.event,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr ""
+
+msgctxt "help:calendar.rrule,until_date:0"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+
+msgctxt "model:calendar.alarm,name:0"
+msgid "Alarm"
+msgstr ""
+
+msgctxt "model:calendar.attendee,name:0"
+msgid "Attendee"
+msgstr ""
+
+msgctxt "model:calendar.calendar,name:0"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgid "Calendar - read - User"
+msgstr ""
+
+msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgid "Calendar - write - User"
+msgstr ""
+
+msgctxt "model:calendar.category,name:0"
+msgid "Category"
+msgstr ""
+
+msgctxt "model:calendar.date,name:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "model:calendar.event,name:0"
+msgid "Event"
+msgstr ""
+
+msgctxt "model:calendar.event-calendar.category,name:0"
+msgid "Event - Category"
+msgstr ""
+
+msgctxt "model:calendar.event.alarm,name:0"
+msgid "Alarm"
+msgstr ""
+
+msgctxt "model:calendar.event.attendee,name:0"
+msgid "Attendee"
+msgstr ""
+
+msgctxt "model:calendar.event.exdate,name:0"
+msgid "Exception Date"
+msgstr ""
+
+msgctxt "model:calendar.event.exrule,name:0"
+msgid "Exception Rule"
+msgstr ""
+
+msgctxt "model:calendar.event.rdate,name:0"
+msgid "Recurrence Date"
+msgstr ""
+
+msgctxt "model:calendar.event.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr ""
+
+msgctxt "model:calendar.location,name:0"
+msgid "Location"
+msgstr ""
+
+msgctxt "model:calendar.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_calendar_form"
+msgid "Calendars"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_event_form"
+msgid "Events"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_event_form3"
+msgid "Events"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_calendar"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_calendar_form"
+msgid "Calendars"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_event_form"
+msgid "Events"
+msgstr ""
+
+msgctxt "model:res.group,name:group_calendar_admin"
+msgid "Calendar Administration"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Accepted"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Declined"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Delegated"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Needs Action"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Tentative"
+msgstr ""
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Confidential"
+msgstr ""
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Private"
+msgstr ""
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Public"
+msgstr ""
+
+msgctxt "selection:calendar.event,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Confirmed"
+msgstr ""
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Tentative"
+msgstr ""
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Opaque"
+msgstr ""
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Transparent"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Yearly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Friday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Monday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Saturday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Sunday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Thursday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Tuesday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Wednesday"
+msgstr ""
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendars"
+msgstr ""
+
+msgctxt "view:calendar.calendar:0"
+msgid "General"
+msgstr ""
+
+msgctxt "view:calendar.calendar:0"
+msgid "Security"
+msgstr ""
+
+msgctxt "view:calendar.category:0"
+msgid "Categories"
+msgstr ""
+
+msgctxt "view:calendar.category:0"
+msgid "Category"
+msgstr ""
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendee"
+msgstr ""
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendees"
+msgstr ""
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Date"
+msgstr ""
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Dates"
+msgstr ""
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rule"
+msgstr ""
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rules"
+msgstr ""
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Date"
+msgstr ""
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Dates"
+msgstr ""
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rule"
+msgstr ""
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rules"
+msgstr ""
+
+msgctxt "view:calendar.event:0"
+msgid "Attendees"
+msgstr ""
+
+msgctxt "view:calendar.event:0"
+msgid "Categories"
+msgstr ""
+
+msgctxt "view:calendar.event:0"
+msgid "Event"
+msgstr ""
+
+msgctxt "view:calendar.event:0"
+msgid "Events"
+msgstr ""
+
+msgctxt "view:calendar.event:0"
+msgid "General"
+msgstr ""
+
+msgctxt "view:calendar.event:0"
+msgid "Occurences"
+msgstr ""
+
+msgctxt "view:calendar.location:0"
+msgid "Location"
+msgstr ""
+
+msgctxt "view:calendar.location:0"
+msgid "Locations"
+msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
new file mode 100644
index 0000000..f4c7715
--- /dev/null
+++ b/locale/de_DE.po
@@ -0,0 +1,765 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.calendar:0"
+msgid "A user can have only one calendar!"
+msgstr "Es ist nur ein Kalender pro Benutzer möglich!"
+
+msgctxt "error:calendar.calendar:0"
+msgid "The name of calendar must be unique!"
+msgstr "Kalendername kann nicht mehrfach vergeben werden!"
+
+msgctxt "error:calendar.category:0"
+msgid "The name of calendar category must be unique!"
+msgstr "Name für Kalenderkategorie kann nicht mehrfach vergeben werden!"
+
+msgctxt "error:calendar.event:0"
+msgid "Recurrence can not be recurrent!"
+msgstr "Wiederholungen können nicht rekursiv sein!"
+
+msgctxt "error:calendar.event: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 "error:calendar.location:0"
+msgid "The name of calendar location must be unique!"
+msgstr "Name für Kalenderort kann nicht mehrfach vergeben werden!"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Day\""
+msgstr "Ungültig \"Für Tag\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Hour\""
+msgstr "Ungültig \"Für Stunde\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Minute\""
+msgstr "Ungültig \"Für Minute\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month Day\""
+msgstr "Ungültig \"Für Tag des Monats\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month\""
+msgstr "Ungültig \"Für Monat\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Position\""
+msgstr "Ungültig \"Für Position\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Second\""
+msgstr "Ungültig \"Für Sekunde\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Week Number\""
+msgstr "Ungültig \"Für Woche Nummer\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Year Day\""
+msgstr "Ungültig \"Für Tag des Jahres\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Only one of \"until\" and \"count\" can be set!"
+msgstr "Es kann nur entweder \"Bis\" oder \"Anzahl\" gesetzt werden!"
+
+msgctxt "field:calendar.alarm,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.alarm,valarm:0"
+msgid "valarm"
+msgstr "valarm"
+
+msgctxt "field:calendar.attendee,attendee:0"
+msgid "attendee"
+msgstr "Teilnehmer"
+
+msgctxt "field:calendar.attendee,email:0"
+msgid "Email"
+msgstr "E-Mail"
+
+msgctxt "field:calendar.attendee,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.attendee,status:0"
+msgid "Participation Status"
+msgstr "Teilnahmestatus"
+
+msgctxt "field:calendar.calendar,description:0"
+msgid "Description"
+msgstr "Bezeichnung"
+
+msgctxt "field:calendar.calendar,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.calendar,owner:0"
+msgid "Owner"
+msgstr "Besitzer"
+
+msgctxt "field:calendar.calendar,read_users:0"
+msgid "Read Users"
+msgstr "Benutzer mit Leseberechtigung"
+
+msgctxt "field:calendar.calendar,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.calendar,write_users:0"
+msgid "Write Users"
+msgstr "Benutzer mit Schreibberechtigung"
+
+msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Kalender"
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgid "User"
+msgstr "Benutzer"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Kalender"
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgid "User"
+msgstr "Benutzer"
+
+msgctxt "field:calendar.category,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.date,date:0"
+msgid "Is Date"
+msgstr "Als Datum"
+
+msgctxt "field:calendar.date,datetime:0"
+msgid "Date"
+msgstr "Zeitpunkt"
+
+msgctxt "field:calendar.date,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.event,alarms:0"
+msgid "Alarms"
+msgstr "Alarm"
+
+msgctxt "field:calendar.event,all_day:0"
+msgid "All Day"
+msgstr "Ganztägig"
+
+msgctxt "field:calendar.event,attendees:0"
+msgid "Attendees"
+msgstr "Teilnehmer"
+
+msgctxt "field:calendar.event,calendar:0"
+msgid "Calendar"
+msgstr "Kalender"
+
+msgctxt "field:calendar.event,calendar_owner:0"
+msgid "Owner"
+msgstr "Besitzer"
+
+msgctxt "field:calendar.event,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Benutzer mit Leseberechtigung"
+
+msgctxt "field:calendar.event,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Benutzer mit Schreibberechtigung"
+
+msgctxt "field:calendar.event,categories:0"
+msgid "Categories"
+msgstr "Kategorien"
+
+msgctxt "field:calendar.event,classification:0"
+msgid "Classification"
+msgstr "Klassifizierung"
+
+msgctxt "field:calendar.event,description:0"
+msgid "Description"
+msgstr "Bezeichnung"
+
+msgctxt "field:calendar.event,dtend:0"
+msgid "End Date"
+msgstr "Enddatum"
+
+msgctxt "field:calendar.event,dtstart:0"
+msgid "Start Date"
+msgstr "Anfangsdatum"
+
+msgctxt "field:calendar.event,exdates:0"
+msgid "Exception Dates"
+msgstr "Ausnahmedaten"
+
+msgctxt "field:calendar.event,exrules:0"
+msgid "Exception Rules"
+msgstr "Ausnahmeregeln"
+
+msgctxt "field:calendar.event,location:0"
+msgid "Location"
+msgstr "Ort"
+
+msgctxt "field:calendar.event,occurences:0"
+msgid "Occurences"
+msgstr "Ereignisse"
+
+msgctxt "field:calendar.event,organizer:0"
+msgid "Organizer"
+msgstr "Organisator"
+
+msgctxt "field:calendar.event,parent:0"
+msgid "Parent"
+msgstr "Übergeordnet (Termin)"
+
+msgctxt "field:calendar.event,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Wiederholungsdaten"
+
+msgctxt "field:calendar.event,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.event,recurrence:0"
+msgid "Recurrence"
+msgstr "Wiederholung"
+
+msgctxt "field:calendar.event,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Wiederholungsregeln"
+
+msgctxt "field:calendar.event,sequence:0"
+msgid "Sequence"
+msgstr "Revision"
+
+msgctxt "field:calendar.event,status:0"
+msgid "Status"
+msgstr "Status"
+
+msgctxt "field:calendar.event,summary:0"
+msgid "Summary"
+msgstr "Zusammenfassung"
+
+msgctxt "field:calendar.event,timezone:0"
+msgid "Timezone"
+msgstr "Zeitzone"
+
+msgctxt "field:calendar.event,transp:0"
+msgid "Time Transparency"
+msgstr "Zeittransparenz"
+
+msgctxt "field:calendar.event,uuid:0"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.event,vevent:0"
+msgid "vevent"
+msgstr "vevent"
+
+msgctxt "field:calendar.event-calendar.category,category:0"
+msgid "Category"
+msgstr "Kategorie"
+
+msgctxt "field:calendar.event-calendar.category,event:0"
+msgid "Event"
+msgstr "Termin"
+
+msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr "Kalender Alarm"
+
+msgctxt "field:calendar.event.alarm,event:0"
+msgid "Event"
+msgstr "Termin"
+
+msgctxt "field:calendar.event.alarm,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr "Kalender Teilnehmer"
+
+msgctxt "field:calendar.event.attendee,event:0"
+msgid "Event"
+msgstr "Termin"
+
+msgctxt "field:calendar.event.attendee,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Kalender Datum"
+
+msgctxt "field:calendar.event.exdate,event:0"
+msgid "Event"
+msgstr "Termin"
+
+msgctxt "field:calendar.event.exdate,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Kalender WRegel"
+
+msgctxt "field:calendar.event.exrule,event:0"
+msgid "Event"
+msgstr "Termin"
+
+msgctxt "field:calendar.event.exrule,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Kalender Datum"
+
+msgctxt "field:calendar.event.rdate,event:0"
+msgid "Event"
+msgstr "Termin"
+
+msgctxt "field:calendar.event.rdate,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Kalender WRegel"
+
+msgctxt "field:calendar.event.rrule,event:0"
+msgid "Event"
+msgstr "Termin"
+
+msgctxt "field:calendar.event.rrule,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.location,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.location,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.rrule,byday:0"
+msgid "By Day"
+msgstr "Für Tag"
+
+msgctxt "field:calendar.rrule,byhour:0"
+msgid "By Hour"
+msgstr "Für Stunde"
+
+msgctxt "field:calendar.rrule,byminute:0"
+msgid "By Minute"
+msgstr "Für Minute"
+
+msgctxt "field:calendar.rrule,bymonth:0"
+msgid "By Month"
+msgstr "Für Monat"
+
+msgctxt "field:calendar.rrule,bymonthday:0"
+msgid "By Month Day"
+msgstr "Für Tag des Monats"
+
+msgctxt "field:calendar.rrule,bysecond:0"
+msgid "By Second"
+msgstr "Für Sekunde"
+
+msgctxt "field:calendar.rrule,bysetpos:0"
+msgid "By Position"
+msgstr "Für Position"
+
+msgctxt "field:calendar.rrule,byweekno:0"
+msgid "By Week Number"
+msgstr "Für Woche Nummer"
+
+msgctxt "field:calendar.rrule,byyearday:0"
+msgid "By Year Day"
+msgstr "Für Tag des Jahres"
+
+msgctxt "field:calendar.rrule,count:0"
+msgid "Count"
+msgstr "Anzahl"
+
+msgctxt "field:calendar.rrule,freq:0"
+msgid "Frequency"
+msgstr "Häufigkeit"
+
+msgctxt "field:calendar.rrule,interval:0"
+msgid "Interval"
+msgstr "Intervall"
+
+msgctxt "field:calendar.rrule,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.rrule,until:0"
+msgid "Until Date"
+msgstr "Bis Zeitpunkt"
+
+msgctxt "field:calendar.rrule,until_date:0"
+msgid "Is Date"
+msgstr "Als Datum"
+
+msgctxt "field:calendar.rrule,wkst:0"
+msgid "Week Day"
+msgstr "Wochentag"
+
+msgctxt "field:res.user,calendars:0"
+msgid "Calendars"
+msgstr "Kalender"
+
+msgctxt "help:calendar.calendar,owner:0"
+msgid "The user must have an email"
+msgstr "Dem Benutzer muss eine E-Mail-Adresse zugeordnet sein!"
+
+msgctxt "help:calendar.date,date:0"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Verwende von Feld \"Zeitpunkt\" nur das Datum ohne den Zeitanteil."
+
+msgctxt "help:calendar.event,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Universally Unique Identifier"
+
+msgctxt "help:calendar.rrule,until_date:0"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr "Verwende von Feld \"Bis Zeitpunkt\" nur das Datum ohne den Zeitanteil."
+
+msgctxt "model:calendar.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarm"
+
+msgctxt "model:calendar.attendee,name:0"
+msgid "Attendee"
+msgstr "Teilnehmer"
+
+msgctxt "model:calendar.calendar,name:0"
+msgid "Calendar"
+msgstr "Kalender"
+
+msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgid "Calendar - read - User"
+msgstr "Kalender - Schreiben - Benutzer"
+
+msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgid "Calendar - write - User"
+msgstr "Kalender - Lesen - Benutzer"
+
+msgctxt "model:calendar.category,name:0"
+msgid "Category"
+msgstr "Kategorie"
+
+msgctxt "model:calendar.date,name:0"
+msgid "Calendar Date"
+msgstr "Kalender Datum"
+
+msgctxt "model:calendar.event,name:0"
+msgid "Event"
+msgstr "Termin"
+
+msgctxt "model:calendar.event-calendar.category,name:0"
+msgid "Event - Category"
+msgstr "Termin - Kategorie"
+
+msgctxt "model:calendar.event.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarm"
+
+msgctxt "model:calendar.event.attendee,name:0"
+msgid "Attendee"
+msgstr "Teilnehmer"
+
+msgctxt "model:calendar.event.exdate,name:0"
+msgid "Exception Date"
+msgstr "Ausnahmedatum"
+
+msgctxt "model:calendar.event.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Ausnahmeregel"
+
+msgctxt "model:calendar.event.rdate,name:0"
+msgid "Recurrence Date"
+msgstr "Wiederholungsdatum"
+
+msgctxt "model:calendar.event.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Wiederholungsregel"
+
+msgctxt "model:calendar.location,name:0"
+msgid "Location"
+msgstr "Ort"
+
+msgctxt "model:calendar.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Wiederholungsregel"
+
+msgctxt "model:ir.action,name:act_calendar_form"
+msgid "Calendars"
+msgstr "Kalender"
+
+msgctxt "model:ir.action,name:act_event_form"
+msgid "Events"
+msgstr "Termine"
+
+msgctxt "model:ir.action,name:act_event_form3"
+msgid "Events"
+msgstr "Termine"
+
+msgctxt "model:ir.ui.menu,name:menu_calendar"
+msgid "Calendar"
+msgstr "Kalender"
+
+msgctxt "model:ir.ui.menu,name:menu_calendar_form"
+msgid "Calendars"
+msgstr "Kalender"
+
+msgctxt "model:ir.ui.menu,name:menu_event_form"
+msgid "Events"
+msgstr "Termine"
+
+msgctxt "model:res.group,name:group_calendar_admin"
+msgid "Calendar Administration"
+msgstr "Kalender Administration"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Accepted"
+msgstr "Angenommen"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Declined"
+msgstr "Abgelehnt"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Delegated"
+msgstr "Delegiert"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Needs Action"
+msgstr "Aktion erforderlich"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Tentative"
+msgstr "Unter Vorbehalt"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Confidential"
+msgstr "Vertraulich"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Private"
+msgstr "Privat"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Public"
+msgstr "Öffentlich"
+
+msgctxt "selection:calendar.event,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Cancelled"
+msgstr "Abgesagt"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Confirmed"
+msgstr "Bestätigt"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Tentative"
+msgstr "Unter Vorbehalt"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Opaque"
+msgstr "Opak"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Transparent"
+msgstr "Transparent"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Daily"
+msgstr "Täglich"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Hourly"
+msgstr "Stündlich"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Minutely"
+msgstr "Minütlich"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Monthly"
+msgstr "Monatlich"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Secondly"
+msgstr "Sekündlich"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Weekly"
+msgstr "Wöchentlich"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Yearly"
+msgstr "Jährlich"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Friday"
+msgstr "Freitag"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Monday"
+msgstr "Montag"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Saturday"
+msgstr "Samstag"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Sunday"
+msgstr "Sonntag"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Thursday"
+msgstr "Donnerstag"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Tuesday"
+msgstr "Dienstag"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Wednesday"
+msgstr "Mittwoch"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendar"
+msgstr "Kalender"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendars"
+msgstr "Kalender"
+
+msgctxt "view:calendar.calendar:0"
+msgid "General"
+msgstr "Allgemein"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Security"
+msgstr "Sicherheit"
+
+msgctxt "view:calendar.category:0"
+msgid "Categories"
+msgstr "Kategorien"
+
+msgctxt "view:calendar.category:0"
+msgid "Category"
+msgstr "Kategorie"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendee"
+msgstr "Teilnehmer"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendees"
+msgstr "Teilnehmer"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Date"
+msgstr "Ausnahmedatum"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Dates"
+msgstr "Ausnahmedaten"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rule"
+msgstr "Ausnahmeregel"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rules"
+msgstr "Ausnahmeregeln"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Date"
+msgstr "Wiederholungsdatum"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Wiederholungsdaten"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Wiederholungsregel"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Wiederholungsregeln"
+
+msgctxt "view:calendar.event:0"
+msgid "Attendees"
+msgstr "Teilnehmer"
+
+msgctxt "view:calendar.event:0"
+msgid "Categories"
+msgstr "Kategorien"
+
+msgctxt "view:calendar.event:0"
+msgid "Event"
+msgstr "Termin"
+
+msgctxt "view:calendar.event:0"
+msgid "Events"
+msgstr "Termine"
+
+msgctxt "view:calendar.event:0"
+msgid "General"
+msgstr "Allgemein"
+
+msgctxt "view:calendar.event:0"
+msgid "Occurences"
+msgstr "Ereignisse"
+
+msgctxt "view:calendar.event:0"
+msgid "Recurrences"
+msgstr "Wiederholungen"
+
+msgctxt "view:calendar.location:0"
+msgid "Location"
+msgstr "Ort"
+
+msgctxt "view:calendar.location:0"
+msgid "Locations"
+msgstr "Orte"
diff --git a/locale/es_CO.po b/locale/es_CO.po
new file mode 100644
index 0000000..da25b87
--- /dev/null
+++ b/locale/es_CO.po
@@ -0,0 +1,769 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.calendar:0"
+msgid "A user can have only one calendar!"
+msgstr "¡Un usuario puede tener a lo sumo un calendario!"
+
+msgctxt "error:calendar.calendar:0"
+msgid "The name of calendar must be unique!"
+msgstr "¡El nombre del calendario es único!"
+
+msgctxt "error:calendar.category:0"
+msgid "The name of calendar category must be unique!"
+msgstr "¡El nombre de la categoría de calendario debe ser único!"
+
+msgctxt "error:calendar.event:0"
+msgid "Recurrence can not be recurrent!"
+msgstr "¡La repetición no puede repetirse!"
+
+msgctxt "error:calendar.event:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "¡El UUID y la recurrencia deben ser únicos por calendario! "
+
+msgctxt "error:calendar.location:0"
+msgid "The name of calendar location must be unique!"
+msgstr "¡El nombre del lugar del calendario debe ser único!"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Day\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Hour\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Minute\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month Day\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Position\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Second\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Week Number\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Year Day\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Only one of \"until\" and \"count\" can be set!"
+msgstr ""
+
+msgctxt "field:calendar.alarm,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.alarm,valarm:0"
+msgid "valarm"
+msgstr ""
+
+msgctxt "field:calendar.attendee,attendee:0"
+msgid "attendee"
+msgstr ""
+
+msgctxt "field:calendar.attendee,email:0"
+msgid "Email"
+msgstr "Correo Electrónico"
+
+msgctxt "field:calendar.attendee,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.attendee,status:0"
+msgid "Participation Status"
+msgstr ""
+
+msgctxt "field:calendar.calendar,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:calendar.calendar,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar,owner:0"
+msgid "Owner"
+msgstr "Propietario"
+
+msgctxt "field:calendar.calendar,read_users:0"
+msgid "Read Users"
+msgstr "Usuarios que pueden Leer"
+
+msgctxt "field:calendar.calendar,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar,write_users:0"
+msgid "Write Users"
+msgstr "Escribir Usuarios"
+
+msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "field:calendar.category,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.date,date:0"
+msgid "Is Date"
+msgstr "Es Fecha"
+
+#, fuzzy
+msgctxt "field:calendar.date,datetime:0"
+msgid "Date"
+msgstr "Fecha"
+
+#, fuzzy
+msgctxt "field:calendar.date,rec_name:0"
+msgid "Name"
+msgstr "Nombre de Contacto"
+
+msgctxt "field:calendar.event,alarms:0"
+msgid "Alarms"
+msgstr "Alarmas"
+
+msgctxt "field:calendar.event,all_day:0"
+msgid "All Day"
+msgstr "Todo el Día"
+
+msgctxt "field:calendar.event,attendees:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "field:calendar.event,calendar:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.event,calendar_owner:0"
+msgid "Owner"
+msgstr "Propietario"
+
+msgctxt "field:calendar.event,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Usuarios que pueden Leer"
+
+msgctxt "field:calendar.event,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Escribir Usuarios"
+
+msgctxt "field:calendar.event,categories:0"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "field:calendar.event,classification:0"
+msgid "Classification"
+msgstr "Clasificación"
+
+msgctxt "field:calendar.event,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:calendar.event,dtend:0"
+msgid "End Date"
+msgstr "Fecha Fin"
+
+msgctxt "field:calendar.event,dtstart:0"
+msgid "Start Date"
+msgstr "Fecha Inicial"
+
+msgctxt "field:calendar.event,exdates:0"
+msgid "Exception Dates"
+msgstr "Fechas de Excepción"
+
+msgctxt "field:calendar.event,exrules:0"
+msgid "Exception Rules"
+msgstr "Reglas de Excepción"
+
+msgctxt "field:calendar.event,location:0"
+msgid "Location"
+msgstr "Lugar"
+
+#, fuzzy
+msgctxt "field:calendar.event,occurences:0"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "field:calendar.event,organizer:0"
+msgid "Organizer"
+msgstr "Organizador"
+
+msgctxt "field:calendar.event,parent:0"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:calendar.event,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Fechas de Repetición"
+
+msgctxt "field:calendar.event,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event,recurrence:0"
+msgid "Recurrence"
+msgstr "Repetición"
+
+msgctxt "field:calendar.event,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Reglas de Repetición"
+
+msgctxt "field:calendar.event,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:calendar.event,status:0"
+msgid "Status"
+msgstr "Estado"
+
+msgctxt "field:calendar.event,summary:0"
+msgid "Summary"
+msgstr "Resumen"
+
+msgctxt "field:calendar.event,timezone:0"
+msgid "Timezone"
+msgstr "Zona horaria"
+
+msgctxt "field:calendar.event,transp:0"
+msgid "Time Transparency"
+msgstr "Transparencia de Tiempo"
+
+msgctxt "field:calendar.event,uuid:0"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.event,vevent:0"
+msgid "vevent"
+msgstr "vevento"
+
+msgctxt "field:calendar.event-calendar.category,category:0"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "field:calendar.event-calendar.category,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.alarm,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.attendee,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Fecha Calendario"
+
+msgctxt "field:calendar.event.exdate,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.exdate,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.exrule,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Fecha Calendario"
+
+msgctxt "field:calendar.event.rdate,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.rdate,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.rrule,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.rrule,byday:0"
+msgid "By Day"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byhour:0"
+msgid "By Hour"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byminute:0"
+msgid "By Minute"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bymonth:0"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bymonthday:0"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bysecond:0"
+msgid "By Second"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bysetpos:0"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byweekno:0"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byyearday:0"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:calendar.rrule,count:0"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:calendar.rrule,freq:0"
+msgid "Frequency"
+msgstr ""
+
+msgctxt "field:calendar.rrule,interval:0"
+msgid "Interval"
+msgstr ""
+
+msgctxt "field:calendar.rrule,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.rrule,until:0"
+msgid "Until Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.rrule,until_date:0"
+msgid "Is Date"
+msgstr "Es Fecha"
+
+msgctxt "field:calendar.rrule,wkst:0"
+msgid "Week Day"
+msgstr "Día de la Semana"
+
+msgctxt "field:res.user,calendars:0"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "help:calendar.calendar,owner:0"
+msgid "The user must have an email"
+msgstr ""
+
+msgctxt "help:calendar.date,date:0"
+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.event,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Idenitificador Universal Único"
+
+msgctxt "help:calendar.rrule,until_date:0"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+
+msgctxt "model:calendar.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.attendee,name:0"
+msgid "Attendee"
+msgstr "Asistente"
+
+msgctxt "model:calendar.calendar,name:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgid "Calendar - read - User"
+msgstr "Calendario - leer - Usuario"
+
+msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgid "Calendar - write - User"
+msgstr "Calendario - escribir - Usuario"
+
+msgctxt "model:calendar.category,name:0"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "model:calendar.date,name:0"
+msgid "Calendar Date"
+msgstr "Fecha Calendario"
+
+msgctxt "model:calendar.event,name:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "model:calendar.event-calendar.category,name:0"
+msgid "Event - Category"
+msgstr "Evento - Categoría"
+
+msgctxt "model:calendar.event.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.event.attendee,name:0"
+msgid "Attendee"
+msgstr "Asistente"
+
+msgctxt "model:calendar.event.exdate,name:0"
+msgid "Exception Date"
+msgstr "Fecha de Excepción"
+
+msgctxt "model:calendar.event.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Regla de Excepción"
+
+msgctxt "model:calendar.event.rdate,name:0"
+msgid "Recurrence Date"
+msgstr "Fecha de Repetición"
+
+msgctxt "model:calendar.event.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Regla de Repetición"
+
+msgctxt "model:calendar.location,name:0"
+msgid "Location"
+msgstr "Lugar"
+
+msgctxt "model:calendar.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Regla de Repetición"
+
+msgctxt "model:ir.action,name:act_calendar_form"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "model:ir.action,name:act_event_form"
+msgid "Events"
+msgstr "Eventos"
+
+msgctxt "model:ir.action,name:act_event_form3"
+msgid "Events"
+msgstr "Eventos"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_calendar"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "model:ir.ui.menu,name:menu_calendar_form"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "model:ir.ui.menu,name:menu_event_form"
+msgid "Events"
+msgstr "Eventos"
+
+msgctxt "model:res.group,name:group_calendar_admin"
+msgid "Calendar Administration"
+msgstr "Administrar Calendario"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Accepted"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Declined"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Delegated"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Needs Action"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Tentative"
+msgstr "Tentativa"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Confidential"
+msgstr "Confidencial"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Private"
+msgstr "Privado"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Public"
+msgstr "Público"
+
+msgctxt "selection:calendar.event,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Confirmed"
+msgstr "Confirmado"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Tentative"
+msgstr "Tentativa"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Opaque"
+msgstr "Opaco"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Transparent"
+msgstr "Transparente"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Yearly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "view:calendar.calendar:0"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Security"
+msgstr "Seguridad"
+
+msgctxt "view:calendar.category:0"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "view:calendar.category:0"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendee"
+msgstr "Asistente"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Date"
+msgstr "Fecha de Excepción"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Dates"
+msgstr "Fechas de Excepción"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rule"
+msgstr "Regla de Excepción"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rules"
+msgstr "Reglas de Excepción"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Date"
+msgstr "Fecha de Repetición"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Fechas de Repetición"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Regla de Repetición"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Reglas de Repetición"
+
+msgctxt "view:calendar.event:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.event:0"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "view:calendar.event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "view:calendar.event:0"
+msgid "Events"
+msgstr "Eventos"
+
+msgctxt "view:calendar.event:0"
+msgid "General"
+msgstr "General"
+
+#, fuzzy
+msgctxt "view:calendar.event:0"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "view:calendar.event:0"
+msgid "Recurrences"
+msgstr "Repeticiones"
+
+msgctxt "view:calendar.location:0"
+msgid "Location"
+msgstr "Lugar"
+
+msgctxt "view:calendar.location:0"
+msgid "Locations"
+msgstr "Lugares"
diff --git a/locale/es_ES.po b/locale/es_ES.po
new file mode 100644
index 0000000..d905bdc
--- /dev/null
+++ b/locale/es_ES.po
@@ -0,0 +1,764 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.calendar:0"
+msgid "A user can have only one calendar!"
+msgstr "Un usuario solo puede tener un calendario"
+
+msgctxt "error:calendar.calendar:0"
+msgid "The name of calendar must be unique!"
+msgstr "El nombre del calendario debe ser único"
+
+msgctxt "error:calendar.category:0"
+msgid "The name of calendar category must be unique!"
+msgstr "El nombre de la categoría del calendario debe ser único"
+
+msgctxt "error:calendar.event:0"
+msgid "Recurrence can not be recurrent!"
+msgstr "Una recurrencia no puede ser recurrente"
+
+msgctxt "error:calendar.event:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "UUID y recurrencia deben ser únicos en un calendario"
+
+msgctxt "error:calendar.location:0"
+msgid "The name of calendar location must be unique!"
+msgstr "El nombre de la ubicación del calendario debe ser único"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Day\""
+msgstr "Inválido «por día»"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Hour\""
+msgstr "Inválido «por hora»"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Minute\""
+msgstr "Inválido «por minuto»"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month Day\""
+msgstr "Inválido «por día del mes»"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month\""
+msgstr "Inválido «por mes»"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Position\""
+msgstr "Inválido «por posición»"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Second\""
+msgstr "Inválido «por segundos»"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Week Number\""
+msgstr "Inválido «por número de semana»"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Year Day\""
+msgstr "Inválido «por día del año»"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Only one of \"until\" and \"count\" can be set!"
+msgstr "Solo se puede usar o «hasta» o «Número de veces»"
+
+msgctxt "field:calendar.alarm,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.alarm,valarm:0"
+msgid "valarm"
+msgstr "valarm"
+
+msgctxt "field:calendar.attendee,attendee:0"
+msgid "attendee"
+msgstr "asistentes"
+
+msgctxt "field:calendar.attendee,email:0"
+msgid "Email"
+msgstr "Correo electrónico"
+
+msgctxt "field:calendar.attendee,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.attendee,status:0"
+msgid "Participation Status"
+msgstr "Estado de participación"
+
+msgctxt "field:calendar.calendar,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:calendar.calendar,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar,owner:0"
+msgid "Owner"
+msgstr "Dueño"
+
+msgctxt "field:calendar.calendar,read_users:0"
+msgid "Read Users"
+msgstr "Usuarios con lectura"
+
+msgctxt "field:calendar.calendar,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar,write_users:0"
+msgid "Write Users"
+msgstr "Usuarios con escritura"
+
+msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "field:calendar.category,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+#, fuzzy
+msgctxt "field:calendar.date,date:0"
+msgid "Is Date"
+msgstr "Es fecha"
+
+#, fuzzy
+msgctxt "field:calendar.date,datetime:0"
+msgid "Date"
+msgstr "Fecha"
+
+#, fuzzy
+msgctxt "field:calendar.date,rec_name:0"
+msgid "Name"
+msgstr "Nombre del campo"
+
+msgctxt "field:calendar.event,alarms:0"
+msgid "Alarms"
+msgstr "Alarmas"
+
+msgctxt "field:calendar.event,all_day:0"
+msgid "All Day"
+msgstr "Todo el día"
+
+msgctxt "field:calendar.event,attendees:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "field:calendar.event,calendar:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.event,calendar_owner:0"
+msgid "Owner"
+msgstr "Dueño"
+
+msgctxt "field:calendar.event,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Usuarios con lectura"
+
+msgctxt "field:calendar.event,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Usuarios con escritura"
+
+msgctxt "field:calendar.event,categories:0"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "field:calendar.event,classification:0"
+msgid "Classification"
+msgstr "Clasificación"
+
+msgctxt "field:calendar.event,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:calendar.event,dtend:0"
+msgid "End Date"
+msgstr "Fecha fin"
+
+msgctxt "field:calendar.event,dtstart:0"
+msgid "Start Date"
+msgstr "Fecha inicio"
+
+msgctxt "field:calendar.event,exdates:0"
+msgid "Exception Dates"
+msgstr "Fechas excluidas"
+
+msgctxt "field:calendar.event,exrules:0"
+msgid "Exception Rules"
+msgstr "Reglas de excepción"
+
+msgctxt "field:calendar.event,location:0"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "field:calendar.event,occurences:0"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "field:calendar.event,organizer:0"
+msgid "Organizer"
+msgstr "Organizador"
+
+msgctxt "field:calendar.event,parent:0"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:calendar.event,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Fechas de recurrencia"
+
+msgctxt "field:calendar.event,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event,recurrence:0"
+msgid "Recurrence"
+msgstr "Recurrencia"
+
+msgctxt "field:calendar.event,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Reglas de recurrencia"
+
+msgctxt "field:calendar.event,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:calendar.event,status:0"
+msgid "Status"
+msgstr "Estado"
+
+msgctxt "field:calendar.event,summary:0"
+msgid "Summary"
+msgstr "Resumen"
+
+msgctxt "field:calendar.event,timezone:0"
+msgid "Timezone"
+msgstr "Zona horaria"
+
+msgctxt "field:calendar.event,transp:0"
+msgid "Time Transparency"
+msgstr "Tiempo de transparencia"
+
+msgctxt "field:calendar.event,uuid:0"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.event,vevent:0"
+msgid "vevent"
+msgstr "vevent"
+
+msgctxt "field:calendar.event-calendar.category,category:0"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "field:calendar.event-calendar.category,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr "Alarma del calendario"
+
+msgctxt "field:calendar.event.alarm,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.alarm,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr "Calendario de asistentes"
+
+msgctxt "field:calendar.event.attendee,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.attendee,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.exdate,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Regla de recurrencia"
+
+msgctxt "field:calendar.event.exrule,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.exrule,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.rdate,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Regla de recurrencia"
+
+msgctxt "field:calendar.event.rrule,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.rrule,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.rrule,byday:0"
+msgid "By Day"
+msgstr "Por día"
+
+msgctxt "field:calendar.rrule,byhour:0"
+msgid "By Hour"
+msgstr "Por hora"
+
+msgctxt "field:calendar.rrule,byminute:0"
+msgid "By Minute"
+msgstr "Por minuto"
+
+msgctxt "field:calendar.rrule,bymonth:0"
+msgid "By Month"
+msgstr "Por mes"
+
+msgctxt "field:calendar.rrule,bymonthday:0"
+msgid "By Month Day"
+msgstr "Por día del mes"
+
+msgctxt "field:calendar.rrule,bysecond:0"
+msgid "By Second"
+msgstr "Por segundo"
+
+msgctxt "field:calendar.rrule,bysetpos:0"
+msgid "By Position"
+msgstr "Por posición"
+
+msgctxt "field:calendar.rrule,byweekno:0"
+msgid "By Week Number"
+msgstr "Por día de la semana"
+
+msgctxt "field:calendar.rrule,byyearday:0"
+msgid "By Year Day"
+msgstr "Por día del año"
+
+msgctxt "field:calendar.rrule,count:0"
+msgid "Count"
+msgstr "Número de veces"
+
+msgctxt "field:calendar.rrule,freq:0"
+msgid "Frequency"
+msgstr "Frecuencia"
+
+msgctxt "field:calendar.rrule,interval:0"
+msgid "Interval"
+msgstr "Intervalo"
+
+msgctxt "field:calendar.rrule,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.rrule,until:0"
+msgid "Until Date"
+msgstr "Hasta la fecha"
+
+msgctxt "field:calendar.rrule,until_date:0"
+msgid "Is Date"
+msgstr "Es fecha"
+
+msgctxt "field:calendar.rrule,wkst:0"
+msgid "Week Day"
+msgstr "Día de la semana"
+
+msgctxt "field:res.user,calendars:0"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "help:calendar.calendar,owner:0"
+msgid "The user must have an email"
+msgstr "El usuario debe tener un correo electrónico"
+
+msgctxt "help:calendar.date,date:0"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.event,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Identificador universal único"
+
+msgctxt "help:calendar.rrule,until_date:0"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr "Ignora la hora del campo «Hasta la fecha», y trata solo la fecha"
+
+msgctxt "model:calendar.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.attendee,name:0"
+msgid "Attendee"
+msgstr "Asistentes"
+
+msgctxt "model:calendar.calendar,name:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgid "Calendar - read - User"
+msgstr "Calendario - leer - usuario"
+
+msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgid "Calendar - write - User"
+msgstr "Calendario - escribir - usuario"
+
+msgctxt "model:calendar.category,name:0"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "model:calendar.date,name:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "model:calendar.event,name:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "model:calendar.event-calendar.category,name:0"
+msgid "Event - Category"
+msgstr "Evento - Categoría"
+
+msgctxt "model:calendar.event.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.event.attendee,name:0"
+msgid "Attendee"
+msgstr "Asistentes"
+
+msgctxt "model:calendar.event.exdate,name:0"
+msgid "Exception Date"
+msgstr "Fecha excluida"
+
+msgctxt "model:calendar.event.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Regla de excepción"
+
+msgctxt "model:calendar.event.rdate,name:0"
+msgid "Recurrence Date"
+msgstr "Fecha de recurrencia"
+
+msgctxt "model:calendar.event.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "model:calendar.location,name:0"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "model:calendar.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "model:ir.action,name:act_calendar_form"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "model:ir.action,name:act_event_form"
+msgid "Events"
+msgstr "Eventos"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_event_form3"
+msgid "Events"
+msgstr "Eventos"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_calendar"
+msgid "Calendar"
+msgstr "Gestión de calendario"
+
+msgctxt "model:ir.ui.menu,name:menu_calendar_form"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "model:ir.ui.menu,name:menu_event_form"
+msgid "Events"
+msgstr "Eventos"
+
+msgctxt "model:res.group,name:group_calendar_admin"
+msgid "Calendar Administration"
+msgstr "Administración de calendario"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Accepted"
+msgstr "Aceptada"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Declined"
+msgstr "Rehusado"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Delegated"
+msgstr "Delegada"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Needs Action"
+msgstr "Necesita una acción"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Tentative"
+msgstr "Tentativa"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Confidential"
+msgstr "Confidencial"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Private"
+msgstr "Privado"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Public"
+msgstr "Público"
+
+msgctxt "selection:calendar.event,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Confirmed"
+msgstr "Confirmada"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Tentative"
+msgstr "Tentativo"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Opaque"
+msgstr "Opaco"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Transparent"
+msgstr "Transparente"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Daily"
+msgstr "Diariamente"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Minutely"
+msgstr "Cada minuto"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Monthly"
+msgstr "Mensualmente"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Secondly"
+msgstr "Cada segundo"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "view:calendar.calendar:0"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Security"
+msgstr "Seguridad"
+
+msgctxt "view:calendar.category:0"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "view:calendar.category:0"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendee"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Date"
+msgstr "Fecha excluida"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Dates"
+msgstr "Fechas excluidas"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rule"
+msgstr "Regla de excepción"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rules"
+msgstr "Reglas de excepciones"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Date"
+msgstr "Fecha de recurrencia"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Fechas de recurrencia"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Reglas de recurrencia"
+
+msgctxt "view:calendar.event:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.event:0"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "view:calendar.event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "view:calendar.event:0"
+msgid "Events"
+msgstr "Eventos"
+
+msgctxt "view:calendar.event:0"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:calendar.event:0"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "view:calendar.location:0"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "view:calendar.location:0"
+msgid "Locations"
+msgstr "Ubicaciones"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
new file mode 100644
index 0000000..69bc39e
--- /dev/null
+++ b/locale/fr_FR.po
@@ -0,0 +1,759 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.calendar:0"
+msgid "A user can have only one calendar!"
+msgstr "Un utilisateur ne peut avoir qu'un seul calendrier !"
+
+msgctxt "error:calendar.calendar:0"
+msgid "The name of calendar must be unique!"
+msgstr "Le nom du calendrier doit être unique !"
+
+msgctxt "error:calendar.category:0"
+msgid "The name of calendar category must be unique!"
+msgstr "Le nom de la catégorie de calendrier doit être unique"
+
+msgctxt "error:calendar.event:0"
+msgid "Recurrence can not be recurrent!"
+msgstr "Une récurrence ne peut pas être récurrente !"
+
+msgctxt "error:calendar.event:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "UUID et récurrence doivent être uniques sur un calendrier !"
+
+msgctxt "error:calendar.location:0"
+msgid "The name of calendar location must be unique!"
+msgstr "Le nom de l'emplacement doit être unique !"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Day\""
+msgstr "\"Par jour\" invalide"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Hour\""
+msgstr "\"Par heure\" invalide"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Minute\""
+msgstr "\"Par minute\" invalide"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month Day\""
+msgstr "\"Par jour du mois\" invalide"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month\""
+msgstr "\"Par mois\" invalide"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Position\""
+msgstr "\"Par position\" invalide"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Second\""
+msgstr "\"Par seconde\" invalide"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Week Number\""
+msgstr "\"Par jour de la semaine\" invalide"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Year Day\""
+msgstr "\"Par jour de l'année\" invalide"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Only one of \"until\" and \"count\" can be set!"
+msgstr "\"Date de fin\" et \"Répétitions\" ne peuvent être remplis en même temps !"
+
+msgctxt "field:calendar.alarm,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.alarm,valarm:0"
+msgid "valarm"
+msgstr "valarm"
+
+msgctxt "field:calendar.attendee,attendee:0"
+msgid "attendee"
+msgstr "participant"
+
+msgctxt "field:calendar.attendee,email:0"
+msgid "Email"
+msgstr "E-mail"
+
+msgctxt "field:calendar.attendee,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.attendee,status:0"
+msgid "Participation Status"
+msgstr "Statut de participation"
+
+msgctxt "field:calendar.calendar,description:0"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "field:calendar.calendar,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.calendar,owner:0"
+msgid "Owner"
+msgstr "Propriétaire"
+
+msgctxt "field:calendar.calendar,read_users:0"
+msgid "Read Users"
+msgstr "Utilisateurs en lecture"
+
+msgctxt "field:calendar.calendar,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.calendar,write_users:0"
+msgid "Write Users"
+msgstr "Utilisateurs en écriture"
+
+msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Calendrier"
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgid "User"
+msgstr "Utilisateur"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Calendrier"
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgid "User"
+msgstr "Utilisateur"
+
+msgctxt "field:calendar.category,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.date,date:0"
+msgid "Is Date"
+msgstr "Est une date"
+
+msgctxt "field:calendar.date,datetime:0"
+msgid "Date"
+msgstr "Date"
+
+msgctxt "field:calendar.date,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event,alarms:0"
+msgid "Alarms"
+msgstr "Alarmes"
+
+msgctxt "field:calendar.event,all_day:0"
+msgid "All Day"
+msgstr "Toute la journée"
+
+msgctxt "field:calendar.event,attendees:0"
+msgid "Attendees"
+msgstr "Participants"
+
+msgctxt "field:calendar.event,calendar:0"
+msgid "Calendar"
+msgstr "Calendrier"
+
+msgctxt "field:calendar.event,calendar_owner:0"
+msgid "Owner"
+msgstr "Propriétaire"
+
+msgctxt "field:calendar.event,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Utilisateurs en lecture"
+
+msgctxt "field:calendar.event,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Utilisateurs en écriture"
+
+msgctxt "field:calendar.event,categories:0"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "field:calendar.event,classification:0"
+msgid "Classification"
+msgstr "Classification"
+
+msgctxt "field:calendar.event,description:0"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "field:calendar.event,dtend:0"
+msgid "End Date"
+msgstr "Date de fin"
+
+msgctxt "field:calendar.event,dtstart:0"
+msgid "Start Date"
+msgstr "Date de début"
+
+msgctxt "field:calendar.event,exdates:0"
+msgid "Exception Dates"
+msgstr "Dates d'exception"
+
+msgctxt "field:calendar.event,exrules:0"
+msgid "Exception Rules"
+msgstr "Règles d'exception"
+
+msgctxt "field:calendar.event,location:0"
+msgid "Location"
+msgstr "Emplacement"
+
+msgctxt "field:calendar.event,occurences:0"
+msgid "Occurences"
+msgstr "Occurrences"
+
+msgctxt "field:calendar.event,organizer:0"
+msgid "Organizer"
+msgstr "Organisateur"
+
+msgctxt "field:calendar.event,parent:0"
+msgid "Parent"
+msgstr "Parent"
+
+msgctxt "field:calendar.event,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Dates de récurrence"
+
+msgctxt "field:calendar.event,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event,recurrence:0"
+msgid "Recurrence"
+msgstr "Récurrence"
+
+msgctxt "field:calendar.event,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Règles de récurrence"
+
+msgctxt "field:calendar.event,sequence:0"
+msgid "Sequence"
+msgstr "Séquence"
+
+msgctxt "field:calendar.event,status:0"
+msgid "Status"
+msgstr "Statut"
+
+msgctxt "field:calendar.event,summary:0"
+msgid "Summary"
+msgstr "Résumé"
+
+msgctxt "field:calendar.event,timezone:0"
+msgid "Timezone"
+msgstr "Fuseau Horaire"
+
+msgctxt "field:calendar.event,transp:0"
+msgid "Time Transparency"
+msgstr "Transparence"
+
+msgctxt "field:calendar.event,uuid:0"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.event,vevent:0"
+msgid "vevent"
+msgstr "vevent"
+
+msgctxt "field:calendar.event-calendar.category,category:0"
+msgid "Category"
+msgstr "Catégorie"
+
+msgctxt "field:calendar.event-calendar.category,event:0"
+msgid "Event"
+msgstr "Événement"
+
+msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr "Alarme calendrier"
+
+msgctxt "field:calendar.event.alarm,event:0"
+msgid "Event"
+msgstr "Événement"
+
+msgctxt "field:calendar.event.alarm,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr "Participant calendrier"
+
+msgctxt "field:calendar.event.attendee,event:0"
+msgid "Event"
+msgstr "Événement"
+
+msgctxt "field:calendar.event.attendee,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Date calendrier"
+
+msgctxt "field:calendar.event.exdate,event:0"
+msgid "Event"
+msgstr "Événement"
+
+msgctxt "field:calendar.event.exdate,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Règle de récurrence"
+
+msgctxt "field:calendar.event.exrule,event:0"
+msgid "Event"
+msgstr "Événement"
+
+msgctxt "field:calendar.event.exrule,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Date calendrier"
+
+msgctxt "field:calendar.event.rdate,event:0"
+msgid "Event"
+msgstr "Événement"
+
+msgctxt "field:calendar.event.rdate,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Règle de récurrence"
+
+msgctxt "field:calendar.event.rrule,event:0"
+msgid "Event"
+msgstr "Événement"
+
+msgctxt "field:calendar.event.rrule,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.location,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.location,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.rrule,byday:0"
+msgid "By Day"
+msgstr "Par jour"
+
+msgctxt "field:calendar.rrule,byhour:0"
+msgid "By Hour"
+msgstr "Par heure"
+
+msgctxt "field:calendar.rrule,byminute:0"
+msgid "By Minute"
+msgstr "Par minute"
+
+msgctxt "field:calendar.rrule,bymonth:0"
+msgid "By Month"
+msgstr "Par mois"
+
+msgctxt "field:calendar.rrule,bymonthday:0"
+msgid "By Month Day"
+msgstr "Par jour du mois"
+
+msgctxt "field:calendar.rrule,bysecond:0"
+msgid "By Second"
+msgstr "Par seconde"
+
+msgctxt "field:calendar.rrule,bysetpos:0"
+msgid "By Position"
+msgstr "Par position"
+
+msgctxt "field:calendar.rrule,byweekno:0"
+msgid "By Week Number"
+msgstr "Par numéro de semaine"
+
+msgctxt "field:calendar.rrule,byyearday:0"
+msgid "By Year Day"
+msgstr "Par jour de l'année"
+
+msgctxt "field:calendar.rrule,count:0"
+msgid "Count"
+msgstr "Répétitions"
+
+msgctxt "field:calendar.rrule,freq:0"
+msgid "Frequency"
+msgstr "Fréquence"
+
+msgctxt "field:calendar.rrule,interval:0"
+msgid "Interval"
+msgstr "Intervalle"
+
+msgctxt "field:calendar.rrule,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.rrule,until:0"
+msgid "Until Date"
+msgstr "Date de fin"
+
+msgctxt "field:calendar.rrule,until_date:0"
+msgid "Is Date"
+msgstr "Est une date"
+
+msgctxt "field:calendar.rrule,wkst:0"
+msgid "Week Day"
+msgstr "Jour de la semaine"
+
+msgctxt "field:res.user,calendars:0"
+msgid "Calendars"
+msgstr "Calendriers"
+
+msgctxt "help:calendar.calendar,owner:0"
+msgid "The user must have an email"
+msgstr "L'utilisateur doit avoir une adresse mail"
+
+msgctxt "help:calendar.date,date:0"
+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.event,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Identificateur unique universel"
+
+msgctxt "help:calendar.rrule,until_date:0"
+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.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarme"
+
+msgctxt "model:calendar.attendee,name:0"
+msgid "Attendee"
+msgstr "Participant"
+
+msgctxt "model:calendar.calendar,name:0"
+msgid "Calendar"
+msgstr "Calendrier"
+
+msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgid "Calendar - read - User"
+msgstr "Calendrier - Lecture - Utilisateur"
+
+msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgid "Calendar - write - User"
+msgstr "Calendrier - Écriture - Utilisateur"
+
+msgctxt "model:calendar.category,name:0"
+msgid "Category"
+msgstr "Catégorie"
+
+msgctxt "model:calendar.date,name:0"
+msgid "Calendar Date"
+msgstr "Date calendrier"
+
+msgctxt "model:calendar.event,name:0"
+msgid "Event"
+msgstr "Événement"
+
+msgctxt "model:calendar.event-calendar.category,name:0"
+msgid "Event - Category"
+msgstr "Évenement - Catégorie"
+
+msgctxt "model:calendar.event.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarme"
+
+msgctxt "model:calendar.event.attendee,name:0"
+msgid "Attendee"
+msgstr "Participant"
+
+msgctxt "model:calendar.event.exdate,name:0"
+msgid "Exception Date"
+msgstr "Date d'exception"
+
+msgctxt "model:calendar.event.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Règle d'exception"
+
+msgctxt "model:calendar.event.rdate,name:0"
+msgid "Recurrence Date"
+msgstr "Date de récurrence"
+
+msgctxt "model:calendar.event.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Règle de récurrence"
+
+msgctxt "model:calendar.location,name:0"
+msgid "Location"
+msgstr "Emplacement"
+
+msgctxt "model:calendar.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Règle de récurrence"
+
+msgctxt "model:ir.action,name:act_calendar_form"
+msgid "Calendars"
+msgstr "Calendriers"
+
+msgctxt "model:ir.action,name:act_event_form"
+msgid "Events"
+msgstr "Événement"
+
+msgctxt "model:ir.action,name:act_event_form3"
+msgid "Events"
+msgstr "Événements"
+
+msgctxt "model:ir.ui.menu,name:menu_calendar"
+msgid "Calendar"
+msgstr "Calendrier"
+
+msgctxt "model:ir.ui.menu,name:menu_calendar_form"
+msgid "Calendars"
+msgstr "Calendriers"
+
+msgctxt "model:ir.ui.menu,name:menu_event_form"
+msgid "Events"
+msgstr "Évenement"
+
+msgctxt "model:res.group,name:group_calendar_admin"
+msgid "Calendar Administration"
+msgstr "Administration calendrier"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Accepted"
+msgstr "Accepté"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Declined"
+msgstr "Décliné"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Delegated"
+msgstr "Délégué"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Needs Action"
+msgstr "Nécessite une action"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Tentative"
+msgstr "Tentative"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Confidential"
+msgstr "Confidentiel"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Private"
+msgstr "Privé"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Public"
+msgstr "Publique"
+
+msgctxt "selection:calendar.event,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Cancelled"
+msgstr "Annulé"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Confirmed"
+msgstr "Confirmé"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Tentative"
+msgstr "Tentative"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Opaque"
+msgstr "Opaque"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Transparent"
+msgstr "transparent"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Daily"
+msgstr "Journalier"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Hourly"
+msgstr "Horaire"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Minutely"
+msgstr "Chaque minute"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Monthly"
+msgstr "Mensuel"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Secondly"
+msgstr "Chaque seconde"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Weekly"
+msgstr "hebdomadaire"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Yearly"
+msgstr "Annuel"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Friday"
+msgstr "Vendredi"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Monday"
+msgstr "Lundi"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Saturday"
+msgstr "Samedi"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Sunday"
+msgstr "Dimanche"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Thursday"
+msgstr "Jeudi"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Tuesday"
+msgstr "Mardi"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Wednesday"
+msgstr "Mercredi"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendar"
+msgstr "Calendrier"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendars"
+msgstr "Calendriers"
+
+msgctxt "view:calendar.calendar:0"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Security"
+msgstr "Sécurité"
+
+msgctxt "view:calendar.category:0"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "view:calendar.category:0"
+msgid "Category"
+msgstr "Catégorie"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendee"
+msgstr "Participant"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendees"
+msgstr "Participants"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Date"
+msgstr "Date d'exception"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Dates"
+msgstr "Dates d'exception"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rule"
+msgstr "Règle d'exception"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rules"
+msgstr "Règles d'exception"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Date"
+msgstr "Date de récurrence"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Dates de récurrence"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Règle de récurrence"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Règles de récurrence"
+
+msgctxt "view:calendar.event:0"
+msgid "Attendees"
+msgstr "Participants"
+
+msgctxt "view:calendar.event:0"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "view:calendar.event:0"
+msgid "Event"
+msgstr "Événement"
+
+msgctxt "view:calendar.event:0"
+msgid "Events"
+msgstr "Événements"
+
+msgctxt "view:calendar.event:0"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:calendar.event:0"
+msgid "Occurences"
+msgstr "Occurrences"
+
+msgctxt "view:calendar.location:0"
+msgid "Location"
+msgstr "Emplacement"
+
+msgctxt "view:calendar.location:0"
+msgid "Locations"
+msgstr "Emplacements"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
new file mode 100644
index 0000000..d4aa135
--- /dev/null
+++ b/locale/nl_NL.po
@@ -0,0 +1,798 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.calendar:0"
+msgid "A user can have only one calendar!"
+msgstr ""
+
+msgctxt "error:calendar.calendar:0"
+msgid "The name of calendar must be unique!"
+msgstr ""
+
+msgctxt "error:calendar.category:0"
+msgid "The name of calendar category must be unique!"
+msgstr ""
+
+msgctxt "error:calendar.event:0"
+msgid "Recurrence can not be recurrent!"
+msgstr ""
+
+msgctxt "error:calendar.event:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr ""
+
+msgctxt "error:calendar.location:0"
+msgid "The name of calendar location must be unique!"
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Day\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Hour\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Minute\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month Day\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Position\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Second\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Week Number\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Year Day\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Only one of \"until\" and \"count\" can be set!"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.alarm,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.alarm,valarm:0"
+msgid "valarm"
+msgstr ""
+
+msgctxt "field:calendar.attendee,attendee:0"
+msgid "attendee"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.attendee,email:0"
+msgid "Email"
+msgstr "E-mail"
+
+#, fuzzy
+msgctxt "field:calendar.attendee,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.attendee,status:0"
+msgid "Participation Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.calendar,description:0"
+msgid "Description"
+msgstr "Specificatie"
+
+#, fuzzy
+msgctxt "field:calendar.calendar,name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.calendar,owner:0"
+msgid "Owner"
+msgstr ""
+
+msgctxt "field:calendar.calendar,read_users:0"
+msgid "Read Users"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.calendar,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.calendar,write_users:0"
+msgid "Write Users"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgid "Calendar"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgid "User"
+msgstr "Gebruiker"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgid "Calendar"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgid "User"
+msgstr "Gebruiker"
+
+#, fuzzy
+msgctxt "field:calendar.category,name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.date,date:0"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.date,datetime:0"
+msgid "Date"
+msgstr "Vervaldatum"
+
+#, fuzzy
+msgctxt "field:calendar.date,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.event,alarms:0"
+msgid "Alarms"
+msgstr ""
+
+msgctxt "field:calendar.event,all_day:0"
+msgid "All Day"
+msgstr ""
+
+msgctxt "field:calendar.event,attendees:0"
+msgid "Attendees"
+msgstr ""
+
+msgctxt "field:calendar.event,calendar:0"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "field:calendar.event,calendar_owner:0"
+msgid "Owner"
+msgstr ""
+
+msgctxt "field:calendar.event,calendar_read_users:0"
+msgid "Read Users"
+msgstr ""
+
+msgctxt "field:calendar.event,calendar_write_users:0"
+msgid "Write Users"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event,categories:0"
+msgid "Categories"
+msgstr "Categorieën"
+
+msgctxt "field:calendar.event,classification:0"
+msgid "Classification"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event,description:0"
+msgid "Description"
+msgstr "Specificatie"
+
+#, fuzzy
+msgctxt "field:calendar.event,dtend:0"
+msgid "End Date"
+msgstr "Eind datum"
+
+#, fuzzy
+msgctxt "field:calendar.event,dtstart:0"
+msgid "Start Date"
+msgstr "Start datum"
+
+msgctxt "field:calendar.event,exdates:0"
+msgid "Exception Dates"
+msgstr ""
+
+msgctxt "field:calendar.event,exrules:0"
+msgid "Exception Rules"
+msgstr ""
+
+msgctxt "field:calendar.event,location:0"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:calendar.event,occurences:0"
+msgid "Occurences"
+msgstr ""
+
+msgctxt "field:calendar.event,organizer:0"
+msgid "Organizer"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event,parent:0"
+msgid "Parent"
+msgstr "Bovenliggend niveau"
+
+msgctxt "field:calendar.event,rdates:0"
+msgid "Recurrence Dates"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.event,recurrence:0"
+msgid "Recurrence"
+msgstr ""
+
+msgctxt "field:calendar.event,rrules:0"
+msgid "Recurrence Rules"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event,sequence:0"
+msgid "Sequence"
+msgstr "Reeks"
+
+msgctxt "field:calendar.event,status:0"
+msgid "Status"
+msgstr ""
+
+msgctxt "field:calendar.event,summary:0"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:calendar.event,timezone:0"
+msgid "Timezone"
+msgstr ""
+
+msgctxt "field:calendar.event,transp:0"
+msgid "Time Transparency"
+msgstr ""
+
+msgctxt "field:calendar.event,uuid:0"
+msgid "UUID"
+msgstr ""
+
+msgctxt "field:calendar.event,vevent:0"
+msgid "vevent"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event-calendar.category,category:0"
+msgid "Category"
+msgstr "Categorie"
+
+msgctxt "field:calendar.event-calendar.category,event:0"
+msgid "Event"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,event:0"
+msgid "Event"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.alarm,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,event:0"
+msgid "Event"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.attendee,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,event:0"
+msgid "Event"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.exdate,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,event:0"
+msgid "Event"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.exrule,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,event:0"
+msgid "Event"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.rdate,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,event:0"
+msgid "Event"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.rrule,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:calendar.location,name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:calendar.location,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.rrule,byday:0"
+msgid "By Day"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byhour:0"
+msgid "By Hour"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byminute:0"
+msgid "By Minute"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bymonth:0"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bymonthday:0"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bysecond:0"
+msgid "By Second"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bysetpos:0"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byweekno:0"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byyearday:0"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:calendar.rrule,count:0"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:calendar.rrule,freq:0"
+msgid "Frequency"
+msgstr ""
+
+msgctxt "field:calendar.rrule,interval:0"
+msgid "Interval"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.rrule,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.rrule,until:0"
+msgid "Until Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,until_date:0"
+msgid "Is Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,wkst:0"
+msgid "Week Day"
+msgstr ""
+
+msgctxt "field:res.user,calendars:0"
+msgid "Calendars"
+msgstr ""
+
+msgctxt "help:calendar.calendar,owner:0"
+msgid "The user must have an email"
+msgstr ""
+
+msgctxt "help:calendar.date,date:0"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.event,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr ""
+
+msgctxt "help:calendar.rrule,until_date:0"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+
+msgctxt "model:calendar.alarm,name:0"
+msgid "Alarm"
+msgstr ""
+
+msgctxt "model:calendar.attendee,name:0"
+msgid "Attendee"
+msgstr ""
+
+msgctxt "model:calendar.calendar,name:0"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgid "Calendar - read - User"
+msgstr ""
+
+msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgid "Calendar - write - User"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:calendar.category,name:0"
+msgid "Category"
+msgstr "Categorie"
+
+msgctxt "model:calendar.date,name:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "model:calendar.event,name:0"
+msgid "Event"
+msgstr ""
+
+msgctxt "model:calendar.event-calendar.category,name:0"
+msgid "Event - Category"
+msgstr ""
+
+msgctxt "model:calendar.event.alarm,name:0"
+msgid "Alarm"
+msgstr ""
+
+msgctxt "model:calendar.event.attendee,name:0"
+msgid "Attendee"
+msgstr ""
+
+msgctxt "model:calendar.event.exdate,name:0"
+msgid "Exception Date"
+msgstr ""
+
+msgctxt "model:calendar.event.exrule,name:0"
+msgid "Exception Rule"
+msgstr ""
+
+msgctxt "model:calendar.event.rdate,name:0"
+msgid "Recurrence Date"
+msgstr ""
+
+msgctxt "model:calendar.event.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr ""
+
+msgctxt "model:calendar.location,name:0"
+msgid "Location"
+msgstr ""
+
+msgctxt "model:calendar.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_calendar_form"
+msgid "Calendars"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_event_form"
+msgid "Events"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_event_form3"
+msgid "Events"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_calendar"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_calendar_form"
+msgid "Calendars"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_event_form"
+msgid "Events"
+msgstr ""
+
+msgctxt "model:res.group,name:group_calendar_admin"
+msgid "Calendar Administration"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Accepted"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Declined"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Delegated"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Needs Action"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Tentative"
+msgstr ""
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Confidential"
+msgstr ""
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Private"
+msgstr ""
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Public"
+msgstr ""
+
+msgctxt "selection:calendar.event,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Cancelled"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:calendar.event,status:0"
+msgid "Confirmed"
+msgstr "Bevestigd"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Tentative"
+msgstr ""
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Opaque"
+msgstr ""
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Transparent"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Yearly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Friday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Monday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Saturday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Sunday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Thursday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Tuesday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Wednesday"
+msgstr ""
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendars"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:calendar.calendar:0"
+msgid "General"
+msgstr "Algemeen"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Security"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:calendar.category:0"
+msgid "Categories"
+msgstr "Categorieën"
+
+#, fuzzy
+msgctxt "view:calendar.category:0"
+msgid "Category"
+msgstr "Categorie"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendee"
+msgstr ""
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendees"
+msgstr ""
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Date"
+msgstr ""
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Dates"
+msgstr ""
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rule"
+msgstr ""
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rules"
+msgstr ""
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Date"
+msgstr ""
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Dates"
+msgstr ""
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rule"
+msgstr ""
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rules"
+msgstr ""
+
+msgctxt "view:calendar.event:0"
+msgid "Attendees"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:calendar.event:0"
+msgid "Categories"
+msgstr "Categorieën"
+
+msgctxt "view:calendar.event:0"
+msgid "Event"
+msgstr ""
+
+msgctxt "view:calendar.event:0"
+msgid "Events"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:calendar.event:0"
+msgid "General"
+msgstr "Algemeen"
+
+msgctxt "view:calendar.event:0"
+msgid "Occurences"
+msgstr ""
+
+msgctxt "view:calendar.location:0"
+msgid "Location"
+msgstr ""
+
+msgctxt "view:calendar.location:0"
+msgid "Locations"
+msgstr ""
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
new file mode 100644
index 0000000..0ab492d
--- /dev/null
+++ b/locale/ru_RU.po
@@ -0,0 +1,764 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.calendar:0"
+msgid "A user can have only one calendar!"
+msgstr "Пользователь может иметь только Один календарь!"
+
+msgctxt "error:calendar.calendar:0"
+msgid "The name of calendar must be unique!"
+msgstr "Имя календаря должно быть уникально"
+
+msgctxt "error:calendar.category:0"
+msgid "The name of calendar category must be unique!"
+msgstr ""
+
+msgctxt "error:calendar.event:0"
+msgid "Recurrence can not be recurrent!"
+msgstr ""
+
+msgctxt "error:calendar.event:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr ""
+
+msgctxt "error:calendar.location:0"
+msgid "The name of calendar location must be unique!"
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Day\""
+msgstr "Неверное поле \"По дням\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Hour\""
+msgstr "Неверное поле \"По часам\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Minute\""
+msgstr "Неверное поле \"По минутам\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month Day\""
+msgstr "Неверное поле \"По дням месяца\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month\""
+msgstr "Неверное поле \"По месяцам\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Position\""
+msgstr "Неверное поле \"По позиции\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Second\""
+msgstr "Неверное поле \"По секундам\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Week Number\""
+msgstr "Неверное поле \"По номерам недель\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Year Day\""
+msgstr "Неверный \"По дням года\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Only one of \"until\" and \"count\" can be set!"
+msgstr ""
+
+msgctxt "field:calendar.alarm,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.alarm,valarm:0"
+msgid "valarm"
+msgstr ""
+
+msgctxt "field:calendar.attendee,attendee:0"
+msgid "attendee"
+msgstr "участник"
+
+msgctxt "field:calendar.attendee,email:0"
+msgid "Email"
+msgstr "Эл.почта"
+
+msgctxt "field:calendar.attendee,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.attendee,status:0"
+msgid "Participation Status"
+msgstr "Статус участия"
+
+msgctxt "field:calendar.calendar,description:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:calendar.calendar,name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.calendar,owner:0"
+msgid "Owner"
+msgstr "Владелец"
+
+msgctxt "field:calendar.calendar,read_users:0"
+msgid "Read Users"
+msgstr "Пользователи могут читать"
+
+msgctxt "field:calendar.calendar,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.calendar,write_users:0"
+msgid "Write Users"
+msgstr "Пользователи могут писать"
+
+msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Календар"
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgid "User"
+msgstr "Пользователь"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Календарь"
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgid "User"
+msgstr "Пользователь"
+
+msgctxt "field:calendar.category,name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.date,date:0"
+msgid "Is Date"
+msgstr "Весь день"
+
+msgctxt "field:calendar.date,datetime:0"
+msgid "Date"
+msgstr "Дата"
+
+msgctxt "field:calendar.date,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.event,alarms:0"
+msgid "Alarms"
+msgstr "Вызовы"
+
+msgctxt "field:calendar.event,all_day:0"
+msgid "All Day"
+msgstr "Все дни"
+
+msgctxt "field:calendar.event,attendees:0"
+msgid "Attendees"
+msgstr "Участники"
+
+msgctxt "field:calendar.event,calendar:0"
+msgid "Calendar"
+msgstr "Календарь"
+
+msgctxt "field:calendar.event,calendar_owner:0"
+msgid "Owner"
+msgstr "Владелец"
+
+msgctxt "field:calendar.event,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Пользователи могут читать"
+
+msgctxt "field:calendar.event,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Пользователи могут писать"
+
+msgctxt "field:calendar.event,categories:0"
+msgid "Categories"
+msgstr "Категория"
+
+msgctxt "field:calendar.event,classification:0"
+msgid "Classification"
+msgstr "Классификация"
+
+msgctxt "field:calendar.event,description:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:calendar.event,dtend:0"
+msgid "End Date"
+msgstr "Дата окончания"
+
+msgctxt "field:calendar.event,dtstart:0"
+msgid "Start Date"
+msgstr "Дата начала"
+
+msgctxt "field:calendar.event,exdates:0"
+msgid "Exception Dates"
+msgstr "Дата исключения"
+
+msgctxt "field:calendar.event,exrules:0"
+msgid "Exception Rules"
+msgstr "Правила исключения"
+
+msgctxt "field:calendar.event,location:0"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "field:calendar.event,occurences:0"
+msgid "Occurences"
+msgstr "Дополнительные задачи"
+
+msgctxt "field:calendar.event,organizer:0"
+msgid "Organizer"
+msgstr "Организатор"
+
+msgctxt "field:calendar.event,parent:0"
+msgid "Parent"
+msgstr "Основной"
+
+msgctxt "field:calendar.event,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Даты повторения"
+
+msgctxt "field:calendar.event,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.event,recurrence:0"
+msgid "Recurrence"
+msgstr "Повторение"
+
+msgctxt "field:calendar.event,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Правила повторения"
+
+msgctxt "field:calendar.event,sequence:0"
+msgid "Sequence"
+msgstr "Последовательность"
+
+msgctxt "field:calendar.event,status:0"
+msgid "Status"
+msgstr "Состояние"
+
+msgctxt "field:calendar.event,summary:0"
+msgid "Summary"
+msgstr "Резюме"
+
+msgctxt "field:calendar.event,timezone:0"
+msgid "Timezone"
+msgstr "Зона времени"
+
+msgctxt "field:calendar.event,transp:0"
+msgid "Time Transparency"
+msgstr "Время Прозрачность"
+
+msgctxt "field:calendar.event,uuid:0"
+msgid "UUID"
+msgstr ""
+
+msgctxt "field:calendar.event,vevent:0"
+msgid "vevent"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,category:0"
+msgid "Category"
+msgstr "Категории"
+
+msgctxt "field:calendar.event-calendar.category,event:0"
+msgid "Event"
+msgstr "Событие"
+
+msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr "Сигнала календаря"
+
+msgctxt "field:calendar.event.alarm,event:0"
+msgid "Event"
+msgstr "Событие"
+
+msgctxt "field:calendar.event.alarm,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr "Календарь участников"
+
+msgctxt "field:calendar.event.attendee,event:0"
+msgid "Event"
+msgstr "Событие"
+
+msgctxt "field:calendar.event.attendee,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "День календаря"
+
+msgctxt "field:calendar.event.exdate,event:0"
+msgid "Event"
+msgstr "Событие"
+
+msgctxt "field:calendar.event.exdate,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Правила календаря"
+
+msgctxt "field:calendar.event.exrule,event:0"
+msgid "Event"
+msgstr "Событие"
+
+msgctxt "field:calendar.event.exrule,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "День календаря"
+
+msgctxt "field:calendar.event.rdate,event:0"
+msgid "Event"
+msgstr "Событие"
+
+msgctxt "field:calendar.event.rdate,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Правила календаря"
+
+msgctxt "field:calendar.event.rrule,event:0"
+msgid "Event"
+msgstr "Событие"
+
+msgctxt "field:calendar.event.rrule,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.location,name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.location,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.rrule,byday:0"
+msgid "By Day"
+msgstr "По дням"
+
+msgctxt "field:calendar.rrule,byhour:0"
+msgid "By Hour"
+msgstr "По часам"
+
+msgctxt "field:calendar.rrule,byminute:0"
+msgid "By Minute"
+msgstr "По минутам"
+
+msgctxt "field:calendar.rrule,bymonth:0"
+msgid "By Month"
+msgstr "По месячно"
+
+msgctxt "field:calendar.rrule,bymonthday:0"
+msgid "By Month Day"
+msgstr "По дням месяца"
+
+msgctxt "field:calendar.rrule,bysecond:0"
+msgid "By Second"
+msgstr "По секундам"
+
+msgctxt "field:calendar.rrule,bysetpos:0"
+msgid "By Position"
+msgstr "По позиции"
+
+msgctxt "field:calendar.rrule,byweekno:0"
+msgid "By Week Number"
+msgstr "По номерам недель"
+
+msgctxt "field:calendar.rrule,byyearday:0"
+msgid "By Year Day"
+msgstr "По дням года"
+
+msgctxt "field:calendar.rrule,count:0"
+msgid "Count"
+msgstr "Количество"
+
+msgctxt "field:calendar.rrule,freq:0"
+msgid "Frequency"
+msgstr "Частота"
+
+msgctxt "field:calendar.rrule,interval:0"
+msgid "Interval"
+msgstr "Внутренний"
+
+msgctxt "field:calendar.rrule,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.rrule,until:0"
+msgid "Until Date"
+msgstr "До даты"
+
+msgctxt "field:calendar.rrule,until_date:0"
+msgid "Is Date"
+msgstr "Весь день"
+
+msgctxt "field:calendar.rrule,wkst:0"
+msgid "Week Day"
+msgstr "День недели"
+
+msgctxt "field:res.user,calendars:0"
+msgid "Calendars"
+msgstr "Календари"
+
+msgctxt "help:calendar.calendar,owner:0"
+msgid "The user must have an email"
+msgstr ""
+
+msgctxt "help:calendar.date,date:0"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Время игнорируется в поле \"Дата\", действует только дата"
+
+msgctxt "help:calendar.event,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Универсальный уникальный идентификатор"
+
+msgctxt "help:calendar.rrule,until_date:0"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr "Время игнорируется в поле \"До даты\", действует только дата"
+
+msgctxt "model:calendar.alarm,name:0"
+msgid "Alarm"
+msgstr "Вызов"
+
+msgctxt "model:calendar.attendee,name:0"
+msgid "Attendee"
+msgstr "Участник"
+
+msgctxt "model:calendar.calendar,name:0"
+msgid "Calendar"
+msgstr "Календарь"
+
+msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgid "Calendar - read - User"
+msgstr "Пользователи могут читать"
+
+msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgid "Calendar - write - User"
+msgstr "Пользователи могут писать"
+
+msgctxt "model:calendar.category,name:0"
+msgid "Category"
+msgstr "Категории"
+
+msgctxt "model:calendar.date,name:0"
+msgid "Calendar Date"
+msgstr "День календаря"
+
+msgctxt "model:calendar.event,name:0"
+msgid "Event"
+msgstr "Событие"
+
+msgctxt "model:calendar.event-calendar.category,name:0"
+msgid "Event - Category"
+msgstr "Категории - События"
+
+msgctxt "model:calendar.event.alarm,name:0"
+msgid "Alarm"
+msgstr "Вызов"
+
+msgctxt "model:calendar.event.attendee,name:0"
+msgid "Attendee"
+msgstr "Участник"
+
+msgctxt "model:calendar.event.exdate,name:0"
+msgid "Exception Date"
+msgstr "Дата исключения"
+
+msgctxt "model:calendar.event.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Правило исключения"
+
+msgctxt "model:calendar.event.rdate,name:0"
+msgid "Recurrence Date"
+msgstr "Даты повторения"
+
+msgctxt "model:calendar.event.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Правила повторения"
+
+msgctxt "model:calendar.location,name:0"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "model:calendar.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Правила повторения"
+
+msgctxt "model:ir.action,name:act_calendar_form"
+msgid "Calendars"
+msgstr "Календари"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_event_form"
+msgid "Events"
+msgstr "События"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_event_form3"
+msgid "Events"
+msgstr "События"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_calendar"
+msgid "Calendar"
+msgstr "Календари"
+
+msgctxt "model:ir.ui.menu,name:menu_calendar_form"
+msgid "Calendars"
+msgstr "Календари"
+
+msgctxt "model:ir.ui.menu,name:menu_event_form"
+msgid "Events"
+msgstr "События"
+
+msgctxt "model:res.group,name:group_calendar_admin"
+msgid "Calendar Administration"
+msgstr "Управление календарем"
+
+#, fuzzy
+msgctxt "selection:calendar.attendee,status:0"
+msgid ""
+msgstr "Резервный счет"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Accepted"
+msgstr "Подтверждено"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Declined"
+msgstr "Отклонено"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Delegated"
+msgstr "Делегировано"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Needs Action"
+msgstr "Требуется действие"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Tentative"
+msgstr "Предварительный"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Confidential"
+msgstr "Конфиденциальное"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Private"
+msgstr "Личное"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Public"
+msgstr "Публичное"
+
+#, fuzzy
+msgctxt "selection:calendar.event,status:0"
+msgid ""
+msgstr "Резервный счет"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Cancelled"
+msgstr "Отмененно"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Confirmed"
+msgstr "Подтвержденно"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Tentative"
+msgstr "Предварительный"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Opaque"
+msgstr "Непрозрачный"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Transparent"
+msgstr "Прозрачный"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Daily"
+msgstr "Ежедневный"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Hourly"
+msgstr "Ежечасный"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Minutely"
+msgstr "Ежеминутно"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Monthly"
+msgstr "Ежемесячно"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Secondly"
+msgstr "Ежесекудно"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Weekly"
+msgstr "Еженедельно"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Yearly"
+msgstr "Ежегодно"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Friday"
+msgstr "Пятница"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Monday"
+msgstr "Понедельник"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Saturday"
+msgstr "Суббота"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Sunday"
+msgstr "Воскресенье"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Thursday"
+msgstr "Четверг"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Tuesday"
+msgstr "Вторник"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Wednesday"
+msgstr "Среда"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendar"
+msgstr "Календарь"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendars"
+msgstr "Календари"
+
+msgctxt "view:calendar.calendar:0"
+msgid "General"
+msgstr "Основной"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Security"
+msgstr "Доступ"
+
+msgctxt "view:calendar.category:0"
+msgid "Categories"
+msgstr "Категория"
+
+msgctxt "view:calendar.category:0"
+msgid "Category"
+msgstr "Категории"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendee"
+msgstr "Участник"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendees"
+msgstr "Участники"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Date"
+msgstr "Дата исключения"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Dates"
+msgstr "Дата исключения"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rule"
+msgstr "Правило исключения"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rules"
+msgstr "Правила исключения"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Date"
+msgstr "Даты повторения"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Даты повторения"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Правила повторения"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Правила повторения"
+
+msgctxt "view:calendar.event:0"
+msgid "Attendees"
+msgstr "Участники"
+
+msgctxt "view:calendar.event:0"
+msgid "Categories"
+msgstr "Категория"
+
+msgctxt "view:calendar.event:0"
+msgid "Event"
+msgstr "Событие"
+
+msgctxt "view:calendar.event:0"
+msgid "Events"
+msgstr "События"
+
+msgctxt "view:calendar.event:0"
+msgid "General"
+msgstr "Основной"
+
+msgctxt "view:calendar.event:0"
+msgid "Occurences"
+msgstr "Повторение"
+
+msgctxt "view:calendar.location:0"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "view:calendar.location:0"
+msgid "Locations"
+msgstr "Местоположения"
diff --git a/res.py b/res.py
index 2329f67..82c8925 100644
--- a/res.py
+++ b/res.py
@@ -2,7 +2,7 @@
#this repository contains the full copyright notices and license terms.
import copy
from trytond.model import ModelView, ModelSQL, fields
-from trytond.pyson import Bool, Eval, Or
+from trytond.pyson import Bool, Eval
class User(ModelSQL, ModelView):
@@ -19,9 +19,8 @@ class User(ModelSQL, ModelView):
if not self.email.states.get('required'):
self.email.states['required'] = required
else:
- self.email.states['required'] = \
- Or(self.email.states['required'],
- required)
+ self.email.states['required'] = (
+ self.email.states['required'] | required)
if 'calendars' not in self.email.depends:
self.email.depends.append('calendars')
diff --git a/ru_RU.csv b/ru_RU.csv
deleted file mode 100644
index 5a6e85f..0000000
--- a/ru_RU.csv
+++ /dev/null
@@ -1,202 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.calendar,0,A user can have only one calendar!,Пользователь может иметь только Один календарь!,0
-error,calendar.calendar,0,The name of calendar must be unique!,Имя календаря должно быть уникально,0
-error,calendar.category,0,The name of calendar category must be unique!,,0
-error,calendar.event,0,Recurrence can not be recurrent!,,0
-error,calendar.event,0,UUID and recurrence must be unique in a calendar!,,0
-error,calendar.location,0,The name of calendar location must be unique!,,0
-error,calendar.rrule,0,"Invalid ""By Day""","Неверное поле ""По дням""",0
-error,calendar.rrule,0,"Invalid ""By Hour""","Неверное поле ""По часам""",0
-error,calendar.rrule,0,"Invalid ""By Minute""","Неверное поле ""По минутам""",0
-error,calendar.rrule,0,"Invalid ""By Month Day""","Неверное поле ""По дням месяца""",0
-error,calendar.rrule,0,"Invalid ""By Month""","Неверное поле ""По месяцам""",0
-error,calendar.rrule,0,"Invalid ""By Position""","Неверное поле ""По позиции""",0
-error,calendar.rrule,0,"Invalid ""By Second""","Неверное поле ""По секундам""",0
-error,calendar.rrule,0,"Invalid ""By Week Number""","Неверное поле ""По номерам недель""",0
-error,calendar.rrule,0,"Invalid ""By Year Day""","Неверный ""По дням года""",0
-error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!",,0
-field,"calendar.alarm,rec_name",0,Name,Наименование,0
-field,"calendar.alarm,valarm",0,valarm,,0
-field,"calendar.attendee,attendee",0,attendee,участник,0
-field,"calendar.attendee,email",0,Email,Эл.почта,0
-field,"calendar.attendee,rec_name",0,Name,Наименование,0
-field,"calendar.attendee,status",0,Participation Status,Статус участия,0
-field,"calendar.calendar,description",0,Description,Описание,0
-field,"calendar.calendar,name",0,Name,Наименование,0
-field,"calendar.calendar,owner",0,Owner,Владелец,0
-field,"calendar.calendar,read_users",0,Read Users,Пользователи могут читать,0
-field,"calendar.calendar,rec_name",0,Name,Наименование,0
-field,"calendar.calendar,write_users",0,Write Users,Пользователи могут писать,0
-field,"calendar.calendar-read-res.user,calendar",0,Calendar,Календар,0
-field,"calendar.calendar-read-res.user,rec_name",0,Name,Наименование,0
-field,"calendar.calendar-read-res.user,user",0,User,Пользователь,0
-field,"calendar.calendar-write-res.user,calendar",0,Calendar,Календарь,0
-field,"calendar.calendar-write-res.user,rec_name",0,Name,Наименование,0
-field,"calendar.calendar-write-res.user,user",0,User,Пользователь,0
-field,"calendar.category,name",0,Name,Наименование,0
-field,"calendar.category,rec_name",0,Name,Наименование,0
-field,"calendar.date,date",0,Is Date,Весь день,0
-field,"calendar.date,datetime",0,Date,Дата,0
-field,"calendar.date,rec_name",0,Name,Наименование,0
-field,"calendar.event,alarms",0,Alarms,Вызовы,0
-field,"calendar.event,all_day",0,All Day,Все дни,0
-field,"calendar.event,attendees",0,Attendees,Участники,0
-field,"calendar.event,calendar",0,Calendar,Календарь,0
-field,"calendar.event,calendar_owner",0,Owner,Владелец,0
-field,"calendar.event,calendar_read_users",0,Read Users,Пользователи могут читать,0
-field,"calendar.event,calendar_write_users",0,Write Users,Пользователи могут писать,0
-field,"calendar.event,categories",0,Categories,Категория,0
-field,"calendar.event,classification",0,Classification,Классификация,0
-field,"calendar.event,classification_public",0,Classification Public,Классификация общая,0
-field,"calendar.event,description",0,Description,Описание,0
-field,"calendar.event,dtend",0,End Date,Дата окончания,0
-field,"calendar.event,dtstart",0,Start Date,Дата начала,0
-field,"calendar.event,exdates",0,Exception Dates,Дата исключения,0
-field,"calendar.event,exrules",0,Exception Rules,Правила исключения,0
-field,"calendar.event,location",0,Location,Местоположение,0
-field,"calendar.event,occurences",0,Occurences,Дополнительные задачи,0
-field,"calendar.event,organizer",0,Organizer,Организатор,0
-field,"calendar.event,parent",0,Parent,Основной,0
-field,"calendar.event,rdates",0,Recurrence Dates,Даты повторения,0
-field,"calendar.event,rec_name",0,Name,Наименование,0
-field,"calendar.event,recurrence",0,Recurrence,Повторение,0
-field,"calendar.event,rrules",0,Recurrence Rules,Правила повторения,0
-field,"calendar.event,sequence",0,Sequence,Последовательность,0
-field,"calendar.event,status",0,Status,Состояние,0
-field,"calendar.event,summary",0,Summary,Резюме,0
-field,"calendar.event,timezone",0,Timezone,Зона времени,0
-field,"calendar.event,transp",0,Time Transparency,Время Прозрачность,0
-field,"calendar.event,uuid",0,UUID,,0
-field,"calendar.event,vevent",0,vevent,,0
-field,"calendar.event-calendar.category,category",0,Category,Категории,0
-field,"calendar.event-calendar.category,event",0,Event,Событие,0
-field,"calendar.event-calendar.category,rec_name",0,Name,Наименование,0
-field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Сигнала календаря,0
-field,"calendar.event.alarm,event",0,Event,Событие,0
-field,"calendar.event.alarm,rec_name",0,Name,Наименование,0
-field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Календарь участников,0
-field,"calendar.event.attendee,event",0,Event,Событие,0
-field,"calendar.event.attendee,rec_name",0,Name,Наименование,0
-field,"calendar.event.exdate,calendar_date",0,Calendar Date,День календаря,0
-field,"calendar.event.exdate,calendar_rdate",0,Calendar RDate,День календаря,0
-field,"calendar.event.exdate,event",0,Event,Событие,0
-field,"calendar.event.exdate,rec_name",0,Name,Наименование,0
-field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Правила календаря,0
-field,"calendar.event.exrule,event",0,Event,Событие,0
-field,"calendar.event.exrule,rec_name",0,Name,Наименование,0
-field,"calendar.event.rdate,calendar_date",0,Calendar Date,День календаря,0
-field,"calendar.event.rdate,calendar_rdate",0,Calendar RDate,День календаря,0
-field,"calendar.event.rdate,event",0,Event,Событие,0
-field,"calendar.event.rdate,rec_name",0,Name,Наименование,0
-field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Правила календаря,0
-field,"calendar.event.rrule,event",0,Event,Событие,0
-field,"calendar.event.rrule,rec_name",0,Name,Наименование,0
-field,"calendar.location,name",0,Name,Наименование,0
-field,"calendar.location,rec_name",0,Name,Наименование,0
-field,"calendar.rdate,date",0,Is Date,Весь день,0
-field,"calendar.rdate,datetime",0,Date,Дата,0
-field,"calendar.rdate,rec_name",0,Name,Наименование,0
-field,"calendar.rrule,byday",0,By Day,По дням,0
-field,"calendar.rrule,byhour",0,By Hour,По часам,0
-field,"calendar.rrule,byminute",0,By Minute,По минутам,0
-field,"calendar.rrule,bymonth",0,By Month,По месячно,0
-field,"calendar.rrule,bymonthday",0,By Month Day,По дням месяца,0
-field,"calendar.rrule,bysecond",0,By Second,По секундам,0
-field,"calendar.rrule,bysetpos",0,By Position,По позиции,0
-field,"calendar.rrule,byweekno",0,By Week Number,По номерам недель,0
-field,"calendar.rrule,byyearday",0,By Year Day,По дням года,0
-field,"calendar.rrule,count",0,Count,Количество,0
-field,"calendar.rrule,freq",0,Frequency,Частота,0
-field,"calendar.rrule,interval",0,Interval,Внутренний,0
-field,"calendar.rrule,rec_name",0,Name,Наименование,0
-field,"calendar.rrule,until",0,Until Date,До даты,0
-field,"calendar.rrule,until_date",0,Is Date,Весь день,0
-field,"calendar.rrule,wkst",0,Week Day,День недели,0
-field,"res.user,calendars",0,Calendars,Календари,0
-help,"calendar.calendar,owner",0,The user must have an email,,0
-help,"calendar.date,date",0,"Ignore time of field ""Date"", but handle as date only.","Время игнорируется в поле ""Дата"", действует только дата",0
-help,"calendar.event,uuid",0,Universally Unique Identifier,Универсальный уникальный идентификатор,0
-help,"calendar.rdate,date",0,"Ignore time of field ""Date"", but handle as date only.","Время игнорируется в поле ""Дата"", действует только дата",0
-help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","Время игнорируется в поле ""До даты"", действует только дата",0
-model,"calendar.alarm,name",0,Alarm,Вызов,0
-model,"calendar.attendee,name",0,Attendee,Участник,0
-model,"calendar.calendar,name",0,Calendar,Календарь,0
-model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Пользователи могут читать,0
-model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Пользователи могут писать,0
-model,"calendar.category,name",0,Category,Категории,0
-model,"calendar.date,name",0,Calendar Date,День календаря,0
-model,"calendar.event,name",0,Event,Событие,0
-model,"calendar.event-calendar.category,name",0,Event - Category,Категории - События,0
-model,"calendar.event.alarm,name",0,Alarm,Вызов,0
-model,"calendar.event.attendee,name",0,Attendee,Участник,0
-model,"calendar.event.exdate,name",0,Exception Date,Дата исключения,0
-model,"calendar.event.exrule,name",0,Exception Rule,Правило исключения,0
-model,"calendar.event.rdate,name",0,Recurrence Date,Даты повторения,0
-model,"calendar.event.rrule,name",0,Recurrence Rule,Правила повторения,0
-model,"calendar.location,name",0,Location,Местоположение,0
-model,"calendar.rdate,name",0,Recurrence Date,Даты повторения,0
-model,"calendar.rrule,name",0,Recurrence Rule,Правила повторения,0
-model,"ir.action,name",act_calendar_form,Calendars,Календари,0
-model,"ir.action,name",act_calendar_form2,Calendars,Календари,0
-model,"ir.action,name",act_event_form,Events,,0
-model,"ir.action,name",act_event_form2,Events,,0
-model,"ir.action,name",act_event_form3,Events,,0
-model,"ir.ui.menu,name",menu_calendar,Calendar Management,Календари,0
-model,"ir.ui.menu,name",menu_calendar_form,Calendars,Календари,0
-model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Новый календарь,0
-model,"ir.ui.menu,name",menu_event_form,Events,События,0
-model,"ir.ui.menu,name",menu_event_form2,New Event,Новое событие,0
-model,"res.group,name",group_calendar_admin,Calendar Administration,Управление календарем,0
-selection,"calendar.attendee,status",0,,,0
-selection,"calendar.attendee,status",0,Accepted,Подтверждено,0
-selection,"calendar.attendee,status",0,Declined,Отклонено,0
-selection,"calendar.attendee,status",0,Delegated,Делегировано,0
-selection,"calendar.attendee,status",0,Needs Action,Требуется действие,0
-selection,"calendar.attendee,status",0,Tentative,Предварительный,0
-selection,"calendar.event,classification",0,Confidential,Конфиденциальное,0
-selection,"calendar.event,classification",0,Private,Личное,0
-selection,"calendar.event,classification",0,Public,Публичное,0
-selection,"calendar.event,status",0,,,0
-selection,"calendar.event,status",0,Cancelled,Отмененно,0
-selection,"calendar.event,status",0,Confirmed,Подтвержденно,0
-selection,"calendar.event,status",0,Tentative,Предварительный,0
-selection,"calendar.event,transp",0,Opaque,Непрозрачный,0
-selection,"calendar.event,transp",0,Transparent,Прозрачный,0
-selection,"calendar.rrule,freq",0,Daily,Ежедневный,0
-selection,"calendar.rrule,freq",0,Hourly,Ежечасный,0
-selection,"calendar.rrule,freq",0,Minutely,Ежеминутно,0
-selection,"calendar.rrule,freq",0,Monthly,Ежемесячно,0
-selection,"calendar.rrule,freq",0,Secondly,Ежесекудно,0
-selection,"calendar.rrule,freq",0,Weekly,Еженедельно,0
-selection,"calendar.rrule,freq",0,Yearly,Ежегодно,0
-selection,"calendar.rrule,wkst",0,Friday,Пятница,0
-selection,"calendar.rrule,wkst",0,Monday,Понедельник,0
-selection,"calendar.rrule,wkst",0,Saturday,Суббота,0
-selection,"calendar.rrule,wkst",0,Sunday,Воскресенье,0
-selection,"calendar.rrule,wkst",0,Thursday,Четверг,0
-selection,"calendar.rrule,wkst",0,Tuesday,Вторник,0
-selection,"calendar.rrule,wkst",0,Wednesday,Среда,0
-view,calendar.calendar,0,Calendar,Календарь,0
-view,calendar.calendar,0,Calendars,Календари,0
-view,calendar.calendar,0,General,Основной,0
-view,calendar.calendar,0,Security,Доступ,0
-view,calendar.category,0,Categories,Категория,0
-view,calendar.category,0,Category,Категории,0
-view,calendar.event,0,Attendees,Участники,0
-view,calendar.event,0,Categories,Категория,0
-view,calendar.event,0,Event,Событие,0
-view,calendar.event,0,Events,События,0
-view,calendar.event,0,General,Основной,0
-view,calendar.event,0,Occurences,Повторение,0
-view,calendar.event.attendee,0,Attendee,Участник,0
-view,calendar.event.attendee,0,Attendees,Участники,0
-view,calendar.event.exdate,0,Exception Date,Дата исключения,0
-view,calendar.event.exdate,0,Exception Dates,Дата исключения,0
-view,calendar.event.exrule,0,Exception Rule,Правило исключения,0
-view,calendar.event.exrule,0,Exception Rules,Правила исключения,0
-view,calendar.event.rdate,0,Recurrence Date,Даты повторения,0
-view,calendar.event.rdate,0,Recurrence Dates,Даты повторения,0
-view,calendar.event.rrule,0,Recurrence Rule,Правила повторения,0
-view,calendar.event.rrule,0,Recurrence Rules,Правила повторения,0
-view,calendar.location,0,Location,Местоположение,0
-view,calendar.location,0,Locations,Местоположения,0
diff --git a/setup.py b/setup.py
index 50e3711..94fef71 100644
--- a/setup.py
+++ b/setup.py
@@ -39,25 +39,30 @@ setup(name='trytond_calendar',
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',
],
license='GPL-3',
install_requires=requires,
+ extras_require={
+ 'test': ['caldav'],
+ },
zip_safe=False,
entry_points="""
[trytond.modules]
diff --git a/tests/__init__.pyc b/tests/__init__.pyc
deleted file mode 100644
index b370054..0000000
Binary files a/tests/__init__.pyc and /dev/null differ
diff --git a/tests/scenario_calendar.py b/tests/scenario_calendar.py
new file mode 100644
index 0000000..649e47e
--- /dev/null
+++ b/tests/scenario_calendar.py
@@ -0,0 +1,174 @@
+#!/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 optparse import OptionParser
+from urlparse import urlparse
+import unittest
+import sys
+import datetime
+
+from dateutil.relativedelta import relativedelta
+import caldav
+import vobject
+from proteus import config, Model, Wizard
+
+def install_module(name, config):
+ Module = Model.get('ir.module.module')
+ module, = Module.find([('name', '=', name)])
+ if module.state != 'installed':
+ Module.button_install([module.id], config.context)
+ Wizard('ir.module.module.install_upgrade').execute('start')
+
+def configure_user(login, config):
+ User = Model.get('res.user')
+ users = User.find([('login', '=', login)])
+ email = '%s at example.com' % login
+ if not users:
+ User(login=login, name=login, email=email).save()
+ else:
+ user, = users
+ user.email = email
+ user.save()
+
+def create_calendar(login, user, config):
+ Calendar = Model.get('calendar.calendar')
+ User = Model.get('res.user')
+ current_user, = User.find([('login', '=', login)])
+ main_user, = User.find([('login', '=', user)])
+ for calendar in Calendar.find([('owner', '=', login)]):
+ calendar.write_users.append(User(main_user.id))
+ calendar.save()
+ calendar.delete()
+ calendar = Calendar(name=login, owner=current_user)
+ if login != 'bar':
+ calendar.read_users.append(main_user)
+ calendar.save()
+
+
+class TestCase(unittest.TestCase):
+
+ def setUp(self):
+ self.client = caldav.DAVClient(URL)
+ self.principal = caldav.Principal(self.client, URL)
+ self.calendar, = [x for x in self.principal.calendars()
+ if x.url.path.endswith(user)]
+
+ def test0010calendar(self):
+ 'Test calendar'
+ calendar, _ = self.principal.calendars()
+
+ def test0020create_event(self):
+ 'Create event'
+ ical = vobject.iCalendar()
+ vevent = ical.add('vevent')
+ vevent.add('summary')
+ vevent.summary.value = 'Test event'
+ vevent.add('dtstart')
+ vevent.dtstart.value = datetime.datetime.now() + relativedelta(months=1)
+ vevent.add('dtend')
+ vevent.dtend.value = datetime.datetime.now() + relativedelta(months=1,
+ hours=1)
+ caldav.Event(self.client, data=ical.serialize(),
+ parent=self.calendar).save()
+
+ def test0030search_event(self):
+ 'Search date'
+ events = self.calendar.date_search(datetime.datetime.now(),
+ datetime.datetime.now() + relativedelta(months=2))
+ self.assertEqual(len(events), 1)
+ events = self.calendar.date_search(
+ datetime.datetime.now() - relativedelta(months=1),
+ datetime.datetime.now())
+ self.assertEqual(len(events), 0)
+
+ def test0040get_event(self):
+ 'Get event'
+ event = self.calendar.events()[0]
+ event.load()
+ self.assertEqual(event.url, self.calendar.event(event.id).url)
+
+ def test0050create_event_attendee(self):
+ 'Create event with attendee'
+ ical = vobject.iCalendar()
+ vevent = ical.add('vevent')
+ vevent.add('summary')
+ vevent.summary.value = 'Test event with attendee'
+ vevent.add('dtstart')
+ vevent.dtstart.value = datetime.datetime.now() + relativedelta(days=10)
+ vevent.add('dtend')
+ vevent.dtend.value = datetime.datetime.now() + relativedelta(days=10,
+ hours=4)
+ vevent.add('organizer')
+ vevent.organizer.value = '%s at example.com' % user
+ attendees = []
+ for name in ('foo', 'bar'):
+ attendee = vobject.base.ContentLine('ATTENDEE', [], '')
+ attendee.partstat_param = 'TENTATIVE'
+ attendee.value = 'MAILTO:%s at example.com' % name
+ attendees.append(attendee)
+ vevent.attendee_list = attendees
+ event = caldav.Event(self.client, data=ical.serialize(),
+ parent=self.calendar).save()
+
+ Event = Model.get('calendar.event')
+ owner_event, = Event.find([
+ ('calendar.owner.email', '=', '%s at example.com' % user),
+ ('summary', '=', vevent.summary.value),
+ ])
+ attendee_event, = Event.find([
+ ('calendar.owner.email', '=', 'foo at example.com'),
+ ])
+ self.assertEqual(attendee_event.uuid, owner_event.uuid)
+
+ def test0060update_attendee_status(self):
+ 'Update status of attendee'
+ for event in self.calendar.events():
+ event.load()
+ if event.instance.vevent.summary.value == 'Test event with attendee':
+ break
+ for attendee in event.instance.vevent.attendee_list:
+ attendee.partstat_param = 'accepted'
+ event.save()
+
+ Event = Model.get('calendar.event')
+ attendee_event, = Event.find([
+ ('calendar.owner.email', '=', 'foo at example.com'),
+ ])
+ for attendee in attendee_event.attendees:
+ self.assertEqual(attendee.status, 'accepted')
+
+ def test0070delete_attendee(self):
+ 'Delete attendee'
+ for event in self.calendar.events():
+ event.load()
+ if event.instance.vevent.summary.value == 'Test event with attendee':
+ break
+ event.instance.vevent.attendee_list = []
+ event.save()
+
+ Event = Model.get('calendar.event')
+ self.assertEqual(Event.find([
+ ('calendar.owner.email', '=', 'foo at example.com'),
+ ]), [])
+
+if __name__ == '__main__':
+ parser = OptionParser()
+ parser.add_option('--xmlrpc', dest='xmlrpc', metavar='URL',
+ help='use trytond XML-RPC at URL')
+ parser.add_option('--url', dest='url', metavar='URL',
+ help='use calendar at URL')
+ (options, args) = parser.parse_args()
+ config = config.set_xmlrpc(options.xmlrpc)
+ xmlrpc_user = urlparse(options.xmlrpc).username
+ user = urlparse(options.url).username
+ assert xmlrpc_user == user
+ assert user != 'foo'
+ install_module('calendar', config)
+ configure_user(user, config)
+ configure_user('foo', config)
+ configure_user('bar', config)
+ create_calendar(user, user, config)
+ create_calendar('foo', user, config)
+ create_calendar('bar', user, config)
+ URL = options.url
+ unittest.main(argv=sys.argv[:1])
diff --git a/tests/test_calendar.py b/tests/test_calendar.py
index cc80b0a..207654b 100644
--- a/tests/test_calendar.py
+++ b/tests/test_calendar.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 CalendarTestCase(unittest.TestCase):
@@ -27,6 +27,12 @@ class CalendarTestCase(unittest.TestCase):
'''
test_view('calendar')
+ def test0006depends(self):
+ '''
+ Test depends.
+ '''
+ test_depends()
+
def suite():
suite = trytond.tests.test_tryton.suite()
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
diff --git a/tests/test_calendar.pyc b/tests/test_calendar.pyc
deleted file mode 100644
index 02dbc50..0000000
Binary files a/tests/test_calendar.pyc and /dev/null differ
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index 3a458b7..7a50dec 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,29 +1,31 @@
Metadata-Version: 1.0
Name: trytond-calendar
-Version: 2.0.0
+Version: 2.2.0
Summary: Add CalDAV support
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.egg-info/SOURCES.txt b/trytond_calendar.egg-info/SOURCES.txt
index de3adb7..24835cd 100644
--- a/trytond_calendar.egg-info/SOURCES.txt
+++ b/trytond_calendar.egg-info/SOURCES.txt
@@ -4,13 +4,7 @@ INSTALL
LICENSE
MANIFEST.in
README
-bg_BG.csv
calendar.xml
-de_DE.csv
-es_CO.csv
-es_ES.csv
-fr_FR.csv
-ru_RU.csv
setup.py
./__init__.py
./__tryton__.py
@@ -19,11 +13,16 @@ setup.py
./res.py
./webdav.py
./tests/__init__.py
+./tests/scenario_calendar.py
./tests/test_calendar.py
-tests/__init__.py
-tests/__init__.pyc
-tests/test_calendar.py
-tests/test_calendar.pyc
+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.egg-info/PKG-INFO
trytond_calendar.egg-info/SOURCES.txt
trytond_calendar.egg-info/dependency_links.txt
diff --git a/trytond_calendar.egg-info/requires.txt b/trytond_calendar.egg-info/requires.txt
index ccd0e32..fe966b1 100644
--- a/trytond_calendar.egg-info/requires.txt
+++ b/trytond_calendar.egg-info/requires.txt
@@ -2,4 +2,7 @@ vobject >= 0.8.0
PyWebDAV >= 0.9.3
python-dateutil
pytz
-trytond >= 2.0, < 2.1
\ No newline at end of file
+trytond >= 2.2, < 2.3
+
+[test]
+caldav
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index 62b7e0b..03186fe 100644
--- a/webdav.py
+++ b/webdav.py
@@ -7,9 +7,41 @@ from trytond.model import ModelView, ModelSQL
from trytond.tools import reduce_ids
from trytond.cache import Cache
from trytond.transaction import Transaction
+from trytond.pool import Pool
CALDAV_NS = 'urn:ietf:params:xml:ns:caldav'
+def _comp_filter_domain(dtstart, dtend):
+ return ['OR',
+ [
+ ['OR',
+ [('dtstart', '<=', dtstart),
+ ('dtend', '>=', dtstart)],
+ [('dtstart', '<=', dtend),
+ ('dtend', '>=', dtend)],
+ [('dtstart', '>=', dtstart),
+ ('dtend', '<=', dtend)],
+ [('dtstart', '>=', dtstart),
+ ('dtstart', '<=', dtend),
+ ('dtend', '=', False)]],
+ ('parent', '=', False),
+ ('rdates', '=', False),
+ ('rrules', '=', False),
+ ('exdates', '=', False),
+ ('exrules', '=', False),
+ ('occurences', '=', False),
+ ],
+ [ #TODO manage better recurring event
+ ('parent', '=', False),
+ ('dtstart', '<=', dtend),
+ ['OR',
+ ('rdates', '!=', False),
+ ('rrules', '!=', False),
+ ('exdates', '!=', False),
+ ('exrules', '!=', False),
+ ('occurences', '!=', False),
+ ]
+ ]]
class Collection(ModelSQL, ModelView):
@@ -23,7 +55,7 @@ class Collection(ModelSQL, ModelView):
:return: calendar id
or False if there is no calendar
'''
- calendar_obj = self.pool.get('calendar.calendar')
+ calendar_obj = Pool().get('calendar.calendar')
if uri and uri.startswith('Calendars/'):
calendar, uri = (uri[10:].split('/', 1) + [None])[0:2]
@@ -45,7 +77,7 @@ class Collection(ModelSQL, ModelView):
:return: event id
or False if there is no event
'''
- event_obj = self.pool.get('calendar.event')
+ event_obj = Pool().get('calendar.event')
if uri and uri.startswith('Calendars/'):
calendar, event_uri = (uri[10:].split('/', 1) + [None])[0:2]
@@ -88,6 +120,7 @@ class Collection(ModelSQL, ModelView):
if filter.localName == 'principal-property-search':
return [('id', '=', 0)]
elif filter.localName == 'calendar-query':
+ result = []
calendar_filter = None
for e in filter.childNodes:
if e.nodeType == e.TEXT_NODE:
@@ -111,11 +144,19 @@ class Collection(ModelSQL, ModelView):
if vevent_filter.getAttribute('name') != 'VEVENT':
vevent_filter = None
continue
+ for comp_filter in vevent_filter.childNodes:
+ if comp_filter.localName != 'time-range':
+ continue
+ start = comp_filter.getAttribute('start')
+ start = vobject.icalendar.stringToDateTime(start)
+ end = comp_filter.getAttribute('end')
+ end = vobject.icalendar.stringToDateTime(end)
+ result.append(_comp_filter_domain(start, end))
break
if vevent_filter is None:
return [('id', '=', 0)]
break
- return []
+ return result
elif filter.localName == 'calendar-multiget':
ids = []
for e in filter.childNodes:
@@ -140,8 +181,8 @@ class Collection(ModelSQL, ModelView):
return res
def get_childs(self, uri, filter=None, cache=None):
- calendar_obj = self.pool.get('calendar.calendar')
- event_obj = self.pool.get('calendar.event')
+ calendar_obj = Pool().get('calendar.calendar')
+ event_obj = Pool().get('calendar.event')
if uri in ('Calendars', 'Calendars/'):
domain = self._caldav_filter_domain_calendar(filter)
@@ -195,7 +236,7 @@ class Collection(ModelSQL, ModelView):
return super(Collection, self).get_resourcetype(uri, cache=cache)
def get_displayname(self, uri, cache=None):
- calendar_obj = self.pool.get('calendar.calendar')
+ calendar_obj = Pool().get('calendar.calendar')
if uri in ('Calendars', 'Calendars/'):
return 'Calendars'
calendar_id = self.calendar(uri)
@@ -214,8 +255,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')
- event_obj = self.pool.get('calendar.event')
+ calendar_obj = Pool().get('calendar.calendar')
+ event_obj = Pool().get('calendar.event')
calendar_id = self.calendar(uri)
if not calendar_id:
@@ -290,8 +331,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')
- event_obj = self.pool.get('calendar.event')
+ calendar_obj = Pool().get('calendar.calendar')
+ event_obj = Pool().get('calendar.event')
cursor = Transaction().cursor
calendar_id = self.calendar(uri)
@@ -403,8 +444,8 @@ class Collection(ModelSQL, ModelView):
return super(Collection, self).get_lastmodified(uri, cache=cache)
def get_data(self, uri, cache=None):
- event_obj = self.pool.get('calendar.event')
- calendar_obj = self.pool.get('calendar.calendar')
+ event_obj = Pool().get('calendar.event')
+ calendar_obj = Pool().get('calendar.calendar')
calendar_id = self.calendar(uri)
if calendar_id:
@@ -422,7 +463,7 @@ class Collection(ModelSQL, ModelView):
return super(Collection, self).get_data(uri, cache=cache)
def get_calendar_description(self, uri, cache=None):
- calendar_obj = self.pool.get('calendar.calendar')
+ calendar_obj = Pool().get('calendar.calendar')
calendar_id = self.calendar(uri)
if calendar_id:
@@ -462,14 +503,14 @@ class Collection(ModelSQL, ModelView):
return '/Calendars'
def get_calendar_user_address_set(self, uri, cache=None):
- user_obj = self.pool.get('res.user')
+ user_obj = Pool().get('res.user')
user = user_obj.browse(Transaction().user)
if user.email:
return user.email
raise DAV_NotFound
def get_schedule_inbox_URL(self, uri, cache=None):
- calendar_obj = self.pool.get('calendar.calendar')
+ calendar_obj = Pool().get('calendar.calendar')
user = Transaction().user
calendar_ids = calendar_obj.search([
@@ -485,8 +526,8 @@ class Collection(ModelSQL, ModelView):
return self.get_schedule_inbox_URL(uri, cache=cache)
def put(self, uri, data, content_type, cache=None):
- event_obj = self.pool.get('calendar.event')
- calendar_obj = self.pool.get('calendar.calendar')
+ event_obj = Pool().get('calendar.event')
+ calendar_obj = Pool().get('calendar.calendar')
calendar_id = self.calendar(uri)
if calendar_id:
@@ -517,7 +558,7 @@ class Collection(ModelSQL, ModelView):
return super(Collection, self).mkcol(uri, cache=cache)
def rmcol(self, uri, cache=None):
- calendar_obj = self.pool.get('calendar.calendar')
+ calendar_obj = Pool().get('calendar.calendar')
calendar_id = self.calendar(uri)
if calendar_id:
@@ -531,7 +572,7 @@ class Collection(ModelSQL, ModelView):
return super(Collection, self).rmcol(uri, cache=cache)
def rm(self, uri, cache=None):
- event_obj = self.pool.get('calendar.event')
+ event_obj = Pool().get('calendar.event')
calendar_id = self.calendar(uri)
if calendar_id:
@@ -573,7 +614,7 @@ class Collection(ModelSQL, ModelView):
:param cache: the cache
:return: a list of privileges
'''
- calendar_obj = self.pool.get('calendar.calendar')
+ calendar_obj = Pool().get('calendar.calendar')
if uri in ('Calendars', 'Calendars/'):
return ['create', 'read', 'write', 'delete']
commit e214fca6dae88caaba5a19f34f2c63c98fe28021
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue May 24 19:12:43 2011 +0200
Adding upstream version 2.0.0.
diff --git a/CHANGELOG b/CHANGELOG
index 4869665..698aff4 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,4 +1,4 @@
-Version 1.8.1 - 2011-02-13
+Version 2.0.0 - 2011-04-27
* Bug fixes (see mercurial logs for details)
Version 1.8.0 - 2010-11-01
diff --git a/PKG-INFO b/PKG-INFO
index c5e22a2..c8be40d 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.0
Name: trytond_calendar
-Version: 1.8.1
+Version: 2.0.0
Summary: Add CalDAV support
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 07b6402..fce5345 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -3,19 +3,23 @@
#this repository contains the full copyright notices and license terms.
{
'name' : 'Calendar',
+ 'name_bg_BG' : 'Календар',
'name_de_DE' : 'Kalender',
'name_es_CO' : 'Calendario',
'name_es_ES' : 'Calendario',
'name_fr_FR' : 'Calendrier',
- 'version' : '1.8.1',
+ 'name_ru_RU' : 'Календарь',
+ 'version' : '2.0.0',
'author' : 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
'description': 'Add CalDAV support',
+ 'description_bg_BG' : 'Добавя подръжка на CalDAV',
'description_de_DE' : 'Fügt Unterstützung für CalDAV hinzu',
'description_es_CO' : 'Añade soporte para CalDAV',
'description_es_ES' : 'Añade soporte para CalDAV',
- 'description_fr_FR': 'Ajoute le support CalDAV',
+ 'description_fr_FR' : 'Ajoute le support CalDAV',
+ 'description_ru_RU' : 'Добавление поддержки CalDAV',
'depends' : [
'ir',
'res',
@@ -25,9 +29,11 @@
'calendar.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..0a8f1c9
--- /dev/null
+++ b/bg_BG.csv
@@ -0,0 +1,194 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.calendar,0,A user can have only one calendar!,Потребителя може да има само един календар!,0
+error,calendar.calendar,0,The name of calendar must be unique!,Името на календара трябва да е уникално!,0
+error,calendar.category,0,The name of calendar category must be unique!,Името на категорията на календара трябва да е уникално!,0
+error,calendar.event,0,Recurrence can not be recurrent!,Повторението не може да е периодично!,0
+error,calendar.event,0,UUID and recurrence must be unique in a calendar!,UUID и взаимна вложеност трябва да са уникални в календар!,0
+error,calendar.location,0,The name of calendar location must be unique!,Името на местонахождението на календара трябва да е уникално!,0
+error,calendar.rrule,0,"Invalid ""By Day""","Невалиден ""По ден""",0
+error,calendar.rrule,0,"Invalid ""By Hour""","Навалиден ""По час""",0
+error,calendar.rrule,0,"Invalid ""By Minute""","Невалиден ""По минута""",0
+error,calendar.rrule,0,"Invalid ""By Month Day""","Невалиден ""По ден от месец""",0
+error,calendar.rrule,0,"Invalid ""By Month""","Невалидно ""По месец""",0
+error,calendar.rrule,0,"Invalid ""By Position""","Невалиден ""По позиция""",0
+error,calendar.rrule,0,"Invalid ""By Second""","Невалиден ""По секунда""",0
+error,calendar.rrule,0,"Invalid ""By Week Number""","Невалиден ""По номер на седмица""",0
+error,calendar.rrule,0,"Invalid ""By Year Day""","Невалиден ""По ден от годината""",0
+error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!","""Крайна дата"" и ""брой"" не може да се попълва по едно и също време!",0
+field,"calendar.alarm,rec_name",0,Name,Име,0
+field,"calendar.alarm,valarm",0,valarm,,0
+field,"calendar.attendee,attendee",0,attendee,присътващ,0
+field,"calendar.attendee,email",0,Email,Email,0
+field,"calendar.attendee,rec_name",0,Name,Име,0
+field,"calendar.attendee,status",0,Participation Status,Статус на участие,0
+field,"calendar.calendar,description",0,Description,Описание,0
+field,"calendar.calendar,name",0,Name,Име,0
+field,"calendar.calendar,owner",0,Owner,Собственик,0
+field,"calendar.calendar,read_users",0,Read Users,Потребители с права за четене,0
+field,"calendar.calendar,rec_name",0,Name,Име,0
+field,"calendar.calendar,write_users",0,Write Users,Записване на потребители,0
+field,"calendar.calendar-read-res.user,calendar",0,Calendar,Календар,0
+field,"calendar.calendar-read-res.user,rec_name",0,Name,Име,0
+field,"calendar.calendar-read-res.user,user",0,User,Потребител,0
+field,"calendar.calendar-write-res.user,calendar",0,Calendar,Календар,0
+field,"calendar.calendar-write-res.user,rec_name",0,Name,Име,0
+field,"calendar.calendar-write-res.user,user",0,User,Потребител,0
+field,"calendar.category,name",0,Name,Име,0
+field,"calendar.category,rec_name",0,Name,Име,0
+field,"calendar.date,date",0,Is Date,Е дата,0
+field,"calendar.date,datetime",0,Date,Дата,0
+field,"calendar.date,rec_name",0,Name,Име,0
+field,"calendar.event,alarms",0,Alarms,Аларми,0
+field,"calendar.event,all_day",0,All Day,Всички дни,0
+field,"calendar.event,attendees",0,Attendees,Присъстващи,0
+field,"calendar.event,calendar",0,Calendar,Календар,0
+field,"calendar.event,calendar_owner",0,Owner,Собственик,0
+field,"calendar.event,calendar_read_users",0,Read Users,Потребители с права за четене,0
+field,"calendar.event,calendar_write_users",0,Write Users,Записване на потребители,0
+field,"calendar.event,categories",0,Categories,Категории,0
+field,"calendar.event,classification",0,Classification,Класификация,0
+field,"calendar.event,description",0,Description,Описание,0
+field,"calendar.event,dtend",0,End Date,Крайна дата,0
+field,"calendar.event,dtstart",0,Start Date,Начална дата,0
+field,"calendar.event,exdates",0,Exception Dates,Дати на грешките,0
+field,"calendar.event,exrules",0,Exception Rules,Правила при грешка,0
+field,"calendar.event,location",0,Location,Местоположение,0
+field,"calendar.event,occurences",0,Occurences,Събития,0
+field,"calendar.event,organizer",0,Organizer,Организатор,0
+field,"calendar.event,parent",0,Parent,Родител,0
+field,"calendar.event,rdates",0,Recurrence Dates,Дати на повторяемост,0
+field,"calendar.event,rec_name",0,Name,Име,0
+field,"calendar.event,recurrence",0,Recurrence,Повторение,0
+field,"calendar.event,rrules",0,Recurrence Rules,Правила за повторяемост,0
+field,"calendar.event,sequence",0,Sequence,Последователност,0
+field,"calendar.event,status",0,Status,Състояние,0
+field,"calendar.event,summary",0,Summary,Обобщено,0
+field,"calendar.event,timezone",0,Timezone,Времева зона,0
+field,"calendar.event,transp",0,Time Transparency,Прозрачен във времето,0
+field,"calendar.event,uuid",0,UUID,UUID,0
+field,"calendar.event,vevent",0,vevent,,0
+field,"calendar.event-calendar.category,category",0,Category,Категория,0
+field,"calendar.event-calendar.category,event",0,Event,Събитие,0
+field,"calendar.event-calendar.category,rec_name",0,Name,Име,0
+field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Аларма на календар,0
+field,"calendar.event.alarm,event",0,Event,Събитие,0
+field,"calendar.event.alarm,rec_name",0,Name,Име,0
+field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Присъстващ на календар,0
+field,"calendar.event.attendee,event",0,Event,Събитие,0
+field,"calendar.event.attendee,rec_name",0,Name,Име,0
+field,"calendar.event.exdate,calendar_date",0,Calendar Date,Дата от календар,0
+field,"calendar.event.exdate,event",0,Event,Събитие,0
+field,"calendar.event.exdate,rec_name",0,Name,Име,0
+field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,,0
+field,"calendar.event.exrule,event",0,Event,Събитие,0
+field,"calendar.event.exrule,rec_name",0,Name,Име,0
+field,"calendar.event.rdate,calendar_date",0,Calendar Date,Дата от календар,0
+field,"calendar.event.rdate,event",0,Event,Събитие,0
+field,"calendar.event.rdate,rec_name",0,Name,Име,0
+field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,,0
+field,"calendar.event.rrule,event",0,Event,Събитие,0
+field,"calendar.event.rrule,rec_name",0,Name,Име,0
+field,"calendar.location,name",0,Name,Име,0
+field,"calendar.location,rec_name",0,Name,Име,0
+field,"calendar.rrule,byday",0,By Day,По ден,0
+field,"calendar.rrule,byhour",0,By Hour,По час,0
+field,"calendar.rrule,byminute",0,By Minute,По минута,0
+field,"calendar.rrule,bymonth",0,By Month,По месец,0
+field,"calendar.rrule,bymonthday",0,By Month Day,По ден от месеца,0
+field,"calendar.rrule,bysecond",0,By Second,По секунда,0
+field,"calendar.rrule,bysetpos",0,By Position,По позиция,0
+field,"calendar.rrule,byweekno",0,By Week Number,По номер на седмицата,0
+field,"calendar.rrule,byyearday",0,By Year Day,По ден от годината,0
+field,"calendar.rrule,count",0,Count,Брой,0
+field,"calendar.rrule,freq",0,Frequency,Честота,0
+field,"calendar.rrule,interval",0,Interval,Интервал,0
+field,"calendar.rrule,rec_name",0,Name,Име,0
+field,"calendar.rrule,until",0,Until Date,До дата,0
+field,"calendar.rrule,until_date",0,Is Date,Е дата,0
+field,"calendar.rrule,wkst",0,Week Day,Ден от седмица,0
+field,"res.user,calendars",0,Calendars,Календари,0
+help,"calendar.calendar,owner",0,The user must have an email,Потребителя трябва да има email,0
+help,"calendar.date,date",0,"Ignore time of field ""Date"", but handle as date only.","От полето ""Дата"" се игнорира часа и се използва само датата.",0
+help,"calendar.event,uuid",0,Universally Unique Identifier,Универсален иникален идентификатор,0
+help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","От полето ""До дата"" се игнорира часа и се използва само датата.",0
+model,"calendar.alarm,name",0,Alarm,Аларма,0
+model,"calendar.attendee,name",0,Attendee,Присъстващ,0
+model,"calendar.calendar,name",0,Calendar,Календар,0
+model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,,0
+model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,,0
+model,"calendar.category,name",0,Category,Категория,0
+model,"calendar.date,name",0,Calendar Date,Дата от календар,0
+model,"calendar.event,name",0,Event,Събитие,0
+model,"calendar.event-calendar.category,name",0,Event - Category,Събитие - категория,0
+model,"calendar.event.alarm,name",0,Alarm,Аларма,0
+model,"calendar.event.attendee,name",0,Attendee,Присъстващ,0
+model,"calendar.event.exdate,name",0,Exception Date,Дата на грешка,0
+model,"calendar.event.exrule,name",0,Exception Rule,Правило при грешка,0
+model,"calendar.event.rdate,name",0,Recurrence Date,Повтаряща се дата,0
+model,"calendar.event.rrule,name",0,Recurrence Rule,Правило за повторение,0
+model,"calendar.location,name",0,Location,Местоположение,0
+model,"calendar.rrule,name",0,Recurrence Rule,Правило за повторение,0
+model,"ir.action,name",act_calendar_form,Calendars,Календари,0
+model,"ir.action,name",act_calendar_form2,Calendars,Календари,0
+model,"ir.action,name",act_event_form,Events,Събития,0
+model,"ir.action,name",act_event_form2,Events,Събития,0
+model,"ir.action,name",act_event_form3,Events,Събития,0
+model,"ir.ui.menu,name",menu_calendar,Calendar Management,Управление на календари,0
+model,"ir.ui.menu,name",menu_calendar_form,Calendars,Календари,0
+model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Нов календар,0
+model,"ir.ui.menu,name",menu_event_form,Events,Събития,0
+model,"ir.ui.menu,name",menu_event_form2,New Event,Ново събитие,0
+model,"res.group,name",group_calendar_admin,Calendar Administration,Управление на календар,0
+selection,"calendar.attendee,status",0,,,0
+selection,"calendar.attendee,status",0,Accepted,Приет,0
+selection,"calendar.attendee,status",0,Declined,Отхвърлен,0
+selection,"calendar.attendee,status",0,Delegated,Делегиран,0
+selection,"calendar.attendee,status",0,Needs Action,Необходимо е действие,0
+selection,"calendar.attendee,status",0,Tentative,Пробен,0
+selection,"calendar.event,classification",0,Confidential,Поверителен,0
+selection,"calendar.event,classification",0,Private,Частен,0
+selection,"calendar.event,classification",0,Public,Публичен,0
+selection,"calendar.event,status",0,,,0
+selection,"calendar.event,status",0,Cancelled,Отказан,0
+selection,"calendar.event,status",0,Confirmed,Потвърден,0
+selection,"calendar.event,status",0,Tentative,Пробен,0
+selection,"calendar.event,transp",0,Opaque,Непрозрачен,0
+selection,"calendar.event,transp",0,Transparent,Прозрачен,0
+selection,"calendar.rrule,freq",0,Daily,Ежедневно,0
+selection,"calendar.rrule,freq",0,Hourly,Ежечасно,0
+selection,"calendar.rrule,freq",0,Minutely,Ежеминутно,0
+selection,"calendar.rrule,freq",0,Monthly,Месечно,0
+selection,"calendar.rrule,freq",0,Secondly,Всяка секунда,0
+selection,"calendar.rrule,freq",0,Weekly,Седмично,0
+selection,"calendar.rrule,freq",0,Yearly,Годишно,0
+selection,"calendar.rrule,wkst",0,Friday,Петък,0
+selection,"calendar.rrule,wkst",0,Monday,Понеделник,0
+selection,"calendar.rrule,wkst",0,Saturday,Събота,0
+selection,"calendar.rrule,wkst",0,Sunday,Неделя,0
+selection,"calendar.rrule,wkst",0,Thursday,Четвъртък,0
+selection,"calendar.rrule,wkst",0,Tuesday,Вторник,0
+selection,"calendar.rrule,wkst",0,Wednesday,Четвъртък,0
+view,calendar.calendar,0,Calendar,Календар,0
+view,calendar.calendar,0,Calendars,Календари,0
+view,calendar.calendar,0,General,Основен,0
+view,calendar.calendar,0,Security,Сигурност,0
+view,calendar.category,0,Categories,Категории,0
+view,calendar.category,0,Category,Категория,0
+view,calendar.event,0,Attendees,Присъстващи,0
+view,calendar.event,0,Categories,Категории,0
+view,calendar.event,0,Event,Събитие,0
+view,calendar.event,0,Events,Събития,0
+view,calendar.event,0,General,Основен,0
+view,calendar.event,0,Occurences,Събития,0
+view,calendar.event.attendee,0,Attendee,Присъстващ,0
+view,calendar.event.attendee,0,Attendees,Присъстващи,0
+view,calendar.event.exdate,0,Exception Date,Дата на грешка,0
+view,calendar.event.exdate,0,Exception Dates,Дати на грешките,0
+view,calendar.event.exrule,0,Exception Rule,Правило при грешка,0
+view,calendar.event.exrule,0,Exception Rules,Правила при грешка,0
+view,calendar.event.rdate,0,Recurrence Date,Повтаряща се дата,0
+view,calendar.event.rdate,0,Recurrence Dates,Дати на повторяемост,0
+view,calendar.event.rrule,0,Recurrence Rule,Правило за повторение,0
+view,calendar.event.rrule,0,Recurrence Rules,Правила за повторяемост,0
+view,calendar.location,0,Location,Местоположение,0
+view,calendar.location,0,Locations,Местонахождения,0
diff --git a/calendar.xml b/calendar.xml
index 475994b..c668799 100644
--- a/calendar.xml
+++ b/calendar.xml
@@ -57,7 +57,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_calendar_form">
<field name="name">Calendars</field>
<field name="res_model">calendar.calendar</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view" id="act_calendar_form_view1">
<field name="sequence" eval="10"/>
@@ -74,7 +73,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_calendar_form2">
<field name="name">Calendars</field>
<field name="res_model">calendar.calendar</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view" id="act_calendar_form2_view1">
<field name="sequence" eval="10"/>
@@ -267,7 +265,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_event_form">
<field name="name">Events</field>
<field name="res_model">calendar.event</field>
- <field name="view_type">form</field>
<field name="domain">[('parent', '=', False)]</field>
</record>
<record model="ir.action.act_window.view" id="act_event_form_view1">
@@ -285,7 +282,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_event_form2">
<field name="name">Events</field>
<field name="res_model">calendar.event</field>
- <field name="view_type">form</field>
<field name="domain">[('parent', '=', False)]</field>
</record>
<record model="ir.action.act_window.view" id="act_event_form2_view1">
@@ -304,7 +300,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_event_form3">
<field name="name">Events</field>
<field name="res_model">calendar.event</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_event_form3_view1">
diff --git a/ru_RU.csv b/ru_RU.csv
new file mode 100644
index 0000000..5a6e85f
--- /dev/null
+++ b/ru_RU.csv
@@ -0,0 +1,202 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.calendar,0,A user can have only one calendar!,Пользователь может иметь только Один календарь!,0
+error,calendar.calendar,0,The name of calendar must be unique!,Имя календаря должно быть уникально,0
+error,calendar.category,0,The name of calendar category must be unique!,,0
+error,calendar.event,0,Recurrence can not be recurrent!,,0
+error,calendar.event,0,UUID and recurrence must be unique in a calendar!,,0
+error,calendar.location,0,The name of calendar location must be unique!,,0
+error,calendar.rrule,0,"Invalid ""By Day""","Неверное поле ""По дням""",0
+error,calendar.rrule,0,"Invalid ""By Hour""","Неверное поле ""По часам""",0
+error,calendar.rrule,0,"Invalid ""By Minute""","Неверное поле ""По минутам""",0
+error,calendar.rrule,0,"Invalid ""By Month Day""","Неверное поле ""По дням месяца""",0
+error,calendar.rrule,0,"Invalid ""By Month""","Неверное поле ""По месяцам""",0
+error,calendar.rrule,0,"Invalid ""By Position""","Неверное поле ""По позиции""",0
+error,calendar.rrule,0,"Invalid ""By Second""","Неверное поле ""По секундам""",0
+error,calendar.rrule,0,"Invalid ""By Week Number""","Неверное поле ""По номерам недель""",0
+error,calendar.rrule,0,"Invalid ""By Year Day""","Неверный ""По дням года""",0
+error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!",,0
+field,"calendar.alarm,rec_name",0,Name,Наименование,0
+field,"calendar.alarm,valarm",0,valarm,,0
+field,"calendar.attendee,attendee",0,attendee,участник,0
+field,"calendar.attendee,email",0,Email,Эл.почта,0
+field,"calendar.attendee,rec_name",0,Name,Наименование,0
+field,"calendar.attendee,status",0,Participation Status,Статус участия,0
+field,"calendar.calendar,description",0,Description,Описание,0
+field,"calendar.calendar,name",0,Name,Наименование,0
+field,"calendar.calendar,owner",0,Owner,Владелец,0
+field,"calendar.calendar,read_users",0,Read Users,Пользователи могут читать,0
+field,"calendar.calendar,rec_name",0,Name,Наименование,0
+field,"calendar.calendar,write_users",0,Write Users,Пользователи могут писать,0
+field,"calendar.calendar-read-res.user,calendar",0,Calendar,Календар,0
+field,"calendar.calendar-read-res.user,rec_name",0,Name,Наименование,0
+field,"calendar.calendar-read-res.user,user",0,User,Пользователь,0
+field,"calendar.calendar-write-res.user,calendar",0,Calendar,Календарь,0
+field,"calendar.calendar-write-res.user,rec_name",0,Name,Наименование,0
+field,"calendar.calendar-write-res.user,user",0,User,Пользователь,0
+field,"calendar.category,name",0,Name,Наименование,0
+field,"calendar.category,rec_name",0,Name,Наименование,0
+field,"calendar.date,date",0,Is Date,Весь день,0
+field,"calendar.date,datetime",0,Date,Дата,0
+field,"calendar.date,rec_name",0,Name,Наименование,0
+field,"calendar.event,alarms",0,Alarms,Вызовы,0
+field,"calendar.event,all_day",0,All Day,Все дни,0
+field,"calendar.event,attendees",0,Attendees,Участники,0
+field,"calendar.event,calendar",0,Calendar,Календарь,0
+field,"calendar.event,calendar_owner",0,Owner,Владелец,0
+field,"calendar.event,calendar_read_users",0,Read Users,Пользователи могут читать,0
+field,"calendar.event,calendar_write_users",0,Write Users,Пользователи могут писать,0
+field,"calendar.event,categories",0,Categories,Категория,0
+field,"calendar.event,classification",0,Classification,Классификация,0
+field,"calendar.event,classification_public",0,Classification Public,Классификация общая,0
+field,"calendar.event,description",0,Description,Описание,0
+field,"calendar.event,dtend",0,End Date,Дата окончания,0
+field,"calendar.event,dtstart",0,Start Date,Дата начала,0
+field,"calendar.event,exdates",0,Exception Dates,Дата исключения,0
+field,"calendar.event,exrules",0,Exception Rules,Правила исключения,0
+field,"calendar.event,location",0,Location,Местоположение,0
+field,"calendar.event,occurences",0,Occurences,Дополнительные задачи,0
+field,"calendar.event,organizer",0,Organizer,Организатор,0
+field,"calendar.event,parent",0,Parent,Основной,0
+field,"calendar.event,rdates",0,Recurrence Dates,Даты повторения,0
+field,"calendar.event,rec_name",0,Name,Наименование,0
+field,"calendar.event,recurrence",0,Recurrence,Повторение,0
+field,"calendar.event,rrules",0,Recurrence Rules,Правила повторения,0
+field,"calendar.event,sequence",0,Sequence,Последовательность,0
+field,"calendar.event,status",0,Status,Состояние,0
+field,"calendar.event,summary",0,Summary,Резюме,0
+field,"calendar.event,timezone",0,Timezone,Зона времени,0
+field,"calendar.event,transp",0,Time Transparency,Время Прозрачность,0
+field,"calendar.event,uuid",0,UUID,,0
+field,"calendar.event,vevent",0,vevent,,0
+field,"calendar.event-calendar.category,category",0,Category,Категории,0
+field,"calendar.event-calendar.category,event",0,Event,Событие,0
+field,"calendar.event-calendar.category,rec_name",0,Name,Наименование,0
+field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Сигнала календаря,0
+field,"calendar.event.alarm,event",0,Event,Событие,0
+field,"calendar.event.alarm,rec_name",0,Name,Наименование,0
+field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Календарь участников,0
+field,"calendar.event.attendee,event",0,Event,Событие,0
+field,"calendar.event.attendee,rec_name",0,Name,Наименование,0
+field,"calendar.event.exdate,calendar_date",0,Calendar Date,День календаря,0
+field,"calendar.event.exdate,calendar_rdate",0,Calendar RDate,День календаря,0
+field,"calendar.event.exdate,event",0,Event,Событие,0
+field,"calendar.event.exdate,rec_name",0,Name,Наименование,0
+field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Правила календаря,0
+field,"calendar.event.exrule,event",0,Event,Событие,0
+field,"calendar.event.exrule,rec_name",0,Name,Наименование,0
+field,"calendar.event.rdate,calendar_date",0,Calendar Date,День календаря,0
+field,"calendar.event.rdate,calendar_rdate",0,Calendar RDate,День календаря,0
+field,"calendar.event.rdate,event",0,Event,Событие,0
+field,"calendar.event.rdate,rec_name",0,Name,Наименование,0
+field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Правила календаря,0
+field,"calendar.event.rrule,event",0,Event,Событие,0
+field,"calendar.event.rrule,rec_name",0,Name,Наименование,0
+field,"calendar.location,name",0,Name,Наименование,0
+field,"calendar.location,rec_name",0,Name,Наименование,0
+field,"calendar.rdate,date",0,Is Date,Весь день,0
+field,"calendar.rdate,datetime",0,Date,Дата,0
+field,"calendar.rdate,rec_name",0,Name,Наименование,0
+field,"calendar.rrule,byday",0,By Day,По дням,0
+field,"calendar.rrule,byhour",0,By Hour,По часам,0
+field,"calendar.rrule,byminute",0,By Minute,По минутам,0
+field,"calendar.rrule,bymonth",0,By Month,По месячно,0
+field,"calendar.rrule,bymonthday",0,By Month Day,По дням месяца,0
+field,"calendar.rrule,bysecond",0,By Second,По секундам,0
+field,"calendar.rrule,bysetpos",0,By Position,По позиции,0
+field,"calendar.rrule,byweekno",0,By Week Number,По номерам недель,0
+field,"calendar.rrule,byyearday",0,By Year Day,По дням года,0
+field,"calendar.rrule,count",0,Count,Количество,0
+field,"calendar.rrule,freq",0,Frequency,Частота,0
+field,"calendar.rrule,interval",0,Interval,Внутренний,0
+field,"calendar.rrule,rec_name",0,Name,Наименование,0
+field,"calendar.rrule,until",0,Until Date,До даты,0
+field,"calendar.rrule,until_date",0,Is Date,Весь день,0
+field,"calendar.rrule,wkst",0,Week Day,День недели,0
+field,"res.user,calendars",0,Calendars,Календари,0
+help,"calendar.calendar,owner",0,The user must have an email,,0
+help,"calendar.date,date",0,"Ignore time of field ""Date"", but handle as date only.","Время игнорируется в поле ""Дата"", действует только дата",0
+help,"calendar.event,uuid",0,Universally Unique Identifier,Универсальный уникальный идентификатор,0
+help,"calendar.rdate,date",0,"Ignore time of field ""Date"", but handle as date only.","Время игнорируется в поле ""Дата"", действует только дата",0
+help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","Время игнорируется в поле ""До даты"", действует только дата",0
+model,"calendar.alarm,name",0,Alarm,Вызов,0
+model,"calendar.attendee,name",0,Attendee,Участник,0
+model,"calendar.calendar,name",0,Calendar,Календарь,0
+model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Пользователи могут читать,0
+model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Пользователи могут писать,0
+model,"calendar.category,name",0,Category,Категории,0
+model,"calendar.date,name",0,Calendar Date,День календаря,0
+model,"calendar.event,name",0,Event,Событие,0
+model,"calendar.event-calendar.category,name",0,Event - Category,Категории - События,0
+model,"calendar.event.alarm,name",0,Alarm,Вызов,0
+model,"calendar.event.attendee,name",0,Attendee,Участник,0
+model,"calendar.event.exdate,name",0,Exception Date,Дата исключения,0
+model,"calendar.event.exrule,name",0,Exception Rule,Правило исключения,0
+model,"calendar.event.rdate,name",0,Recurrence Date,Даты повторения,0
+model,"calendar.event.rrule,name",0,Recurrence Rule,Правила повторения,0
+model,"calendar.location,name",0,Location,Местоположение,0
+model,"calendar.rdate,name",0,Recurrence Date,Даты повторения,0
+model,"calendar.rrule,name",0,Recurrence Rule,Правила повторения,0
+model,"ir.action,name",act_calendar_form,Calendars,Календари,0
+model,"ir.action,name",act_calendar_form2,Calendars,Календари,0
+model,"ir.action,name",act_event_form,Events,,0
+model,"ir.action,name",act_event_form2,Events,,0
+model,"ir.action,name",act_event_form3,Events,,0
+model,"ir.ui.menu,name",menu_calendar,Calendar Management,Календари,0
+model,"ir.ui.menu,name",menu_calendar_form,Calendars,Календари,0
+model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Новый календарь,0
+model,"ir.ui.menu,name",menu_event_form,Events,События,0
+model,"ir.ui.menu,name",menu_event_form2,New Event,Новое событие,0
+model,"res.group,name",group_calendar_admin,Calendar Administration,Управление календарем,0
+selection,"calendar.attendee,status",0,,,0
+selection,"calendar.attendee,status",0,Accepted,Подтверждено,0
+selection,"calendar.attendee,status",0,Declined,Отклонено,0
+selection,"calendar.attendee,status",0,Delegated,Делегировано,0
+selection,"calendar.attendee,status",0,Needs Action,Требуется действие,0
+selection,"calendar.attendee,status",0,Tentative,Предварительный,0
+selection,"calendar.event,classification",0,Confidential,Конфиденциальное,0
+selection,"calendar.event,classification",0,Private,Личное,0
+selection,"calendar.event,classification",0,Public,Публичное,0
+selection,"calendar.event,status",0,,,0
+selection,"calendar.event,status",0,Cancelled,Отмененно,0
+selection,"calendar.event,status",0,Confirmed,Подтвержденно,0
+selection,"calendar.event,status",0,Tentative,Предварительный,0
+selection,"calendar.event,transp",0,Opaque,Непрозрачный,0
+selection,"calendar.event,transp",0,Transparent,Прозрачный,0
+selection,"calendar.rrule,freq",0,Daily,Ежедневный,0
+selection,"calendar.rrule,freq",0,Hourly,Ежечасный,0
+selection,"calendar.rrule,freq",0,Minutely,Ежеминутно,0
+selection,"calendar.rrule,freq",0,Monthly,Ежемесячно,0
+selection,"calendar.rrule,freq",0,Secondly,Ежесекудно,0
+selection,"calendar.rrule,freq",0,Weekly,Еженедельно,0
+selection,"calendar.rrule,freq",0,Yearly,Ежегодно,0
+selection,"calendar.rrule,wkst",0,Friday,Пятница,0
+selection,"calendar.rrule,wkst",0,Monday,Понедельник,0
+selection,"calendar.rrule,wkst",0,Saturday,Суббота,0
+selection,"calendar.rrule,wkst",0,Sunday,Воскресенье,0
+selection,"calendar.rrule,wkst",0,Thursday,Четверг,0
+selection,"calendar.rrule,wkst",0,Tuesday,Вторник,0
+selection,"calendar.rrule,wkst",0,Wednesday,Среда,0
+view,calendar.calendar,0,Calendar,Календарь,0
+view,calendar.calendar,0,Calendars,Календари,0
+view,calendar.calendar,0,General,Основной,0
+view,calendar.calendar,0,Security,Доступ,0
+view,calendar.category,0,Categories,Категория,0
+view,calendar.category,0,Category,Категории,0
+view,calendar.event,0,Attendees,Участники,0
+view,calendar.event,0,Categories,Категория,0
+view,calendar.event,0,Event,Событие,0
+view,calendar.event,0,Events,События,0
+view,calendar.event,0,General,Основной,0
+view,calendar.event,0,Occurences,Повторение,0
+view,calendar.event.attendee,0,Attendee,Участник,0
+view,calendar.event.attendee,0,Attendees,Участники,0
+view,calendar.event.exdate,0,Exception Date,Дата исключения,0
+view,calendar.event.exdate,0,Exception Dates,Дата исключения,0
+view,calendar.event.exrule,0,Exception Rule,Правило исключения,0
+view,calendar.event.exrule,0,Exception Rules,Правила исключения,0
+view,calendar.event.rdate,0,Recurrence Date,Даты повторения,0
+view,calendar.event.rdate,0,Recurrence Dates,Даты повторения,0
+view,calendar.event.rrule,0,Recurrence Rule,Правила повторения,0
+view,calendar.event.rrule,0,Recurrence Rules,Правила повторения,0
+view,calendar.location,0,Location,Местоположение,0
+view,calendar.location,0,Locations,Местоположения,0
diff --git a/setup.py b/setup.py
index 461d886..50e3711 100644
--- a/setup.py
+++ b/setup.py
@@ -44,12 +44,16 @@ setup(name='trytond_calendar',
'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/tests/__init__.pyc b/tests/__init__.pyc
new file mode 100644
index 0000000..b370054
Binary files /dev/null and b/tests/__init__.pyc differ
diff --git a/tests/test_calendar.pyc b/tests/test_calendar.pyc
new file mode 100644
index 0000000..02dbc50
Binary files /dev/null and b/tests/test_calendar.pyc differ
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index e6c9d58..3a458b7 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.0
Name: trytond-calendar
-Version: 1.8.1
+Version: 2.0.0
Summary: Add CalDAV support
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.egg-info/SOURCES.txt b/trytond_calendar.egg-info/SOURCES.txt
index ec48332..de3adb7 100644
--- a/trytond_calendar.egg-info/SOURCES.txt
+++ b/trytond_calendar.egg-info/SOURCES.txt
@@ -4,11 +4,13 @@ INSTALL
LICENSE
MANIFEST.in
README
+bg_BG.csv
calendar.xml
de_DE.csv
es_CO.csv
es_ES.csv
fr_FR.csv
+ru_RU.csv
setup.py
./__init__.py
./__tryton__.py
@@ -18,6 +20,10 @@ setup.py
./webdav.py
./tests/__init__.py
./tests/test_calendar.py
+tests/__init__.py
+tests/__init__.pyc
+tests/test_calendar.py
+tests/test_calendar.pyc
trytond_calendar.egg-info/PKG-INFO
trytond_calendar.egg-info/SOURCES.txt
trytond_calendar.egg-info/dependency_links.txt
diff --git a/trytond_calendar.egg-info/requires.txt b/trytond_calendar.egg-info/requires.txt
index 707195e..ccd0e32 100644
--- a/trytond_calendar.egg-info/requires.txt
+++ b/trytond_calendar.egg-info/requires.txt
@@ -2,4 +2,4 @@ vobject >= 0.8.0
PyWebDAV >= 0.9.3
python-dateutil
pytz
-trytond >= 1.8, < 1.9
\ No newline at end of file
+trytond >= 2.0, < 2.1
\ No newline at end of file
commit b31be2a30f4e71d9ce74434a93902c434f6dd98e
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Feb 15 11:46:12 2011 +0100
Adding upstream version 1.8.1.
diff --git a/CHANGELOG b/CHANGELOG
index cda8551..4869665 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 1.8.1 - 2011-02-13
+* 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 1419342..c5e22a2 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond_calendar
-Version: 1.8.0
+Version: 1.8.1
Summary: Add CalDAV support
Home-page: http://www.tryton.org/
Author: B2CK
diff --git a/__tryton__.py b/__tryton__.py
index 615a3e5..07b6402 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
'name_es_CO' : 'Calendario',
'name_es_ES' : 'Calendario',
'name_fr_FR' : 'Calendrier',
- 'version' : '1.8.0',
+ 'version' : '1.8.1',
'author' : 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
diff --git a/tests/__init__.pyc b/tests/__init__.pyc
deleted file mode 100644
index b370054..0000000
Binary files a/tests/__init__.pyc and /dev/null differ
diff --git a/tests/test_calendar.pyc b/tests/test_calendar.pyc
deleted file mode 100644
index 02dbc50..0000000
Binary files a/tests/test_calendar.pyc and /dev/null differ
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index 4b0bad5..e6c9d58 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond-calendar
-Version: 1.8.0
+Version: 1.8.1
Summary: Add CalDAV support
Home-page: http://www.tryton.org/
Author: B2CK
diff --git a/trytond_calendar.egg-info/SOURCES.txt b/trytond_calendar.egg-info/SOURCES.txt
index 86154dc..ec48332 100644
--- a/trytond_calendar.egg-info/SOURCES.txt
+++ b/trytond_calendar.egg-info/SOURCES.txt
@@ -18,10 +18,6 @@ setup.py
./webdav.py
./tests/__init__.py
./tests/test_calendar.py
-tests/__init__.py
-tests/__init__.pyc
-tests/test_calendar.py
-tests/test_calendar.pyc
trytond_calendar.egg-info/PKG-INFO
trytond_calendar.egg-info/SOURCES.txt
trytond_calendar.egg-info/dependency_links.txt
diff --git a/webdav.py b/webdav.py
index a086807..62b7e0b 100644
--- a/webdav.py
+++ b/webdav.py
@@ -581,6 +581,7 @@ class Collection(ModelSQL, ModelView):
calendar_id = self.calendar(uri)
if calendar_id:
calendar = calendar_obj.browse(calendar_id)
+ user = Transaction().user
if user == calendar.owner.id:
return ['create', 'read', 'write', 'delete']
res = []
commit e6f9511ad2ec4941b9d2f9fe6c995f7129e64d2e
Author: Daniel Baumann <daniel at debian.org>
Date: Thu Nov 4 20:12:11 2010 +0100
Adding upstream version 1.8.0.
diff --git a/CHANGELOG b/CHANGELOG
index ecc0320..cda8551 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-09
* Bug fixes (see mercurial logs for details)
* Remove classification_public
diff --git a/MANIFEST.in b/MANIFEST.in
index c61b52d..5343ad8 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -7,4 +7,3 @@ include LICENSE
include *.xml
include *.odt
include *.csv
-include tests/*
diff --git a/PKG-INFO b/PKG-INFO
index df6d2d5..1419342 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.0
Name: trytond_calendar
-Version: 1.6.0
+Version: 1.8.0
Summary: Add CalDAV support
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 57872dc..615a3e5 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
'name_es_CO' : 'Calendario',
'name_es_ES' : 'Calendario',
'name_fr_FR' : 'Calendrier',
- 'version' : '1.6.0',
+ 'version' : '1.8.0',
'author' : 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
diff --git a/caldav.py b/caldav.py
index ed10a27..4b6d56a 100644
--- a/caldav.py
+++ b/caldav.py
@@ -1,18 +1,19 @@
#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
-
+import urlparse
+import urllib
+from string import atoi
+import xml.dom.minidom
from DAV import propfind
from DAV.errors import *
from DAV.utils import get_uriparentpath
from DAV.constants import DAV_VERSION_1, DAV_VERSION_2
-from trytond.protocols.webdav import TrytonDAVInterface, USER_ID, CACHE, \
- DATABASE, WebDAVAuthRequestHandler
+from trytond.protocols.webdav import TrytonDAVInterface, CACHE, \
+ WebDAVAuthRequestHandler
from trytond.pool import Pool
-import urlparse
-import urllib
-from string import atoi
-import xml.dom.minidom
+from trytond.transaction import Transaction
+
+_TRYTON_RELOAD = False
domimpl = xml.dom.minidom.getDOMImplementation()
TrytonDAVInterface.PROPS['urn:ietf:params:xml:ns:caldav'] = (
@@ -55,15 +56,13 @@ def _get_caldav_calendar_description(self, uri):
dbname, dburi = self._get_dburi(uri)
if not dbname:
raise DAV_NotFound
- cursor = DATABASE['cursor']
- pool = Pool(DATABASE['dbname'])
+ pool = Pool(Transaction().cursor.database_name)
try:
collection_obj = pool.get('webdav.collection')
except KeyError:
raise DAV_NotFound
try:
- res = collection_obj.get_calendar_description(cursor, int(USER_ID), dburi,
- cache=CACHE)
+ res = collection_obj.get_calendar_description(dburi, cache=CACHE)
except AttributeError:
raise DAV_NotFound
except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
@@ -80,15 +79,13 @@ def _get_caldav_calendar_data(self, uri):
dbname, dburi = self._get_dburi(uri)
if not dbname:
raise DAV_NotFound
- cursor = DATABASE['cursor']
- pool = Pool(DATABASE['dbname'])
+ pool = Pool(Transaction().cursor.database_name)
try:
collection_obj = pool.get('webdav.collection')
except KeyError:
raise DAV_NotFound
try:
- res = collection_obj.get_calendar_data(cursor, int(USER_ID), dburi,
- cache=CACHE)
+ res = collection_obj.get_calendar_data(dburi, cache=CACHE)
except AttributeError:
raise DAV_NotFound
except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
@@ -105,15 +102,13 @@ def _get_caldav_calendar_home_set(self, uri):
dbname, dburi = self._get_dburi(uri)
if not dbname:
raise DAV_NotFound
- cursor = DATABASE['cursor']
- pool = Pool(DATABASE['dbname'])
+ pool = Pool(Transaction().cursor.database_name)
try:
collection_obj = pool.get('webdav.collection')
except KeyError:
raise DAV_NotFound
try:
- res = collection_obj.get_calendar_home_set(cursor, int(USER_ID), dburi,
- cache=CACHE)
+ res = collection_obj.get_calendar_home_set(dburi, cache=CACHE)
except AttributeError:
raise DAV_NotFound
except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
@@ -139,15 +134,13 @@ def _get_caldav_calendar_user_address_set(self, uri):
dbname, dburi = self._get_dburi(uri)
if not dbname:
raise DAV_NotFound
- cursor = DATABASE['cursor']
- pool = Pool(DATABASE['dbname'])
+ pool = Pool(Transaction().cursor.database_name)
try:
collection_obj = pool.get('webdav.collection')
except KeyError:
raise DAV_NotFound
try:
- res = collection_obj.get_calendar_user_address_set(cursor,
- int(USER_ID), dburi, cache=CACHE)
+ res = collection_obj.get_calendar_user_address_set(dburi, cache=CACHE)
except AttributeError:
raise DAV_NotFound
except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
@@ -169,15 +162,13 @@ def _get_caldav_schedule_inbox_URL(self, uri):
dbname, dburi = self._get_dburi(uri)
if not dbname:
raise DAV_NotFound
- cursor = DATABASE['cursor']
- pool = Pool(DATABASE['dbname'])
+ pool = Pool(Transaction().cursor.database_name)
try:
collection_obj = pool.get('webdav.collection')
except KeyError:
raise DAV_NotFound
try:
- res = collection_obj.get_schedule_inbox_URL(cursor, int(USER_ID), dburi,
- cache=CACHE)
+ res = collection_obj.get_schedule_inbox_URL(dburi, cache=CACHE)
except AttributeError:
raise DAV_NotFound
except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
@@ -201,15 +192,13 @@ def _get_caldav_schedule_outbox_URL(self, uri):
dbname, dburi = self._get_dburi(uri)
if not dbname:
raise DAV_NotFound
- cursor = DATABASE['cursor']
- pool = Pool(DATABASE['dbname'])
+ pool = Pool(Transaction().cursor.database_name)
try:
collection_obj = pool.get('webdav.collection')
except KeyError:
raise DAV_NotFound
try:
- res = collection_obj.get_schedule_outbox_URL(cursor, int(USER_ID), dburi,
- cache=CACHE)
+ res = collection_obj.get_schedule_outbox_URL(dburi, cache=CACHE)
except AttributeError:
raise DAV_NotFound
except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
@@ -254,11 +243,10 @@ def _get_caldav_post(self, uri, body, contenttype=''):
dbname, dburi = self._get_dburi(uri)
if not dbname:
raise DAV_Forbidden
- cursor = DATABASE['cursor']
- pool = Pool(DATABASE['dbname'])
+ pool = Pool(Transaction().cursor.database_name)
calendar_obj = pool.get('calendar.calendar')
try:
- res = calendar_obj.post(cursor, int(USER_ID), dburi, body)
+ res = calendar_obj.post(dburi, body)
except AttributeError:
raise DAV_NotFound
except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
diff --git a/calendar.py b/calendar.py
index be0c723..d5204e8 100644
--- a/calendar.py
+++ b/calendar.py
@@ -1,17 +1,20 @@
#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.backend import TableHandler
-from trytond.pyson import If, Bool, Not, Eval, Greater
+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 If, Bool, Not, Eval, Greater
+from trytond.transaction import Transaction
+from trytond.cache import Cache
+tzlocal = dateutil.tz.tzlocal()
+tzutc = dateutil.tz.tzutc()
domimpl = xml.dom.minidom.getDOMImplementation()
@@ -43,86 +46,74 @@ class Calendar(ModelSQL, ModelView):
('check_name', 'Calendar name can not end with .ics'),
]
- def create(self, cursor, user, vals, context=None):
- res = super(Calendar, self).create(cursor, user, vals, context=context)
+ def create(self, vals):
+ res = super(Calendar, self).create(vals)
# Restart the cache for get_name
- self.get_name(cursor.dbname)
+ self.get_name.reset()
return res
- def write(self, cursor, user, ids, vals, context=None):
- res = super(Calendar, self).write(cursor, user, ids, vals,
- context=context)
+ def write(self, ids, vals):
+ res = super(Calendar, self).write(ids, vals)
# Restart the cache for get_name
- self.get_name(cursor.dbname)
+ self.get_name.reset()
return res
- def delete(self, cursor, user, ids, context=None):
- res = super(Calendar, self).delete(cursor, user, ids, context=context)
+ def delete(self, ids):
+ res = super(Calendar, self).delete(ids)
# Restart the cache for calendar
- self.get_name(cursor.dbname)
+ self.get_name.reset()
return res
- def check_name(self, cursor, user, ids):
+ def check_name(self, ids):
'''
Check the name doesn't end with .ics
'''
- for calendar in self.browse(cursor, user, ids):
+ for calendar in self.browse(ids):
if calendar.name.endswith('.ics'):
return False
return True
@Cache('calendar_calendar.get_name')
- def get_name(self, cursor, user, name, context=None):
+ def get_name(self, name):
'''
Return the calendar id of the name
- :param cursor: the database cursor
- :param user: the user id
:param name: the calendar name
- :param context: the context
:return: the calendar.calendar id or False
'''
- calendar_ids = self.search(cursor, user, [
+ calendar_ids = self.search([
('name', '=', name),
- ], limit=1, context=context)
+ ], limit=1)
if calendar_ids:
return calendar_ids[0]
return False
- def calendar2ical(self, cursor, user, calendar_id, context=None):
+ def calendar2ical(self, calendar_id):
'''
Return an iCalendar object for the given calendar_id containing
all the vevent objects
- :param cursor: the database cursor
- :param user: the user id
:param calendar_id: an id of calendar.calendar
- :param context: the context
:return: an iCalendar
'''
event_obj = self.pool.get('calendar.event')
ical = vobject.iCalendar()
ical.vevent_list = []
- event_ids = event_obj.search(cursor, user, [
+ event_ids = event_obj.search([
('calendar', '=', calendar_id),
('parent', '=', False),
- ], context=context)
- for event in event_obj.browse(cursor, user, event_ids,
- context=context):
- ical2 = event_obj.event2ical(cursor, user, event.id,
- context=context)
+ ])
+ for event in event_obj.browse(event_ids):
+ ical2 = event_obj.event2ical(event.id)
ical.vevent_list.extend(ical2.vevent_list)
return ical
- def _fbtype(self, cursor, user, event, context=None):
+ def _fbtype(self, event):
'''
Return the freebusy type for give transparent and status
- :param cursor: the database cursor
- :param user: the user id
:param event: a BrowseRecord of calendar.event
- :param context: the context
:return: a freebusy type ('FREE', 'BUSY', 'BUSY-TENTATIVE')
'''
if event.transp == 'opaque':
@@ -138,17 +129,14 @@ class Calendar(ModelSQL, ModelView):
fbtype = 'FREE'
return fbtype
- def freebusy(self, cursor, user, calendar_id, dtstart, dtend, context=None):
+ def freebusy(self, calendar_id, dtstart, dtend):
'''
Return an iCalendar object for the given calendar_id with the
vfreebusy objects between the two dates
- :param cursor: the database cursor
- :param user: the user id
:param calendar_id: an id of calendar.calendar
:param dtstart: a date or datetime
:param dtend: a date of datetime
- :param context: the context
:return: an iCalendar
'''
event_obj = self.pool.get('calendar.event')
@@ -169,31 +157,32 @@ class Calendar(ModelSQL, ModelView):
else:
ical.vfreebusy.add('dtend').value = dtend.astimezone(tzutc)
- event_ids = event_obj.search(cursor, 0, [
- ['OR',
- [('dtstart', '<=', dtstart),
- ('dtend', '>=', dtstart)],
- [('dtstart', '<=', dtend),
- ('dtend', '>=', dtend)],
- [('dtstart', '>=', dtstart),
- ('dtend', '<=', dtend)],
- [('dtstart', '>=', dtstart),
- ('dtstart', '<=', dtend),
- ('dtend', '=', False)]],
- ('parent', '=', False),
- ('rdates', '=', False),
- ('rrules', '=', False),
- ('exdates', '=', False),
- ('exrules', '=', False),
- ('occurences', '=', False),
- ('calendar', '=', calendar_id),
- ], context=context)
-
- for event in event_obj.browse(cursor, 0, event_ids, context=context):
+ with Transaction().set_user(0):
+ event_ids = event_obj.search([
+ ['OR',
+ [('dtstart', '<=', dtstart),
+ ('dtend', '>=', dtstart)],
+ [('dtstart', '<=', dtend),
+ ('dtend', '>=', dtend)],
+ [('dtstart', '>=', dtstart),
+ ('dtend', '<=', dtend)],
+ [('dtstart', '>=', dtstart),
+ ('dtstart', '<=', dtend),
+ ('dtend', '=', False)]],
+ ('parent', '=', False),
+ ('rdates', '=', False),
+ ('rrules', '=', False),
+ ('exdates', '=', False),
+ ('exrules', '=', False),
+ ('occurences', '=', False),
+ ('calendar', '=', calendar_id),
+ ])
+ events = event_obj.browse(event_ids)
+
+ for event in events:
# Don't group freebusy as sunbird doesn't handle it
freebusy = ical.vfreebusy.add('freebusy')
- freebusy.fbtype_param = self._fbtype(cursor, user, event,
- context=context)
+ freebusy.fbtype_param = self._fbtype(event)
if event.dtstart.replace(tzinfo=tzlocal) >= dtstart:
freebusy_dtstart = event.dtstart.replace(tzinfo=tzlocal)
else:
@@ -206,21 +195,23 @@ class Calendar(ModelSQL, ModelView):
freebusy_dtstart.astimezone(tzutc),
freebusy_dtend.astimezone(tzutc))]
- event_ids = event_obj.search(cursor, 0, [
- ('parent', '=', False),
- ('dtstart', '<=', dtend),
- ['OR',
- ('rdates', '!=', False),
- ('rrules', '!=', False),
- ('exdates', '!=', False),
- ('exrules', '!=', False),
- ('occurences', '!=', False),
- ],
- ('calendar', '=', calendar_id),
- ], context=context)
- for event in event_obj.browse(cursor, 0, event_ids, context=context):
- event_ical = event_obj.event2ical(cursor, user, event,
- context=context)
+ with Transaction().set_user(0):
+ event_ids = event_obj.search([
+ ('parent', '=', False),
+ ('dtstart', '<=', dtend),
+ ['OR',
+ ('rdates', '!=', False),
+ ('rrules', '!=', False),
+ ('exdates', '!=', False),
+ ('exrules', '!=', False),
+ ('occurences', '!=', False),
+ ],
+ ('calendar', '=', calendar_id),
+ ])
+ events = event_obj.browse(event_ids)
+
+ for event in events:
+ event_ical = event_obj.event2ical(event)
if event_ical.vevent.rruleset:
between_dtstart, between_dtend = dtstart, dtend
if event.all_day:
@@ -242,8 +233,7 @@ class Calendar(ModelSQL, ModelView):
or (freebusy_dtstart.replace(tzinfo=tzlocal) >= dtstart
and freebusy_dtend.replace(tzinfo=tzlocal) <= dtend)):
continue
- freebusy_fbtype = self._fbtype(cursor, user, event,
- context=context)
+ freebusy_fbtype = self._fbtype(event)
all_day = event.all_day
for occurence in event.occurences:
if occurence.recurrence.replace(tzinfo=tzlocal) == \
@@ -255,8 +245,7 @@ class Calendar(ModelSQL, ModelView):
else:
freebusy_dtend = freebusy_dtstart
all_day = occurence.all_day
- freebusy_fbtype = self._fbtype(cursor, user,
- occurence, context=context)
+ freebusy_fbtype = self._fbtype(occurence)
break
freebusy = ical.vfreebusy.add('freebusy')
freebusy.fbtype_param = freebusy_fbtype
@@ -276,26 +265,21 @@ class Calendar(ModelSQL, ModelView):
freebusy_dtend.astimezone(tzutc))]
return ical
- def post(self, cursor, user, uri, data, context=None):
+ def post(self, uri, data):
'''
Handle post of vfreebusy request
- :param cursor: the database cursor
- :param user: the user id
:param uri: the posted uri
:param data: the posted data
- :param context: the context
:return: the xml with schedule-response
'''
from DAV.errors import DAV_Forbidden
collection_obj = self.pool.get('webdav.collection')
- calendar_id = collection_obj.calendar(cursor, user, uri,
- context=context)
+ calendar_id = collection_obj.calendar(uri)
if not calendar_id:
raise DAV_Forbidden
- calendar = self.browse(cursor, user, calendar_id,
- context=context)
+ calendar = self.browse(calendar_id)
if calendar.owner.id != user:
raise DAV_Forbidden
ical = vobject.readOne(data)
@@ -335,12 +319,12 @@ class Calendar(ModelSQL, ModelView):
email = attendee.value
if attendee.value.lower().startswith('mailto:'):
email = attendee.value[7:]
- calendar_ids = self.search(cursor, 0, [
- ('owner.email', '=', email),
- ], context=context)
+ with Transaction().set_user(0):
+ calendar_ids = self.search([
+ ('owner.email', '=', email),
+ ])
if calendar_ids:
- vfreebusy = self.freebusy(cursor, user, calendar_ids[0],
- dtstart, dtend, context=context)
+ vfreebusy = self.freebusy(calendar_ids[0], dtstart, dtend)
vfreebusy.vfreebusy.add('dtstamp').value = \
ical.vfreebusy.dtstamp.value
vfreebusy.vfreebusy.add('uid').value = \
@@ -522,45 +506,46 @@ class Event(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_calendar_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(Event, 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_calendar_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(Event, 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_transp(self, cursor, user, context=None):
+ def default_transp(self):
return 'opaque'
- 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 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 event in self.browse(cursor, user, ids, context=context):
+ for event in self.browse(ids):
name = name[9:]
if name in ('read_users', 'write_users'):
res[event.id] = [x.id for x in event.calendar[name]]
@@ -568,14 +553,14 @@ class Event(ModelSQL, ModelView):
res[event.id] = event.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 event in self.browse(cursor, user, ids):
+ for event in self.browse(ids):
if not event.parent:
continue
if event.rdates \
@@ -586,12 +571,12 @@ class Event(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(Event, self).create(cursor, user, values, context=context)
- event = self.browse(cursor, user, res, context=context)
+ res = super(Event, self).create(values)
+ event = self.browse(res)
if event.calendar.owner \
and (event.organizer == event.calendar.owner.email \
or (event.parent \
@@ -605,38 +590,38 @@ class Event(ModelSQL, ModelView):
if x.status != 'declined'
and x.email != event.parent.organizer]
if attendee_emails:
- calendar_ids = calendar_obj.search(cursor, 0, [
- ('owner.email', 'in', attendee_emails),
- ], context=context)
- if not event.recurrence:
- for calendar_id in calendar_ids:
- new_id = self.copy(cursor, 0, event.id, default={
- 'calendar': calendar_id,
- 'occurences': False,
- }, context=context)
- for occurence in event.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 event.recurrence:
+ for calendar_id in calendar_ids:
+ new_id = self.copy(event.id, default={
'calendar': calendar_id,
- 'parent': new_id,
- }, context=context)
- else:
- parent_ids = self.search(cursor, 0, [
- ('uuid', '=', event.uuid),
- ('calendar.owner.email', 'in', attendee_emails),
- ('id', '!=', event.id),
- ('recurrence', '=', False),
- ], context=context)
- for parent in self.browse(cursor, 0, parent_ids,
- context=context):
- self.copy(cursor, 0, event.id, default={
- 'calendar': parent.calendar.id,
- 'parent': parent.id,
- }, context=context)
+ 'occurences': False,
+ })
+ for occurence in event.occurences:
+ self.copy(occurence.id, default={
+ 'calendar': calendar_id,
+ 'parent': new_id,
+ })
+ else:
+ parent_ids = self.search([
+ ('uuid', '=', event.uuid),
+ ('calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', event.id),
+ ('recurrence', '=', False),
+ ])
+ for parent in self.browse(parent_ids):
+ self.copy(event.id, default={
+ 'calendar': parent.calendar.id,
+ 'parent': parent.id,
+ })
# Restart the cache for event
- collection_obj.event(cursor.dbname)
+ collection_obj.event.reset()
return res
- def _event2update(self, cursor, user, event, context=None):
+ def _event2update(self, event):
rdate_obj = self.pool.get('calendar.event.rdate')
exdate_obj = self.pool.get('calendar.event.exdate')
rrule_obj = self.pool.get('calendar.event.rrule')
@@ -653,32 +638,32 @@ class Event(ModelSQL, ModelView):
res['organizer'] = event.organizer
res['rdates'] = [('delete_all',)]
for rdate in event.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 event.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 event.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 event.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(Event, self).write(cursor, user, ids, values,
- context=context)
+ res = super(Event, self).write(ids, values)
if isinstance(ids, (int, long)):
ids = [ids]
@@ -690,7 +675,7 @@ class Event(ModelSQL, ModelView):
'SET sequence = sequence + 1 ' \
'WHERE ' + red_sql, red_ids)
- for event in self.browse(cursor, user, ids, context=context):
+ for event in self.browse(ids):
if event.calendar.owner \
and (event.organizer == event.calendar.owner.email \
or (event.parent \
@@ -704,57 +689,57 @@ class Event(ModelSQL, ModelView):
if x.status != 'declined'
and x.email != event.parent.organizer]
if attendee_emails:
- event_ids = self.search(cursor, 0, [
- ('uuid', '=', event.uuid),
- ('calendar.owner.email', 'in', attendee_emails),
- ('id', '!=', event.id),
- ('recurrence', '=', event.recurrence or False),
- ], context=context)
- for event2 in self.browse(cursor, user, event_ids,
- context=context):
- if event2.calendar.owner.email in attendee_emails:
- attendee_emails.remove(event2.calendar.owner.email)
- self.write(cursor, 0, event_ids, self._event2update(
- cursor, user, event, context=context), context=context)
- if attendee_emails:
- calendar_ids = calendar_obj.search(cursor, 0, [
- ('owner.email', 'in', attendee_emails),
- ], context=context)
- if not event.recurrence:
- for calendar_id in calendar_ids:
- new_id = self.copy(cursor, 0, event.id, default={
- 'calendar': calendar_id,
- 'occurences': False,
- }, context=context)
- for occurence in event.occurences:
- self.copy(cursor, 0, occurence.id, default={
- 'calendar': calendar_id,
- 'parent': new_id,
- }, context=context)
- else:
- parent_ids = self.search(cursor, 0, [
+ with Transaction().set_user(0):
+ event_ids = self.search([
('uuid', '=', event.uuid),
('calendar.owner.email', 'in', attendee_emails),
('id', '!=', event.id),
- ('recurrence', '=', False),
- ], context=context)
- for parent in self.browse(cursor, 0, parent_ids,
- context=context):
- self.copy(cursor, 0, event.id, default={
- 'calendar': parent.calendar.id,
- 'parent': parent.id,
- }, context=context)
+ ('recurrence', '=', event.recurrence or False),
+ ])
+ for event2 in self.browse(event_ids):
+ if event2.calendar.owner.email in attendee_emails:
+ attendee_emails.remove(
+ event2.calendar.owner.email)
+ self.write(event_ids, self._event2update(event))
+ if attendee_emails:
+ with Transaction().set_user(0):
+ calendar_ids = calendar_obj.search([
+ ('owner.email', 'in', attendee_emails),
+ ])
+ if not event.recurrence:
+ for calendar_id in calendar_ids:
+ new_id = self.copy(event.id, default={
+ 'calendar': calendar_id,
+ 'occurences': False,
+ })
+ for occurence in event.occurences:
+ self.copy(occurence.id, default={
+ 'calendar': calendar_id,
+ 'parent': new_id,
+ })
+ else:
+ parent_ids = self.search([
+ ('uuid', '=', event.uuid),
+ ('calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', event.id),
+ ('recurrence', '=', False),
+ ])
+ for parent in self.browse(parent_ids):
+ self.copy(event.id, default={
+ 'calendar': parent.calendar.id,
+ 'parent': parent.id,
+ })
# Restart the cache for event
- collection_obj.event(cursor.dbname)
+ collection_obj.event.reset()
return res
- def delete(self, cursor, user, ids, context=None):
+ def delete(self, ids):
attendee_obj = self.pool.get('calendar.event.attendee')
collection_obj = self.pool.get('webdav.collection')
if isinstance(ids, (int, long)):
ids = [ids]
- for event in self.browse(cursor, user, ids, context=context):
+ for event in self.browse(ids):
if event.calendar.owner \
and (event.organizer == event.calendar.owner.email \
or (event.parent \
@@ -766,50 +751,47 @@ class Event(ModelSQL, ModelView):
attendee_emails = [x.email for x in event.parent.attendees
if x.email != event.parent.organizer]
if attendee_emails:
- event_ids = self.search(cursor, 0, [
- ('uuid', '=', event.uuid),
- ('calendar.owner.email', 'in', attendee_emails),
- ('id', '!=', event.id),
- ('recurrence', '=', event.recurrence or False),
- ], context=context)
- self.delete(cursor, 0, event_ids, context=context)
+ with Transaction().set_user(0):
+ event_ids = self.search([
+ ('uuid', '=', event.uuid),
+ ('calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', event.id),
+ ('recurrence', '=', event.recurrence or False),
+ ])
+ self.delete(event_ids)
elif event.organizer \
or (event.parent and event.parent.organizer):
if event.organizer:
organizer = event.organizer
else:
organizer = event.parent.organizer
- event_ids = self.search(cursor, 0, [
- ('uuid', '=', event.uuid),
- ('calendar.owner.email', '=', organizer),
- ('id', '!=', event.id),
- ('recurrence', '=', event.recurrence or False),
- ], context=context, limit=1)
- if event_ids:
- event2 = self.browse(cursor, 0, event_ids[0],
- context=context)
- for attendee in event2.attendees:
- if attendee.email == event.calendar.owner.email:
- attendee_obj.write(cursor, 0, attendee.id, {
- 'status': 'declined',
- }, context=context)
- res = super(Event, self).delete(cursor, user, ids, context=context)
+ with Transaction().set_user(0):
+ event_ids = self.search([
+ ('uuid', '=', event.uuid),
+ ('calendar.owner.email', '=', organizer),
+ ('id', '!=', event.id),
+ ('recurrence', '=', event.recurrence or False),
+ ], limit=1)
+ if event_ids:
+ event2 = self.browse(event_ids[0])
+ for attendee in event2.attendees:
+ if attendee.email == event.calendar.owner.email:
+ attendee_obj.write(attendee.id, {
+ 'status': 'declined',
+ })
+ res = super(Event, self).delete(ids)
# Restart the cache for event
- collection_obj.event(cursor.dbname)
+ collection_obj.event.reset()
return res
- def ical2values(self, cursor, user, event_id, ical, calendar_id,
- vevent=None, context=None):
+ def ical2values(self, event_id, ical, calendar_id, vevent=None):
'''
Convert iCalendar to values for create or write
- :param cursor: the database cursor
- :param user: the user id
:param event_id: the event id for write or None for create
:param ical: a ical instance of vobject
:param calendar_id: the calendar id of the event
:param vevent: the vevent 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')
@@ -822,9 +804,6 @@ class Event(ModelSQL, ModelView):
rrule_obj = self.pool.get('calendar.event.rrule')
exrule_obj = self.pool.get('calendar.event.exrule')
- if context is None:
- context = {}
-
vevents = []
if not vevent:
vevent = ical.vevent
@@ -836,7 +815,7 @@ class Event(ModelSQL, ModelView):
event = None
if event_id:
- event = self.browse(cursor, user, event_id, context=context)
+ event = self.browse(event_id)
res = {}
if not event:
@@ -893,21 +872,19 @@ class Event(ModelSQL, ModelView):
else:
res['status'] = ''
if hasattr(vevent, 'categories'):
- ctx = context.copy()
- ctx['active_test'] = False
- category_ids = category_obj.search(cursor, user, [
- ('name', 'in', [x for x in vevent.categories.value]),
- ], context=context)
- categories = category_obj.browse(cursor, user, category_ids,
- context=context)
+ with Transaction().set_context(active_test=False):
+ category_ids = category_obj.search([
+ ('name', 'in', [x for x in vevent.categories.value]),
+ ])
+ categories = category_obj.browse(category_ids)
category_names2ids = {}
for category in categories:
category_names2ids[category.name] = category.id
for category in vevent.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',)]
@@ -920,15 +897,14 @@ class Event(ModelSQL, ModelView):
else:
res['classification'] = 'public'
if hasattr(vevent, 'location'):
- ctx = context.copy()
- ctx['active_test'] = False
- location_ids = location_obj.search(cursor, user, [
- ('name', '=', vevent.location.value),
- ], limit=1, context=ctx)
+ with Transaction().set_context(active_test=False):
+ location_ids = location_obj.search([
+ ('name', '=', vevent.location.value),
+ ], limit=1)
if not location_ids:
- location_id = location_obj.create(cursor, user, {
+ location_id = location_obj.create({
'name': vevent.location.value,
- }, context=context)
+ })
else:
location_id = location_ids[0]
res['location'] = location_id
@@ -958,8 +934,7 @@ class Event(ModelSQL, ModelView):
if hasattr(vevent, 'attendee'):
while vevent.attendee_list:
attendee = vevent.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))
@@ -975,8 +950,7 @@ class Event(ModelSQL, ModelView):
while vevent.rdate_list:
rdate = vevent.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'] = []
@@ -986,8 +960,7 @@ class Event(ModelSQL, ModelView):
while vevent.exdate_list:
exdate = vevent.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'] = []
@@ -996,8 +969,7 @@ class Event(ModelSQL, ModelView):
if hasattr(vevent, 'rrule'):
while vevent.rrule_list:
rrule = vevent.rrule_list.pop()
- vals = rrule_obj.rule2values(cursor, user, rrule,
- context=context)
+ vals = rrule_obj.rule2values(rrule)
res['rrules'].append(('create', vals))
res['exrules'] = []
@@ -1006,8 +978,7 @@ class Event(ModelSQL, ModelView):
if hasattr(vevent, 'exrule'):
while vevent.exrule_list:
exrule = vevent.exrule_list.pop()
- vals = exrule_obj.rule2values(cursor, user, exrule,
- context=context)
+ vals = exrule_obj.rule2values(exrule)
res['exrules'].append(('create', vals))
if event:
@@ -1017,8 +988,7 @@ class Event(ModelSQL, ModelView):
res.setdefault('alarms', [])
while vevent.valarm_list:
valarm = vevent.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'):
@@ -1036,8 +1006,7 @@ class Event(ModelSQL, ModelView):
occurences_todel = [x.id for x in event.occurences]
for vevent in vevents:
event_id = None
- vals = self.ical2values(cursor, user, event_id, ical,
- calendar_id, vevent=vevent, context=context)
+ vals = self.ical2values(event_id, ical, calendar_id, vevent=vevent)
if event:
for occurence in event.occurences:
if vals['recurrence'] == \
@@ -1058,17 +1027,14 @@ class Event(ModelSQL, ModelView):
res['occurences'].insert(0, ('delete', occurences_todel))
return res
- def event2ical(self, cursor, user, event, context=None):
+ def event2ical(self, event):
'''
Return an iCalendar instance of vobject for event
- :param cursor: the database cursor
- :param user: the user id
:param event: a BrowseRecord of calendar.event
or a calendar.event 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')
@@ -1080,13 +1046,13 @@ class Event(ModelSQL, ModelView):
exrule_obj = self.pool.get('calendar.event.exrule')
if isinstance(event, (int, long)):
- event = self.browse(cursor, user, event, context=context)
+ event = self.browse(event)
- user_ = user_obj.browse(cursor, user, user, context=context)
+ user = user_obj.browse(Transaction().user)
if event.timezone:
tzevent = pytz.timezone(event.timezone)
- elif user_.timezone:
- tzevent = pytz.timezone(user_.timezone)
+ elif user.timezone:
+ tzevent = pytz.timezone(user.timezone)
else:
tzevent = tzlocal
@@ -1190,41 +1156,36 @@ class Event(ModelSQL, ModelView):
vevent.attendee_list = []
for attendee in event.attendees:
vevent.attendee_list.append(attendee_obj.attendee2attendee(
- cursor, user, attendee, context=context))
+ attendee))
if event.rdates:
vevent.add('rdate')
vevent.rdate.value = []
for rdate in event.rdates:
- vevent.rdate.value.append(rdate_obj.date2date(cursor, user,
- rdate, context=context))
+ vevent.rdate.value.append(rdate_obj.date2date(rdate))
if event.exdates:
vevent.add('exdate')
vevent.exdate.value = []
for exdate in event.exdates:
- vevent.exdate.value.append(exdate_obj.date2date(cursor, user,
- exdate, context=context))
+ vevent.exdate.value.append(exdate_obj.date2date(exdate))
if event.rrules:
for rrule in event.rrules:
- vevent.add('rrule').value = rrule_obj.rule2rule(cursor, user,
- rrule, context=context)
+ vevent.add('rrule').value = rrule_obj.rule2rule(rrule)
if event.exrules:
for exrule in event.exrules:
- vevent.add('exrule').value = exrule_obj.rule2rule(cursor, user,
- exrule, context=context)
+ vevent.add('exrule').value = exrule_obj.rule2rule(exrule)
vevent.valarm_list = []
for alarm in event.alarms:
- valarm = alarm_obj.alarm2valarm(cursor, user, alarm,
- context=context)
+ valarm = alarm_obj.alarm2valarm(alarm)
if valarm:
vevent.valarm_list.append(valarm)
for occurence in event.occurences:
- oical = self.event2ical(cursor, user, occurence, context=context)
+ oical = self.event2ical(occurence)
ical.vevent_list.append(oical.vevent)
return ical
@@ -1251,28 +1212,22 @@ class Alarm(ModelSQL):
valarm = fields.Binary('valarm')
- def valarm2values(self, cursor, user, valarm, context=None):
+ def valarm2values(self, valarm):
'''
Convert a valarm object into values for create or write
- :param cursor: the database cursor
- :param user: the user id
:param valarm: the valarm object
- :param context: the context
:return: a dictionary with values
'''
res = {}
res['valarm'] = valarm.serialize()
return res
- def alarm2valarm(self, cursor, user, alarm, context=None):
+ def alarm2valarm(self, alarm):
'''
Return a valarm instance of vobject for alarm
- :param cursor: the database cursor
- :param user: the user id
:param alarm: a BrowseRecord of calendar.event.alarm
- :param context: the context
:return: a valarm instance of vobject
'''
valarm = None
@@ -1294,50 +1249,48 @@ class EventAlarm(ModelSQL):
event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
required=True, select=1)
- def create(self, cursor, user, values, context=None):
+ def create(self, values):
event_obj = self.pool.get('calendar.event')
if values.get('event'):
# Update write_date of event
- event_obj.write(cursor, user, values['event'], {}, context=context)
- return super(EventAlarm, self).create(cursor, user, values, context=context)
+ event_obj.write(values['event'], {})
+ return super(EventAlarm, self).create(values)
- def write(self, cursor, user, ids, values, context=None):
+ def write(self, ids, values):
event_obj = self.pool.get('calendar.event')
if isinstance(ids, (int, long)):
ids = [ids]
- event_ids = [x.event.id for x in self.browse(cursor, user, ids,
- context=context)]
+ event_ids = [x.event.id for x in self.browse(ids)]
if values.get('event'):
event_ids.append(values['event'])
if event_ids:
# Update write_date of event
- event_obj.write(cursor, user, event_ids, {}, context=context)
- return super(EventAlarm, self).write(cursor, user, ids, values,
- context=context)
+ event_obj.write(event_ids, {})
+ return super(EventAlarm, self).write(ids, values)
- def delete(self, cursor, user, ids, context=None):
+ def delete(self, ids):
event_obj = self.pool.get('calendar.event')
alarm_obj = self.pool.get('calendar.alarm')
if isinstance(ids, (int, long)):
ids = [ids]
- event_alarms = self.browse(cursor, user, ids, context=context)
+ event_alarms = self.browse(ids)
alarm_ids = [a.calendar_alarm.id for a in event_alarms]
event_ids = [x.event.id for x in event_alarms]
if event_ids:
# Update write_date of event
- event_obj.write(cursor, user, event_ids, {}, context=context)
- res = super(EventAlarm, self).delete(cursor, user, ids, context=context)
+ event_obj.write(event_ids, {})
+ res = super(EventAlarm, 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)
EventAlarm()
@@ -1360,22 +1313,19 @@ class Attendee(ModelSQL, ModelView):
], 'Participation Status')
attendee = fields.Binary('attendee')
- def default_status(self, cursor, user, context=None):
+ def default_status(self):
return ''
- def _attendee2update(self, cursor, user, attendee, context=None):
+ def _attendee2update(self, attendee):
res = {}
res['status'] = attendee.status
return res
- def attendee2values(self, cursor, user, attendee, context=None):
+ def attendee2values(self, attendee):
'''
Convert a attendee object into values for create or write
- :param cursor: the database cursor
- :param user: the user id
:param attendee: the attendee object
- :param context: the context
:return: a dictionary with values
'''
res = {}
@@ -1390,14 +1340,11 @@ class Attendee(ModelSQL, ModelView):
res['attendee'] = attendee.serialize()
return res
- def attendee2attendee(self, cursor, user, attendee, context=None):
+ def attendee2attendee(self, attendee):
'''
Return a attendee instance of vobject for attendee
- :param cursor: the database cursor
- :param user: the user id
:param attendee: a BrowseRecord of calendar.event.attendee
- :param context: the context
:return: a attendee instance of vobject
'''
res = None
@@ -1434,14 +1381,13 @@ class EventAttendee(ModelSQL, ModelView):
event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
required=True, select=1)
- def create(self, cursor, user, values, context=None):
+ def create(self, values):
event_obj = self.pool.get('calendar.event')
if values.get('event'):
# Update write_date of event
- event_obj.write(cursor, user, values['event'], {}, context=context)
- res = super(EventAttendee, self).create(cursor, user, values,
- context=context)
- attendee = self.browse(cursor, user, res, context=context)
+ event_obj.write(values['event'], {})
+ res = super(EventAttendee, self).create(values)
+ attendee = self.browse(res)
event = attendee.event
if event.calendar.owner \
and (event.organizer == event.calendar.owner.email \
@@ -1454,37 +1400,36 @@ class EventAttendee(ModelSQL, ModelView):
attendee_emails = [x.email for x in event.parent.attendees
if x.email != event.parent.organizer]
if attendee_emails:
- event_ids = event_obj.search(cursor, 0, [
- ('uuid', '=', event.uuid),
- ('calendar.owner.email', 'in', attendee_emails),
- ('id', '!=', event.id),
- ('recurrence', '=', event.recurrence or False),
- ], context=context)
- for event_id in event_ids:
- self.copy(cursor, 0, res, default={
- 'event': event_id,
- }, context=context)
+ with Transaction().set_user(0):
+ event_ids = event_obj.search([
+ ('uuid', '=', event.uuid),
+ ('calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', event.id),
+ ('recurrence', '=', event.recurrence or False),
+ ])
+ for event_id in event_ids:
+ self.copy(res, default={
+ 'event': event_id,
+ })
return res
- def write(self, cursor, user, ids, values, context=None):
+ def write(self, ids, values):
event_obj = self.pool.get('calendar.event')
if isinstance(ids, (int, long)):
ids = [ids]
- event_ids = [x.event.id for x in self.browse(cursor, user, ids,
- context=context)]
+ event_ids = [x.event.id for x in self.browse(ids)]
if values.get('event'):
event_ids.append(values['event'])
if event_ids:
# Update write_date of event
- event_obj.write(cursor, user, event_ids, {}, context=context)
+ event_obj.write(event_ids, {})
if 'email' in values:
values = values.copy()
del values['email']
- res = super(EventAttendee, self).write(cursor, user, ids, values,
- context=context)
- attendees = self.browse(cursor, user, ids, context=context)
+ res = super(EventAttendee, self).write(ids, values)
+ attendees = self.browse(ids)
for attendee in attendees:
event = attendee.event
if event.calendar.owner \
@@ -1498,32 +1443,35 @@ class EventAttendee(ModelSQL, ModelView):
attendee_emails = [x.email for x in event.parent.attendees
if x.email != event.parent.organizer]
if attendee_emails:
- attendee_ids = self.search(cursor, 0, [
- ('event.uuid', '=', event.uuid),
- ('event.calendar.owner.email', 'in', attendee_emails),
- ('id', '!=', attendee.id),
- ('event.recurrence', '=', event.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([
+ ('event.uuid', '=', event.uuid),
+ ('event.calendar.owner.email', 'in',
+ attendee_emails),
+ ('id', '!=', attendee.id),
+ ('event.recurrence', '=',
+ event.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):
event_obj = self.pool.get('calendar.event')
attendee_obj = self.pool.get('calendar.attendee')
if isinstance(ids, (int, long)):
ids = [ids]
- event_attendees = self.browse(cursor, user, ids, context=context)
+ event_attendees = self.browse(ids)
calendar_attendee_ids = [a.calendar_attendee.id \
for a in event_attendees]
event_ids = [x.event.id for x in event_attendees]
if event_ids:
# Update write_date of event
- event_obj.write(cursor, user, event_ids, {}, context=context)
+ event_obj.write(event_ids, {})
- for attendee in self.browse(cursor, user, ids, context=context):
+ for attendee in self.browse(ids):
event = attendee.event
if event.calendar.owner \
and (event.organizer == event.calendar.owner.email \
@@ -1536,14 +1484,17 @@ class EventAttendee(ModelSQL, ModelView):
attendee_emails = [x.email for x in event.parent.attendees
if x.email != event.parent.organizer]
if attendee_emails:
- attendee_ids = self.search(cursor, 0, [
- ('event.uuid', '=', event.uuid),
- ('event.calendar.owner.email', 'in', attendee_emails),
- ('id', '!=', attendee.id),
- ('event.recurrence', '=', event.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([
+ ('event.uuid', '=', event.uuid),
+ ('event.calendar.owner.email', 'in',
+ attendee_emails),
+ ('id', '!=', attendee.id),
+ ('event.recurrence', '=',
+ event.recurrence or False),
+ ('email', '=', attendee.email),
+ ])
+ self.delete(attendee_ids)
elif event.calendar.owner \
and ((event.organizer \
or (event.parent and event.parent.organizer)) \
@@ -1552,24 +1503,24 @@ class EventAttendee(ModelSQL, ModelView):
organizer = event.organizer
else:
organizer = event.parent.organizer
- attendee_ids = self.search(cursor, 0, [
- ('event.uuid', '=', event.uuid),
- ('event.calendar.owner.email', '=', organizer),
- ('id', '!=', attendee.id),
- ('event.recurrence', '=', event.recurrence or False),
- ('email', '=', attendee.email),
- ], context=context)
- if attendee_ids:
- self.write(cursor, 0, attendee_ids, {
- 'status': 'declined',
- }, context=context)
- res = super(EventAttendee, self).delete(cursor, user, ids, context=context)
+ with Transaction().set_user(0):
+ attendee_ids = self.search([
+ ('event.uuid', '=', event.uuid),
+ ('event.calendar.owner.email', '=', organizer),
+ ('id', '!=', attendee.id),
+ ('event.recurrence', '=', event.recurrence or False),
+ ('email', '=', attendee.email),
+ ])
+ if attendee_ids:
+ self.write(attendee_ids, {
+ 'status': 'declined',
+ })
+ res = super(EventAttendee, 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
@@ -1580,30 +1531,27 @@ class EventAttendee(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(EventAttendee, 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(EventAttendee, 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)
EventAttendee()
@@ -1618,28 +1566,26 @@ class Date(ModelSQL, ModelView):
'but handle as date only.')
datetime = fields.DateTime('Date', 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
old_table = 'calendar_rdate'
if TableHandler.table_exist(cursor, old_table):
TableHandler.table_rename(cursor, old_table, self._table)
- return super(Date, self).init(cursor, module_name)
+ return super(Date, self).init(module_name)
- def _date2update(self, cursor, user, date, context=None):
+ def _date2update(self, date):
res = {}
res['date'] = date.date
res['datetime'] = date.datetime
return res
- def date2values(self, cursor, user, date, context=None):
+ def date2values(self, date):
'''
Convert a date object into values for create or write
- :param cursor: the database cursor
- :param user: the user id
:param date: the date object
- :param context: the context
:return: a dictionary with values
'''
res = {}
@@ -1655,15 +1601,12 @@ class Date(ModelSQL, ModelView):
res['datetime'] = date
return res
- def date2date(self, cursor, user, date, context=None):
+ def date2date(self, date):
'''
Return a datetime for date
- :param cursor: the database cursor
- :param user: the user id
:param date: a BrowseRecord of calendar.date or
calendar.exdate
- :param context: the context
:return: a datetime
'''
if date.date:
@@ -1688,64 +1631,62 @@ class EventRDate(ModelSQL, ModelView):
event = fields.Many2One('calendar.event', 'Event', 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(EventRDate, self).init(cursor, module_name)
+ return super(EventRDate, self).init(module_name)
- def create(self, cursor, user, values, context=None):
+ def create(self, values):
event_obj = self.pool.get('calendar.event')
if values.get('event'):
# Update write_date of event
- event_obj.write(cursor, user, values['event'], {}, context=context)
- return super(EventRDate, self).create(cursor, user, values,
- context=context)
+ event_obj.write(values['event'], {})
+ return super(EventRDate, self).create(values)
- def write(self, cursor, user, ids, values, context=None):
+ def write(self, ids, values):
event_obj = self.pool.get('calendar.event')
if isinstance(ids, (int, long)):
ids = [ids]
- event_ids = [x.event.id for x in self.browse(cursor, user, ids,
- context=context)]
+ event_ids = [x.event.id for x in self.browse(ids)]
if values.get('event'):
event_ids.append(values['event'])
if event_ids:
# Update write_date of event
- event_obj.write(cursor, user, event_ids, {}, context=context)
- return super(EventRDate, self).write(cursor, user, ids, values,
- context=context)
+ event_obj.write(event_ids, {})
+ return super(EventRDate, self).write(ids, values)
- def delete(self, cursor, user, ids, context=None):
+ def delete(self, ids):
event_obj = self.pool.get('calendar.event')
rdate_obj = self.pool.get('calendar.date')
if isinstance(ids, (int, long)):
ids = [ids]
- event_rdates = self.browse(cursor, user, ids, context=context)
+ event_rdates = self.browse(ids)
rdate_ids = [a.calendar_date.id for a in event_rdates]
event_ids = [x.event.id for x in event_rdates]
if event_ids:
# Update write_date of event
- event_obj.write(cursor, user, event_ids, {}, context=context)
- res = super(EventRDate, self).delete(cursor, user, ids, context=context)
+ event_obj.write(event_ids, {})
+ res = super(EventRDate, 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)
EventRDate()
@@ -1827,53 +1768,54 @@ class RRule(ModelSQL, ModelView):
'invalid_bysetpos': 'Invalid "By Position"',
})
- def init(self, cursor, module_name):
+ def init(self, module_name):
+ cursor = Transaction().cursor
# Migrate from 1.4: unit_count replaced by until_count_only_one
table = TableHandler(cursor, self, module_name)
table.drop_constraint('until_count')
- return super(RRule, self).init(cursor, module_name)
+ return super(RRule, self).init(module_name)
- def check_bysecond(self, cursor, user, ids):
- for rule in self.browse(cursor, user, ids):
+ def check_bysecond(self, ids):
+ for rule in self.browse(ids):
if not rule.bysecond:
continue
for second in rule.bysecond.split(','):
try:
second = int(second)
- except:
+ except Exception:
return False
if not (second >= 0 and second <= 59):
return False
return True
- def check_byminute(self, cursor, user, ids):
- for rule in self.browse(cursor, user, ids):
+ def check_byminute(self, ids):
+ for rule in self.browse(ids):
if not rule.byminute:
continue
for minute in rule.byminute.split(','):
try:
minute = int(minute)
- except:
+ except Exception:
return False
if not (minute >= 0 and minute <= 59):
return False
return True
- def check_byhour(self, cursor, user, ids):
- for rule in self.browse(cursor, user, ids):
+ def check_byhour(self, ids):
+ for rule in self.browse(ids):
if not rule.byhour:
continue
for hour in rule.byhour.split(','):
try:
hour = int(hour)
- except:
+ except Exception:
return False
if not (hour >= 0 and hour <= 23):
return False
return True
- def check_byday(self, cursor, user, ids):
- for rule in self.browse(cursor, user, ids):
+ def check_byday(self, ids):
+ for rule in self.browse(ids):
if not rule.byday:
continue
for weekdaynum in rule.byday.split(','):
@@ -1885,78 +1827,78 @@ class RRule(ModelSQL, ModelView):
continue
try:
ordwk = int(ordwk)
- except:
+ except Exception:
return False
if not (abs(ordwk) >= 1 and abs(ordwk) <= 53):
return False
return True
- def check_bymonthday(self, cursor, user, ids):
- for rule in self.browse(cursor, user, ids):
+ def check_bymonthday(self, ids):
+ for rule in self.browse(ids):
if not rule.bymonthday:
continue
for monthdaynum in rule.bymonthday.split(','):
try:
monthdaynum = int(monthdaynum)
- except:
+ except Exception:
return False
if not (abs(monthdaynum) >= 1 and abs(monthdaynum) <= 31):
return False
return True
- def check_byyearday(self, cursor, user, ids):
- for rule in self.browse(cursor, user, ids):
+ def check_byyearday(self, ids):
+ for rule in self.browse(ids):
if not rule.byyearday:
continue
for yeardaynum in rule.byyearday.split(','):
try:
yeardaynum = int(yeardaynum)
- except:
+ except Exception:
return False
if not (abs(yeardaynum) >= 1 and abs(yeardaynum) <= 366):
return False
return True
- def check_byweekno(self, cursor, user, ids):
- for rule in self.browse(cursor, user, ids):
+ def check_byweekno(self, ids):
+ for rule in self.browse(ids):
if not rule.byweekno:
continue
for weeknum in rule.byweekno.split(','):
try:
weeknum = int(weeknum)
- except:
+ except Exception:
return False
if not (abs(weeknum) >= 1 and abs(weeknum) <= 53):
return False
return True
- def check_bymonth(self, cursor, user, ids):
- for rule in self.browse(cursor, user, ids):
+ def check_bymonth(self, ids):
+ for rule in self.browse(ids):
if not rule.bymonth:
continue
for monthnum in rule.bymonth.split(','):
try:
monthnum = int(monthnum)
- except:
+ except Exception:
return False
if not (monthnum >= 1 and monthnum <= 12):
return False
return True
- def check_bysetpos(self, cursor, user, ids):
- for rule in self.browse(cursor, user, ids):
+ def check_bysetpos(self, ids):
+ for rule in self.browse(ids):
if not rule.bysetpos:
continue
for setposday in rule.bysetpos.split(','):
try:
setposday = int(setposday)
- except:
+ except Exception:
return False
if not (abs(setposday) >= 1 and abs(setposday) <= 366):
return False
return True
- def _rule2update(self, cursor, user, rule, context=None):
+ def _rule2update(self, rule):
res = {}
for field in ('freq', 'until_date', 'until', 'count', 'interval',
'bysecond', 'byminute', 'byhour', 'byday', 'bymonthday',
@@ -1964,14 +1906,11 @@ class RRule(ModelSQL, ModelView):
res[field] = rule[field]
return res
- def rule2values(self, cursor, user, rule, context=None):
+ def rule2values(self, rule):
'''
Convert a rule object into values for create or write
- :param cursor: the database cursor
- :param user: the user id
:param rule: teh rule object
- :param context: the context
:return: a dictionary with values
'''
res = {}
@@ -1981,7 +1920,7 @@ class RRule(ModelSQL, ModelView):
if field == 'until':
try:
value = vobject.icalendar.stringToDateTime(value)
- except:
+ except Exception:
value = vobject.icalendar.stringToDate(value)
if not isinstance(value, datetime.datetime):
res['until_date'] = True
@@ -1999,15 +1938,12 @@ class RRule(ModelSQL, ModelView):
res[field] = value
return res
- def rule2rule(self, cursor, user, rule, context=None):
+ def rule2rule(self, rule):
'''
Return a rule string for rule
- :param cursor: the database cursor
- :param user: the user id
:param rule: a BrowseRecord of calendar.rrule or
calendar.exrule
- :param context: the context
:return: a string
'''
res = 'FREQ=' + rule.freq.upper()
@@ -2047,53 +1983,52 @@ class EventRRule(ModelSQL, ModelView):
select=1, required=True)
- def create(self, cursor, user, values, context=None):
+ def create(self, values):
event_obj = self.pool.get('calendar.event')
if values.get('event'):
# Update write_date of event
- event_obj.write(cursor, user, values['event'], {}, context=context)
- return super(EventRRule, self).create(cursor, user, values, context=context)
+ event_obj.write(values['event'], {})
+ return super(EventRRule, self).create(values)
- def write(self, cursor, user, ids, values, context=None):
+ def write(self, ids, values):
event_obj = self.pool.get('calendar.event')
if isinstance(ids, (int, long)):
ids = [ids]
- event_ids = [x.event.id for x in self.browse(cursor, user, ids,
- context=context)]
+ event_ids = [x.event.id for x in self.browse(ids)]
if values.get('event'):
event_ids.append(values['event'])
if event_ids:
# Update write_date of event
- event_obj.write(cursor, user, event_ids, {}, context=context)
- return super(EventRRule, self).write(cursor, user, ids, values, context=context)
+ event_obj.write(event_ids, {})
+ return super(EventRRule, self).write(ids, values)
- def delete(self, cursor, user, ids, context=None):
+ def delete(self, ids):
event_obj = self.pool.get('calendar.event')
rrule_obj = self.pool.get('calendar.rrule')
if isinstance(ids, (int, long)):
ids = [ids]
- event_rrules = self.browse(cursor, user, ids, context=context)
+ event_rrules = self.browse(ids)
rrule_ids = [a.calendar_rrule.id for a in event_rrules]
event_ids = [x.event.id for x in event_rrules]
if event_ids:
# Update write_date of event
- event_obj.write(cursor, user, event_ids, {}, context=context)
- res = super(EventRRule, self).delete(cursor, user, ids, context=context)
+ event_obj.write(event_ids, {})
+ res = super(EventRRule, 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)
EventRRule()
diff --git a/calendar.xml b/calendar.xml
index 07e9a33..475994b 100644
--- a/calendar.xml
+++ b/calendar.xml
@@ -10,6 +10,9 @@ this repository contains the full copyright notices and license terms. -->
<record model="res.user" id="res.user_admin">
<field name="groups" eval="[('add', ref('group_calendar_admin'))]"/>
</record>
+ <record model="res.user" id="res.user_trigger">
+ <field name="groups" eval="[('add', ref('group_calendar_admin'))]"/>
+ </record>
<menuitem name="Calendar Management" sequence="8" id="menu_calendar"/>
diff --git a/de_DE.csv b/de_DE.csv
index ba69519..7202432 100644
--- a/de_DE.csv
+++ b/de_DE.csv
@@ -8,8 +8,8 @@ error,calendar.location,0,The name of calendar location must be unique!,Name fü
error,calendar.rrule,0,"Invalid ""By Day""","Ungültig ""Für Tag""",0
error,calendar.rrule,0,"Invalid ""By Hour""","Ungültig ""Für Stunde""",0
error,calendar.rrule,0,"Invalid ""By Minute""","Ungültig ""Für Minute""",0
-error,calendar.rrule,0,"Invalid ""By Month""","Ungültig ""Für Monat""",0
error,calendar.rrule,0,"Invalid ""By Month Day""","Ungültig ""Für Tag des Monats""",0
+error,calendar.rrule,0,"Invalid ""By Month""","Ungültig ""Für Monat""",0
error,calendar.rrule,0,"Invalid ""By Position""","Ungültig ""Für Position""",0
error,calendar.rrule,0,"Invalid ""By Second""","Ungültig ""Für Sekunde""",0
error,calendar.rrule,0,"Invalid ""By Week Number""","Ungültig ""Für Woche Nummer""",0
@@ -24,33 +24,24 @@ field,"calendar.attendee,status",0,Participation Status,Teilnahmestatus,0
field,"calendar.calendar,description",0,Description,Bezeichnung,0
field,"calendar.calendar,name",0,Name,Name,0
field,"calendar.calendar,owner",0,Owner,Besitzer,0
+field,"calendar.calendar,read_users",0,Read Users,Benutzer mit Leseberechtigung,0
+field,"calendar.calendar,rec_name",0,Name,Name,0
+field,"calendar.calendar,write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
field,"calendar.calendar-read-res.user,calendar",0,Calendar,Kalender,0
field,"calendar.calendar-read-res.user,rec_name",0,Name,Name,0
field,"calendar.calendar-read-res.user,user",0,User,Benutzer,0
-field,"calendar.calendar,read_users",0,Read Users,Benutzer mit Leseberechtigung,0
-field,"calendar.calendar,rec_name",0,Name,Name,0
field,"calendar.calendar-write-res.user,calendar",0,Calendar,Kalender,0
field,"calendar.calendar-write-res.user,rec_name",0,Name,Name,0
field,"calendar.calendar-write-res.user,user",0,User,Benutzer,0
-field,"calendar.calendar,write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
field,"calendar.category,name",0,Name,Name,0
field,"calendar.category,rec_name",0,Name,Name,0
field,"calendar.date,date",0,Is Date,Als Datum,0
field,"calendar.date,datetime",0,Date,Zeitpunkt,0
field,"calendar.date,rec_name",0,Name,Name,0
-field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Kalender Alarm,0
-field,"calendar.event.alarm,event",0,Event,Termin,0
-field,"calendar.event.alarm,rec_name",0,Name,Name,0
field,"calendar.event,alarms",0,Alarms,Alarm,0
field,"calendar.event,all_day",0,All Day,Ganztägig,0
-field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Kalender Teilnehmer,0
-field,"calendar.event.attendee,event",0,Event,Termin,0
-field,"calendar.event.attendee,rec_name",0,Name,Name,0
field,"calendar.event,attendees",0,Attendees,Teilnehmer,0
field,"calendar.event,calendar",0,Calendar,Kalender,0
-field,"calendar.event-calendar.category,category",0,Category,Kategorie,0
-field,"calendar.event-calendar.category,event",0,Event,Termin,0
-field,"calendar.event-calendar.category,rec_name",0,Name,Name,0
field,"calendar.event,calendar_owner",0,Owner,Besitzer,0
field,"calendar.event,calendar_read_users",0,Read Users,Benutzer mit Leseberechtigung,0
field,"calendar.event,calendar_write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
@@ -59,27 +50,15 @@ field,"calendar.event,classification",0,Classification,Klassifizierung,0
field,"calendar.event,description",0,Description,Bezeichnung,0
field,"calendar.event,dtend",0,End Date,Enddatum,0
field,"calendar.event,dtstart",0,Start Date,Anfangsdatum,0
-field,"calendar.event.exdate,calendar_date",0,Calendar Date,Kalender Datum,0
-field,"calendar.event.exdate,event",0,Event,Termin,0
-field,"calendar.event.exdate,rec_name",0,Name,Name,0
field,"calendar.event,exdates",0,Exception Dates,Ausnahmedaten,0
-field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
-field,"calendar.event.exrule,event",0,Event,Termin,0
-field,"calendar.event.exrule,rec_name",0,Name,Name,0
field,"calendar.event,exrules",0,Exception Rules,Ausnahmeregeln,0
field,"calendar.event,location",0,Location,Ort,0
field,"calendar.event,occurences",0,Occurences,Ereignisse,0
field,"calendar.event,organizer",0,Organizer,Organisator,0
field,"calendar.event,parent",0,Parent,Übergeordnet (Termin),0
-field,"calendar.event.rdate,calendar_date",0,Calendar Date,Kalender Datum,0
-field,"calendar.event.rdate,event",0,Event,Termin,0
-field,"calendar.event.rdate,rec_name",0,Name,Name,0
field,"calendar.event,rdates",0,Recurrence Dates,Wiederholungsdaten,0
field,"calendar.event,rec_name",0,Name,Name,0
field,"calendar.event,recurrence",0,Recurrence,Wiederholung,0
-field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
-field,"calendar.event.rrule,event",0,Event,Termin,0
-field,"calendar.event.rrule,rec_name",0,Name,Name,0
field,"calendar.event,rrules",0,Recurrence Rules,Wiederholungsregeln,0
field,"calendar.event,sequence",0,Sequence,Revision,0
field,"calendar.event,status",0,Status,Status,0
@@ -88,6 +67,27 @@ field,"calendar.event,timezone",0,Timezone,Zeitzone,0
field,"calendar.event,transp",0,Time Transparency,Zeittransparenz,0
field,"calendar.event,uuid",0,UUID,UUID,0
field,"calendar.event,vevent",0,vevent,vevent,0
+field,"calendar.event-calendar.category,category",0,Category,Kategorie,0
+field,"calendar.event-calendar.category,event",0,Event,Termin,0
+field,"calendar.event-calendar.category,rec_name",0,Name,Name,0
+field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Kalender Alarm,0
+field,"calendar.event.alarm,event",0,Event,Termin,0
+field,"calendar.event.alarm,rec_name",0,Name,Name,0
+field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Kalender Teilnehmer,0
+field,"calendar.event.attendee,event",0,Event,Termin,0
+field,"calendar.event.attendee,rec_name",0,Name,Name,0
+field,"calendar.event.exdate,calendar_date",0,Calendar Date,Kalender Datum,0
+field,"calendar.event.exdate,event",0,Event,Termin,0
+field,"calendar.event.exdate,rec_name",0,Name,Name,0
+field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
+field,"calendar.event.exrule,event",0,Event,Termin,0
+field,"calendar.event.exrule,rec_name",0,Name,Name,0
+field,"calendar.event.rdate,calendar_date",0,Calendar Date,Kalender Datum,0
+field,"calendar.event.rdate,event",0,Event,Termin,0
+field,"calendar.event.rdate,rec_name",0,Name,Name,0
+field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
+field,"calendar.event.rrule,event",0,Event,Termin,0
+field,"calendar.event.rrule,rec_name",0,Name,Name,0
field,"calendar.location,name",0,Name,Name,0
field,"calendar.location,rec_name",0,Name,Name,0
field,"calendar.rrule,byday",0,By Day,Für Tag,0
@@ -118,12 +118,12 @@ model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Kalender -
model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Kalender - Lesen - Benutzer,0
model,"calendar.category,name",0,Category,Kategorie,0
model,"calendar.date,name",0,Calendar Date,Kalender Datum,0
+model,"calendar.event,name",0,Event,Termin,0
+model,"calendar.event-calendar.category,name",0,Event - Category,Termin - Kategorie,0
model,"calendar.event.alarm,name",0,Alarm,Alarm,0
model,"calendar.event.attendee,name",0,Attendee,Teilnehmer,0
-model,"calendar.event-calendar.category,name",0,Event - Category,Termin - Kategorie,0
model,"calendar.event.exdate,name",0,Exception Date,Ausnahmedatum,0
model,"calendar.event.exrule,name",0,Exception Rule,Ausnahmeregel,0
-model,"calendar.event,name",0,Event,Termin,0
model,"calendar.event.rdate,name",0,Recurrence Date,Wiederholungsdatum,0
model,"calendar.event.rrule,name",0,Recurrence Rule,Wiederholungsregel,0
model,"calendar.location,name",0,Location,Ort,0
@@ -135,8 +135,8 @@ model,"ir.action,name",act_event_form2,Events,Termine,0
model,"ir.action,name",act_event_form3,Events,Termine,0
model,"ir.ui.menu,name",menu_calendar,Calendar Management,Kalender,0
model,"ir.ui.menu,name",menu_calendar_form,Calendars,Kalender,0
-model,"ir.ui.menu,name",menu_event_form,Events,Termine,0
model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Neuer Kalender,0
+model,"ir.ui.menu,name",menu_event_form,Events,Termine,0
model,"ir.ui.menu,name",menu_event_form2,New Event,Neuer Termin,0
model,"res.group,name",group_calendar_admin,Calendar Administration,Kalender Administration,0
selection,"calendar.attendee,status",0,,,0
diff --git a/fr_FR.csv b/fr_FR.csv
index b2df1a2..b814ecf 100644
--- a/fr_FR.csv
+++ b/fr_FR.csv
@@ -8,8 +8,8 @@ error,calendar.location,0,The name of calendar location must be unique!,Le nom d
error,calendar.rrule,0,"Invalid ""By Day""","""Par jour"" invalide",0
error,calendar.rrule,0,"Invalid ""By Hour""","""Par heure"" invalide",0
error,calendar.rrule,0,"Invalid ""By Minute""","""Par minute"" invalide",0
-error,calendar.rrule,0,"Invalid ""By Month""","""Par mois"" invalide",0
error,calendar.rrule,0,"Invalid ""By Month Day""","""Par jour du mois"" invalide",0
+error,calendar.rrule,0,"Invalid ""By Month""","""Par mois"" invalide",0
error,calendar.rrule,0,"Invalid ""By Position""","""Par position"" invalide",0
error,calendar.rrule,0,"Invalid ""By Second""","""Par seconde"" invalide",0
error,calendar.rrule,0,"Invalid ""By Week Number""","""Par jour de la semaine"" invalide",0
@@ -24,33 +24,24 @@ field,"calendar.attendee,status",0,Participation Status,Statut de participation,
field,"calendar.calendar,description",0,Description,Description,0
field,"calendar.calendar,name",0,Name,Nom,0
field,"calendar.calendar,owner",0,Owner,Propriétaire,0
+field,"calendar.calendar,read_users",0,Read Users,Utilisateurs en lecture,0
+field,"calendar.calendar,rec_name",0,Name,Nom,0
+field,"calendar.calendar,write_users",0,Write Users,Utilisateurs en écriture,0
field,"calendar.calendar-read-res.user,calendar",0,Calendar,Calendrier,0
field,"calendar.calendar-read-res.user,rec_name",0,Name,Nom,0
field,"calendar.calendar-read-res.user,user",0,User,Utilisateur,0
-field,"calendar.calendar,read_users",0,Read Users,Utilisateurs en lecture,0
-field,"calendar.calendar,rec_name",0,Name,Nom,0
field,"calendar.calendar-write-res.user,calendar",0,Calendar,Calendrier,0
field,"calendar.calendar-write-res.user,rec_name",0,Name,Nom,0
field,"calendar.calendar-write-res.user,user",0,User,Utilisateur,0
-field,"calendar.calendar,write_users",0,Write Users,Utilisateurs en écriture,0
field,"calendar.category,name",0,Name,Nom,0
field,"calendar.category,rec_name",0,Name,Nom,0
field,"calendar.date,date",0,Is Date,Est une date,0
field,"calendar.date,datetime",0,Date,Date,0
field,"calendar.date,rec_name",0,Name,Nom,0
-field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Alarme calendrier,0
-field,"calendar.event.alarm,event",0,Event,Événement,0
-field,"calendar.event.alarm,rec_name",0,Name,Nom,0
field,"calendar.event,alarms",0,Alarms,Alarmes,0
field,"calendar.event,all_day",0,All Day,Toute la journée,0
-field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Participant calendrier,0
-field,"calendar.event.attendee,event",0,Event,Événement,0
-field,"calendar.event.attendee,rec_name",0,Name,Nom,0
field,"calendar.event,attendees",0,Attendees,Participants,0
field,"calendar.event,calendar",0,Calendar,Calendrier,0
-field,"calendar.event-calendar.category,category",0,Category,Catégorie,0
-field,"calendar.event-calendar.category,event",0,Event,Événement,0
-field,"calendar.event-calendar.category,rec_name",0,Name,Nom,0
field,"calendar.event,calendar_owner",0,Owner,Propriétaire,0
field,"calendar.event,calendar_read_users",0,Read Users,Utilisateurs en lecture,0
field,"calendar.event,calendar_write_users",0,Write Users,Utilisateurs en écriture,0
@@ -59,28 +50,15 @@ field,"calendar.event,classification",0,Classification,Classification,0
field,"calendar.event,description",0,Description,Description,0
field,"calendar.event,dtend",0,End Date,Date de fin,0
field,"calendar.event,dtstart",0,Start Date,Date de début,0
-field,"calendar.event.exdate,calendar_date",0,Calendar Date,Date calendrier,0
-field,"calendar.event.exdate,event",0,Event,Événement,0
-field,"calendar.event.exdate,rec_name",0,Name,Nom,0
field,"calendar.event,exdates",0,Exception Dates,Dates d'exception,0
-field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
-field,"calendar.event.exrule,event",0,Event,Événement,0
-field,"calendar.event.exrule,rec_name",0,Name,Nom,0
field,"calendar.event,exrules",0,Exception Rules,Règles d'exception,0
field,"calendar.event,location",0,Location,Emplacement,0
field,"calendar.event,occurences",0,Occurences,Occurrences,0
field,"calendar.event,organizer",0,Organizer,Organisateur,0
field,"calendar.event,parent",0,Parent,Parent,0
-field,"calendar.event.rdate,calendar_date",0,Calendar Date,Date calendrier,0
-field,"calendar.event.rdate,calendar_rdate",0,Calendar RDate,Date de récurrence,0
-field,"calendar.event.rdate,event",0,Event,Événement,0
-field,"calendar.event.rdate,rec_name",0,Name,Nom,0
field,"calendar.event,rdates",0,Recurrence Dates,Dates de récurrence,0
field,"calendar.event,rec_name",0,Name,Nom,0
field,"calendar.event,recurrence",0,Recurrence,Récurrence,0
-field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
-field,"calendar.event.rrule,event",0,Event,Événement,0
-field,"calendar.event.rrule,rec_name",0,Name,Nom,0
field,"calendar.event,rrules",0,Recurrence Rules,Règles de récurrence,0
field,"calendar.event,sequence",0,Sequence,Séquence,0
field,"calendar.event,status",0,Status,Statut,0
@@ -89,9 +67,29 @@ field,"calendar.event,timezone",0,Timezone,Fuseau Horaire,0
field,"calendar.event,transp",0,Time Transparency,Transparence,0
field,"calendar.event,uuid",0,UUID,UUID,0
field,"calendar.event,vevent",0,vevent,vevent,0
+field,"calendar.event-calendar.category,category",0,Category,Catégorie,0
+field,"calendar.event-calendar.category,event",0,Event,Événement,0
+field,"calendar.event-calendar.category,rec_name",0,Name,Nom,0
+field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Alarme calendrier,0
+field,"calendar.event.alarm,event",0,Event,Événement,0
+field,"calendar.event.alarm,rec_name",0,Name,Nom,0
+field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Participant calendrier,0
+field,"calendar.event.attendee,event",0,Event,Événement,0
+field,"calendar.event.attendee,rec_name",0,Name,Nom,0
+field,"calendar.event.exdate,calendar_date",0,Calendar Date,Date calendrier,0
+field,"calendar.event.exdate,event",0,Event,Événement,0
+field,"calendar.event.exdate,rec_name",0,Name,Nom,0
+field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
+field,"calendar.event.exrule,event",0,Event,Événement,0
+field,"calendar.event.exrule,rec_name",0,Name,Nom,0
+field,"calendar.event.rdate,calendar_date",0,Calendar Date,Date calendrier,0
+field,"calendar.event.rdate,event",0,Event,Événement,0
+field,"calendar.event.rdate,rec_name",0,Name,Nom,0
+field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
+field,"calendar.event.rrule,event",0,Event,Événement,0
+field,"calendar.event.rrule,rec_name",0,Name,Nom,0
field,"calendar.location,name",0,Name,Nom,0
field,"calendar.location,rec_name",0,Name,Nom,0
-field,"calendar.rdate,date",0,Is Date,Est une date,0
field,"calendar.rrule,byday",0,By Day,Par jour,0
field,"calendar.rrule,byhour",0,By Hour,Par heure,0
field,"calendar.rrule,byminute",0,By Minute,Par minute,0
@@ -120,12 +118,12 @@ model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Calendrier
model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Calendrier - Écriture - Utilisateur,0
model,"calendar.category,name",0,Category,Catégorie,0
model,"calendar.date,name",0,Calendar Date,Date calendrier,0
+model,"calendar.event,name",0,Event,Événement,0
+model,"calendar.event-calendar.category,name",0,Event - Category,Évenement - Catégorie,0
model,"calendar.event.alarm,name",0,Alarm,Alarme,0
model,"calendar.event.attendee,name",0,Attendee,Participant,0
-model,"calendar.event-calendar.category,name",0,Event - Category,Évenement - Catégorie,0
model,"calendar.event.exdate,name",0,Exception Date,Date d'exception,0
model,"calendar.event.exrule,name",0,Exception Rule,Règle d'exception,0
-model,"calendar.event,name",0,Event,Événement,0
model,"calendar.event.rdate,name",0,Recurrence Date,Date de récurrence,0
model,"calendar.event.rrule,name",0,Recurrence Rule,Règle de récurrence,0
model,"calendar.location,name",0,Location,Emplacement,0
@@ -137,8 +135,8 @@ model,"ir.action,name",act_event_form2,Events,Événements,0
model,"ir.action,name",act_event_form3,Events,Événements,0
model,"ir.ui.menu,name",menu_calendar,Calendar Management,Gestion de calendrier,0
model,"ir.ui.menu,name",menu_calendar_form,Calendars,Calendriers,0
-model,"ir.ui.menu,name",menu_event_form,Events,Évenement,0
model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Nouveau calendrier,0
+model,"ir.ui.menu,name",menu_event_form,Events,Évenement,0
model,"ir.ui.menu,name",menu_event_form2,New Event,Nouvel événement,0
model,"res.group,name",group_calendar_admin,Calendar Administration,Administration calendrier,0
selection,"calendar.attendee,status",0,,,0
diff --git a/res.py b/res.py
index b9221bf..2329f67 100644
--- a/res.py
+++ b/res.py
@@ -1,8 +1,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 copy
from trytond.model import ModelView, ModelSQL, fields
from trytond.pyson import Bool, Eval, Or
-import copy
class User(ModelSQL, ModelView):
diff --git a/tests/test_calendar.py b/tests/test_calendar.py
index 4f42b7c..cc80b0a 100644
--- a/tests/test_calendar.py
+++ b/tests/test_calendar.py
@@ -25,7 +25,7 @@ class CalendarTestCase(unittest.TestCase):
'''
Test views.
'''
- self.assertRaises(Exception, test_view('calendar'))
+ test_view('calendar')
def suite():
suite = trytond.tests.test_tryton.suite()
diff --git a/tests/test_calendar.pyc b/tests/test_calendar.pyc
index 07e8ac7..02dbc50 100644
Binary files a/tests/test_calendar.pyc and b/tests/test_calendar.pyc differ
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index d049f34..4b0bad5 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.0
Name: trytond-calendar
-Version: 1.6.0
+Version: 1.8.0
Summary: Add CalDAV support
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.egg-info/requires.txt b/trytond_calendar.egg-info/requires.txt
index 44242eb..707195e 100644
--- a/trytond_calendar.egg-info/requires.txt
+++ b/trytond_calendar.egg-info/requires.txt
@@ -2,4 +2,4 @@ vobject >= 0.8.0
PyWebDAV >= 0.9.3
python-dateutil
pytz
-trytond >= 1.6, < 1.7
\ No newline at end of file
+trytond >= 1.8, < 1.9
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index 3f14d1a..a086807 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.cache import Cache
+from trytond.transaction import Transaction
CALDAV_NS = 'urn:ietf:params:xml:ns:caldav'
@@ -13,14 +15,11 @@ class Collection(ModelSQL, ModelView):
_name = "webdav.collection"
- def calendar(self, cursor, user, uri, ics=False, context=None):
+ def calendar(self, uri, ics=False):
'''
Return the calendar id in the uri or False
- :param cursor: the database cursor
- :param user: the user id
:param uri: the uri
- :param context: the context
:return: calendar id
or False if there is no calendar
'''
@@ -33,19 +32,16 @@ class Collection(ModelSQL, ModelView):
calendar = calendar[:-4]
else:
return False
- return calendar_obj.get_name(cursor, user, calendar, context=context)
+ return calendar_obj.get_name(calendar)
return False
@Cache('webdav_collection.event')
- def event(self, cursor, user, uri, calendar_id=False, context=None):
+ def event(self, uri, calendar_id=False):
'''
Return the event 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: event id
or False if there is no event
'''
@@ -54,26 +50,23 @@ class Collection(ModelSQL, ModelView):
if uri and uri.startswith('Calendars/'):
calendar, event_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
- event_ids = event_obj.search(cursor, user, [
+ event_ids = event_obj.search([
('calendar', '=', calendar_id),
('uuid', '=', event_uri[:-4]),
('parent', '=', False),
- ], limit=1, context=context)
+ ], limit=1)
if event_ids:
return event_ids[0]
return False
- def _caldav_filter_domain_calendar(self, cursor, user, filter, context=None):
+ def _caldav_filter_domain_calendar(self, filter):
'''
Return a domain for caldav filter on calendar
- :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
'''
if not filter:
@@ -82,14 +75,11 @@ class Collection(ModelSQL, ModelView):
return [('id', '=', 0)]
return [('id', '=', 0)]
- def _caldav_filter_domain_event(self, cursor, user, filter, context=None):
+ def _caldav_filter_domain_event(self, filter):
'''
Return a domain for caldav filter on event
- :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 = []
@@ -139,30 +129,26 @@ 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)
- event_id = self.event(cursor, user, uri, context=context)
+ event_id = self.event(uri)
if event_id:
ids.append(event_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')
event_obj = self.pool.get('calendar.event')
if uri in ('Calendars', 'Calendars/'):
- domain = self._caldav_filter_domain_calendar(cursor, user,
- filter, context=context)
- domain = [['OR', ('owner', '=', user), ('read_users', '=', user)],
+ domain = self._caldav_filter_domain_calendar(filter)
+ domain = [['OR', ('owner', '=', Transaction().user), ('read_users', '=', Transaction().user)],
domain]
- calendar_ids = calendar_obj.search(cursor, user, domain,
- context=context)
- calendars = calendar_obj.browse(cursor, user, calendar_ids,
- context=context)
+ calendar_ids = calendar_obj.search(domain)
+ calendars = calendar_obj.browse(calendar_ids)
if cache is not None:
cache.setdefault('_calendar', {})
cache['_calendar'].setdefault(calendar_obj._name, {})
@@ -171,16 +157,14 @@ class Collection(ModelSQL, ModelView):
return [x.name for x in calendars] + \
[x.name + '.ics' for x in calendars]
if uri 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_event(cursor, user, filter,
- context=context)
- event_ids = event_obj.search(cursor, user, [
+ domain = self._caldav_filter_domain_event(filter)
+ event_ids = event_obj.search([
('calendar', '=', calendar_id),
domain,
- ], context=context)
- events = event_obj.browse(cursor, user, event_ids,
- context=context)
+ ])
+ events = event_obj.browse(event_ids)
if cache is not None:
cache.setdefault('_calendar', {})
cache['_calendar'].setdefault(event_obj._name, {})
@@ -188,8 +172,8 @@ class Collection(ModelSQL, ModelView):
cache['_calendar'][event_obj._name][event_id] = {}
return [x.uuid + '.ics' for x in events]
return []
- 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 not uri and not filter:
res.append('Calendars')
elif not uri and filter:
@@ -197,50 +181,45 @@ class Collection(ModelSQL, ModelView):
res.append('Calendars')
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
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_displayname(self, cursor, user, uri, context=None, cache=None):
+ def get_displayname(self, uri, cache=None):
calendar_obj = self.pool.get('calendar.calendar')
if uri in ('Calendars', 'Calendars/'):
return 'Calendars'
- 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 calendar_obj.browse(cursor, user, calendar_id,
- context=context).rec_name
+ return calendar_obj.browse(calendar_id).rec_name
return uri.split('/')[-1]
- elif self.calendar(cursor, user, uri, ics=True, context=context):
+ elif self.calendar(uri, ics=True):
return uri.split('/')[-1]
- return super(Collection, self).get_displayname(cursor, user, uri,
- context=context, cache=cache)
+ return super(Collection, self).get_displayname(uri, cache=cache)
- def get_contenttype(self, cursor, user, uri, context=None, cache=None):
- if self.event(cursor, user, uri, context=context) \
- or self.calendar(cursor, user, uri, ics=True, context=context):
+ def get_contenttype(self, uri, cache=None):
+ if self.event(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')
event_obj = self.pool.get('calendar.event')
- calendar_id = self.calendar(cursor, user, uri, context=context)
+ 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:
if not (uri[10:].split('/', 1) + [None])[1]:
if cache is not None:
@@ -256,6 +235,7 @@ class Collection(ModelSQL, ModelView):
else:
ids = [calendar_id]
res = None
+ cursor = Transaction().cursor
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)
@@ -274,8 +254,7 @@ class Collection(ModelSQL, ModelView):
if res is not None:
return res
else:
- event_id = self.event(cursor, user, uri, calendar_id=calendar_id,
- context=context)
+ event_id = self.event(uri, calendar_id=calendar_id)
if event_id:
if cache is not None:
cache.setdefault('_calendar', {})
@@ -290,6 +269,7 @@ class Collection(ModelSQL, ModelView):
else:
ids = [event_id]
res = None
+ cursor = Transaction().cursor
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)
@@ -307,14 +287,14 @@ class Collection(ModelSQL, ModelView):
[event_id2]['creationdate'] = date
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')
event_obj = self.pool.get('calendar.event')
- calendar_id = self.calendar(cursor, user, uri, context=context)
+ cursor = Transaction().cursor
+ calendar_id = self.calendar(uri)
if calendar_id:
if not (uri[10:].split('/', 1) + [None])[1]:
if cache is not None:
@@ -349,8 +329,7 @@ class Collection(ModelSQL, ModelView):
if res is not None:
return res
else:
- event_id = self.event(cursor, user, uri, calendar_id=calendar_id,
- context=context)
+ event_id = self.event(uri, calendar_id=calendar_id)
if event_id:
if cache is not None:
cache.setdefault('_calendar', {})
@@ -388,8 +367,7 @@ class Collection(ModelSQL, ModelView):
[event_id2]['lastmodified'] = date
if res is not None:
return res
- calendar_ics_id = self.calendar(cursor, user, uri, ics=True,
- context=context)
+ calendar_ics_id = self.calendar(uri, ics=True)
if calendar_ics_id:
if cache is not None:
cache.setdefault('_calendar', {})
@@ -422,37 +400,31 @@ class Collection(ModelSQL, ModelView):
[calendar_id2]['lastmodified ics'] = date
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):
event_obj = self.pool.get('calendar.event')
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
- event_id = self.event(cursor, user, uri, calendar_id=calendar_id,
- context=context)
+ event_id = self.event(uri, calendar_id=calendar_id)
if not event_id:
raise DAV_NotFound
- ical = event_obj.event2ical(cursor, user, event_id, context=context)
+ ical = event_obj.event2ical(event_id)
return ical.serialize()
- calendar_ics_id = self.calendar(cursor, user, uri, ics=True,
- context=context)
+ calendar_ics_id = self.calendar(uri, ics=True)
if calendar_ics_id:
- ical = calendar_obj.calendar2ical(cursor, user, calendar_ics_id,
- context=context)
+ ical = calendar_obj.calendar2ical(calendar_ics_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 get_calendar_description(self, cursor, user, uri, context=None,
- cache=None):
+ def get_calendar_description(self, uri, cache=None):
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]:
if cache is not None:
@@ -470,8 +442,7 @@ class Collection(ModelSQL, ModelView):
else:
ids = [calendar_id]
res = None
- for calendar in calendar_obj.browse(cursor, user, ids,
- context=context):
+ for calendar in calendar_obj.browse(ids):
if calendar.id == calendar_id:
res = calendar.description
if cache is not None:
@@ -484,150 +455,121 @@ class Collection(ModelSQL, ModelView):
return res
raise DAV_NotFound
- def get_calendar_data(self, cursor, user, uri, context=None, cache=None):
- return self.get_data(cursor, user, uri, context=context, cache=cache)\
- .decode('utf-8')
+ def get_calendar_data(self, uri, cache=None):
+ return self.get_data(uri, cache=cache).decode('utf-8')
- def get_calendar_home_set(self, cursor, user, uri, context=None,
- cache=None):
+ def get_calendar_home_set(self, uri, cache=None):
return '/Calendars'
- def get_calendar_user_address_set(self, cursor, user_id, uri, context=None,
- cache=None):
+ def get_calendar_user_address_set(self, uri, cache=None):
user_obj = self.pool.get('res.user')
- user = user_obj.browse(cursor, user_id, user_id, context=context)
+ user = user_obj.browse(Transaction().user)
if user.email:
return user.email
raise DAV_NotFound
- def get_schedule_inbox_URL(self, cursor, user, uri, context=None,
- cache=None):
+ def get_schedule_inbox_URL(self, uri, cache=None):
calendar_obj = self.pool.get('calendar.calendar')
+ user = Transaction().user
- calendar_ids = calendar_obj.search(cursor, user, [
+ calendar_ids = calendar_obj.search([
('owner', '=', user),
- ], limit=1, context=context)
+ ], limit=1)
if not calendar_ids:
# Sunbird failed with no value
return '/Calendars'
- calendar = calendar_obj.browse(cursor, user, calendar_ids[0],
- context=context)
+ calendar = calendar_obj.browse(calendar_ids[0])
return '/Calendars/' + calendar.name
- def get_schedule_outbox_URL(self, cursor, user, uri, context=None,
- cache=None):
- return self.get_schedule_inbox_URL(cursor, user, uri, context=context,
- cache=cache)
+ def get_schedule_outbox_URL(self, uri, cache=None):
+ return self.get_schedule_inbox_URL(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):
event_obj = self.pool.get('calendar.event')
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
- event_id = self.event(cursor, user, uri, calendar_id=calendar_id,
- context=context)
+ event_id = self.event(uri, calendar_id=calendar_id)
if not event_id:
ical = vobject.readOne(data)
- values = event_obj.ical2values(cursor, user, None, ical,
- calendar_id, context=context)
- event_id = event_obj.create(cursor, user, values,
- context=context)
- event = event_obj.browse(cursor, user, event_id,
- context=context)
- calendar = calendar_obj.browse(cursor, user, calendar_id,
- context=context)
- return cursor.database_name + '/Calendars/' + calendar.name + \
- '/' + event.uuid + '.ics'
+ values = event_obj.ical2values(None, ical, calendar_id)
+ event_id = event_obj.create(values)
+ event = event_obj.browse(event_id)
+ calendar = calendar_obj.browse(calendar_id)
+ return (Transaction().cursor.database_name + '/Calendars/' +
+ calendar.name + '/' + event.uuid + '.ics')
else:
ical = vobject.readOne(data)
- values = event_obj.ical2values(cursor, user, event_id, ical,
- calendar_id, context=context)
- event_obj.write(cursor, user, event_id, values,
- context=context)
+ values = event_obj.ical2values(event_id, ical, calendar_id)
+ event_obj.write(event_id, values)
return
- calendar_ics_id = self.calendar(cursor, user, uri, ics=True,
- context=context)
+ calendar_ics_id = self.calendar(uri, ics=True)
if calendar_ics_id:
raise DAV_Forbidden
- return super(Collection, self).put(cursor, user, uri, data,
- content_type, context=context)
+ return super(Collection, self).put(uri, data, content_type)
- def mkcol(self, cursor, user, uri, context=None, cache=None):
+ def mkcol(self, uri, cache=None):
if uri and uri.startswith('Calendars/'):
raise DAV_Forbidden
- return super(Collection, self).mkcol(cursor, user, uri, context=context,
- cache=cache)
+ return super(Collection, self).mkcol(uri, cache=cache)
- def rmcol(self, cursor, user, uri, context=None, cache=None):
+ def rmcol(self, uri, cache=None):
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]:
try:
- calendar_obj.delete(cursor, user, calendar_id,
- context=context)
- except:
+ calendar_obj.delete(calendar_id)
+ except Exception:
raise DAV_Forbidden
return 200
raise DAV_Forbidden
- return super(Collection, self).rmcol(cursor, user, uri, context=context,
- cache=cache)
+ return super(Collection, self).rmcol(uri, cache=cache)
- def rm(self, cursor, user, uri, context=None, cache=None):
+ def rm(self, uri, cache=None):
event_obj = self.pool.get('calendar.event')
- 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 403
- event_id = self.event(cursor, user, uri, calendar_id=calendar_id,
- context=context)
+ event_id = self.event(uri, calendar_id=calendar_id)
if event_id:
try:
- event_obj.delete(cursor, user, event_id, context=context)
- except:
+ event_obj.delete(event_id)
+ except Exception:
return 403
return 200
return 404
- calendar_ics_id = self.calendar(cursor, user, uri, ics=True,
- context=context)
+ calendar_ics_id = self.calendar(uri, ics=True)
if calendar_ics_id:
return 403
- 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.event(cursor, user, uri, calendar_id=calendar_id,
- context=context):
+ if self.event(uri, calendar_id=calendar_id):
return 1
- calendar_ics_id = self.calendar(cursor, user, uri, ics=True,
- context=context)
+ calendar_ics_id = self.calendar(uri, ics=True)
if calendar_ics_id:
return 1
- return super(Collection, self).exists(cursor, user, uri, context=context,
- cache=cache)
+ return super(Collection, self).exists(uri, cache=cache)
- def current_user_privilege_set(self, cursor, user, uri, context=None,
- cache=None):
+ def current_user_privilege_set(self, uri, cache=None):
'''
Return the privileges of the current user for uri
Privileges ares: create, read, write, delete
- :param cursor: the database cursor
- :param user: the user id
:param uri: the uri
- :param context: the context
:param cache: the cache
:return: a list of privileges
'''
@@ -636,10 +578,9 @@ class Collection(ModelSQL, ModelView):
if uri in ('Calendars', 'Calendars/'):
return ['create', 'read', 'write', 'delete']
if uri and uri.startswith('Calendars/'):
- calendar_id = self.calendar(cursor, user, uri, context=context)
+ calendar_id = self.calendar(uri)
if calendar_id:
- calendar = calendar_obj.browse(cursor, user, calendar_id,
- context=context)
+ calendar = calendar_obj.browse(calendar_id)
if user == calendar.owner.id:
return ['create', 'read', 'write', 'delete']
res = []
@@ -649,7 +590,7 @@ class Collection(ModelSQL, ModelView):
res.extend(['read', 'write', 'delete'])
return res
return []
- return super(Collection, self).current_user_privilege_set(cursor, user,
- uri, context=context, cache=cache)
+ return super(Collection, self).current_user_privilege_set(uri,
+ cache=cache)
Collection()
commit 504d77091f536edd3abdcf4ca60c6496c0d50e8e
Author: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Date: Mon May 10 16:49:29 2010 +0200
Adding upstream version 1.6.0.
diff --git a/CHANGELOG b/CHANGELOG
index 035fbe7..ecc0320 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,8 +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)
+Version 1.6.0 - 2010-05-09
+* Bug fixes (see mercurial logs for details)
+* Remove classification_public
Version 1.4.0 - 2009-10-19
* Initial release
diff --git a/PKG-INFO b/PKG-INFO
index f37d9ae..df6d2d5 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.0
Name: trytond_calendar
-Version: 1.4.2
+Version: 1.6.0
Summary: Add CalDAV support
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/README b/README
index fdb062c..b662e80 100644
--- a/README
+++ b/README
@@ -1,5 +1,5 @@
trytond_calendar
-======================
+================
The calendar module of the Tryton application platform. See
__tryton__.py
diff --git a/__tryton__.py b/__tryton__.py
index 4830f9f..57872dc 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
'name_es_CO' : 'Calendario',
'name_es_ES' : 'Calendario',
'name_fr_FR' : 'Calendrier',
- 'version' : '1.4.2',
+ 'version' : '1.6.0',
'author' : 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
diff --git a/calendar.py b/calendar.py
index 20c61f4..be0c723 100644
--- a/calendar.py
+++ b/calendar.py
@@ -2,6 +2,8 @@
#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.backend import TableHandler
+from trytond.pyson import If, Bool, Not, Eval, Greater
import uuid
import vobject
import dateutil.tz
@@ -69,6 +71,7 @@ class Calendar(ModelSQL, ModelView):
return False
return True
+ @Cache('calendar_calendar.get_name')
def get_name(self, cursor, user, name, context=None):
'''
Return the calendar id of the name
@@ -86,8 +89,6 @@ class Calendar(ModelSQL, ModelView):
return calendar_ids[0]
return False
- get_name = Cache('calendar_calendar.get_name')(get_name)
-
def calendar2ical(self, cursor, user, calendar_id, context=None):
'''
Return an iCalendar object for the given calendar_id containing
@@ -286,6 +287,7 @@ class Calendar(ModelSQL, ModelView):
:param context: the context
:return: the xml with schedule-response
'''
+ from DAV.errors import DAV_Forbidden
collection_obj = self.pool.get('webdav.collection')
calendar_id = collection_obj.calendar(cursor, user, uri,
@@ -432,7 +434,7 @@ class Event(ModelSQL, ModelView):
uuid = fields.Char('UUID', required=True,
help='Universally Unique Identifier', select=1)
calendar = fields.Many2One('calendar.calendar', 'Calendar',
- required=True, select=1)
+ required=True, select=1, ondelete="CASCADE")
summary = fields.Char('Summary')
sequence = fields.Integer('Sequence')
description = fields.Text('Description')
@@ -455,7 +457,7 @@ class Event(ModelSQL, ModelView):
('cancelled', 'Cancelled'),
], 'Status')
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.event.attendee', 'event',
'Attendees')
@@ -466,47 +468,45 @@ class Event(ModelSQL, ModelView):
alarms = fields.One2Many('calendar.event.alarm', 'event', 'Alarms')
rdates = fields.One2Many('calendar.event.rdate', 'event', 'Recurrence Dates',
states={
- 'invisible': "bool(parent)",
+ 'invisible': Bool(Eval('parent')),
}, depends=['parent'])
rrules = fields.One2Many('calendar.event.rrule', 'event', 'Recurrence Rules',
states={
- 'invisible': "bool(parent)",
+ 'invisible': Bool(Eval('parent')),
}, depends=['parent'])
exdates = fields.One2Many('calendar.event.exdate', 'event', 'Exception Dates',
states={
- 'invisible': "bool(parent)",
+ 'invisible': Bool(Eval('parent')),
}, depends=['parent'])
exrules = fields.One2Many('calendar.event.exrule', 'event', 'Exception Rules',
states={
- 'invisible': "bool(parent)",
+ 'invisible': Bool(Eval('parent')),
}, depends=['parent'])
occurences = fields.One2Many('calendar.event', 'parent', 'Occurences',
- domain=["('uuid', '=', uuid)",
- "('calendar', '=', calendar)"],
+ domain=[
+ ('uuid', '=', Eval('uuid')),
+ ('calendar', '=', Eval('calendar')),
+ ],
states={
- 'invisible': "bool(parent)",
+ 'invisible': Bool(Eval('parent')),
}, depends=['uuid', 'calendar', 'parent'])
parent = fields.Many2One('calendar.event', 'Parent',
- domain=["('uuid', '=', uuid)",
- "('parent', '=', False)",
- "('calendar', '=', calendar)"],
+ domain=[
+ ('uuid', '=', Eval('uuid')),
+ ('parent', '=', False),
+ ('calendar', '=', Eval('calendar')),
+ ],
ondelete='CASCADE', depends=['uuid', 'calendar'])
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'])
- 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.Many2One('res.user',
+ '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')
vevent = fields.Binary('vevent')
def __init__(self):
@@ -522,6 +522,20 @@ class Event(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_calendar_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(Event, self).init(cursor, module_name)
+
def default_uuid(self, cursor, user, context=None):
return str(uuid.uuid4())
@@ -542,7 +556,7 @@ class Event(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 = {}
@@ -554,35 +568,8 @@ class Event(ModelSQL, ModelView):
res[event.id] = event.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 event in self.browse(cursor, user, ids, context=context):
- res[event.id] = False
- if event.classification == 'public':
- res[event.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):
'''
@@ -1361,7 +1348,7 @@ class Attendee(ModelSQL, ModelView):
_name = 'calendar.attendee'
email = fields.Char('Email', required=True, states={
- 'readonly': 'active_id > 0',
+ 'readonly': Greater(Eval('active_id', 0), 0),
})
status = fields.Selection([
('', ''),
@@ -1621,16 +1608,24 @@ class EventAttendee(ModelSQL, ModelView):
EventAttendee()
-class RDate(ModelSQL, ModelView):
- 'Recurrence Date'
+class Date(ModelSQL, ModelView):
+ 'Calendar Date'
_description = __doc__
- _name = 'calendar.rdate'
+ _name = 'calendar.date'
_rec_name = 'datetime'
date = fields.Boolean('Is Date', help='Ignore time of field "Date", ' \
'but handle as date only.')
datetime = fields.DateTime('Date', required=True)
+ def init(self, cursor, module_name):
+ # Migration from 1.4: calendar.rdate renamed to calendar.date
+ old_table = 'calendar_rdate'
+ if TableHandler.table_exist(cursor, old_table):
+ TableHandler.table_rename(cursor, old_table, self._table)
+
+ return super(Date, self).init(cursor, module_name)
+
def _date2update(self, cursor, user, date, context=None):
res = {}
res['date'] = date.date
@@ -1666,7 +1661,7 @@ class RDate(ModelSQL, ModelView):
:param cursor: the database cursor
:param user: the user id
- :param date: a BrowseRecord of calendar.rdate or
+ :param date: a BrowseRecord of calendar.date or
calendar.exdate
:param context: the context
:return: a datetime
@@ -1678,21 +1673,30 @@ class RDate(ModelSQL, ModelView):
res = date.datetime.replace(tzinfo=tzlocal).astimezone(tzutc)
return res
-RDate()
+Date()
class EventRDate(ModelSQL, ModelView):
'Recurrence Date'
_description = __doc__
_name = 'calendar.event.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)
event = fields.Many2One('calendar.event', 'Event', 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(EventRDate, self).init(cursor, module_name)
+
def create(self, cursor, user, values, context=None):
event_obj = self.pool.get('calendar.event')
if values.get('event'):
@@ -1717,11 +1721,11 @@ class EventRDate(ModelSQL, ModelView):
def delete(self, cursor, user, ids, context=None):
event_obj = self.pool.get('calendar.event')
- rdate_obj = self.pool.get('calendar.rdate')
+ rdate_obj = self.pool.get('calendar.date')
if isinstance(ids, (int, long)):
ids = [ids]
event_rdates = self.browse(cursor, user, ids, context=context)
- rdate_ids = [a.calendar_rdate.id for a in event_rdates]
+ rdate_ids = [a.calendar_date.id for a in event_rdates]
event_ids = [x.event.id for x in event_rdates]
if event_ids:
# Update write_date of event
@@ -1732,15 +1736,15 @@ class EventRDate(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)
EventRDate()
@@ -1796,8 +1800,8 @@ class RRule(ModelSQL, ModelView):
def __init__(self):
super(RRule, self).__init__()
self._sql_constraints += [
- ('until_count',
- 'CHECK(until IS NULL OR count IS NULL)',
+ ('until_count_only_one',
+ 'CHECK(until IS NULL OR count IS NULL OR count = 0)',
'Only one of "until" and "count" can be set!'),
]
self._constraints += [
@@ -1823,6 +1827,12 @@ class RRule(ModelSQL, ModelView):
'invalid_bysetpos': 'Invalid "By Position"',
})
+ def init(self, cursor, module_name):
+ # Migrate from 1.4: unit_count replaced by until_count_only_one
+ table = TableHandler(cursor, self, module_name)
+ table.drop_constraint('until_count')
+ return super(RRule, self).init(cursor, module_name)
+
def check_bysecond(self, cursor, user, ids):
for rule in self.browse(cursor, user, ids):
if not rule.bysecond:
diff --git a/calendar.xml b/calendar.xml
index 8a0b020..07e9a33 100644
--- a/calendar.xml
+++ b/calendar.xml
@@ -68,6 +68,23 @@ this repository contains the full copyright notices and license terms. -->
</record>
<menuitem parent="menu_calendar" sequence="1"
action="act_calendar_form" id="menu_calendar_form"/>
+ <record model="ir.action.act_window" id="act_calendar_form2">
+ <field name="name">Calendars</field>
+ <field name="res_model">calendar.calendar</field>
+ <field name="view_type">form</field>
+ </record>
+ <record model="ir.action.act_window.view" id="act_calendar_form2_view1">
+ <field name="sequence" eval="10"/>
+ <field name="view" ref="calendar_view_form"/>
+ <field name="act_window" ref="act_calendar_form2"/>
+ </record>
+ <record model="ir.action.act_window.view" id="act_calendar_form2_view2">
+ <field name="sequence" eval="20"/>
+ <field name="view" ref="calendar_view_tree"/>
+ <field name="act_window" ref="act_calendar_form2"/>
+ </record>
+ <menuitem name="New Calendar" parent="menu_calendar_form" sequence="10"
+ action="act_calendar_form2" id="menu_calendar_form2"/>
<record model="ir.rule.group" id="rule_group_read_calendar">
<field name="model" search="[('model', '=', 'calendar.event')]"/>
@@ -90,12 +107,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="operand">User</field>
<field name="rule_group" ref="rule_group_read_calendar"/>
</record>
- <record model="ir.rule" id="rule_group_read_calendar_line3">
- <field name="field" search="[('name', '=', 'classification_public'), ('model.model', '=', 'calendar.event')]"/>
- <field name="operator">=</field>
- <field name="operand">True</field>
- <field name="rule_group" ref="rule_group_read_calendar"/>
- </record>
<record model="ir.rule.group" id="rule_group_write_calendar">
<field name="model" search="[('model', '=', 'calendar.event')]"/>
@@ -227,7 +238,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="attendees" colspan="4"/>
</page>
<page string="Occurences" id="occurences"
- states="{'invisible': '''bool(globals().get('_parent_parent'))'''}">
+ states="{'invisible': Bool(Eval('_parent_parent'))}">
<field name="rrules" colspan="2"/>
<field name="rdates" colspan="2"/>
<field name="exrules" colspan="2"/>
@@ -266,8 +277,49 @@ this repository contains the full copyright notices and license terms. -->
<field name="view" ref="event_view_form"/>
<field name="act_window" ref="act_event_form"/>
</record>
- <menuitem parent="menu_calendar_form" sequence="1"
+ <menuitem parent="menu_calendar_form" sequence="20"
action="act_event_form" id="menu_event_form"/>
+ <record model="ir.action.act_window" id="act_event_form2">
+ <field name="name">Events</field>
+ <field name="res_model">calendar.event</field>
+ <field name="view_type">form</field>
+ <field name="domain">[('parent', '=', False)]</field>
+ </record>
+ <record model="ir.action.act_window.view" id="act_event_form2_view1">
+ <field name="sequence" eval="10"/>
+ <field name="view" ref="event_view_form"/>
+ <field name="act_window" ref="act_event_form2"/>
+ </record>
+ <record model="ir.action.act_window.view" id="act_event_form2_view2">
+ <field name="sequence" eval="20"/>
+ <field name="view" ref="event_view_tree"/>
+ <field name="act_window" ref="act_event_form2"/>
+ </record>
+ <menuitem name="New Event" parent="menu_event_form" sequence="10"
+ action="act_event_form2" id="menu_event_form2"/>
+
+ <record model="ir.action.act_window" id="act_event_form3">
+ <field name="name">Events</field>
+ <field name="res_model">calendar.event</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_event_form3_view1">
+ <field name="sequence" eval="10"/>
+ <field name="view" ref="event_view_tree"/>
+ <field name="act_window" ref="act_event_form3"/>
+ </record>
+ <record model="ir.action.act_window.view" id="act_event_form3_view2">
+ <field name="sequence" eval="20"/>
+ <field name="view" ref="event_view_form"/>
+ <field name="act_window" ref="act_event_form3"/>
+ </record>
+ <record model="ir.action.keyword"
+ id="act_open_event_keyword1">
+ <field name="keyword">form_relate</field>
+ <field name="model">calendar.calendar,0</field>
+ <field name="action" ref="act_event_form3"/>
+ </record>
<record model="ir.ui.view" id="attendee_view_tree">
<field name="model">calendar.event.attendee</field>
diff --git a/de_DE.csv b/de_DE.csv
index abef7ff..ba69519 100644
--- a/de_DE.csv
+++ b/de_DE.csv
@@ -35,6 +35,9 @@ field,"calendar.calendar-write-res.user,user",0,User,Benutzer,0
field,"calendar.calendar,write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
field,"calendar.category,name",0,Name,Name,0
field,"calendar.category,rec_name",0,Name,Name,0
+field,"calendar.date,date",0,Is Date,Als Datum,0
+field,"calendar.date,datetime",0,Date,Zeitpunkt,0
+field,"calendar.date,rec_name",0,Name,Name,0
field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Kalender Alarm,0
field,"calendar.event.alarm,event",0,Event,Termin,0
field,"calendar.event.alarm,rec_name",0,Name,Name,0
@@ -53,11 +56,10 @@ field,"calendar.event,calendar_read_users",0,Read Users,Benutzer mit Leseberecht
field,"calendar.event,calendar_write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
field,"calendar.event,categories",0,Categories,Kategorien,0
field,"calendar.event,classification",0,Classification,Klassifizierung,0
-field,"calendar.event,classification_public",0,Classification Public,Öffentliche Klassifizierung,0
field,"calendar.event,description",0,Description,Bezeichnung,0
field,"calendar.event,dtend",0,End Date,Enddatum,0
field,"calendar.event,dtstart",0,Start Date,Anfangsdatum,0
-field,"calendar.event.exdate,calendar_rdate",0,Calendar RDate,Kalender WDatum,0
+field,"calendar.event.exdate,calendar_date",0,Calendar Date,Kalender Datum,0
field,"calendar.event.exdate,event",0,Event,Termin,0
field,"calendar.event.exdate,rec_name",0,Name,Name,0
field,"calendar.event,exdates",0,Exception Dates,Ausnahmedaten,0
@@ -69,7 +71,7 @@ field,"calendar.event,location",0,Location,Ort,0
field,"calendar.event,occurences",0,Occurences,Ereignisse,0
field,"calendar.event,organizer",0,Organizer,Organisator,0
field,"calendar.event,parent",0,Parent,Übergeordnet (Termin),0
-field,"calendar.event.rdate,calendar_rdate",0,Calendar RDate,Kalender WDatum,0
+field,"calendar.event.rdate,calendar_date",0,Calendar Date,Kalender Datum,0
field,"calendar.event.rdate,event",0,Event,Termin,0
field,"calendar.event.rdate,rec_name",0,Name,Name,0
field,"calendar.event,rdates",0,Recurrence Dates,Wiederholungsdaten,0
@@ -79,7 +81,7 @@ field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
field,"calendar.event.rrule,event",0,Event,Termin,0
field,"calendar.event.rrule,rec_name",0,Name,Name,0
field,"calendar.event,rrules",0,Recurrence Rules,Wiederholungsregeln,0
-field,"calendar.event,sequence",0,Sequence,Sequenz,0
+field,"calendar.event,sequence",0,Sequence,Revision,0
field,"calendar.event,status",0,Status,Status,0
field,"calendar.event,summary",0,Summary,Zusammenfassung,0
field,"calendar.event,timezone",0,Timezone,Zeitzone,0
@@ -88,9 +90,6 @@ field,"calendar.event,uuid",0,UUID,UUID,0
field,"calendar.event,vevent",0,vevent,vevent,0
field,"calendar.location,name",0,Name,Name,0
field,"calendar.location,rec_name",0,Name,Name,0
-field,"calendar.rdate,date",0,Is Date,Als Datum,0
-field,"calendar.rdate,datetime",0,Date,Zeitpunkt,0
-field,"calendar.rdate,rec_name",0,Name,Name,0
field,"calendar.rrule,byday",0,By Day,Für Tag,0
field,"calendar.rrule,byhour",0,By Hour,Für Stunde,0
field,"calendar.rrule,byminute",0,By Minute,Für Minute,0
@@ -109,8 +108,8 @@ field,"calendar.rrule,until_date",0,Is Date,Als Datum,0
field,"calendar.rrule,wkst",0,Week Day,Wochentag,0
field,"res.user,calendars",0,Calendars,Kalender,0
help,"calendar.calendar,owner",0,The user must have an email,Dem Benutzer muss eine E-Mail-Adresse zugeordnet sein!,0
+help,"calendar.date,date",0,"Ignore time of field ""Date"", but handle as date only.","Verwende von Feld ""Zeitpunkt"" nur das Datum ohne den Zeitanteil.",0
help,"calendar.event,uuid",0,Universally Unique Identifier,Universally Unique Identifier,0
-help,"calendar.rdate,date",0,"Ignore time of field ""Date"", but handle as date only.","Verwende von Feld ""Zeitpunkt"" nur das Datum ohne den Zeitanteil.",0
help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","Verwende von Feld ""Bis Zeitpunkt"" nur das Datum ohne den Zeitanteil.",0
model,"calendar.alarm,name",0,Alarm,Alarm,0
model,"calendar.attendee,name",0,Attendee,Teilnehmer,0
@@ -118,6 +117,7 @@ model,"calendar.calendar,name",0,Calendar,Kalender,0
model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Kalender - Schreiben - Benutzer,0
model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Kalender - Lesen - Benutzer,0
model,"calendar.category,name",0,Category,Kategorie,0
+model,"calendar.date,name",0,Calendar Date,Kalender Datum,0
model,"calendar.event.alarm,name",0,Alarm,Alarm,0
model,"calendar.event.attendee,name",0,Attendee,Teilnehmer,0
model,"calendar.event-calendar.category,name",0,Event - Category,Termin - Kategorie,0
@@ -127,13 +127,17 @@ model,"calendar.event,name",0,Event,Termin,0
model,"calendar.event.rdate,name",0,Recurrence Date,Wiederholungsdatum,0
model,"calendar.event.rrule,name",0,Recurrence Rule,Wiederholungsregel,0
model,"calendar.location,name",0,Location,Ort,0
-model,"calendar.rdate,name",0,Recurrence Date,Wiederholungsdatum,0
model,"calendar.rrule,name",0,Recurrence Rule,Wiederholungsregel,0
model,"ir.action,name",act_calendar_form,Calendars,Kalender,0
+model,"ir.action,name",act_calendar_form2,Calendars,Kalender,0
model,"ir.action,name",act_event_form,Events,Termine,0
+model,"ir.action,name",act_event_form2,Events,Termine,0
+model,"ir.action,name",act_event_form3,Events,Termine,0
model,"ir.ui.menu,name",menu_calendar,Calendar Management,Kalender,0
model,"ir.ui.menu,name",menu_calendar_form,Calendars,Kalender,0
model,"ir.ui.menu,name",menu_event_form,Events,Termine,0
+model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Neuer Kalender,0
+model,"ir.ui.menu,name",menu_event_form2,New Event,Neuer Termin,0
model,"res.group,name",group_calendar_admin,Calendar Administration,Kalender Administration,0
selection,"calendar.attendee,status",0,,,0
selection,"calendar.attendee,status",0,Accepted,Angenommen,0
diff --git a/es_CO.csv b/es_CO.csv
index ad65390..6b16971 100644
--- a/es_CO.csv
+++ b/es_CO.csv
@@ -35,6 +35,9 @@ field,"calendar.calendar-write-res.user,user",0,User,Usuario,0
field,"calendar.calendar,write_users",0,Write Users,Escribir Usuarios,0
field,"calendar.category,name",0,Name,Nombre,0
field,"calendar.category,rec_name",0,Name,Nombre,0
+field,"calendar.date,date",0,Is Date,Es Fecha,0
+field,"calendar.date,datetime",0,Date,Fecha,1
+field,"calendar.date,rec_name",0,Name,Nombre de Contacto,1
field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,,0
field,"calendar.event.alarm,event",0,Event,Evento,0
field,"calendar.event.alarm,rec_name",0,Name,Nombre,0
@@ -53,11 +56,10 @@ field,"calendar.event,calendar_read_users",0,Read Users,Usuarios que pueden Leer
field,"calendar.event,calendar_write_users",0,Write Users,Escribir Usuarios,0
field,"calendar.event,categories",0,Categories,Categorías,0
field,"calendar.event,classification",0,Classification,Clasificación,0
-field,"calendar.event,classification_public",0,Classification Public,Clasificación Pública,0
field,"calendar.event,description",0,Description,Descripción,0
field,"calendar.event,dtend",0,End Date,Fecha Fin,0
field,"calendar.event,dtstart",0,Start Date,Fecha Inicial,0
-field,"calendar.event.exdate,calendar_rdate",0,Calendar RDate,,0
+field,"calendar.event.exdate,calendar_date",0,Calendar Date,Fecha Calendario,0
field,"calendar.event.exdate,event",0,Event,Evento,0
field,"calendar.event.exdate,rec_name",0,Name,Nombre,0
field,"calendar.event,exdates",0,Exception Dates,Fechas de Excepción,0
@@ -66,10 +68,10 @@ field,"calendar.event.exrule,event",0,Event,Evento,0
field,"calendar.event.exrule,rec_name",0,Name,Nombre,0
field,"calendar.event,exrules",0,Exception Rules,Reglas de Excepción,0
field,"calendar.event,location",0,Location,Lugar,0
-field,"calendar.event,occurences",0,Occurences,,0
+field,"calendar.event,occurences",0,Occurences,Ocurrencias,1
field,"calendar.event,organizer",0,Organizer,Organizador,0
field,"calendar.event,parent",0,Parent,Padre,0
-field,"calendar.event.rdate,calendar_rdate",0,Calendar RDate,,0
+field,"calendar.event.rdate,calendar_date",0,Calendar Date,Fecha Calendario,0
field,"calendar.event.rdate,event",0,Event,Evento,0
field,"calendar.event.rdate,rec_name",0,Name,Nombre,0
field,"calendar.event,rdates",0,Recurrence Dates,Fechas de Repetición,0
@@ -88,9 +90,6 @@ field,"calendar.event,uuid",0,UUID,UUID,0
field,"calendar.event,vevent",0,vevent,vevento,0
field,"calendar.location,name",0,Name,Nombre,0
field,"calendar.location,rec_name",0,Name,Nombre,0
-field,"calendar.rdate,date",0,Is Date,,0
-field,"calendar.rdate,datetime",0,Date,Fecha,0
-field,"calendar.rdate,rec_name",0,Name,Nombre,0
field,"calendar.rrule,byday",0,By Day,,0
field,"calendar.rrule,byhour",0,By Hour,,0
field,"calendar.rrule,byminute",0,By Minute,,0
@@ -109,8 +108,8 @@ field,"calendar.rrule,until_date",0,Is Date,,0
field,"calendar.rrule,wkst",0,Week Day,Día de la Semana,0
field,"res.user,calendars",0,Calendars,Calendarios,0
help,"calendar.calendar,owner",0,The user must have an email,,0
+help,"calendar.date,date",0,"Ignore time of field ""Date"", but handle as date only.","Ignore tiempo del campo ""Fecha"", pero manejelo como fecha solamente.",0
help,"calendar.event,uuid",0,Universally Unique Identifier,Idenitificador Universal Único,0
-help,"calendar.rdate,date",0,"Ignore time of field ""Date"", but handle as date only.",,0
help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.",,0
model,"calendar.alarm,name",0,Alarm,Alarma,0
model,"calendar.attendee,name",0,Attendee,Asistente,0
@@ -118,6 +117,7 @@ model,"calendar.calendar,name",0,Calendar,Calendario,0
model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Calendario - leer - Usuario,0
model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Calendario - escribir - Usuario,0
model,"calendar.category,name",0,Category,Categoría,0
+model,"calendar.date,name",0,Calendar Date,Fecha Calendario,0
model,"calendar.event.alarm,name",0,Alarm,Alarma,0
model,"calendar.event.attendee,name",0,Attendee,Asistente,0
model,"calendar.event-calendar.category,name",0,Event - Category,Evento - Categoría,0
@@ -127,13 +127,17 @@ model,"calendar.event,name",0,Event,Evento,0
model,"calendar.event.rdate,name",0,Recurrence Date,Fecha de Repetición,0
model,"calendar.event.rrule,name",0,Recurrence Rule,Regla de Repetición,0
model,"calendar.location,name",0,Location,Lugar,0
-model,"calendar.rdate,name",0,Recurrence Date,Fecha de Repetición,0
model,"calendar.rrule,name",0,Recurrence Rule,Regla de Repetición,0
model,"ir.action,name",act_calendar_form,Calendars,Calendarios,0
+model,"ir.action,name",act_calendar_form2,Calendars,Calendarios,0
model,"ir.action,name",act_event_form,Events,Eventos,0
+model,"ir.action,name",act_event_form2,Events,Eventos,0
+model,"ir.action,name",act_event_form3,Events,Eventos,0
model,"ir.ui.menu,name",menu_calendar,Calendar Management,Calendario,0
model,"ir.ui.menu,name",menu_calendar_form,Calendars,Calendarios,0
model,"ir.ui.menu,name",menu_event_form,Events,Eventos,0
+model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Nuevo Calendario,0
+model,"ir.ui.menu,name",menu_event_form2,New Event,Nuevo Evento,0
model,"res.group,name",group_calendar_admin,Calendar Administration,Administrar Calendario,0
selection,"calendar.attendee,status",0,,,0
selection,"calendar.attendee,status",0,Accepted,,0
@@ -175,7 +179,7 @@ view,calendar.event,0,Categories,Categorías,0
view,calendar.event,0,Event,Evento,0
view,calendar.event,0,Events,Eventos,0
view,calendar.event,0,General,General,0
-view,calendar.event,0,Occurences,,0
+view,calendar.event,0,Occurences,Ocurrencias,1
view,calendar.event,0,Recurrences,Repeticiones,0
view,calendar.event.attendee,0,Attendee,Asistente,0
view,calendar.event.attendee,0,Attendees,Asistentes,0
diff --git a/fr_FR.csv b/fr_FR.csv
index 68ec678..b2df1a2 100644
--- a/fr_FR.csv
+++ b/fr_FR.csv
@@ -35,6 +35,9 @@ field,"calendar.calendar-write-res.user,user",0,User,Utilisateur,0
field,"calendar.calendar,write_users",0,Write Users,Utilisateurs en écriture,0
field,"calendar.category,name",0,Name,Nom,0
field,"calendar.category,rec_name",0,Name,Nom,0
+field,"calendar.date,date",0,Is Date,Est une date,0
+field,"calendar.date,datetime",0,Date,Date,0
+field,"calendar.date,rec_name",0,Name,Nom,0
field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Alarme calendrier,0
field,"calendar.event.alarm,event",0,Event,Événement,0
field,"calendar.event.alarm,rec_name",0,Name,Nom,0
@@ -53,11 +56,10 @@ field,"calendar.event,calendar_read_users",0,Read Users,Utilisateurs en lecture,
field,"calendar.event,calendar_write_users",0,Write Users,Utilisateurs en écriture,0
field,"calendar.event,categories",0,Categories,Catégories,0
field,"calendar.event,classification",0,Classification,Classification,0
-field,"calendar.event,classification_public",0,Classification Public,Classification publique,0
field,"calendar.event,description",0,Description,Description,0
field,"calendar.event,dtend",0,End Date,Date de fin,0
field,"calendar.event,dtstart",0,Start Date,Date de début,0
-field,"calendar.event.exdate,calendar_rdate",0,Calendar RDate,Date de récurrence,0
+field,"calendar.event.exdate,calendar_date",0,Calendar Date,Date calendrier,0
field,"calendar.event.exdate,event",0,Event,Événement,0
field,"calendar.event.exdate,rec_name",0,Name,Nom,0
field,"calendar.event,exdates",0,Exception Dates,Dates d'exception,0
@@ -69,6 +71,7 @@ field,"calendar.event,location",0,Location,Emplacement,0
field,"calendar.event,occurences",0,Occurences,Occurrences,0
field,"calendar.event,organizer",0,Organizer,Organisateur,0
field,"calendar.event,parent",0,Parent,Parent,0
+field,"calendar.event.rdate,calendar_date",0,Calendar Date,Date calendrier,0
field,"calendar.event.rdate,calendar_rdate",0,Calendar RDate,Date de récurrence,0
field,"calendar.event.rdate,event",0,Event,Événement,0
field,"calendar.event.rdate,rec_name",0,Name,Nom,0
@@ -89,8 +92,6 @@ field,"calendar.event,vevent",0,vevent,vevent,0
field,"calendar.location,name",0,Name,Nom,0
field,"calendar.location,rec_name",0,Name,Nom,0
field,"calendar.rdate,date",0,Is Date,Est une date,0
-field,"calendar.rdate,datetime",0,Date,Date,0
-field,"calendar.rdate,rec_name",0,Name,Nom,0
field,"calendar.rrule,byday",0,By Day,Par jour,0
field,"calendar.rrule,byhour",0,By Hour,Par heure,0
field,"calendar.rrule,byminute",0,By Minute,Par minute,0
@@ -109,15 +110,16 @@ field,"calendar.rrule,until_date",0,Is Date,Est une date,0
field,"calendar.rrule,wkst",0,Week Day,Jour de la semaine,0
field,"res.user,calendars",0,Calendars,Calendriers,0
help,"calendar.calendar,owner",0,The user must have an email,L'utilisateur doit avoir une adresse mail,0
+help,"calendar.date,date",0,"Ignore time of field ""Date"", but handle as date only.","Ignorer l'heure du champ ""Date"" et considérer uniquement la date",0
help,"calendar.event,uuid",0,Universally Unique Identifier,Identificateur unique universel,0
-help,"calendar.rdate,date",0,"Ignore time of field ""Date"", but handle as date only.","Ignore l'heure du champ ""Date""",0
-help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","Ignore l'heure du champ ""Date de fin""",0
+help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","Ignorer l'heure du champ ""Date de fin"" et considérer uniquement la date",0
model,"calendar.alarm,name",0,Alarm,Alarme,0
model,"calendar.attendee,name",0,Attendee,Participant,0
model,"calendar.calendar,name",0,Calendar,Calendrier,0
model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Calendrier - Lecture - Utilisateur,0
model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Calendrier - Écriture - Utilisateur,0
model,"calendar.category,name",0,Category,Catégorie,0
+model,"calendar.date,name",0,Calendar Date,Date calendrier,0
model,"calendar.event.alarm,name",0,Alarm,Alarme,0
model,"calendar.event.attendee,name",0,Attendee,Participant,0
model,"calendar.event-calendar.category,name",0,Event - Category,Évenement - Catégorie,0
@@ -127,13 +129,17 @@ model,"calendar.event,name",0,Event,Événement,0
model,"calendar.event.rdate,name",0,Recurrence Date,Date de récurrence,0
model,"calendar.event.rrule,name",0,Recurrence Rule,Règle de récurrence,0
model,"calendar.location,name",0,Location,Emplacement,0
-model,"calendar.rdate,name",0,Recurrence Date,Date de récurrence,0
model,"calendar.rrule,name",0,Recurrence Rule,Règle de récurrence,0
model,"ir.action,name",act_calendar_form,Calendars,Calendriers,0
+model,"ir.action,name",act_calendar_form2,Calendars,Calendriers,0
model,"ir.action,name",act_event_form,Events,Événement,0
+model,"ir.action,name",act_event_form2,Events,Événements,0
+model,"ir.action,name",act_event_form3,Events,Événements,0
model,"ir.ui.menu,name",menu_calendar,Calendar Management,Gestion de calendrier,0
model,"ir.ui.menu,name",menu_calendar_form,Calendars,Calendriers,0
model,"ir.ui.menu,name",menu_event_form,Events,Évenement,0
+model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Nouveau calendrier,0
+model,"ir.ui.menu,name",menu_event_form2,New Event,Nouvel événement,0
model,"res.group,name",group_calendar_admin,Calendar Administration,Administration calendrier,0
selection,"calendar.attendee,status",0,,,0
selection,"calendar.attendee,status",0,Accepted,Accepté,0
diff --git a/res.py b/res.py
index 66e3a3f..b9221bf 100644
--- a/res.py
+++ b/res.py
@@ -1,6 +1,7 @@
#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, fields
+from trytond.pyson import Bool, Eval, Or
import copy
@@ -14,11 +15,13 @@ class User(ModelSQL, ModelView):
self.email = copy.copy(self.email)
self.email.states = copy.copy(self.email.states)
self.email.depends = copy.copy(self.email.depends)
- if 'required' in self.email.states:
- self.email.states['required'] = '(' + self.email.states['required'] \
- + ') or bool(calendars)'
+ required = Bool(Eval('calendars'))
+ if not self.email.states.get('required'):
+ self.email.states['required'] = required
else:
- self.email.states['required'] = 'bool(calendars)'
+ self.email.states['required'] = \
+ Or(self.email.states['required'],
+ required)
if 'calendars' not in self.email.depends:
self.email.depends.append('calendars')
diff --git a/setup.py b/setup.py
index af2225e..461d886 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',
version=info.get('version', '0.0.1'),
@@ -27,6 +30,7 @@ setup(name='trytond_calendar',
package_dir={'trytond.modules.calendar': '.'},
packages=[
'trytond.modules.calendar',
+ 'trytond.modules.calendar.tests',
],
package_data={
'trytond.modules.calendar': info.get('xml', []) \
@@ -55,4 +59,6 @@ setup(name='trytond_calendar',
[trytond.modules]
calendar = trytond.modules.calendar
""",
+ test_suite='tests',
+ test_loader='trytond.test_loader:Loader',
)
diff --git a/tests/__init__.py b/tests/__init__.py
index 2680025..8b786f9 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 import *
+from test_calendar import suite
diff --git a/tests/__init__.pyc b/tests/__init__.pyc
new file mode 100644
index 0000000..b370054
Binary files /dev/null and b/tests/__init__.pyc differ
diff --git a/tests/test_calendar.py b/tests/test_calendar.py
index 78e6314..4f42b7c 100644
--- a/tests/test_calendar.py
+++ b/tests/test_calendar.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 CalendarTestCase(unittest.TestCase):
@@ -28,11 +28,10 @@ class CalendarTestCase(unittest.TestCase):
self.assertRaises(Exception, test_view('calendar'))
def suite():
- return unittest.TestLoader().loadTestsFromTestCase(CalendarTestCase)
+ suite = trytond.tests.test_tryton.suite()
+ suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
+ CalendarTestCase))
+ return suite
if __name__ == '__main__':
- suiteTrytond = trytond.tests.test_tryton.suite()
- suiteCalendar = suite()
- alltests = unittest.TestSuite([suiteTrytond, suiteCalendar])
- unittest.TextTestRunner(verbosity=2).run(alltests)
- SOCK.disconnect()
+ unittest.TextTestRunner(verbosity=2).run(suite())
diff --git a/tests/test_calendar.pyc b/tests/test_calendar.pyc
new file mode 100644
index 0000000..07e8ac7
Binary files /dev/null and b/tests/test_calendar.pyc differ
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index fcd595c..d049f34 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.0
Name: trytond-calendar
-Version: 1.4.2
+Version: 1.6.0
Summary: Add CalDAV support
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.egg-info/SOURCES.txt b/trytond_calendar.egg-info/SOURCES.txt
index bafc0ca..86154dc 100644
--- a/trytond_calendar.egg-info/SOURCES.txt
+++ b/trytond_calendar.egg-info/SOURCES.txt
@@ -16,8 +16,12 @@ setup.py
./calendar.py
./res.py
./webdav.py
+./tests/__init__.py
+./tests/test_calendar.py
tests/__init__.py
+tests/__init__.pyc
tests/test_calendar.py
+tests/test_calendar.pyc
trytond_calendar.egg-info/PKG-INFO
trytond_calendar.egg-info/SOURCES.txt
trytond_calendar.egg-info/dependency_links.txt
diff --git a/trytond_calendar.egg-info/requires.txt b/trytond_calendar.egg-info/requires.txt
index 43123aa..44242eb 100644
--- a/trytond_calendar.egg-info/requires.txt
+++ b/trytond_calendar.egg-info/requires.txt
@@ -2,5 +2,4 @@ vobject >= 0.8.0
PyWebDAV >= 0.9.3
python-dateutil
pytz
-trytond >= 1.4
-trytond < 1.5
\ No newline at end of file
+trytond >= 1.6, < 1.7
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index 52870ba..3f14d1a 100644
--- a/webdav.py
+++ b/webdav.py
@@ -36,6 +36,7 @@ class Collection(ModelSQL, ModelView):
return calendar_obj.get_name(cursor, user, calendar, context=context)
return False
+ @Cache('webdav_collection.event')
def event(self, cursor, user, uri, calendar_id=False, context=None):
'''
Return the event id in the uri or False
@@ -65,8 +66,6 @@ class Collection(ModelSQL, ModelView):
return event_ids[0]
return False
- event = Cache('webdav_collection.event')(event)
-
def _caldav_filter_domain_calendar(self, cursor, user, filter, context=None):
'''
Return a domain for caldav filter on calendar
@@ -212,6 +211,21 @@ class Collection(ModelSQL, ModelView):
return super(Collection, self).get_resourcetype(cursor, user, uri,
context=context, cache=cache)
+ def get_displayname(self, cursor, user, uri, context=None, cache=None):
+ calendar_obj = self.pool.get('calendar.calendar')
+ if uri in ('Calendars', 'Calendars/'):
+ return 'Calendars'
+ calendar_id = self.calendar(cursor, user, uri, context=context)
+ if calendar_id:
+ if not (uri[10:].split('/', 1) + [None])[1]:
+ return calendar_obj.browse(cursor, user, calendar_id,
+ context=context).rec_name
+ return uri.split('/')[-1]
+ elif self.calendar(cursor, user, uri, ics=True, context=context):
+ return uri.split('/')[-1]
+ return super(Collection, self).get_displayname(cursor, user, uri,
+ context=context, cache=cache)
+
def get_contenttype(self, cursor, user, uri, context=None, cache=None):
if self.event(cursor, user, uri, context=context) \
or self.calendar(cursor, user, uri, ics=True, context=context):
@@ -604,4 +618,38 @@ class Collection(ModelSQL, ModelView):
return super(Collection, self).exists(cursor, user, uri, context=context,
cache=cache)
+ def current_user_privilege_set(self, cursor, user, uri, context=None,
+ cache=None):
+ '''
+ Return the privileges of the current user for uri
+ Privileges ares: create, read, write, delete
+
+ :param cursor: the database cursor
+ :param user: the user id
+ :param uri: the uri
+ :param context: the context
+ :param cache: the cache
+ :return: a list of privileges
+ '''
+ calendar_obj = self.pool.get('calendar.calendar')
+
+ if uri in ('Calendars', 'Calendars/'):
+ return ['create', 'read', 'write', 'delete']
+ if uri and uri.startswith('Calendars/'):
+ calendar_id = self.calendar(cursor, user, uri, context=context)
+ if calendar_id:
+ calendar = calendar_obj.browse(cursor, user, calendar_id,
+ context=context)
+ if user == calendar.owner.id:
+ return ['create', 'read', 'write', 'delete']
+ res = []
+ if user in (x.id for x in calendar.read_users):
+ res.append('read')
+ if user in (x.id for x in calendar.write_users):
+ res.extend(['read', 'write', 'delete'])
+ return res
+ return []
+ return super(Collection, self).current_user_privilege_set(cursor, user,
+ uri, context=context, cache=cache)
+
Collection()
commit 7acb61aa8fb7054d3dc8e9575a219eed205701ac
Author: Daniel Baumann <daniel at debian.org>
Date: Sat Feb 20 10:13:28 2010 +0100
Adding 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 bd52731..f37d9ae 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond_calendar
-Version: 1.4.1
+Version: 1.4.2
Summary: Add CalDAV support
Home-page: http://www.tryton.org/
Author: B2CK
diff --git a/__tryton__.py b/__tryton__.py
index 18974ca..4830f9f 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
'name_es_CO' : 'Calendario',
'name_es_ES' : 'Calendario',
'name_fr_FR' : 'Calendrier',
- 'version' : '1.4.1',
+ 'version' : '1.4.2',
'author' : 'B2CK',
'email': 'info at b2ck.com',
'website': 'http://www.tryton.org/',
diff --git a/calendar.py b/calendar.py
index e59e000..20c61f4 100644
--- a/calendar.py
+++ b/calendar.py
@@ -492,7 +492,8 @@ class Event(ModelSQL, ModelView):
"('calendar', '=', calendar)"],
ondelete='CASCADE', depends=['uuid', 'calendar'])
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'])
calendar_owner = fields.Function('get_calendar_field',
type='many2one', relation='res.user', string='Owner',
@@ -890,7 +891,8 @@ class Event(ModelSQL, ModelView):
if hasattr(vevent, 'recurrence-id'):
if not isinstance(vevent.recurrence_id.value, datetime.datetime):
res['recurrence'] = datetime.datetime.combine(
- vevent.recurrence_id.value, datetime.time())
+ vevent.recurrence_id.value, datetime.time()
+ ).replace(tzinfo=tzlocal)
else:
if vevent.recurrence_id.value.tzinfo:
res['recurrence'] = \
@@ -1047,14 +1049,14 @@ class Event(ModelSQL, ModelView):
occurences_todel = [x.id for x in event.occurences]
for vevent in vevents:
event_id = None
+ vals = self.ical2values(cursor, user, event_id, ical,
+ calendar_id, vevent=vevent, context=context)
if event:
for occurence in event.occurences:
- if occurence.recurrence.replace(tzinfo=tzlocal) \
- == vevent.recurrence_id.value:
+ if vals['recurrence'] == \
+ occurence.recurrence.replace(tzinfo=tzlocal):
event_id = occurence.id
occurences_todel.remove(occurence.id)
- vals = self.ical2values(cursor, user, event_id, ical,
- calendar_id, vevent=vevent, context=context)
if event:
vals['uuid'] = event.uuid
else:
@@ -1066,7 +1068,7 @@ class Event(ModelSQL, ModelView):
res['occurences'].append(('create', vals))
if occurences_todel:
res.setdefault('occurences', [])
- res['occurences'].append(('delete', occurences_todel))
+ res['occurences'].insert(0, ('delete', occurences_todel))
return res
def event2ical(self, cursor, user, event, context=None):
@@ -1146,7 +1148,7 @@ class Event(ModelSQL, ModelView):
if not hasattr(vevent, 'last-modified'):
vevent.add('last-modified')
vevent.last_modified.value = date.replace(tzinfo=tzlocal)
- if event.recurrence:
+ if event.recurrence and event.parent:
if not hasattr(vevent, 'recurrence-id'):
vevent.add('recurrence-id')
if event.all_day:
@@ -1154,6 +1156,8 @@ class Event(ModelSQL, ModelView):
else:
vevent.recurrence_id.value = event.recurrence\
.replace(tzinfo=tzlocal).astimezone(tzevent)
+ elif hasattr(vevent, 'recurrence-id'):
+ del vevent.recurrence_id
if event.status:
if not hasattr(vevent, 'status'):
vevent.add('status')
@@ -1185,6 +1189,10 @@ class Event(ModelSQL, ModelView):
elif hasattr(vevent, 'location'):
del vevent.location
+ if not hasattr(vevent, 'transp'):
+ vevent.add('transp')
+ vevent.transp.value = event.transp.upper()
+
if event.organizer:
if not hasattr(vevent, 'organizer'):
vevent.add('organizer')
diff --git a/calendar.xml b/calendar.xml
index 589c48e..8a0b020 100644
--- a/calendar.xml
+++ b/calendar.xml
@@ -227,7 +227,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="attendees" colspan="4"/>
</page>
<page string="Occurences" id="occurences"
- 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.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index 4466f2b..fcd595c 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond-calendar
-Version: 1.4.1
+Version: 1.4.2
Summary: Add CalDAV support
Home-page: http://www.tryton.org/
Author: B2CK
commit b7a1d427257e0c249ef19d7f5ef5fa0264251e5c
Author: Daniel Baumann <daniel at debian.org>
Date: Wed Nov 25 12:58:42 2009 +0100
Adding 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 5e40877..9a3da7b 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 (http://vobject.skyhouseconsulting.com/)
+ * pywebdav >= 0.9.3 (http://sourceforge.net/projects/pywebdav/)
* python-dateutil (http://labix.org/python-dateutil)
* pytz (http://pytz.sourceforge.net/)
diff --git a/PKG-INFO b/PKG-INFO
index d4b55fa..bd52731 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond_calendar
-Version: 1.4.0
+Version: 1.4.1
Summary: Add CalDAV support
Home-page: http://www.tryton.org/
Author: B2CK
diff --git a/__tryton__.py b/__tryton__.py
index 5c2f618..18974ca 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
'name_es_CO' : 'Calendario',
'name_es_ES' : 'Calendario',
'name_fr_FR' : '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 560e13b..ed10a27 100644
--- a/caldav.py
+++ b/caldav.py
@@ -40,26 +40,32 @@ def mk_prop_response(self, uri, good_props, bad_props, doc):
if parent_uri in ('Calendars', 'Calendars/'):
ad = doc.createElement('calendar')
ad.setAttribute('xmlns', 'urn:ietf:params:xml:ns:caldav')
- vc = doc.createElement('vevent-collection')
- vc.setAttribute('xmlns', 'http://groupdav.org/')
+ #Disable groupdav attribute for iPhone
+ #vc = doc.createElement('vevent-collection')
+ #vc.setAttribute('xmlns', 'http://groupdav.org/')
cols = res.getElementsByTagName('D:collection')
if cols:
cols[0].parentNode.appendChild(ad)
- cols[0].parentNode.appendChild(vc)
+ #cols[0].parentNode.appendChild(vc)
return res
propfind.PROPFIND.mk_prop_response = mk_prop_response
def _get_caldav_calendar_description(self, uri):
dbname, dburi = self._get_dburi(uri)
+ if not dbname:
+ raise DAV_NotFound
cursor = DATABASE['cursor']
pool = Pool(DATABASE['dbname'])
- collection_obj = pool.get('webdav.collection')
+ try:
+ collection_obj = pool.get('webdav.collection')
+ except KeyError:
+ raise DAV_NotFound
try:
res = collection_obj.get_calendar_description(cursor, int(USER_ID), dburi,
cache=CACHE)
except AttributeError:
- return ''
+ raise DAV_NotFound
except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
self._log_exception(exception)
raise
@@ -72,12 +78,19 @@ TrytonDAVInterface._get_caldav_calendar_description = _get_caldav_calendar_descr
def _get_caldav_calendar_data(self, uri):
dbname, dburi = self._get_dburi(uri)
+ if not dbname:
+ raise DAV_NotFound
cursor = DATABASE['cursor']
pool = Pool(DATABASE['dbname'])
- collection_obj = pool.get('webdav.collection')
+ try:
+ collection_obj = pool.get('webdav.collection')
+ except KeyError:
+ raise DAV_NotFound
try:
res = collection_obj.get_calendar_data(cursor, int(USER_ID), dburi,
cache=CACHE)
+ except AttributeError:
+ raise DAV_NotFound
except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
self._log_exception(exception)
raise
@@ -90,12 +103,19 @@ TrytonDAVInterface._get_caldav_calendar_data = _get_caldav_calendar_data
def _get_caldav_calendar_home_set(self, uri):
dbname, dburi = self._get_dburi(uri)
+ if not dbname:
+ raise DAV_NotFound
cursor = DATABASE['cursor']
pool = Pool(DATABASE['dbname'])
- collection_obj = pool.get('webdav.collection')
+ try:
+ collection_obj = pool.get('webdav.collection')
+ except KeyError:
+ raise DAV_NotFound
try:
res = collection_obj.get_calendar_home_set(cursor, int(USER_ID), dburi,
cache=CACHE)
+ except AttributeError:
+ raise DAV_NotFound
except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
self._log_exception(exception)
raise
@@ -107,7 +127,9 @@ def _get_caldav_calendar_home_set(self, uri):
doc = domimpl.createDocument(None, 'href', None)
href = doc.documentElement
href.tagName = 'D:href'
- huri = doc.createTextNode(urlparse.urlunsplit(uparts))
+ #iPhone doesn't handle "http" in href
+ #huri = doc.createTextNode(urlparse.urlunsplit(uparts))
+ huri = doc.createTextNode(urllib.quote('/' + dbname + res))
href.appendChild(huri)
return href
@@ -115,12 +137,19 @@ TrytonDAVInterface._get_caldav_calendar_home_set = _get_caldav_calendar_home_set
def _get_caldav_calendar_user_address_set(self, uri):
dbname, dburi = self._get_dburi(uri)
+ if not dbname:
+ raise DAV_NotFound
cursor = DATABASE['cursor']
pool = Pool(DATABASE['dbname'])
- collection_obj = pool.get('webdav.collection')
+ try:
+ collection_obj = pool.get('webdav.collection')
+ except KeyError:
+ raise DAV_NotFound
try:
res = collection_obj.get_calendar_user_address_set(cursor,
int(USER_ID), dburi, cache=CACHE)
+ except AttributeError:
+ raise DAV_NotFound
except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
self._log_exception(exception)
raise
@@ -138,12 +167,19 @@ TrytonDAVInterface._get_caldav_calendar_user_address_set = _get_caldav_calendar_
def _get_caldav_schedule_inbox_URL(self, uri):
dbname, dburi = self._get_dburi(uri)
+ if not dbname:
+ raise DAV_NotFound
cursor = DATABASE['cursor']
pool = Pool(DATABASE['dbname'])
- collection_obj = pool.get('webdav.collection')
+ try:
+ collection_obj = pool.get('webdav.collection')
+ except KeyError:
+ raise DAV_NotFound
try:
res = collection_obj.get_schedule_inbox_URL(cursor, int(USER_ID), dburi,
cache=CACHE)
+ except AttributeError:
+ raise DAV_NotFound
except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
self._log_exception(exception)
raise
@@ -163,12 +199,19 @@ TrytonDAVInterface._get_caldav_schedule_inbox_URL = _get_caldav_schedule_inbox_U
def _get_caldav_schedule_outbox_URL(self, uri):
dbname, dburi = self._get_dburi(uri)
+ if not dbname:
+ raise DAV_NotFound
cursor = DATABASE['cursor']
pool = Pool(DATABASE['dbname'])
- collection_obj = pool.get('webdav.collection')
+ try:
+ collection_obj = pool.get('webdav.collection')
+ except KeyError:
+ raise DAV_NotFound
try:
res = collection_obj.get_schedule_outbox_URL(cursor, int(USER_ID), dburi,
cache=CACHE)
+ except AttributeError:
+ raise DAV_NotFound
except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
self._log_exception(exception)
raise
@@ -201,17 +244,23 @@ def _get_dav_principal_collection_set(self, uri):
huri = doc.createTextNode(urlparse.urlunsplit(uparts))
href.appendChild(huri)
return href
- return _prev_get_dav_principal_collection_set(self, uri)
+ if _prev_get_dav_principal_collection_set:
+ return _prev_get_dav_principal_collection_set(self, uri)
+ raise DAV_NotFound
TrytonDAVInterface._get_dav_principal_collection_set = _get_dav_principal_collection_set
def _get_caldav_post(self, uri, body, contenttype=''):
dbname, dburi = self._get_dburi(uri)
+ if not dbname:
+ raise DAV_Forbidden
cursor = DATABASE['cursor']
pool = Pool(DATABASE['dbname'])
calendar_obj = pool.get('calendar.calendar')
try:
res = calendar_obj.post(cursor, int(USER_ID), dburi, body)
+ except AttributeError:
+ raise DAV_NotFound
except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
self._log_exception(exception)
raise
diff --git a/calendar.py b/calendar.py
index b4b426e..e59e000 100644
--- a/calendar.py
+++ b/calendar.py
@@ -207,6 +207,7 @@ class Calendar(ModelSQL, ModelView):
event_ids = event_obj.search(cursor, 0, [
('parent', '=', False),
+ ('dtstart', '<=', dtend),
['OR',
('rdates', '!=', False),
('rrules', '!=', False),
@@ -225,6 +226,8 @@ class Calendar(ModelSQL, ModelView):
between_dtstart = dtstart.replace(tzinfo=None)
between_dtend = dtend.replace(tzinfo=None)
for freebusy_dtstart in event_ical.vevent.rruleset:
+ if freebusy_dtstart.replace(tzinfo=tzlocal) > dtend:
+ break
if not event.dtend:
freebusy_dtend = freebusy_dtstart
else:
@@ -243,7 +246,8 @@ class Calendar(ModelSQL, ModelView):
all_day = event.all_day
for occurence in event.occurences:
if occurence.recurrence.replace(tzinfo=tzlocal) == \
- freebusy_dtstart:
+ freebusy_dtstart.replace(tzinfo=tzlocal):
+ freebusy_dtstart = occurence.dtstart.replace(tzinfo=tzlocal)
if occurence.dtend:
freebusy_dtend = occurence.dtend\
.replace(tzinfo=tzlocal)
@@ -879,8 +883,8 @@ class Event(ModelSQL, ModelView):
res['dtend'] = vevent.dtend.value.astimezone(tzlocal)
else:
res['dtend'] = vevent.dtend.value
- elif hasattr(vevent, 'duration') and res['dtstart']:
- res['dtend'] = dtstart + vevent.duration
+ elif hasattr(vevent, 'duration') and hasattr(vevent, 'dtstart'):
+ res['dtend'] = vevent.dtstart.value + vevent.duration.value
else:
res['dtend'] = False
if hasattr(vevent, 'recurrence-id'):
@@ -1570,6 +1574,27 @@ class EventAttendee(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(EventAttendee, 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,
@@ -1974,7 +1999,7 @@ class RRule(ModelSQL, ModelView):
res += vobject.icalendar.dateToString(rule.until.date())
else:
res += vobject.icalendar.dateTimeToString(rule.until\
- .replace(tzinfo=tzlocal).astimezone(utc),
+ .replace(tzinfo=tzlocal).astimezone(tzutc),
convertToUTC=True)
elif rule.count:
res += ';COUNT=' + str(rule.count)
diff --git a/setup.py b/setup.py
index acce95a..af2225e 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/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index d54b60d..4466f2b 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond-calendar
-Version: 1.4.0
+Version: 1.4.1
Summary: Add CalDAV support
Home-page: http://www.tryton.org/
Author: B2CK
diff --git a/trytond_calendar.egg-info/requires.txt b/trytond_calendar.egg-info/requires.txt
index 2160975..43123aa 100644
--- a/trytond_calendar.egg-info/requires.txt
+++ b/trytond_calendar.egg-info/requires.txt
@@ -1,5 +1,5 @@
-vobject
-PyWebDAV
+vobject >= 0.8.0
+PyWebDAV >= 0.9.3
python-dateutil
pytz
trytond >= 1.4
diff --git a/webdav.py b/webdav.py
index 66a3966..52870ba 100644
--- a/webdav.py
+++ b/webdav.py
@@ -158,6 +158,8 @@ class Collection(ModelSQL, ModelView):
if uri in ('Calendars', 'Calendars/'):
domain = self._caldav_filter_domain_calendar(cursor, user,
filter, context=context)
+ domain = [['OR', ('owner', '=', user), ('read_users', '=', user)],
+ domain]
calendar_ids = calendar_obj.search(cursor, user, domain,
context=context)
calendars = calendar_obj.browse(cursor, user, calendar_ids,
@@ -204,9 +206,7 @@ class Collection(ModelSQL, ModelView):
if calendar_id:
if not (uri[10:].split('/', 1) + [None])[1]:
return COLLECTION
- if self.event(cursor, user, uri, calendar_id=calendar_id,
- context=context):
- return OBJECT
+ return OBJECT
elif self.calendar(cursor, user, uri, ics=True, context=context):
return OBJECT
return super(Collection, self).get_resourcetype(cursor, user, uri,
@@ -449,8 +449,10 @@ class Collection(ModelSQL, ModelView):
ids.append(calendar_id)
elif 'calendar_description' in cache['_calendar']\
[calendar_obj._name][calendar_id]:
- return cache['_calendar'][calendar_obj._name]\
+ res = cache['_calendar'][calendar_obj._name]\
[calendar_id]['calendar_description']
+ if res is not None:
+ return res
else:
ids = [calendar_id]
res = None
@@ -492,7 +494,8 @@ class Collection(ModelSQL, ModelView):
('owner', '=', user),
], limit=1, context=context)
if not calendar_ids:
- raise DAV_NotFound
+ # Sunbird failed with no value
+ return '/Calendars'
calendar = calendar_obj.browse(cursor, user, calendar_ids[0],
context=context)
return '/Calendars/' + calendar.name
@@ -567,19 +570,20 @@ class Collection(ModelSQL, ModelView):
calendar_id = self.calendar(cursor, user, uri, context=context)
if calendar_id:
if not (uri[10:].split('/', 1) + [None])[1]:
- raise DAV_Forbidden
+ return 403
event_id = self.event(cursor, user, uri, calendar_id=calendar_id,
context=context)
if event_id:
try:
event_obj.delete(cursor, user, event_id, context=context)
except:
- raise DAV_Forbidden
+ return 403
return 200
+ return 404
calendar_ics_id = self.calendar(cursor, user, uri, ics=True,
context=context)
if calendar_ics_id:
- raise DAV_Forbidden
+ return 403
return super(Collection, self).rm(cursor, user, uri, context=context,
cache=cache)
commit 93eb1fc962121c325cbfb90898f7d770e922347c
Author: Daniel Baumann <daniel at debian.org>
Date: Mon Oct 19 22:54:43 2009 +0200
Adding upstream version 1.4.0.
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..5e40877
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,33 @@
+Installing trytond_calendar
+=================================
+
+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/)
+
+Installation
+------------
+
+Once you've downloaded and unpacked the trytond_calendar 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.
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..c61b52d
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,10 @@
+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..d4b55fa
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,25 @@
+Metadata-Version: 1.0
+Name: trytond_calendar
+Version: 1.4.0
+Summary: Add CalDAV support
+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..fdb062c
--- /dev/null
+++ b/README
@@ -0,0 +1,36 @@
+trytond_calendar
+======================
+
+The calendar 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..a09702d
--- /dev/null
+++ b/__init__.py
@@ -0,0 +1,7 @@
+#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 webdav import *
+from calendar import *
+from res import *
diff --git a/__tryton__.py b/__tryton__.py
new file mode 100644
index 0000000..5c2f618
--- /dev/null
+++ b/__tryton__.py
@@ -0,0 +1,33 @@
+# -*- 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',
+ 'name_de_DE' : 'Kalender',
+ 'name_es_CO' : 'Calendario',
+ 'name_es_ES' : 'Calendario',
+ 'name_fr_FR' : 'Calendrier',
+ 'version' : '1.4.0',
+ 'author' : 'B2CK',
+ 'email': 'info at b2ck.com',
+ 'website': 'http://www.tryton.org/',
+ 'description': 'Add CalDAV support',
+ 'description_de_DE' : 'Fügt Unterstützung für CalDAV hinzu',
+ 'description_es_CO' : 'Añade soporte para CalDAV',
+ 'description_es_ES' : 'Añade soporte para CalDAV',
+ 'description_fr_FR': 'Ajoute le support CalDAV',
+ 'depends' : [
+ 'ir',
+ 'res',
+ 'webdav',
+ ],
+ 'xml' : [
+ 'calendar.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..560e13b
--- /dev/null
+++ b/caldav.py
@@ -0,0 +1,254 @@
+#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.errors import *
+from DAV.utils import get_uriparentpath
+from DAV.constants import DAV_VERSION_1, DAV_VERSION_2
+from trytond.protocols.webdav import TrytonDAVInterface, USER_ID, CACHE, \
+ DATABASE, WebDAVAuthRequestHandler
+from trytond.pool import Pool
+import urlparse
+import urllib
+from string import atoi
+import xml.dom.minidom
+domimpl = xml.dom.minidom.getDOMImplementation()
+
+TrytonDAVInterface.PROPS['urn:ietf:params:xml:ns:caldav'] = (
+ 'calendar-description',
+ 'calendar-data',
+ 'calendar-home-set',
+ 'calendar-user-address-set',
+ 'schedule-inbox-URL',
+ 'schedule-outbox-URL',
+ )
+TrytonDAVInterface.PROPS['DAV:'] = tuple(list(TrytonDAVInterface.PROPS['DAV:']) \
+ + ['principal-collection-set'])
+TrytonDAVInterface.M_NS['urn:ietf:params:xml:ns:caldav'] = '_get_caldav'
+DAV_VERSION_1['version'] += ',calendar-access,calendar-schedule'#,calendar-auto-schedule'
+DAV_VERSION_2['version'] += ',calendar-access,calendar-schedule'#,calendar-auto-schedule'
+
+_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/'):
+ ad = doc.createElement('calendar')
+ ad.setAttribute('xmlns', 'urn:ietf:params:xml:ns:caldav')
+ vc = doc.createElement('vevent-collection')
+ vc.setAttribute('xmlns', 'http://groupdav.org/')
+ cols = res.getElementsByTagName('D:collection')
+ if cols:
+ cols[0].parentNode.appendChild(ad)
+ cols[0].parentNode.appendChild(vc)
+ return res
+
+propfind.PROPFIND.mk_prop_response = mk_prop_response
+
+def _get_caldav_calendar_description(self, uri):
+ dbname, dburi = self._get_dburi(uri)
+ cursor = DATABASE['cursor']
+ pool = Pool(DATABASE['dbname'])
+ collection_obj = pool.get('webdav.collection')
+ try:
+ res = collection_obj.get_calendar_description(cursor, int(USER_ID), dburi,
+ cache=CACHE)
+ except AttributeError:
+ return ''
+ except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+ self._log_exception(exception)
+ raise
+ except Exception, exception:
+ self._log_exception(exception)
+ raise DAV_Error(500)
+ return res
+
+TrytonDAVInterface._get_caldav_calendar_description = _get_caldav_calendar_description
+
+def _get_caldav_calendar_data(self, uri):
+ dbname, dburi = self._get_dburi(uri)
+ cursor = DATABASE['cursor']
+ pool = Pool(DATABASE['dbname'])
+ collection_obj = pool.get('webdav.collection')
+ try:
+ res = collection_obj.get_calendar_data(cursor, int(USER_ID), dburi,
+ cache=CACHE)
+ except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+ self._log_exception(exception)
+ raise
+ except Exception, exception:
+ self._log_exception(exception)
+ raise DAV_Error(500)
+ return res
+
+TrytonDAVInterface._get_caldav_calendar_data = _get_caldav_calendar_data
+
+def _get_caldav_calendar_home_set(self, uri):
+ dbname, dburi = self._get_dburi(uri)
+ cursor = DATABASE['cursor']
+ pool = Pool(DATABASE['dbname'])
+ collection_obj = pool.get('webdav.collection')
+ try:
+ res = collection_obj.get_calendar_home_set(cursor, int(USER_ID), dburi,
+ cache=CACHE)
+ except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+ self._log_exception(exception)
+ raise
+ except Exception, exception:
+ self._log_exception(exception)
+ raise DAV_Error(500)
+ uparts = list(urlparse.urlsplit(uri))
+ uparts[2] = urllib.quote(dbname + res)
+ doc = domimpl.createDocument(None, 'href', None)
+ href = doc.documentElement
+ href.tagName = 'D:href'
+ huri = doc.createTextNode(urlparse.urlunsplit(uparts))
+ href.appendChild(huri)
+ return href
+
+TrytonDAVInterface._get_caldav_calendar_home_set = _get_caldav_calendar_home_set
+
+def _get_caldav_calendar_user_address_set(self, uri):
+ dbname, dburi = self._get_dburi(uri)
+ cursor = DATABASE['cursor']
+ pool = Pool(DATABASE['dbname'])
+ collection_obj = pool.get('webdav.collection')
+ try:
+ res = collection_obj.get_calendar_user_address_set(cursor,
+ int(USER_ID), dburi, cache=CACHE)
+ except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+ self._log_exception(exception)
+ raise
+ except Exception, exception:
+ self._log_exception(exception)
+ raise DAV_Error(500)
+ doc = domimpl.createDocument(None, 'href', None)
+ href = doc.documentElement
+ href.tagName = 'D:href'
+ huri = doc.createTextNode('MAILTO:' + res)
+ href.appendChild(huri)
+ return href
+
+TrytonDAVInterface._get_caldav_calendar_user_address_set = _get_caldav_calendar_user_address_set
+
+def _get_caldav_schedule_inbox_URL(self, uri):
+ dbname, dburi = self._get_dburi(uri)
+ cursor = DATABASE['cursor']
+ pool = Pool(DATABASE['dbname'])
+ collection_obj = pool.get('webdav.collection')
+ try:
+ res = collection_obj.get_schedule_inbox_URL(cursor, int(USER_ID), dburi,
+ cache=CACHE)
+ except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+ self._log_exception(exception)
+ raise
+ except Exception, exception:
+ self._log_exception(exception)
+ raise DAV_Error(500)
+ uparts = list(urlparse.urlsplit(uri))
+ uparts[2] = urllib.quote(dbname + res)
+ doc = domimpl.createDocument(None, 'href', None)
+ href = doc.documentElement
+ href.tagName = 'D:href'
+ huri = doc.createTextNode(urlparse.urlunsplit(uparts))
+ href.appendChild(huri)
+ return href
+
+TrytonDAVInterface._get_caldav_schedule_inbox_URL = _get_caldav_schedule_inbox_URL
+
+def _get_caldav_schedule_outbox_URL(self, uri):
+ dbname, dburi = self._get_dburi(uri)
+ cursor = DATABASE['cursor']
+ pool = Pool(DATABASE['dbname'])
+ collection_obj = pool.get('webdav.collection')
+ try:
+ res = collection_obj.get_schedule_outbox_URL(cursor, int(USER_ID), dburi,
+ cache=CACHE)
+ except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+ self._log_exception(exception)
+ raise
+ except Exception, exception:
+ self._log_exception(exception)
+ raise DAV_Error(500)
+ uparts = list(urlparse.urlsplit(uri))
+ uparts[2] = urllib.quote(dbname + res)
+ doc = domimpl.createDocument(None, 'href', None)
+ href = doc.documentElement
+ href.tagName = 'D:href'
+ huri = doc.createTextNode(urlparse.urlunsplit(uparts))
+ href.appendChild(huri)
+ return href
+
+TrytonDAVInterface._get_caldav_schedule_outbox_URL = _get_caldav_schedule_outbox_URL
+
+_prev_get_dav_principal_collection_set = hasattr(TrytonDAVInterface,
+ '_get_dav_principal_collection_set') and \
+ TrytonDAVInterface._get_dav_principal_collection_set or None
+
+def _get_dav_principal_collection_set(self, uri):
+ dbname, dburi = self._get_dburi(uri)
+ if dburi.startswith('Calendars'):
+ uparts = list(urlparse.urlsplit(uri))
+ uparts[2] = urllib.quote(dbname + '/Calendars/')
+ doc = domimpl.createDocument(None, 'href', None)
+ href = doc.documentElement
+ href.tagName = 'D:href'
+ huri = doc.createTextNode(urlparse.urlunsplit(uparts))
+ href.appendChild(huri)
+ return href
+ return _prev_get_dav_principal_collection_set(self, uri)
+
+TrytonDAVInterface._get_dav_principal_collection_set = _get_dav_principal_collection_set
+
+def _get_caldav_post(self, uri, body, contenttype=''):
+ dbname, dburi = self._get_dburi(uri)
+ cursor = DATABASE['cursor']
+ pool = Pool(DATABASE['dbname'])
+ calendar_obj = pool.get('calendar.calendar')
+ try:
+ res = calendar_obj.post(cursor, int(USER_ID), dburi, body)
+ except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+ self._log_exception(exception)
+ raise
+ except Exception, exception:
+ self._log_exception(exception)
+ raise DAV_Error(500)
+ return res
+
+TrytonDAVInterface._get_caldav_post = _get_caldav_post
+
+_prev_do_POST = WebDAVAuthRequestHandler.do_POST
+
+def do_POST(self):
+ dc=self.IFACE_CLASS
+
+ uri=urlparse.urljoin(self.get_baseuri(dc), self.path)
+ uri=urllib.unquote(uri)
+
+ dbname, dburi = TrytonDAVInterface.get_dburi(uri)
+ if dburi.startswith('Calendars'):
+ # read the body
+ body=None
+ if self.headers.has_key("Content-Length"):
+ l=self.headers['Content-Length']
+ body=self.rfile.read(atoi(l))
+ ct=None
+ if self.headers.has_key("Content-Type"):
+ ct=self.headers['Content-Type']
+
+ headers = {}
+
+ try:
+ DATA = '%s\n' % dc._get_caldav_post(uri, body, ct)
+ except DAV_Error, (ec, dd):
+ return self.send_status(ec)
+ self.send_body_chunks(DATA, '200', 'OK', 'OK')
+ return
+ return _prev_do_POST(self)
+
+WebDAVAuthRequestHandler.do_POST = do_POST
diff --git a/calendar.py b/calendar.py
new file mode 100644
index 0000000..b4b426e
--- /dev/null
+++ b/calendar.py
@@ -0,0 +1,2063 @@
+#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 Calendar(ModelSQL, ModelView):
+ "Calendar"
+ _description = __doc__
+ _name = 'calendar.calendar'
+
+ name = fields.Char('Name', required=True, select=1)
+ description = fields.Text('Description')
+ owner = fields.Many2One('res.user', 'Owner', select=1,
+ domain=[('email', '!=', False)],
+ help='The user must have an email')
+ read_users = fields.Many2Many('calendar.calendar-read-res.user',
+ 'calendar', 'user', 'Read Users')
+ write_users = fields.Many2Many('calendar.calendar-write-res.user',
+ 'calendar', 'user', 'Write Users')
+
+ def __init__(self):
+ super(Calendar, self).__init__()
+ self._sql_constraints = [
+ ('name_uniq', 'UNIQUE(name)',
+ 'The name of calendar must be unique!'),
+ ('owner_uniq', 'UNIQUE(owner)',
+ 'A user can have only one calendar!'),
+ ]
+ self._order.insert(0, ('name', 'ASC'))
+ self._constraints += [
+ ('check_name', 'Calendar name can not end with .ics'),
+ ]
+
+ def create(self, cursor, user, vals, context=None):
+ res = super(Calendar, self).create(cursor, user, vals, context=context)
+ # Restart the cache for get_name
+ self.get_name(cursor.dbname)
+ return res
+
+ def write(self, cursor, user, ids, vals, context=None):
+ res = super(Calendar, self).write(cursor, user, ids, vals,
+ context=context)
+ # Restart the cache for get_name
+ self.get_name(cursor.dbname)
+ return res
+
+ def delete(self, cursor, user, ids, context=None):
+ res = super(Calendar, self).delete(cursor, user, ids, context=context)
+ # Restart the cache for calendar
+ self.get_name(cursor.dbname)
+ return res
+
+ def check_name(self, cursor, user, ids):
+ '''
+ Check the name doesn't end with .ics
+ '''
+ for calendar in self.browse(cursor, user, ids):
+ if calendar.name.endswith('.ics'):
+ return False
+ return True
+
+ def get_name(self, cursor, user, name, context=None):
+ '''
+ Return the calendar id of the name
+
+ :param cursor: the database cursor
+ :param user: the user id
+ :param name: the calendar name
+ :param context: the context
+ :return: the calendar.calendar id or False
+ '''
+ calendar_ids = self.search(cursor, user, [
+ ('name', '=', name),
+ ], limit=1, context=context)
+ if calendar_ids:
+ return calendar_ids[0]
+ return False
+
+ get_name = Cache('calendar_calendar.get_name')(get_name)
+
+ def calendar2ical(self, cursor, user, calendar_id, context=None):
+ '''
+ Return an iCalendar object for the given calendar_id containing
+ all the vevent objects
+
+ :param cursor: the database cursor
+ :param user: the user id
+ :param calendar_id: an id of calendar.calendar
+ :param context: the context
+ :return: an iCalendar
+ '''
+ event_obj = self.pool.get('calendar.event')
+
+ ical = vobject.iCalendar()
+ ical.vevent_list = []
+ event_ids = event_obj.search(cursor, user, [
+ ('calendar', '=', calendar_id),
+ ('parent', '=', False),
+ ], context=context)
+ for event in event_obj.browse(cursor, user, event_ids,
+ context=context):
+ ical2 = event_obj.event2ical(cursor, user, event.id,
+ context=context)
+ ical.vevent_list.extend(ical2.vevent_list)
+ return ical
+
+ def _fbtype(self, cursor, user, event, context=None):
+ '''
+ Return the freebusy type for give transparent and status
+
+ :param cursor: the database cursor
+ :param user: the user id
+ :param event: a BrowseRecord of calendar.event
+ :param context: the context
+ :return: a freebusy type ('FREE', 'BUSY', 'BUSY-TENTATIVE')
+ '''
+ if event.transp == 'opaque':
+ if not event.status or event.status == 'confirmed':
+ fbtype = 'BUSY'
+ elif event.status == 'cancelled':
+ fbtype = 'FREE'
+ elif event.status == 'tentative':
+ fbtype = 'BUSY-TENTATIVE'
+ else:
+ fbtype = 'BUSY'
+ else:
+ fbtype = 'FREE'
+ return fbtype
+
+ def freebusy(self, cursor, user, calendar_id, dtstart, dtend, context=None):
+ '''
+ Return an iCalendar object for the given calendar_id with the
+ vfreebusy objects between the two dates
+
+ :param cursor: the database cursor
+ :param user: the user id
+ :param calendar_id: an id of calendar.calendar
+ :param dtstart: a date or datetime
+ :param dtend: a date of datetime
+ :param context: the context
+ :return: an iCalendar
+ '''
+ event_obj = self.pool.get('calendar.event')
+
+ ical = vobject.iCalendar()
+ ical.add('method').value = 'REPLY'
+ ical.add('vfreebusy')
+ if not isinstance(dtstart, datetime.datetime):
+ ical.vfreebusy.add('dtstart').value = dtstart
+ dtstart = datetime.datetime.combine(dtstart, datetime.time())\
+ .replace(tzinfo=tzlocal)
+ else:
+ ical.vfreebusy.add('dtstart').value = dtstart.astimezone(tzutc)
+ if not isinstance(dtend, datetime.datetime):
+ ical.vfreebusy.add('dtend').value = dtend
+ dtend = datetime.datetime.combine(dtend, datetime.time.max)\
+ .replace(tzinfo=tzlocal)
+ else:
+ ical.vfreebusy.add('dtend').value = dtend.astimezone(tzutc)
+
+ event_ids = event_obj.search(cursor, 0, [
+ ['OR',
+ [('dtstart', '<=', dtstart),
+ ('dtend', '>=', dtstart)],
+ [('dtstart', '<=', dtend),
+ ('dtend', '>=', dtend)],
+ [('dtstart', '>=', dtstart),
+ ('dtend', '<=', dtend)],
+ [('dtstart', '>=', dtstart),
+ ('dtstart', '<=', dtend),
+ ('dtend', '=', False)]],
+ ('parent', '=', False),
+ ('rdates', '=', False),
+ ('rrules', '=', False),
+ ('exdates', '=', False),
+ ('exrules', '=', False),
+ ('occurences', '=', False),
+ ('calendar', '=', calendar_id),
+ ], context=context)
+
+ for event in event_obj.browse(cursor, 0, event_ids, context=context):
+ # Don't group freebusy as sunbird doesn't handle it
+ freebusy = ical.vfreebusy.add('freebusy')
+ freebusy.fbtype_param = self._fbtype(cursor, user, event,
+ context=context)
+ if event.dtstart.replace(tzinfo=tzlocal) >= dtstart:
+ freebusy_dtstart = event.dtstart.replace(tzinfo=tzlocal)
+ else:
+ freebusy_dtstart = dtstart
+ if event.dtend.replace(tzinfo=tzlocal) <= dtend:
+ freebusy_dtend = event.dtend.replace(tzinfo=tzlocal)
+ else:
+ freebusy_dtend = dtend
+ freebusy.value = [(
+ freebusy_dtstart.astimezone(tzutc),
+ freebusy_dtend.astimezone(tzutc))]
+
+ event_ids = event_obj.search(cursor, 0, [
+ ('parent', '=', False),
+ ['OR',
+ ('rdates', '!=', False),
+ ('rrules', '!=', False),
+ ('exdates', '!=', False),
+ ('exrules', '!=', False),
+ ('occurences', '!=', False),
+ ],
+ ('calendar', '=', calendar_id),
+ ], context=context)
+ for event in event_obj.browse(cursor, 0, event_ids, context=context):
+ event_ical = event_obj.event2ical(cursor, user, event,
+ context=context)
+ if event_ical.vevent.rruleset:
+ between_dtstart, between_dtend = dtstart, dtend
+ if event.all_day:
+ between_dtstart = dtstart.replace(tzinfo=None)
+ between_dtend = dtend.replace(tzinfo=None)
+ for freebusy_dtstart in event_ical.vevent.rruleset:
+ if not event.dtend:
+ freebusy_dtend = freebusy_dtstart
+ else:
+ freebusy_dtend = event.dtend.replace(tzinfo=tzlocal)\
+ - event.dtstart.replace(tzinfo=tzlocal) \
+ + freebusy_dtstart
+ if not ((freebusy_dtstart.replace(tzinfo=tzlocal) <= dtstart
+ and freebusy_dtend.replace(tzinfo=tzlocal) >= dtstart)
+ or (freebusy_dtstart.replace(tzinfo=tzlocal) <= dtend
+ and freebusy_dtend.replace(tzinfo=tzlocal) >= dtend)
+ or (freebusy_dtstart.replace(tzinfo=tzlocal) >= dtstart
+ and freebusy_dtend.replace(tzinfo=tzlocal) <= dtend)):
+ continue
+ freebusy_fbtype = self._fbtype(cursor, user, event,
+ context=context)
+ all_day = event.all_day
+ for occurence in event.occurences:
+ if occurence.recurrence.replace(tzinfo=tzlocal) == \
+ freebusy_dtstart:
+ if occurence.dtend:
+ freebusy_dtend = occurence.dtend\
+ .replace(tzinfo=tzlocal)
+ else:
+ freebusy_dtend = freebusy_dtstart
+ all_day = occurence.all_day
+ freebusy_fbtype = self._fbtype(cursor, user,
+ occurence, context=context)
+ break
+ freebusy = ical.vfreebusy.add('freebusy')
+ freebusy.fbtype_param = freebusy_fbtype
+ if freebusy_dtstart.replace(tzinfo=tzlocal) <= dtstart:
+ freebusy_dtstart = dtstart
+ if freebusy_dtend.replace(tzinfo=tzlocal) >= dtend:
+ freebusy_dtend = dtend
+ if all_day:
+ freebusy.value = [(
+ freebusy_dtstart.replace(tzinfo=tzlocal)\
+ .astimezone(tzutc),
+ freebusy_dtend.replace(tzinfo=tzlocal)\
+ .astimezone(tzutc))]
+ else:
+ freebusy.value = [(
+ freebusy_dtstart.astimezone(tzutc),
+ freebusy_dtend.astimezone(tzutc))]
+ return ical
+
+ def post(self, cursor, user, uri, data, context=None):
+ '''
+ Handle post of vfreebusy request
+
+ :param cursor: the database cursor
+ :param user: the user id
+ :param uri: the posted uri
+ :param data: the posted data
+ :param context: the context
+ :return: the xml with schedule-response
+ '''
+ collection_obj = self.pool.get('webdav.collection')
+
+ calendar_id = collection_obj.calendar(cursor, user, uri,
+ context=context)
+ if not calendar_id:
+ raise DAV_Forbidden
+ calendar = self.browse(cursor, user, calendar_id,
+ context=context)
+ if calendar.owner.id != user:
+ raise DAV_Forbidden
+ ical = vobject.readOne(data)
+ if ical.method.value == 'REQUEST' \
+ and hasattr(ical, 'vfreebusy'):
+ doc = domimpl.createDocument(None, 'schedule-response', None)
+ sr = doc.documentElement
+ sr.setAttribute('xmlns:D', 'DAV:')
+ sr.setAttribute('xmlns:C', 'urn:ietf:params:xml:ns:caldav')
+ sr.tagName = 'C:schedule-response'
+
+ if not isinstance(ical.vfreebusy.dtstart.value, datetime.datetime):
+ dtstart = ical.vfreebusy.dtstart.value
+ else:
+ if ical.vfreebusy.dtstart.value.tzinfo:
+ dtstart = ical.vfreebusy.dtstart.value.astimezone(tzlocal)
+ else:
+ dtstart = ical.vfreebusy.dtstart.value
+ if not isinstance(ical.vfreebusy.dtend.value, datetime.datetime):
+ dtend = ical.vfreebusy.dtend.value
+ else:
+ if ical.vfreebusy.dtend.value.tzinfo:
+ dtend = ical.vfreebusy.dtend.value.astimezone(tzlocal)
+ else:
+ dtend = ical.vfreebusy.dtend.value
+ for attendee in ical.vfreebusy.attendee_list:
+ resp = doc.createElement('C:response')
+ sr.appendChild(resp)
+ recipient = doc.createElement('C:recipient')
+ href = doc.createElement('D:href')
+ huri = doc.createTextNode(attendee.value)
+ href.appendChild(huri)
+ recipient.appendChild(href)
+ resp.appendChild(recipient)
+
+ vfreebusy = None
+ email = attendee.value
+ if attendee.value.lower().startswith('mailto:'):
+ email = attendee.value[7:]
+ calendar_ids = self.search(cursor, 0, [
+ ('owner.email', '=', email),
+ ], context=context)
+ if calendar_ids:
+ vfreebusy = self.freebusy(cursor, user, calendar_ids[0],
+ dtstart, dtend, context=context)
+ vfreebusy.vfreebusy.add('dtstamp').value = \
+ ical.vfreebusy.dtstamp.value
+ vfreebusy.vfreebusy.add('uid').value = \
+ ical.vfreebusy.uid.value
+ vfreebusy.vfreebusy.add('organizer').value = \
+ ical.vfreebusy.organizer.value
+ vfreebusy.vfreebusy.add('attendee').value = attendee.value
+
+ status = doc.createElement('C:request-status')
+ status.appendChild(doc.createTextNode(vfreebusy and \
+ '2.0;Success' or '5.3;No scheduling support for user.'))
+ resp.appendChild(status)
+ if vfreebusy:
+ data = doc.createElement('C:calendar-data')
+ data.appendChild(doc.createTextNode(vfreebusy.serialize()))
+ resp.appendChild(data)
+ return doc.toxml(encoding='utf-8')
+ raise DAV_Forbidden
+
+Calendar()
+
+
+class ReadUser(ModelSQL):
+ 'Calendar - read - User'
+ _description = __doc__
+ _name = 'calendar.calendar-read-res.user'
+
+ calendar = fields.Many2One('calendar.calendar', 'Calendar',
+ ondelete='CASCADE', required=True, select=1)
+ user = fields.Many2One('res.user', 'User', ondelete='CASCADE',
+ required=True, select=1)
+
+ReadUser()
+
+
+class WriteUser(ModelSQL):
+ 'Calendar - write - User'
+ _description = __doc__
+ _name = 'calendar.calendar-write-res.user'
+
+ calendar = fields.Many2One('calendar.calendar', 'Calendar',
+ ondelete='CASCADE', required=True, select=1)
+ user = fields.Many2One('res.user', 'User', ondelete='CASCADE',
+ required=True, select=1)
+
+WriteUser()
+
+
+class Category(ModelSQL, ModelView):
+ "Category"
+ _description = __doc__
+ _name = 'calendar.category'
+
+ name = fields.Char('Name', required=True, select=1)
+
+ def __init__(self):
+ super(Category, self).__init__()
+ self._sql_constraints = [
+ ('name_uniq', 'UNIQUE(name)',
+ 'The name of calendar category must be unique!'),
+ ]
+ self._order.insert(0, ('name', 'ASC'))
+
+Category()
+
+
+class Location(ModelSQL, ModelView):
+ "Location"
+ _description = __doc__
+ _name = 'calendar.location'
+
+ name = fields.Char('Name', required=True, select=1)
+
+ def __init__(self):
+ super(Location, self).__init__()
+ self._sql_constraints = [
+ ('name_uniq', 'UNIQUE(name)',
+ 'The name of calendar location must be unique!'),
+ ]
+ self._order.insert(0, ('name', 'ASC'))
+
+Location()
+
+
+class Event(ModelSQL, ModelView):
+ "Event"
+ _description = __doc__
+ _name = 'calendar.event'
+ _rec_name = 'uuid'
+
+ uuid = fields.Char('UUID', required=True,
+ help='Universally Unique Identifier', select=1)
+ calendar = fields.Many2One('calendar.calendar', 'Calendar',
+ required=True, select=1)
+ summary = fields.Char('Summary')
+ sequence = fields.Integer('Sequence')
+ description = fields.Text('Description')
+ all_day = fields.Boolean('All Day')
+ dtstart = fields.DateTime('Start Date', required=True, select=1)
+ dtend = fields.DateTime('End Date', select=1)
+ timezone = fields.Selection('timezones', 'Timezone')
+ categories = fields.Many2Many('calendar.event-calendar.category',
+ 'event', 'category', 'Categories')
+ classification = fields.Selection([
+ ('public', 'Public'),
+ ('private', 'Private'),
+ ('confidential', 'Confidential'),
+ ], 'Classification', required=True)
+ location = fields.Many2One('calendar.location', 'Location')
+ status = fields.Selection([
+ ('', ''),
+ ('tentative', 'Tentative'),
+ ('confirmed', 'Confirmed'),
+ ('cancelled', 'Cancelled'),
+ ], 'Status')
+ organizer = fields.Char('Organizer', states={
+ 'required': "bool(attendees) and not bool(parent)",
+ }, depends=['attendees', 'parent'])
+ attendees = fields.One2Many('calendar.event.attendee', 'event',
+ 'Attendees')
+ transp = fields.Selection([
+ ('opaque', 'Opaque'),
+ ('transparent', 'Transparent'),
+ ], 'Time Transparency', required=True)
+ alarms = fields.One2Many('calendar.event.alarm', 'event', 'Alarms')
+ rdates = fields.One2Many('calendar.event.rdate', 'event', 'Recurrence Dates',
+ states={
+ 'invisible': "bool(parent)",
+ }, depends=['parent'])
+ rrules = fields.One2Many('calendar.event.rrule', 'event', 'Recurrence Rules',
+ states={
+ 'invisible': "bool(parent)",
+ }, depends=['parent'])
+ exdates = fields.One2Many('calendar.event.exdate', 'event', 'Exception Dates',
+ states={
+ 'invisible': "bool(parent)",
+ }, depends=['parent'])
+ exrules = fields.One2Many('calendar.event.exrule', 'event', 'Exception Rules',
+ states={
+ 'invisible': "bool(parent)",
+ }, depends=['parent'])
+ occurences = fields.One2Many('calendar.event', 'parent', 'Occurences',
+ domain=["('uuid', '=', uuid)",
+ "('calendar', '=', calendar)"],
+ states={
+ 'invisible': "bool(parent)",
+ }, depends=['uuid', 'calendar', 'parent'])
+ parent = fields.Many2One('calendar.event', 'Parent',
+ domain=["('uuid', '=', uuid)",
+ "('parent', '=', False)",
+ "('calendar', '=', calendar)"],
+ ondelete='CASCADE', depends=['uuid', 'calendar'])
+ recurrence = fields.DateTime('Recurrence', select=1, states={
+ 'invisible': "not 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')
+ vevent = fields.Binary('vevent')
+
+ def __init__(self):
+ super(Event, self).__init__()
+ self._sql_constraints = [
+ ('uuid_recurrence_uniq', 'UNIQUE(uuid, calendar, recurrence)',
+ 'UUID and recurrence must be unique in a calendar!'),
+ ]
+ 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_transp(self, cursor, user, context=None):
+ return 'opaque'
+
+ 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 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 event in self.browse(cursor, user, ids, context=context):
+ name = name[9:]
+ if name in ('read_users', 'write_users'):
+ res[event.id] = [x.id for x in event.calendar[name]]
+ else:
+ res[event.id] = event.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 event in self.browse(cursor, user, ids, context=context):
+ res[event.id] = False
+ if event.classification == 'public':
+ res[event.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 event in self.browse(cursor, user, ids):
+ if not event.parent:
+ continue
+ if event.rdates \
+ or event.rrules \
+ or event.exdates \
+ or event.exrules \
+ or event.occurences:
+ 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(Event, self).create(cursor, user, values, context=context)
+ event = self.browse(cursor, user, res, context=context)
+ if event.calendar.owner \
+ and (event.organizer == event.calendar.owner.email \
+ or (event.parent \
+ and event.parent.organizer == event.parent.calendar.owner.email)):
+ if event.organizer == event.calendar.owner.email:
+ attendee_emails = [x.email for x in event.attendees
+ if x.status != 'declined'
+ and x.email != event.organizer]
+ else:
+ attendee_emails = [x.email for x in event.parent.attendees
+ if x.status != 'declined'
+ and x.email != event.parent.organizer]
+ if attendee_emails:
+ calendar_ids = calendar_obj.search(cursor, 0, [
+ ('owner.email', 'in', attendee_emails),
+ ], context=context)
+ if not event.recurrence:
+ for calendar_id in calendar_ids:
+ new_id = self.copy(cursor, 0, event.id, default={
+ 'calendar': calendar_id,
+ 'occurences': False,
+ }, context=context)
+ for occurence in event.occurences:
+ self.copy(cursor, 0, occurence.id, default={
+ 'calendar': calendar_id,
+ 'parent': new_id,
+ }, context=context)
+ else:
+ parent_ids = self.search(cursor, 0, [
+ ('uuid', '=', event.uuid),
+ ('calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', event.id),
+ ('recurrence', '=', False),
+ ], context=context)
+ for parent in self.browse(cursor, 0, parent_ids,
+ context=context):
+ self.copy(cursor, 0, event.id, default={
+ 'calendar': parent.calendar.id,
+ 'parent': parent.id,
+ }, context=context)
+ # Restart the cache for event
+ collection_obj.event(cursor.dbname)
+ return res
+
+ def _event2update(self, cursor, user, event, context=None):
+ rdate_obj = self.pool.get('calendar.event.rdate')
+ exdate_obj = self.pool.get('calendar.event.exdate')
+ rrule_obj = self.pool.get('calendar.event.rrule')
+ exrule_obj = self.pool.get('calendar.event.exrule')
+
+ res = {}
+ res['summary'] = event.summary
+ res['description'] = event.description
+ res['all_day'] = event.all_day
+ res['dtstart'] = event.dtstart
+ res['dtend'] = event.dtend
+ res['location'] = event.location.id
+ res['status'] = event.status
+ res['organizer'] = event.organizer
+ res['rdates'] = [('delete_all',)]
+ for rdate in event.rdates:
+ vals = rdate_obj._date2update(cursor, user, rdate, context=context)
+ res['rdates'].append(('create', vals))
+ res['exdates'] = [('delete_all',)]
+ for exdate in event.exdates:
+ vals = exdate_obj._date2update(cursor, user, exdate, context=context)
+ res['exdates'].append(('create', vals))
+ res['rrules'] = [('delete_all',)]
+ for rrule in event.rrules:
+ vals = rrule_obj._rule2update(cursor, user, rrule, context=context)
+ res['rrules'].append(('create', vals))
+ res['exrules'] = [('delete_all',)]
+ for exrule in event.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(Event, 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 event in self.browse(cursor, user, ids, context=context):
+ if event.calendar.owner \
+ and (event.organizer == event.calendar.owner.email \
+ or (event.parent \
+ and event.parent.organizer == event.calendar.owner.email)):
+ if event.organizer == event.calendar.owner.email:
+ attendee_emails = [x.email for x in event.attendees
+ if x.status != 'declined'
+ and x.email != event.organizer]
+ else:
+ attendee_emails = [x.email for x in event.parent.attendees
+ if x.status != 'declined'
+ and x.email != event.parent.organizer]
+ if attendee_emails:
+ event_ids = self.search(cursor, 0, [
+ ('uuid', '=', event.uuid),
+ ('calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', event.id),
+ ('recurrence', '=', event.recurrence or False),
+ ], context=context)
+ for event2 in self.browse(cursor, user, event_ids,
+ context=context):
+ if event2.calendar.owner.email in attendee_emails:
+ attendee_emails.remove(event2.calendar.owner.email)
+ self.write(cursor, 0, event_ids, self._event2update(
+ cursor, user, event, context=context), context=context)
+ if attendee_emails:
+ calendar_ids = calendar_obj.search(cursor, 0, [
+ ('owner.email', 'in', attendee_emails),
+ ], context=context)
+ if not event.recurrence:
+ for calendar_id in calendar_ids:
+ new_id = self.copy(cursor, 0, event.id, default={
+ 'calendar': calendar_id,
+ 'occurences': False,
+ }, context=context)
+ for occurence in event.occurences:
+ self.copy(cursor, 0, occurence.id, default={
+ 'calendar': calendar_id,
+ 'parent': new_id,
+ }, context=context)
+ else:
+ parent_ids = self.search(cursor, 0, [
+ ('uuid', '=', event.uuid),
+ ('calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', event.id),
+ ('recurrence', '=', False),
+ ], context=context)
+ for parent in self.browse(cursor, 0, parent_ids,
+ context=context):
+ self.copy(cursor, 0, event.id, default={
+ 'calendar': parent.calendar.id,
+ 'parent': parent.id,
+ }, context=context)
+ # Restart the cache for event
+ collection_obj.event(cursor.dbname)
+ return res
+
+ def delete(self, cursor, user, ids, context=None):
+ attendee_obj = self.pool.get('calendar.event.attendee')
+ collection_obj = self.pool.get('webdav.collection')
+
+ if isinstance(ids, (int, long)):
+ ids = [ids]
+ for event in self.browse(cursor, user, ids, context=context):
+ if event.calendar.owner \
+ and (event.organizer == event.calendar.owner.email \
+ or (event.parent \
+ and event.parent.organizer == event.calendar.owner.email)):
+ if event.organizer == event.calendar.owner.email:
+ attendee_emails = [x.email for x in event.attendees
+ if x.email != event.organizer]
+ else:
+ attendee_emails = [x.email for x in event.parent.attendees
+ if x.email != event.parent.organizer]
+ if attendee_emails:
+ event_ids = self.search(cursor, 0, [
+ ('uuid', '=', event.uuid),
+ ('calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', event.id),
+ ('recurrence', '=', event.recurrence or False),
+ ], context=context)
+ self.delete(cursor, 0, event_ids, context=context)
+ elif event.organizer \
+ or (event.parent and event.parent.organizer):
+ if event.organizer:
+ organizer = event.organizer
+ else:
+ organizer = event.parent.organizer
+ event_ids = self.search(cursor, 0, [
+ ('uuid', '=', event.uuid),
+ ('calendar.owner.email', '=', organizer),
+ ('id', '!=', event.id),
+ ('recurrence', '=', event.recurrence or False),
+ ], context=context, limit=1)
+ if event_ids:
+ event2 = self.browse(cursor, 0, event_ids[0],
+ context=context)
+ for attendee in event2.attendees:
+ if attendee.email == event.calendar.owner.email:
+ attendee_obj.write(cursor, 0, attendee.id, {
+ 'status': 'declined',
+ }, context=context)
+ res = super(Event, self).delete(cursor, user, ids, context=context)
+ # Restart the cache for event
+ collection_obj.event(cursor.dbname)
+ return res
+
+ def ical2values(self, cursor, user, event_id, ical, calendar_id,
+ vevent=None, context=None):
+ '''
+ Convert iCalendar to values for create or write
+
+ :param cursor: the database cursor
+ :param user: the user id
+ :param event_id: the event id for write or None for create
+ :param ical: a ical instance of vobject
+ :param calendar_id: the calendar id of the event
+ :param vevent: the vevent 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.event.alarm')
+ attendee_obj = self.pool.get('calendar.event.attendee')
+ rdate_obj = self.pool.get('calendar.event.rdate')
+ exdate_obj = self.pool.get('calendar.event.exdate')
+ rrule_obj = self.pool.get('calendar.event.rrule')
+ exrule_obj = self.pool.get('calendar.event.exrule')
+
+ if context is None:
+ context = {}
+
+ vevents = []
+ if not vevent:
+ vevent = ical.vevent
+
+ for i in ical.getChildren():
+ if i.name == 'VEVENT' \
+ and i != vevent:
+ vevents.append(i)
+
+ event = None
+ if event_id:
+ event = self.browse(cursor, user, event_id, context=context)
+
+ res = {}
+ if not event:
+ if hasattr(vevent, 'uid'):
+ res['uuid'] = vevent.uid.value
+ else:
+ res['uuid'] = str(uuid.uuid4())
+ if hasattr(vevent, 'summary'):
+ res['summary'] = vevent.summary.value
+ else:
+ res['summary'] = False
+ if hasattr(vevent, 'description'):
+ res['description'] = vevent.description.value
+ else:
+ res['description'] = False
+ if not isinstance(vevent.dtstart.value, datetime.datetime):
+ res['all_day'] = True
+ res['dtstart'] = datetime.datetime.combine(vevent.dtstart.value,
+ datetime.time())
+ else:
+ res['all_day'] = False
+ if vevent.dtstart.value.tzinfo:
+ res['dtstart'] = vevent.dtstart.value.astimezone(tzlocal)
+ else:
+ res['dtstart'] = vevent.dtstart.value
+ if hasattr(vevent, 'dtend'):
+ if not isinstance(vevent.dtend.value, datetime.datetime):
+ res['dtend'] = datetime.datetime.combine(vevent.dtend.value,
+ datetime.time())
+ else:
+ if vevent.dtend.value.tzinfo:
+ res['dtend'] = vevent.dtend.value.astimezone(tzlocal)
+ else:
+ res['dtend'] = vevent.dtend.value
+ elif hasattr(vevent, 'duration') and res['dtstart']:
+ res['dtend'] = dtstart + vevent.duration
+ else:
+ res['dtend'] = False
+ if hasattr(vevent, 'recurrence-id'):
+ if not isinstance(vevent.recurrence_id.value, datetime.datetime):
+ res['recurrence'] = datetime.datetime.combine(
+ vevent.recurrence_id.value, datetime.time())
+ else:
+ if vevent.recurrence_id.value.tzinfo:
+ res['recurrence'] = \
+ vevent.recurrence_id.value.astimezone(tzlocal)
+ else:
+ res['recurrence'] = vevent.recurrence_id.value
+ else:
+ res['recurrence'] = False
+ if hasattr(vevent, 'status'):
+ res['status'] = vevent.status.value.lower()
+ else:
+ res['status'] = ''
+ if hasattr(vevent, 'categories'):
+ ctx = context.copy()
+ ctx['active_test'] = False
+ category_ids = category_obj.search(cursor, user, [
+ ('name', 'in', [x for x in vevent.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 vevent.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(vevent, 'class'):
+ if getattr(vevent, 'class').value.lower() in \
+ dict(self.classification.selection):
+ res['classification'] = getattr(vevent, 'class').value.lower()
+ else:
+ res['classification'] = 'public'
+ else:
+ res['classification'] = 'public'
+ if hasattr(vevent, 'location'):
+ ctx = context.copy()
+ ctx['active_test'] = False
+ location_ids = location_obj.search(cursor, user, [
+ ('name', '=', vevent.location.value),
+ ], limit=1, context=ctx)
+ if not location_ids:
+ location_id = location_obj.create(cursor, user, {
+ 'name': vevent.location.value,
+ }, context=context)
+ else:
+ location_id = location_ids[0]
+ res['location'] = location_id
+ else:
+ res['location'] = False
+
+ res['calendar'] = calendar_id
+
+ if hasattr(vevent, 'transp'):
+ res['transp'] = vevent.transp.value.lower()
+ else:
+ res['transp'] = 'opaque'
+
+ if hasattr(vevent, 'organizer'):
+ if vevent.organizer.value.lower().startswith('mailto:'):
+ res['organizer'] = vevent.organizer.value[7:]
+ else:
+ res['organizer'] = vevent.organizer.value
+ else:
+ res['organizer'] = False
+
+ attendees_todel = {}
+ if event:
+ for attendee in event.attendees:
+ attendees_todel[attendee.email] = attendee.id
+ res['attendees'] = []
+ if hasattr(vevent, 'attendee'):
+ while vevent.attendee_list:
+ attendee = vevent.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 event:
+ res['rdates'].append(('delete', [x.id for x in event.rdates]))
+ if hasattr(vevent, 'rdate'):
+ while vevent.rdate_list:
+ rdate = vevent.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 event:
+ res['exdates'].append(('delete', [x.id for x in event.exdates]))
+ if hasattr(vevent, 'exdate'):
+ while vevent.exdate_list:
+ exdate = vevent.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 event:
+ res['rrules'].append(('delete', [x.id for x in event.rrules]))
+ if hasattr(vevent, 'rrule'):
+ while vevent.rrule_list:
+ rrule = vevent.rrule_list.pop()
+ vals = rrule_obj.rule2values(cursor, user, rrule,
+ context=context)
+ res['rrules'].append(('create', vals))
+
+ res['exrules'] = []
+ if event:
+ res['exrules'].append(('delete', [x.id for x in event.exrules]))
+ if hasattr(vevent, 'exrule'):
+ while vevent.exrule_list:
+ exrule = vevent.exrule_list.pop()
+ vals = exrule_obj.rule2values(cursor, user, exrule,
+ context=context)
+ res['exrules'].append(('create', vals))
+
+ if event:
+ res.setdefault('alarms', [])
+ res['alarms'].append(('delete', [x.id for x in event.alarms]))
+ if hasattr(vevent, 'valarm'):
+ res.setdefault('alarms', [])
+ while vevent.valarm_list:
+ valarm = vevent.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['vevent'] = vevent.serialize()
+
+ occurences_todel = []
+ if event:
+ occurences_todel = [x.id for x in event.occurences]
+ for vevent in vevents:
+ event_id = None
+ if event:
+ for occurence in event.occurences:
+ if occurence.recurrence.replace(tzinfo=tzlocal) \
+ == vevent.recurrence_id.value:
+ event_id = occurence.id
+ occurences_todel.remove(occurence.id)
+ vals = self.ical2values(cursor, user, event_id, ical,
+ calendar_id, vevent=vevent, context=context)
+ if event:
+ vals['uuid'] = event.uuid
+ else:
+ vals['uuid'] = res['uuid']
+ res.setdefault('occurences', [])
+ if event_id:
+ res['occurences'].append(('write', event_id, vals))
+ else:
+ res['occurences'].append(('create', vals))
+ if occurences_todel:
+ res.setdefault('occurences', [])
+ res['occurences'].append(('delete', occurences_todel))
+ return res
+
+ def event2ical(self, cursor, user, event, context=None):
+ '''
+ Return an iCalendar instance of vobject for event
+
+ :param cursor: the database cursor
+ :param user: the user id
+ :param event: a BrowseRecord of calendar.event
+ or a calendar.event 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.event.alarm')
+ attendee_obj = self.pool.get('calendar.event.attendee')
+ rdate_obj = self.pool.get('calendar.event.rdate')
+ exdate_obj = self.pool.get('calendar.event.exdate')
+ rrule_obj = self.pool.get('calendar.event.rrule')
+ exrule_obj = self.pool.get('calendar.event.exrule')
+
+ if isinstance(event, (int, long)):
+ event = self.browse(cursor, user, event, context=context)
+
+ user_ = user_obj.browse(cursor, user, user, context=context)
+ if event.timezone:
+ tzevent = pytz.timezone(event.timezone)
+ elif user_.timezone:
+ tzevent = pytz.timezone(user_.timezone)
+ else:
+ tzevent = tzlocal
+
+ ical = vobject.iCalendar()
+ vevent = ical.add('vevent')
+ if event.vevent:
+ ical.vevent = vobject.readOne(event.vevent)
+ vevent = ical.vevent
+ ical.vevent.transformToNative()
+ if event.summary:
+ if not hasattr(vevent, 'summary'):
+ vevent.add('summary')
+ vevent.summary.value = event.summary
+ elif hasattr(vevent, 'summary'):
+ del vevent.summary
+ if event.description:
+ if not hasattr(vevent, 'description'):
+ vevent.add('description')
+ vevent.description.value = event.description
+ elif hasattr(vevent, 'description'):
+ del vevent.description
+ if not hasattr(vevent, 'dtstart'):
+ vevent.add('dtstart')
+ if event.all_day:
+ vevent.dtstart.value = event.dtstart.date()
+ else:
+ vevent.dtstart.value = event.dtstart.replace(tzinfo=tzlocal)\
+ .astimezone(tzevent)
+ if event.dtend:
+ if not hasattr(vevent, 'dtend'):
+ vevent.add('dtend')
+ if event.all_day:
+ vevent.dtend.value = event.dtend.date()
+ else:
+ vevent.dtend.value = event.dtend.replace(tzinfo=tzlocal)\
+ .astimezone(tzevent)
+ elif hasattr(vevent, 'dtend'):
+ del vevent.dtend
+ if not hasattr(vevent, 'created'):
+ vevent.add('created')
+ vevent.created.value = event.create_date.replace(tzinfo=tzlocal)
+ if not hasattr(vevent, 'dtstamp'):
+ vevent.add('dtstamp')
+ date = event.write_date or event.create_date
+ vevent.dtstamp.value = date.replace(tzinfo=tzlocal)
+ if not hasattr(vevent, 'last-modified'):
+ vevent.add('last-modified')
+ vevent.last_modified.value = date.replace(tzinfo=tzlocal)
+ if event.recurrence:
+ if not hasattr(vevent, 'recurrence-id'):
+ vevent.add('recurrence-id')
+ if event.all_day:
+ vevent.recurrence_id.value = event.recurrence.date()
+ else:
+ vevent.recurrence_id.value = event.recurrence\
+ .replace(tzinfo=tzlocal).astimezone(tzevent)
+ if event.status:
+ if not hasattr(vevent, 'status'):
+ vevent.add('status')
+ vevent.status.value = event.status.upper()
+ elif hasattr(vevent, 'status'):
+ del vevent.status
+ if not hasattr(vevent, 'uid'):
+ vevent.add('uid')
+ vevent.uid.value = event.uuid
+ if not hasattr(vevent, 'sequence'):
+ vevent.add('sequence')
+ vevent.sequence.value = str(event.sequence) or '0'
+ if event.categories:
+ if not hasattr(vevent, 'categories'):
+ vevent.add('categories')
+ vevent.categories.value = [x.name for x in event.categories]
+ elif hasattr(vevent, 'categories'):
+ del vevent.categories
+ if not hasattr(vevent, 'class'):
+ vevent.add('class')
+ getattr(vevent, 'class').value = event.classification.upper()
+ elif getattr(vevent, 'class').value.lower() in \
+ dict(self.classification.selection):
+ getattr(vevent, 'class').value = event.classification.upper()
+ if event.location:
+ if not hasattr(vevent, 'location'):
+ vevent.add('location')
+ vevent.location.value = event.location.name
+ elif hasattr(vevent, 'location'):
+ del vevent.location
+
+ if event.organizer:
+ if not hasattr(vevent, 'organizer'):
+ vevent.add('organizer')
+ vevent.organizer.value = 'MAILTO:' + event.organizer
+ elif hasattr(vevent, 'organizer'):
+ del vevent.organizer
+
+ vevent.attendee_list = []
+ for attendee in event.attendees:
+ vevent.attendee_list.append(attendee_obj.attendee2attendee(
+ cursor, user, attendee, context=context))
+
+ if event.rdates:
+ vevent.add('rdate')
+ vevent.rdate.value = []
+ for rdate in event.rdates:
+ vevent.rdate.value.append(rdate_obj.date2date(cursor, user,
+ rdate, context=context))
+
+ if event.exdates:
+ vevent.add('exdate')
+ vevent.exdate.value = []
+ for exdate in event.exdates:
+ vevent.exdate.value.append(exdate_obj.date2date(cursor, user,
+ exdate, context=context))
+
+ if event.rrules:
+ for rrule in event.rrules:
+ vevent.add('rrule').value = rrule_obj.rule2rule(cursor, user,
+ rrule, context=context)
+
+ if event.exrules:
+ for exrule in event.exrules:
+ vevent.add('exrule').value = exrule_obj.rule2rule(cursor, user,
+ exrule, context=context)
+
+ vevent.valarm_list = []
+ for alarm in event.alarms:
+ valarm = alarm_obj.alarm2valarm(cursor, user, alarm,
+ context=context)
+ if valarm:
+ vevent.valarm_list.append(valarm)
+
+ for occurence in event.occurences:
+ oical = self.event2ical(cursor, user, occurence, context=context)
+ ical.vevent_list.append(oical.vevent)
+ return ical
+
+Event()
+
+
+class EventCategory(ModelSQL):
+ 'Event - Category'
+ _description = __doc__
+ _name = 'calendar.event-calendar.category'
+
+ event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
+ required=True, select=1)
+ category = fields.Many2One('calendar.category', 'Category',
+ ondelete='CASCADE', required=True, select=1)
+
+EventCategory()
+
+
+class Alarm(ModelSQL):
+ 'Alarm'
+ _description = __doc__
+ _name = 'calendar.alarm'
+
+ valarm = fields.Binary('valarm')
+
+ def valarm2values(self, cursor, user, valarm, context=None):
+ '''
+ Convert a valarm object into values for create or write
+
+ :param cursor: the database cursor
+ :param user: the user id
+ :param valarm: the valarm object
+ :param context: the context
+ :return: a dictionary with values
+ '''
+ res = {}
+ res['valarm'] = valarm.serialize()
+ return res
+
+ def alarm2valarm(self, cursor, user, alarm, context=None):
+ '''
+ Return a valarm instance of vobject for alarm
+
+ :param cursor: the database cursor
+ :param user: the user id
+ :param alarm: a BrowseRecord of calendar.event.alarm
+ :param context: the context
+ :return: a valarm instance of vobject
+ '''
+ valarm = None
+ if alarm.valarm:
+ valarm = vobject.readOne(alarm.valarm)
+ return valarm
+
+Alarm()
+
+
+class EventAlarm(ModelSQL):
+ 'Alarm'
+ _description = __doc__
+ _name = 'calendar.event.alarm'
+ _inherits = {'calendar.alarm': 'calendar_alarm'}
+
+ calendar_alarm = fields.Many2One('calendar.alarm', 'Calendar Alarm',
+ required=True, ondelete='CASCADE', select=1)
+ event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
+ required=True, select=1)
+
+ def create(self, cursor, user, values, context=None):
+ event_obj = self.pool.get('calendar.event')
+ if values.get('event'):
+ # Update write_date of event
+ event_obj.write(cursor, user, values['event'], {}, context=context)
+ return super(EventAlarm, self).create(cursor, user, values, context=context)
+
+ def write(self, cursor, user, ids, values, context=None):
+ event_obj = self.pool.get('calendar.event')
+ if isinstance(ids, (int, long)):
+ ids = [ids]
+ event_ids = [x.event.id for x in self.browse(cursor, user, ids,
+ context=context)]
+ if values.get('event'):
+ event_ids.append(values['event'])
+ if event_ids:
+ # Update write_date of event
+ event_obj.write(cursor, user, event_ids, {}, context=context)
+ return super(EventAlarm, self).write(cursor, user, ids, values,
+ context=context)
+
+ def delete(self, cursor, user, ids, context=None):
+ event_obj = self.pool.get('calendar.event')
+ alarm_obj = self.pool.get('calendar.alarm')
+ if isinstance(ids, (int, long)):
+ ids = [ids]
+ event_alarms = self.browse(cursor, user, ids, context=context)
+ alarm_ids = [a.calendar_alarm.id for a in event_alarms]
+ event_ids = [x.event.id for x in event_alarms]
+ if event_ids:
+ # Update write_date of event
+ event_obj.write(cursor, user, event_ids, {}, context=context)
+ res = super(EventAlarm, 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)
+
+EventAlarm()
+
+
+class Attendee(ModelSQL, ModelView):
+ 'Attendee'
+ _description = __doc__
+ _name = 'calendar.attendee'
+
+ email = fields.Char('Email', required=True, states={
+ 'readonly': 'active_id > 0',
+ })
+ status = fields.Selection([
+ ('', ''),
+ ('needs-action', 'Needs Action'),
+ ('accepted', 'Accepted'),
+ ('declined', 'Declined'),
+ ('tentative', 'Tentative'),
+ ('delegated', 'Delegated'),
+ ], 'Participation Status')
+ attendee = fields.Binary('attendee')
+
+ def default_status(self, cursor, user, context=None):
+ return ''
+
+ def _attendee2update(self, cursor, user, attendee, context=None):
+ res = {}
+ res['status'] = attendee.status
+ return res
+
+ def attendee2values(self, cursor, user, attendee, context=None):
+ '''
+ Convert a attendee object into values for create or write
+
+ :param cursor: the database cursor
+ :param user: the user id
+ :param attendee: the attendee object
+ :param context: the context
+ :return: a dictionary with values
+ '''
+ res = {}
+ if attendee.value.lower().startswith('mailto:'):
+ res['email'] = attendee.value[7:]
+ else:
+ res['email'] = attendee.value
+ res['status'] = ''
+ if hasattr(attendee, 'partstat_param'):
+ if attendee.partstat_param.lower() in dict(self.status.selection):
+ res['status'] = attendee.partstat_param.lower()
+ res['attendee'] = attendee.serialize()
+ return res
+
+ def attendee2attendee(self, cursor, user, attendee, context=None):
+ '''
+ Return a attendee instance of vobject for attendee
+
+ :param cursor: the database cursor
+ :param user: the user id
+ :param attendee: a BrowseRecord of calendar.event.attendee
+ :param context: the context
+ :return: a attendee instance of vobject
+ '''
+ res = None
+ if attendee.attendee:
+ res = vobject.base.textLineToContentLine(
+ attendee.attendee.replace('\r\n ', ''))
+ else:
+ res = vobject.base.ContentLine('ATTENDEE', [], '')
+
+ if attendee.status:
+ if hasattr(res, 'partstat_param'):
+ if res.partstat_param.lower() in dict(self.status.selection):
+ res.partstat_param = attendee.status.upper()
+ else:
+ res.partstat_param = attendee.status.upper()
+ elif hasattr(res, 'partstat_param'):
+ if res.partstat_param.lower() in dict(self.status.selection):
+ del res.partstat_param
+
+ res.value = 'MAILTO:' + attendee.email
+ return res
+
+Attendee()
+
+
+class EventAttendee(ModelSQL, ModelView):
+ 'Attendee'
+ _description = __doc__
+ _name = 'calendar.event.attendee'
+ _inherits = {'calendar.attendee': 'calendar_attendee'}
+
+ calendar_attendee = fields.Many2One('calendar.attendee',
+ 'Calendar Attendee', required=True, ondelete='CASCADE', select=1)
+ event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
+ required=True, select=1)
+
+ def create(self, cursor, user, values, context=None):
+ event_obj = self.pool.get('calendar.event')
+ if values.get('event'):
+ # Update write_date of event
+ event_obj.write(cursor, user, values['event'], {}, context=context)
+ res = super(EventAttendee, self).create(cursor, user, values,
+ context=context)
+ attendee = self.browse(cursor, user, res, context=context)
+ event = attendee.event
+ if event.calendar.owner \
+ and (event.organizer == event.calendar.owner.email \
+ or (event.parent \
+ and event.parent.organizer == event.parent.calendar.owner.email)):
+ if event.organizer == event.calendar.owner.email:
+ attendee_emails = [x.email for x in event.attendees
+ if x.email != event.organizer]
+ else:
+ attendee_emails = [x.email for x in event.parent.attendees
+ if x.email != event.parent.organizer]
+ if attendee_emails:
+ event_ids = event_obj.search(cursor, 0, [
+ ('uuid', '=', event.uuid),
+ ('calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', event.id),
+ ('recurrence', '=', event.recurrence or False),
+ ], context=context)
+ for event_id in event_ids:
+ self.copy(cursor, 0, res, default={
+ 'event': event_id,
+ }, context=context)
+ return res
+
+ def write(self, cursor, user, ids, values, context=None):
+ event_obj = self.pool.get('calendar.event')
+ if isinstance(ids, (int, long)):
+ ids = [ids]
+ event_ids = [x.event.id for x in self.browse(cursor, user, ids,
+ context=context)]
+ if values.get('event'):
+ event_ids.append(values['event'])
+ if event_ids:
+ # Update write_date of event
+ event_obj.write(cursor, user, event_ids, {}, context=context)
+
+ if 'email' in values:
+ values = values.copy()
+ del values['email']
+
+ res = super(EventAttendee, self).write(cursor, user, ids, values,
+ context=context)
+ attendees = self.browse(cursor, user, ids, context=context)
+ for attendee in attendees:
+ event = attendee.event
+ if event.calendar.owner \
+ and (event.organizer == event.calendar.owner.email \
+ or (event.parent \
+ and event.parent.organizer == event.calendar.owner.email)):
+ if event.organizer == event.calendar.owner.email:
+ attendee_emails = [x.email for x in event.attendees
+ if x.email != event.organizer]
+ else:
+ attendee_emails = [x.email for x in event.parent.attendees
+ if x.email != event.parent.organizer]
+ if attendee_emails:
+ attendee_ids = self.search(cursor, 0, [
+ ('event.uuid', '=', event.uuid),
+ ('event.calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', attendee.id),
+ ('event.recurrence', '=', event.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):
+ event_obj = self.pool.get('calendar.event')
+ attendee_obj = self.pool.get('calendar.attendee')
+
+ if isinstance(ids, (int, long)):
+ ids = [ids]
+ event_attendees = self.browse(cursor, user, ids, context=context)
+ calendar_attendee_ids = [a.calendar_attendee.id \
+ for a in event_attendees]
+ event_ids = [x.event.id for x in event_attendees]
+ if event_ids:
+ # Update write_date of event
+ event_obj.write(cursor, user, event_ids, {}, context=context)
+
+ for attendee in self.browse(cursor, user, ids, context=context):
+ event = attendee.event
+ if event.calendar.owner \
+ and (event.organizer == event.calendar.owner.email \
+ or (event.parent \
+ and event.parent.organizer == event.calendar.owner.email)):
+ if event.organizer == event.calendar.owner.email:
+ attendee_emails = [x.email for x in event.attendees
+ if x.email != event.organizer]
+ else:
+ attendee_emails = [x.email for x in event.parent.attendees
+ if x.email != event.parent.organizer]
+ if attendee_emails:
+ attendee_ids = self.search(cursor, 0, [
+ ('event.uuid', '=', event.uuid),
+ ('event.calendar.owner.email', 'in', attendee_emails),
+ ('id', '!=', attendee.id),
+ ('event.recurrence', '=', event.recurrence or False),
+ ('email', '=', attendee.email),
+ ], context=context)
+ self.delete(cursor, 0, attendee_ids, context=context)
+ elif event.calendar.owner \
+ and ((event.organizer \
+ or (event.parent and event.parent.organizer)) \
+ and attendee.email == event.calendar.owner.email):
+ if event.organizer:
+ organizer = event.organizer
+ else:
+ organizer = event.parent.organizer
+ attendee_ids = self.search(cursor, 0, [
+ ('event.uuid', '=', event.uuid),
+ ('event.calendar.owner.email', '=', organizer),
+ ('id', '!=', attendee.id),
+ ('event.recurrence', '=', event.recurrence or False),
+ ('email', '=', attendee.email),
+ ], context=context)
+ if attendee_ids:
+ self.write(cursor, 0, attendee_ids, {
+ 'status': 'declined',
+ }, context=context)
+ res = super(EventAttendee, 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)
+
+EventAttendee()
+
+
+class RDate(ModelSQL, ModelView):
+ 'Recurrence Date'
+ _description = __doc__
+ _name = 'calendar.rdate'
+ _rec_name = 'datetime'
+
+ date = fields.Boolean('Is Date', help='Ignore time of field "Date", ' \
+ 'but handle as date only.')
+ datetime = fields.DateTime('Date', required=True)
+
+ def _date2update(self, cursor, user, date, context=None):
+ res = {}
+ res['date'] = date.date
+ res['datetime'] = date.datetime
+ return res
+
+ def date2values(self, cursor, user, date, context=None):
+ '''
+ Convert a date object into values for create or write
+
+ :param cursor: the database cursor
+ :param user: the user id
+ :param date: the date object
+ :param context: the context
+ :return: a dictionary with values
+ '''
+ res = {}
+ if not isinstance(date, datetime.datetime):
+ res['date'] = True
+ res['datetime'] = datetime.datetime.combine(date,
+ datetime.time())
+ else:
+ res['date'] = False
+ if date.tzinfo:
+ res['datetime'] = date.astimezone(tzlocal)
+ else:
+ res['datetime'] = date
+ return res
+
+ def date2date(self, cursor, user, date, context=None):
+ '''
+ Return a datetime for date
+
+ :param cursor: the database cursor
+ :param user: the user id
+ :param date: a BrowseRecord of calendar.rdate or
+ calendar.exdate
+ :param context: the context
+ :return: a datetime
+ '''
+ if date.date:
+ res = date.datetime.date()
+ else:
+ # Convert to UTC as sunbird doesn't handle tzid
+ res = date.datetime.replace(tzinfo=tzlocal).astimezone(tzutc)
+ return res
+
+RDate()
+
+
+class EventRDate(ModelSQL, ModelView):
+ 'Recurrence Date'
+ _description = __doc__
+ _name = 'calendar.event.rdate'
+ _inherits = {'calendar.rdate': 'calendar_rdate'}
+ _rec_name = 'datetime'
+
+ calendar_rdate = fields.Many2One('calendar.rdate', 'Calendar RDate',
+ required=True, ondelete='CASCADE', select=1)
+ event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
+ select=1, required=True)
+
+ def create(self, cursor, user, values, context=None):
+ event_obj = self.pool.get('calendar.event')
+ if values.get('event'):
+ # Update write_date of event
+ event_obj.write(cursor, user, values['event'], {}, context=context)
+ return super(EventRDate, self).create(cursor, user, values,
+ context=context)
+
+ def write(self, cursor, user, ids, values, context=None):
+ event_obj = self.pool.get('calendar.event')
+ if isinstance(ids, (int, long)):
+ ids = [ids]
+ event_ids = [x.event.id for x in self.browse(cursor, user, ids,
+ context=context)]
+ if values.get('event'):
+ event_ids.append(values['event'])
+ if event_ids:
+ # Update write_date of event
+ event_obj.write(cursor, user, event_ids, {}, context=context)
+ return super(EventRDate, self).write(cursor, user, ids, values,
+ context=context)
+
+ def delete(self, cursor, user, ids, context=None):
+ event_obj = self.pool.get('calendar.event')
+ rdate_obj = self.pool.get('calendar.rdate')
+ if isinstance(ids, (int, long)):
+ ids = [ids]
+ event_rdates = self.browse(cursor, user, ids, context=context)
+ rdate_ids = [a.calendar_rdate.id for a in event_rdates]
+ event_ids = [x.event.id for x in event_rdates]
+ if event_ids:
+ # Update write_date of event
+ event_obj.write(cursor, user, event_ids, {}, context=context)
+ res = super(EventRDate, 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)
+
+EventRDate()
+
+
+class EventExDate(EventRDate):
+ 'Exception Date'
+ _description = __doc__
+ _name = 'calendar.event.exdate'
+
+EventExDate()
+
+
+class RRule(ModelSQL, ModelView):
+ 'Recurrence Rule'
+ _description = __doc__
+ _name = 'calendar.rrule'
+ _rec_name = 'freq'
+
+ freq = fields.Selection([
+ ('secondly', 'Secondly'),
+ ('minutely', 'Minutely'),
+ ('hourly', 'Hourly'),
+ ('daily', 'Daily'),
+ ('weekly', 'Weekly'),
+ ('monthly', 'Monthly'),
+ ('yearly', 'Yearly'),
+ ], 'Frequency', required=True)
+ until_date = fields.Boolean('Is Date', help='Ignore time of field ' \
+ '"Until Date", but handle as date only.')
+ until = fields.DateTime('Until Date')
+ count = fields.Integer('Count')
+ interval = fields.Integer('Interval')
+ bysecond = fields.Char('By Second')
+ byminute = fields.Char('By Minute')
+ byhour = fields.Char('By Hour')
+ byday = fields.Char('By Day')
+ bymonthday = fields.Char('By Month Day')
+ byyearday = fields.Char('By Year Day')
+ byweekno = fields.Char('By Week Number')
+ bymonth = fields.Char('By Month')
+ bysetpos = fields.Char('By Position')
+ wkst = fields.Selection([
+ ('su', 'Sunday'),
+ ('mo', 'Monday'),
+ ('tu', 'Tuesday'),
+ ('we', 'Wednesday'),
+ ('th', 'Thursday'),
+ ('fr', 'Friday'),
+ ('sa', 'Saturday'),
+ ], 'Week Day', sort=False)
+
+ def __init__(self):
+ super(RRule, self).__init__()
+ self._sql_constraints += [
+ ('until_count',
+ 'CHECK(until IS NULL OR count IS NULL)',
+ 'Only one of "until" and "count" can be set!'),
+ ]
+ self._constraints += [
+ ('check_bysecond', 'invalid_bysecond'),
+ ('check_byminute', 'invalid_byminute'),
+ ('check_byhour', 'invalid_byhour'),
+ ('check_byday', 'invalid_byday'),
+ ('check_bymonthday', 'invalid_bymonthday'),
+ ('check_byyearday', 'invalid_byyearday'),
+ ('check_byweekno', 'invalid_byweekno'),
+ ('check_bymonth', 'invalid_bymonth'),
+ ('check_bysetpos', 'invalid_bysetpos'),
+ ]
+ self._error_messages.update({
+ 'invalid_bysecond': 'Invalid "By Second"',
+ 'invalid_byminute': 'Invalid "By Minute"',
+ 'invalid_byhour': 'Invalid "By Hour"',
+ 'invalid_byday': 'Invalid "By Day"',
+ 'invalid_bymonthday': 'Invalid "By Month Day"',
+ 'invalid_byyearday': 'Invalid "By Year Day"',
+ 'invalid_byweekno': 'Invalid "By Week Number"',
+ 'invalid_bymonth': 'Invalid "By Month"',
+ 'invalid_bysetpos': 'Invalid "By Position"',
+ })
+
+ def check_bysecond(self, cursor, user, ids):
+ for rule in self.browse(cursor, user, ids):
+ if not rule.bysecond:
+ continue
+ for second in rule.bysecond.split(','):
+ try:
+ second = int(second)
+ except:
+ return False
+ if not (second >= 0 and second <= 59):
+ return False
+ return True
+
+ def check_byminute(self, cursor, user, ids):
+ for rule in self.browse(cursor, user, ids):
+ if not rule.byminute:
+ continue
+ for minute in rule.byminute.split(','):
+ try:
+ minute = int(minute)
+ except:
+ return False
+ if not (minute >= 0 and minute <= 59):
+ return False
+ return True
+
+ def check_byhour(self, cursor, user, ids):
+ for rule in self.browse(cursor, user, ids):
+ if not rule.byhour:
+ continue
+ for hour in rule.byhour.split(','):
+ try:
+ hour = int(hour)
+ except:
+ return False
+ if not (hour >= 0 and hour <= 23):
+ return False
+ return True
+
+ def check_byday(self, cursor, user, ids):
+ for rule in self.browse(cursor, user, ids):
+ if not rule.byday:
+ continue
+ for weekdaynum in rule.byday.split(','):
+ weekday = weekdaynum[-2:]
+ if weekday not in ('SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'):
+ return False
+ ordwk = weekday[:-2]
+ if not ordwk:
+ continue
+ try:
+ ordwk = int(ordwk)
+ except:
+ return False
+ if not (abs(ordwk) >= 1 and abs(ordwk) <= 53):
+ return False
+ return True
+
+ def check_bymonthday(self, cursor, user, ids):
+ for rule in self.browse(cursor, user, ids):
+ if not rule.bymonthday:
+ continue
+ for monthdaynum in rule.bymonthday.split(','):
+ try:
+ monthdaynum = int(monthdaynum)
+ except:
+ return False
+ if not (abs(monthdaynum) >= 1 and abs(monthdaynum) <= 31):
+ return False
+ return True
+
+ def check_byyearday(self, cursor, user, ids):
+ for rule in self.browse(cursor, user, ids):
+ if not rule.byyearday:
+ continue
+ for yeardaynum in rule.byyearday.split(','):
+ try:
+ yeardaynum = int(yeardaynum)
+ except:
+ return False
+ if not (abs(yeardaynum) >= 1 and abs(yeardaynum) <= 366):
+ return False
+ return True
+
+ def check_byweekno(self, cursor, user, ids):
+ for rule in self.browse(cursor, user, ids):
+ if not rule.byweekno:
+ continue
+ for weeknum in rule.byweekno.split(','):
+ try:
+ weeknum = int(weeknum)
+ except:
+ return False
+ if not (abs(weeknum) >= 1 and abs(weeknum) <= 53):
+ return False
+ return True
+
+ def check_bymonth(self, cursor, user, ids):
+ for rule in self.browse(cursor, user, ids):
+ if not rule.bymonth:
+ continue
+ for monthnum in rule.bymonth.split(','):
+ try:
+ monthnum = int(monthnum)
+ except:
+ return False
+ if not (monthnum >= 1 and monthnum <= 12):
+ return False
+ return True
+
+ def check_bysetpos(self, cursor, user, ids):
+ for rule in self.browse(cursor, user, ids):
+ if not rule.bysetpos:
+ continue
+ for setposday in rule.bysetpos.split(','):
+ try:
+ setposday = int(setposday)
+ except:
+ return False
+ if not (abs(setposday) >= 1 and abs(setposday) <= 366):
+ return False
+ return True
+
+ def _rule2update(self, cursor, user, rule, context=None):
+ res = {}
+ for field in ('freq', 'until_date', 'until', 'count', 'interval',
+ 'bysecond', 'byminute', 'byhour', 'byday', 'bymonthday',
+ 'byyearday', 'byweekno', 'bymonth', 'bysetpos', 'wkst'):
+ res[field] = rule[field]
+ return res
+
+ def rule2values(self, cursor, user, rule, context=None):
+ '''
+ Convert a rule object into values for create or write
+
+ :param cursor: the database cursor
+ :param user: the user id
+ :param rule: teh rule object
+ :param context: the context
+ :return: a dictionary with values
+ '''
+ res = {}
+ for attr in str(rule.value).replace('\\', '').split(';'):
+ field, value = attr.split('=')
+ field = field.lower()
+ if field == 'until':
+ try:
+ value = vobject.icalendar.stringToDateTime(value)
+ except:
+ value = vobject.icalendar.stringToDate(value)
+ if not isinstance(value, datetime.datetime):
+ res['until_date'] = True
+ res['until'] = datetime.datetime.combine(value,
+ datetime.time())
+ else:
+ res['until_date'] = False
+ if value.tzinfo:
+ res['until'] = value.astimezone(tzlocal)
+ else:
+ res['until'] = value
+ elif field in ('freq', 'wkst'):
+ res[field] = value.lower()
+ else:
+ res[field] = value
+ return res
+
+ def rule2rule(self, cursor, user, rule, context=None):
+ '''
+ Return a rule string for rule
+
+ :param cursor: the database cursor
+ :param user: the user id
+ :param rule: a BrowseRecord of calendar.rrule or
+ calendar.exrule
+ :param context: the context
+ :return: a string
+ '''
+ res = 'FREQ=' + rule.freq.upper()
+ if rule.until:
+ res += ';UNTIL='
+ if rule.until_date:
+ res += vobject.icalendar.dateToString(rule.until.date())
+ else:
+ res += vobject.icalendar.dateTimeToString(rule.until\
+ .replace(tzinfo=tzlocal).astimezone(utc),
+ convertToUTC=True)
+ elif rule.count:
+ res += ';COUNT=' + str(rule.count)
+ for field in ('freq', 'wkst'):
+ if rule[field]:
+ res += ';' + field.upper() + '=' + rule[field].upper()
+ for field in ('interval', 'bysecond', 'byminute', 'byhour',
+ 'byday', 'bymonthday', 'byyearday', 'byweekno',
+ 'bymonth', 'bysetpos'):
+ if rule[field]:
+ res += ';' + field.upper() + '=' + str(rule[field])
+ return res
+
+RRule()
+
+
+class EventRRule(ModelSQL, ModelView):
+ 'Recurrence Rule'
+ _description = __doc__
+ _name = 'calendar.event.rrule'
+ _inherits = {'calendar.rrule': 'calendar_rrule'}
+ _rec_name = 'freq'
+
+ calendar_rrule = fields.Many2One('calendar.rrule', 'Calendar RRule',
+ required=True, ondelete='CASCADE', select=1)
+ event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
+ select=1, required=True)
+
+
+ def create(self, cursor, user, values, context=None):
+ event_obj = self.pool.get('calendar.event')
+ if values.get('event'):
+ # Update write_date of event
+ event_obj.write(cursor, user, values['event'], {}, context=context)
+ return super(EventRRule, self).create(cursor, user, values, context=context)
+
+ def write(self, cursor, user, ids, values, context=None):
+ event_obj = self.pool.get('calendar.event')
+ if isinstance(ids, (int, long)):
+ ids = [ids]
+ event_ids = [x.event.id for x in self.browse(cursor, user, ids,
+ context=context)]
+ if values.get('event'):
+ event_ids.append(values['event'])
+ if event_ids:
+ # Update write_date of event
+ event_obj.write(cursor, user, event_ids, {}, context=context)
+ return super(EventRRule, self).write(cursor, user, ids, values, context=context)
+
+ def delete(self, cursor, user, ids, context=None):
+ event_obj = self.pool.get('calendar.event')
+ rrule_obj = self.pool.get('calendar.rrule')
+ if isinstance(ids, (int, long)):
+ ids = [ids]
+ event_rrules = self.browse(cursor, user, ids, context=context)
+ rrule_ids = [a.calendar_rrule.id for a in event_rrules]
+ event_ids = [x.event.id for x in event_rrules]
+ if event_ids:
+ # Update write_date of event
+ event_obj.write(cursor, user, event_ids, {}, context=context)
+ res = super(EventRRule, 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)
+
+EventRRule()
+
+
+class EventExRule(EventRRule):
+ 'Exception Rule'
+ _description = __doc__
+ _name = 'calendar.event.exrule'
+
+EventExRule()
diff --git a/calendar.xml b/calendar.xml
new file mode 100644
index 0000000..589c48e
--- /dev/null
+++ b/calendar.xml
@@ -0,0 +1,479 @@
+<?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="res.group" id="group_calendar_admin">
+ <field name="name">Calendar Administration</field>
+ </record>
+ <record model="res.user" id="res.user_admin">
+ <field name="groups" eval="[('add', ref('group_calendar_admin'))]"/>
+ </record>
+
+ <menuitem name="Calendar Management" sequence="8" id="menu_calendar"/>
+
+ <record model="ir.ui.view" id="calendar_view_tree">
+ <field name="model">calendar.calendar</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Calendars">
+ <field name="name" select="1"/>
+ <field name="owner" select="1"/>
+ </tree>
+ ]]>
+ </field>
+ </record>
+ <record model="ir.ui.view" id="calendar_view_form">
+ <field name="model">calendar.calendar</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <form string="Calendar">
+ <label name="name"/>
+ <field name="name"/>
+ <label name="owner"/>
+ <field name="owner"/>
+ <notebook colspan="4">
+ <page string="General" id="general">
+ <separator name="description" colspan="4"/>
+ <field name="description" colspan="4"/>
+ </page>
+ <page string="Security" id="security">
+ <separator name="read_users" colspan="4"/>
+ <field name="read_users" colspan="4"/>
+ <separator name="write_users" colspan="4"/>
+ <field name="write_users" colspan="4"/>
+ </page>
+ </notebook>
+ </form>
+ ]]>
+ </field>
+ </record>
+ <record model="ir.action.act_window" id="act_calendar_form">
+ <field name="name">Calendars</field>
+ <field name="res_model">calendar.calendar</field>
+ <field name="view_type">form</field>
+ </record>
+ <record model="ir.action.act_window.view" id="act_calendar_form_view1">
+ <field name="sequence" eval="10"/>
+ <field name="view" ref="calendar_view_tree"/>
+ <field name="act_window" ref="act_calendar_form"/>
+ </record>
+ <record model="ir.action.act_window.view" id="act_calendar_form_view2">
+ <field name="sequence" eval="20"/>
+ <field name="view" ref="calendar_view_form"/>
+ <field name="act_window" ref="act_calendar_form"/>
+ </record>
+ <menuitem parent="menu_calendar" sequence="1"
+ action="act_calendar_form" id="menu_calendar_form"/>
+
+ <record model="ir.rule.group" id="rule_group_read_calendar">
+ <field name="model" search="[('model', '=', 'calendar.event')]"/>
+ <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_calendar_line1">
+ <field name="field" search="[('name', '=', 'calendar_owner'), ('model.model', '=', 'calendar.event')]"/>
+ <field name="operator">=</field>
+ <field name="operand">User</field>
+ <field name="rule_group" ref="rule_group_read_calendar"/>
+ </record>
+ <record model="ir.rule" id="rule_group_read_calendar_line2">
+ <field name="field" search="[('name', '=', 'calendar_read_users'), ('model.model', '=', 'calendar.event')]"/>
+ <field name="operator">=</field>
+ <field name="operand">User</field>
+ <field name="rule_group" ref="rule_group_read_calendar"/>
+ </record>
+ <record model="ir.rule" id="rule_group_read_calendar_line3">
+ <field name="field" search="[('name', '=', 'classification_public'), ('model.model', '=', 'calendar.event')]"/>
+ <field name="operator">=</field>
+ <field name="operand">True</field>
+ <field name="rule_group" ref="rule_group_read_calendar"/>
+ </record>
+
+ <record model="ir.rule.group" id="rule_group_write_calendar">
+ <field name="model" search="[('model', '=', 'calendar.event')]"/>
+ <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_calendar_line1">
+ <field name="field" search="[('name', '=', 'calendar_owner'), ('model.model', '=', 'calendar.event')]"/>
+ <field name="operator">=</field>
+ <field name="operand">User</field>
+ <field name="rule_group" ref="rule_group_write_calendar"/>
+ </record>
+ <record model="ir.rule" id="rule_group_write_calendar_line2">
+ <field name="field" search="[('name', '=', 'calendar_write_users'), ('model.model', '=', 'calendar.event')]"/>
+ <field name="operator">=</field>
+ <field name="operand">User</field>
+ <field name="rule_group" ref="rule_group_write_calendar"/>
+ </record>
+
+ <record model="ir.ui.view" id="category_view_tree">
+ <field name="model">calendar.category</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Categories">
+ <field name="name" select="1"/>
+ </tree>
+ ]]>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="category_view_form">
+ <field name="model">calendar.category</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <form string="Category">
+ <label name="name"/>
+ <field name="name"/>
+ </form>
+ ]]>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="location_view_tree">
+ <field name="model">calendar.location</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Locations">
+ <field name="name" select="1"/>
+ </tree>
+ ]]>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="location_view_form">
+ <field name="model">calendar.location</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <form string="Location">
+ <label name="name"/>
+ <field name="name"/>
+ </form>
+ ]]>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="event_view_tree">
+ <field name="model">calendar.event</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Events">
+ <field name="calendar" select="1"/>
+ <field name="summary" select="1"/>
+ <field name="all_day"/>
+ <field name="dtstart" select="1"/>
+ <field name="dtend" select="2"/>
+ <field name="status" select="2"/>
+ </tree>
+ ]]>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="event_view_form">
+ <field name="model">calendar.event</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <form string="Event">
+ <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="all_day"/>
+ <field name="all_day"/>
+ <label name="transp"/>
+ <field name="transp"/>
+ <label name="dtstart"/>
+ <field name="dtstart"/>
+ <label name="dtend"/>
+ <field name="dtend"/>
+ <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="Occurences" id="occurences"
+ 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="occurences" colspan="4">
+ <tree string="Events">
+ <field name="summary" select="1"/>
+ <field name="recurrence" select="1"/>
+ <field name="all_day"/>
+ <field name="dtstart" select="2"/>
+ <field name="dtend" select="2"/>
+ <field name="status" select="2"/>
+ </tree>
+ </field>
+ </page>
+ </notebook>
+ <field name="parent" colspan="4" invisible="1"/>
+ </form>
+ ]]>
+ </field>
+ </record>
+
+ <record model="ir.action.act_window" id="act_event_form">
+ <field name="name">Events</field>
+ <field name="res_model">calendar.event</field>
+ <field name="view_type">form</field>
+ <field name="domain">[('parent', '=', False)]</field>
+ </record>
+ <record model="ir.action.act_window.view" id="act_event_form_view1">
+ <field name="sequence" eval="10"/>
+ <field name="view" ref="event_view_tree"/>
+ <field name="act_window" ref="act_event_form"/>
+ </record>
+ <record model="ir.action.act_window.view" id="act_event_form_view2">
+ <field name="sequence" eval="20"/>
+ <field name="view" ref="event_view_form"/>
+ <field name="act_window" ref="act_event_form"/>
+ </record>
+ <menuitem parent="menu_calendar_form" sequence="1"
+ action="act_event_form" id="menu_event_form"/>
+
+ <record model="ir.ui.view" id="attendee_view_tree">
+ <field name="model">calendar.event.attendee</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Attendees">
+ <field name="event" 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.event.attendee</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <form string="Attendee">
+ <label name="event"/>
+ <field name="event" 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.event.rdate</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Recurrence Dates">
+ <field name="event" 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.event.rdate</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <form string="Recurrence Date">
+ <label name="event"/>
+ <field name="event" 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.event.exdate</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Exception Dates">
+ <field name="event" 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.event.exdate</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <form string="Exception Date">
+ <label name="event"/>
+ <field name="event" 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.event.rrule</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Recurrence Rules">
+ <field name="event" select="1"/>
+ <field name="freq" select="1"/>
+ </tree>
+ ]]>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="rrule_view_form">
+ <field name="model">calendar.event.rrule</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <form string="Recurrence Rule">
+ <label name="event"/>
+ <field name="event" 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.event.exrule</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Exception Rules">
+ <field name="event" select="1"/>
+ <field name="freq" select="1"/>
+ </tree>
+ ]]>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="exrule_view_form">
+ <field name="model">calendar.event.exrule</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <form string="Exception Rule">
+ <label name="event"/>
+ <field name="event" 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/de_DE.csv b/de_DE.csv
new file mode 100644
index 0000000..abef7ff
--- /dev/null
+++ b/de_DE.csv
@@ -0,0 +1,191 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.calendar,0,A user can have only one calendar!,Es ist nur ein Kalender pro Benutzer möglich!,0
+error,calendar.calendar,0,The name of calendar must be unique!,Kalendername kann nicht mehrfach vergeben werden!,0
+error,calendar.category,0,The name of calendar category must be unique!,Name für Kalenderkategorie kann nicht mehrfach vergeben werden!,0
+error,calendar.event,0,Recurrence can not be recurrent!,Wiederholungen können nicht rekursiv sein!,0
+error,calendar.event,0,UUID and recurrence must be unique in a calendar!,UUID und Wiederholung können in einem Kalender nicht mehrfach vergeben werden!,0
+error,calendar.location,0,The name of calendar location must be unique!,Name für Kalenderort kann nicht mehrfach vergeben werden!,0
+error,calendar.rrule,0,"Invalid ""By Day""","Ungültig ""Für Tag""",0
+error,calendar.rrule,0,"Invalid ""By Hour""","Ungültig ""Für Stunde""",0
+error,calendar.rrule,0,"Invalid ""By Minute""","Ungültig ""Für Minute""",0
+error,calendar.rrule,0,"Invalid ""By Month""","Ungültig ""Für Monat""",0
+error,calendar.rrule,0,"Invalid ""By Month Day""","Ungültig ""Für Tag des Monats""",0
+error,calendar.rrule,0,"Invalid ""By Position""","Ungültig ""Für Position""",0
+error,calendar.rrule,0,"Invalid ""By Second""","Ungültig ""Für Sekunde""",0
+error,calendar.rrule,0,"Invalid ""By Week Number""","Ungültig ""Für Woche Nummer""",0
+error,calendar.rrule,0,"Invalid ""By Year Day""","Ungültig ""Für Tag des Jahres""",0
+error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!","Es kann nur entweder ""Bis"" oder ""Anzahl"" gesetzt werden!",0
+field,"calendar.alarm,rec_name",0,Name,Name,0
+field,"calendar.alarm,valarm",0,valarm,valarm,0
+field,"calendar.attendee,attendee",0,attendee,Teilnehmer,0
+field,"calendar.attendee,email",0,Email,E-Mail,0
+field,"calendar.attendee,rec_name",0,Name,Name,0
+field,"calendar.attendee,status",0,Participation Status,Teilnahmestatus,0
+field,"calendar.calendar,description",0,Description,Bezeichnung,0
+field,"calendar.calendar,name",0,Name,Name,0
+field,"calendar.calendar,owner",0,Owner,Besitzer,0
+field,"calendar.calendar-read-res.user,calendar",0,Calendar,Kalender,0
+field,"calendar.calendar-read-res.user,rec_name",0,Name,Name,0
+field,"calendar.calendar-read-res.user,user",0,User,Benutzer,0
+field,"calendar.calendar,read_users",0,Read Users,Benutzer mit Leseberechtigung,0
+field,"calendar.calendar,rec_name",0,Name,Name,0
+field,"calendar.calendar-write-res.user,calendar",0,Calendar,Kalender,0
+field,"calendar.calendar-write-res.user,rec_name",0,Name,Name,0
+field,"calendar.calendar-write-res.user,user",0,User,Benutzer,0
+field,"calendar.calendar,write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
+field,"calendar.category,name",0,Name,Name,0
+field,"calendar.category,rec_name",0,Name,Name,0
+field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Kalender Alarm,0
+field,"calendar.event.alarm,event",0,Event,Termin,0
+field,"calendar.event.alarm,rec_name",0,Name,Name,0
+field,"calendar.event,alarms",0,Alarms,Alarm,0
+field,"calendar.event,all_day",0,All Day,Ganztägig,0
+field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Kalender Teilnehmer,0
+field,"calendar.event.attendee,event",0,Event,Termin,0
+field,"calendar.event.attendee,rec_name",0,Name,Name,0
+field,"calendar.event,attendees",0,Attendees,Teilnehmer,0
+field,"calendar.event,calendar",0,Calendar,Kalender,0
+field,"calendar.event-calendar.category,category",0,Category,Kategorie,0
+field,"calendar.event-calendar.category,event",0,Event,Termin,0
+field,"calendar.event-calendar.category,rec_name",0,Name,Name,0
+field,"calendar.event,calendar_owner",0,Owner,Besitzer,0
+field,"calendar.event,calendar_read_users",0,Read Users,Benutzer mit Leseberechtigung,0
+field,"calendar.event,calendar_write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
+field,"calendar.event,categories",0,Categories,Kategorien,0
+field,"calendar.event,classification",0,Classification,Klassifizierung,0
+field,"calendar.event,classification_public",0,Classification Public,Öffentliche Klassifizierung,0
+field,"calendar.event,description",0,Description,Bezeichnung,0
+field,"calendar.event,dtend",0,End Date,Enddatum,0
+field,"calendar.event,dtstart",0,Start Date,Anfangsdatum,0
+field,"calendar.event.exdate,calendar_rdate",0,Calendar RDate,Kalender WDatum,0
+field,"calendar.event.exdate,event",0,Event,Termin,0
+field,"calendar.event.exdate,rec_name",0,Name,Name,0
+field,"calendar.event,exdates",0,Exception Dates,Ausnahmedaten,0
+field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
+field,"calendar.event.exrule,event",0,Event,Termin,0
+field,"calendar.event.exrule,rec_name",0,Name,Name,0
+field,"calendar.event,exrules",0,Exception Rules,Ausnahmeregeln,0
+field,"calendar.event,location",0,Location,Ort,0
+field,"calendar.event,occurences",0,Occurences,Ereignisse,0
+field,"calendar.event,organizer",0,Organizer,Organisator,0
+field,"calendar.event,parent",0,Parent,Übergeordnet (Termin),0
+field,"calendar.event.rdate,calendar_rdate",0,Calendar RDate,Kalender WDatum,0
+field,"calendar.event.rdate,event",0,Event,Termin,0
+field,"calendar.event.rdate,rec_name",0,Name,Name,0
+field,"calendar.event,rdates",0,Recurrence Dates,Wiederholungsdaten,0
+field,"calendar.event,rec_name",0,Name,Name,0
+field,"calendar.event,recurrence",0,Recurrence,Wiederholung,0
+field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
+field,"calendar.event.rrule,event",0,Event,Termin,0
+field,"calendar.event.rrule,rec_name",0,Name,Name,0
+field,"calendar.event,rrules",0,Recurrence Rules,Wiederholungsregeln,0
+field,"calendar.event,sequence",0,Sequence,Sequenz,0
+field,"calendar.event,status",0,Status,Status,0
+field,"calendar.event,summary",0,Summary,Zusammenfassung,0
+field,"calendar.event,timezone",0,Timezone,Zeitzone,0
+field,"calendar.event,transp",0,Time Transparency,Zeittransparenz,0
+field,"calendar.event,uuid",0,UUID,UUID,0
+field,"calendar.event,vevent",0,vevent,vevent,0
+field,"calendar.location,name",0,Name,Name,0
+field,"calendar.location,rec_name",0,Name,Name,0
+field,"calendar.rdate,date",0,Is Date,Als Datum,0
+field,"calendar.rdate,datetime",0,Date,Zeitpunkt,0
+field,"calendar.rdate,rec_name",0,Name,Name,0
+field,"calendar.rrule,byday",0,By Day,Für Tag,0
+field,"calendar.rrule,byhour",0,By Hour,Für Stunde,0
+field,"calendar.rrule,byminute",0,By Minute,Für Minute,0
+field,"calendar.rrule,bymonth",0,By Month,Für Monat,0
+field,"calendar.rrule,bymonthday",0,By Month Day,Für Tag des Monats,0
+field,"calendar.rrule,bysecond",0,By Second,Für Sekunde,0
+field,"calendar.rrule,bysetpos",0,By Position,Für Position,0
+field,"calendar.rrule,byweekno",0,By Week Number,Für Woche Nummer,0
+field,"calendar.rrule,byyearday",0,By Year Day,Für Tag des Jahres,0
+field,"calendar.rrule,count",0,Count,Anzahl,0
+field,"calendar.rrule,freq",0,Frequency,Häufigkeit,0
+field,"calendar.rrule,interval",0,Interval,Intervall,0
+field,"calendar.rrule,rec_name",0,Name,Name,0
+field,"calendar.rrule,until",0,Until Date,Bis Zeitpunkt,0
+field,"calendar.rrule,until_date",0,Is Date,Als Datum,0
+field,"calendar.rrule,wkst",0,Week Day,Wochentag,0
+field,"res.user,calendars",0,Calendars,Kalender,0
+help,"calendar.calendar,owner",0,The user must have an email,Dem Benutzer muss eine E-Mail-Adresse zugeordnet sein!,0
+help,"calendar.event,uuid",0,Universally Unique Identifier,Universally Unique Identifier,0
+help,"calendar.rdate,date",0,"Ignore time of field ""Date"", but handle as date only.","Verwende von Feld ""Zeitpunkt"" nur das Datum ohne den Zeitanteil.",0
+help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","Verwende von Feld ""Bis Zeitpunkt"" nur das Datum ohne den Zeitanteil.",0
+model,"calendar.alarm,name",0,Alarm,Alarm,0
+model,"calendar.attendee,name",0,Attendee,Teilnehmer,0
+model,"calendar.calendar,name",0,Calendar,Kalender,0
+model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Kalender - Schreiben - Benutzer,0
+model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Kalender - Lesen - Benutzer,0
+model,"calendar.category,name",0,Category,Kategorie,0
+model,"calendar.event.alarm,name",0,Alarm,Alarm,0
+model,"calendar.event.attendee,name",0,Attendee,Teilnehmer,0
+model,"calendar.event-calendar.category,name",0,Event - Category,Termin - Kategorie,0
+model,"calendar.event.exdate,name",0,Exception Date,Ausnahmedatum,0
+model,"calendar.event.exrule,name",0,Exception Rule,Ausnahmeregel,0
+model,"calendar.event,name",0,Event,Termin,0
+model,"calendar.event.rdate,name",0,Recurrence Date,Wiederholungsdatum,0
+model,"calendar.event.rrule,name",0,Recurrence Rule,Wiederholungsregel,0
+model,"calendar.location,name",0,Location,Ort,0
+model,"calendar.rdate,name",0,Recurrence Date,Wiederholungsdatum,0
+model,"calendar.rrule,name",0,Recurrence Rule,Wiederholungsregel,0
+model,"ir.action,name",act_calendar_form,Calendars,Kalender,0
+model,"ir.action,name",act_event_form,Events,Termine,0
+model,"ir.ui.menu,name",menu_calendar,Calendar Management,Kalender,0
+model,"ir.ui.menu,name",menu_calendar_form,Calendars,Kalender,0
+model,"ir.ui.menu,name",menu_event_form,Events,Termine,0
+model,"res.group,name",group_calendar_admin,Calendar Administration,Kalender Administration,0
+selection,"calendar.attendee,status",0,,,0
+selection,"calendar.attendee,status",0,Accepted,Angenommen,0
+selection,"calendar.attendee,status",0,Declined,Abgelehnt,0
+selection,"calendar.attendee,status",0,Delegated,Delegiert,0
+selection,"calendar.attendee,status",0,Needs Action,Aktion erforderlich,0
+selection,"calendar.attendee,status",0,Tentative,Unter Vorbehalt,0
+selection,"calendar.event,classification",0,Confidential,Vertraulich,0
+selection,"calendar.event,classification",0,Private,Privat,0
+selection,"calendar.event,classification",0,Public,Öffentlich,0
+selection,"calendar.event,status",0,,,0
+selection,"calendar.event,status",0,Cancelled,Abgesagt,0
+selection,"calendar.event,status",0,Confirmed,Bestätigt,0
+selection,"calendar.event,status",0,Tentative,Unter Vorbehalt,0
+selection,"calendar.event,transp",0,Opaque,Opak,0
+selection,"calendar.event,transp",0,Transparent,Transparent,0
+selection,"calendar.rrule,freq",0,Daily,Täglich,0
+selection,"calendar.rrule,freq",0,Hourly,Stündlich,0
+selection,"calendar.rrule,freq",0,Minutely,Minütlich,0
+selection,"calendar.rrule,freq",0,Monthly,Monatlich,0
+selection,"calendar.rrule,freq",0,Secondly,Sekündlich,0
+selection,"calendar.rrule,freq",0,Weekly,Wöchentlich,0
+selection,"calendar.rrule,freq",0,Yearly,Jährlich,0
+selection,"calendar.rrule,wkst",0,Friday,Freitag,0
+selection,"calendar.rrule,wkst",0,Monday,Montag,0
+selection,"calendar.rrule,wkst",0,Saturday,Samstag,0
+selection,"calendar.rrule,wkst",0,Sunday,Sonntag,0
+selection,"calendar.rrule,wkst",0,Thursday,Donnerstag,0
+selection,"calendar.rrule,wkst",0,Tuesday,Dienstag,0
+selection,"calendar.rrule,wkst",0,Wednesday,Mittwoch,0
+view,calendar.calendar,0,Calendar,Kalender,0
+view,calendar.calendar,0,Calendars,Kalender,0
+view,calendar.calendar,0,General,Allgemein,0
+view,calendar.calendar,0,Security,Sicherheit,0
+view,calendar.category,0,Categories,Kategorien,0
+view,calendar.category,0,Category,Kategorie,0
+view,calendar.event,0,Attendees,Teilnehmer,0
+view,calendar.event,0,Categories,Kategorien,0
+view,calendar.event,0,Event,Termin,0
+view,calendar.event,0,Events,Termine,0
+view,calendar.event,0,General,Allgemein,0
+view,calendar.event,0,Occurences,Ereignisse,0
+view,calendar.event,0,Recurrences,Wiederholungen,0
+view,calendar.event.attendee,0,Attendee,Teilnehmer,0
+view,calendar.event.attendee,0,Attendees,Teilnehmer,0
+view,calendar.event.exdate,0,Exception Date,Ausnahmedatum,0
+view,calendar.event.exdate,0,Exception Dates,Ausnahmedaten,0
+view,calendar.event.exrule,0,Exception Rule,Ausnahmeregel,0
+view,calendar.event.exrule,0,Exception Rules,Ausnahmeregeln,0
+view,calendar.event.rdate,0,Recurrence Date,Wiederholungsdatum,0
+view,calendar.event.rdate,0,Recurrence Dates,Wiederholungsdaten,0
+view,calendar.event.rrule,0,Recurrence Rule,Wiederholungsregel,0
+view,calendar.event.rrule,0,Recurrence Rules,Wiederholungsregeln,0
+view,calendar.location,0,Location,Ort,0
+view,calendar.location,0,Locations,Orte,0
diff --git a/es_CO.csv b/es_CO.csv
new file mode 100644
index 0000000..ad65390
--- /dev/null
+++ b/es_CO.csv
@@ -0,0 +1,191 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.calendar,0,A user can have only one calendar!,¡Un usuario puede tener a lo sumo un calendario!,0
+error,calendar.calendar,0,The name of calendar must be unique!,¡El nombre del calendario es único!,0
+error,calendar.category,0,The name of calendar category must be unique!,¡El nombre de la categoría de calendario debe ser único!,0
+error,calendar.event,0,Recurrence can not be recurrent!,¡La repetición no puede repetirse!,0
+error,calendar.event,0,UUID and recurrence must be unique in a calendar!,¡El UUID y la recurrencia deben ser únicos por calendario! ,0
+error,calendar.location,0,The name of calendar location must be unique!,¡El nombre del lugar del calendario debe ser único!,0
+error,calendar.rrule,0,"Invalid ""By Day""",,0
+error,calendar.rrule,0,"Invalid ""By Hour""",,0
+error,calendar.rrule,0,"Invalid ""By Minute""",,0
+error,calendar.rrule,0,"Invalid ""By Month""",,0
+error,calendar.rrule,0,"Invalid ""By Month Day""",,0
+error,calendar.rrule,0,"Invalid ""By Position""",,0
+error,calendar.rrule,0,"Invalid ""By Second""",,0
+error,calendar.rrule,0,"Invalid ""By Week Number""",,0
+error,calendar.rrule,0,"Invalid ""By Year Day""",,0
+error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!",,0
+field,"calendar.alarm,rec_name",0,Name,Nombre,0
+field,"calendar.alarm,valarm",0,valarm,,0
+field,"calendar.attendee,attendee",0,attendee,,0
+field,"calendar.attendee,email",0,Email,Correo Electrónico,0
+field,"calendar.attendee,rec_name",0,Name,Nombre,0
+field,"calendar.attendee,status",0,Participation Status,,0
+field,"calendar.calendar,description",0,Description,Descripción,0
+field,"calendar.calendar,name",0,Name,Nombre,0
+field,"calendar.calendar,owner",0,Owner,Propietario,0
+field,"calendar.calendar-read-res.user,calendar",0,Calendar,Calendario,0
+field,"calendar.calendar-read-res.user,rec_name",0,Name,Nombre,0
+field,"calendar.calendar-read-res.user,user",0,User,Usuario,0
+field,"calendar.calendar,read_users",0,Read Users,Usuarios que pueden Leer,0
+field,"calendar.calendar,rec_name",0,Name,Nombre,0
+field,"calendar.calendar-write-res.user,calendar",0,Calendar,Calendario,0
+field,"calendar.calendar-write-res.user,rec_name",0,Name,Nombre,0
+field,"calendar.calendar-write-res.user,user",0,User,Usuario,0
+field,"calendar.calendar,write_users",0,Write Users,Escribir Usuarios,0
+field,"calendar.category,name",0,Name,Nombre,0
+field,"calendar.category,rec_name",0,Name,Nombre,0
+field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,,0
+field,"calendar.event.alarm,event",0,Event,Evento,0
+field,"calendar.event.alarm,rec_name",0,Name,Nombre,0
+field,"calendar.event,alarms",0,Alarms,Alarmas,0
+field,"calendar.event,all_day",0,All Day,Todo el Día,0
+field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,,0
+field,"calendar.event.attendee,event",0,Event,Evento,0
+field,"calendar.event.attendee,rec_name",0,Name,Nombre,0
+field,"calendar.event,attendees",0,Attendees,Asistentes,0
+field,"calendar.event,calendar",0,Calendar,Calendario,0
+field,"calendar.event-calendar.category,category",0,Category,Categoría,0
+field,"calendar.event-calendar.category,event",0,Event,Evento,0
+field,"calendar.event-calendar.category,rec_name",0,Name,Nombre,0
+field,"calendar.event,calendar_owner",0,Owner,Propietario,0
+field,"calendar.event,calendar_read_users",0,Read Users,Usuarios que pueden Leer,0
+field,"calendar.event,calendar_write_users",0,Write Users,Escribir Usuarios,0
+field,"calendar.event,categories",0,Categories,Categorías,0
+field,"calendar.event,classification",0,Classification,Clasificación,0
+field,"calendar.event,classification_public",0,Classification Public,Clasificación Pública,0
+field,"calendar.event,description",0,Description,Descripción,0
+field,"calendar.event,dtend",0,End Date,Fecha Fin,0
+field,"calendar.event,dtstart",0,Start Date,Fecha Inicial,0
+field,"calendar.event.exdate,calendar_rdate",0,Calendar RDate,,0
+field,"calendar.event.exdate,event",0,Event,Evento,0
+field,"calendar.event.exdate,rec_name",0,Name,Nombre,0
+field,"calendar.event,exdates",0,Exception Dates,Fechas de Excepción,0
+field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,,0
+field,"calendar.event.exrule,event",0,Event,Evento,0
+field,"calendar.event.exrule,rec_name",0,Name,Nombre,0
+field,"calendar.event,exrules",0,Exception Rules,Reglas de Excepción,0
+field,"calendar.event,location",0,Location,Lugar,0
+field,"calendar.event,occurences",0,Occurences,,0
+field,"calendar.event,organizer",0,Organizer,Organizador,0
+field,"calendar.event,parent",0,Parent,Padre,0
+field,"calendar.event.rdate,calendar_rdate",0,Calendar RDate,,0
+field,"calendar.event.rdate,event",0,Event,Evento,0
+field,"calendar.event.rdate,rec_name",0,Name,Nombre,0
+field,"calendar.event,rdates",0,Recurrence Dates,Fechas de Repetición,0
+field,"calendar.event,rec_name",0,Name,Nombre,0
+field,"calendar.event,recurrence",0,Recurrence,Repetición,0
+field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,,0
+field,"calendar.event.rrule,event",0,Event,Evento,0
+field,"calendar.event.rrule,rec_name",0,Name,Nombre,0
+field,"calendar.event,rrules",0,Recurrence Rules,Reglas de Repetición,0
+field,"calendar.event,sequence",0,Sequence,Secuencia,0
+field,"calendar.event,status",0,Status,Estado,0
+field,"calendar.event,summary",0,Summary,Resumen,0
+field,"calendar.event,timezone",0,Timezone,Zona horaria,0
+field,"calendar.event,transp",0,Time Transparency,Transparencia de Tiempo,0
+field,"calendar.event,uuid",0,UUID,UUID,0
+field,"calendar.event,vevent",0,vevent,vevento,0
+field,"calendar.location,name",0,Name,Nombre,0
+field,"calendar.location,rec_name",0,Name,Nombre,0
+field,"calendar.rdate,date",0,Is Date,,0
+field,"calendar.rdate,datetime",0,Date,Fecha,0
+field,"calendar.rdate,rec_name",0,Name,Nombre,0
+field,"calendar.rrule,byday",0,By Day,,0
+field,"calendar.rrule,byhour",0,By Hour,,0
+field,"calendar.rrule,byminute",0,By Minute,,0
+field,"calendar.rrule,bymonth",0,By Month,,0
+field,"calendar.rrule,bymonthday",0,By Month Day,,0
+field,"calendar.rrule,bysecond",0,By Second,,0
+field,"calendar.rrule,bysetpos",0,By Position,,0
+field,"calendar.rrule,byweekno",0,By Week Number,,0
+field,"calendar.rrule,byyearday",0,By Year Day,,0
+field,"calendar.rrule,count",0,Count,,0
+field,"calendar.rrule,freq",0,Frequency,,0
+field,"calendar.rrule,interval",0,Interval,,0
+field,"calendar.rrule,rec_name",0,Name,Nombre,0
+field,"calendar.rrule,until",0,Until Date,,0
+field,"calendar.rrule,until_date",0,Is Date,,0
+field,"calendar.rrule,wkst",0,Week Day,Día de la Semana,0
+field,"res.user,calendars",0,Calendars,Calendarios,0
+help,"calendar.calendar,owner",0,The user must have an email,,0
+help,"calendar.event,uuid",0,Universally Unique Identifier,Idenitificador Universal Único,0
+help,"calendar.rdate,date",0,"Ignore time of field ""Date"", but handle as date only.",,0
+help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.",,0
+model,"calendar.alarm,name",0,Alarm,Alarma,0
+model,"calendar.attendee,name",0,Attendee,Asistente,0
+model,"calendar.calendar,name",0,Calendar,Calendario,0
+model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Calendario - leer - Usuario,0
+model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Calendario - escribir - Usuario,0
+model,"calendar.category,name",0,Category,Categoría,0
+model,"calendar.event.alarm,name",0,Alarm,Alarma,0
+model,"calendar.event.attendee,name",0,Attendee,Asistente,0
+model,"calendar.event-calendar.category,name",0,Event - Category,Evento - Categoría,0
+model,"calendar.event.exdate,name",0,Exception Date,Fecha de Excepción,0
+model,"calendar.event.exrule,name",0,Exception Rule,Regla de Excepción,0
+model,"calendar.event,name",0,Event,Evento,0
+model,"calendar.event.rdate,name",0,Recurrence Date,Fecha de Repetición,0
+model,"calendar.event.rrule,name",0,Recurrence Rule,Regla de Repetición,0
+model,"calendar.location,name",0,Location,Lugar,0
+model,"calendar.rdate,name",0,Recurrence Date,Fecha de Repetición,0
+model,"calendar.rrule,name",0,Recurrence Rule,Regla de Repetición,0
+model,"ir.action,name",act_calendar_form,Calendars,Calendarios,0
+model,"ir.action,name",act_event_form,Events,Eventos,0
+model,"ir.ui.menu,name",menu_calendar,Calendar Management,Calendario,0
+model,"ir.ui.menu,name",menu_calendar_form,Calendars,Calendarios,0
+model,"ir.ui.menu,name",menu_event_form,Events,Eventos,0
+model,"res.group,name",group_calendar_admin,Calendar Administration,Administrar Calendario,0
+selection,"calendar.attendee,status",0,,,0
+selection,"calendar.attendee,status",0,Accepted,,0
+selection,"calendar.attendee,status",0,Declined,,0
+selection,"calendar.attendee,status",0,Delegated,,0
+selection,"calendar.attendee,status",0,Needs Action,,0
+selection,"calendar.attendee,status",0,Tentative,Tentativa,0
+selection,"calendar.event,classification",0,Confidential,Confidencial,0
+selection,"calendar.event,classification",0,Private,Privado,0
+selection,"calendar.event,classification",0,Public,Público,0
+selection,"calendar.event,status",0,,,0
+selection,"calendar.event,status",0,Cancelled,Cancelado,0
+selection,"calendar.event,status",0,Confirmed,Confirmado,0
+selection,"calendar.event,status",0,Tentative,Tentativa,0
+selection,"calendar.event,transp",0,Opaque,Opaco,0
+selection,"calendar.event,transp",0,Transparent,Transparente,0
+selection,"calendar.rrule,freq",0,Daily,,0
+selection,"calendar.rrule,freq",0,Hourly,,0
+selection,"calendar.rrule,freq",0,Minutely,,0
+selection,"calendar.rrule,freq",0,Monthly,,0
+selection,"calendar.rrule,freq",0,Secondly,,0
+selection,"calendar.rrule,freq",0,Weekly,,0
+selection,"calendar.rrule,freq",0,Yearly,,0
+selection,"calendar.rrule,wkst",0,Friday,Viernes,0
+selection,"calendar.rrule,wkst",0,Monday,Lunes,0
+selection,"calendar.rrule,wkst",0,Saturday,Sábado,0
+selection,"calendar.rrule,wkst",0,Sunday,Domingo,0
+selection,"calendar.rrule,wkst",0,Thursday,Jueves,0
+selection,"calendar.rrule,wkst",0,Tuesday,Martes,0
+selection,"calendar.rrule,wkst",0,Wednesday,Miércoles,0
+view,calendar.calendar,0,Calendar,Calendario,0
+view,calendar.calendar,0,Calendars,Calendarios,0
+view,calendar.calendar,0,General,General,0
+view,calendar.calendar,0,Security,Seguridad,0
+view,calendar.category,0,Categories,Categorías,0
+view,calendar.category,0,Category,Categoría,0
+view,calendar.event,0,Attendees,Asistentes,0
+view,calendar.event,0,Categories,Categorías,0
+view,calendar.event,0,Event,Evento,0
+view,calendar.event,0,Events,Eventos,0
+view,calendar.event,0,General,General,0
+view,calendar.event,0,Occurences,,0
+view,calendar.event,0,Recurrences,Repeticiones,0
+view,calendar.event.attendee,0,Attendee,Asistente,0
+view,calendar.event.attendee,0,Attendees,Asistentes,0
+view,calendar.event.exdate,0,Exception Date,Fecha de Excepción,0
+view,calendar.event.exdate,0,Exception Dates,Fechas de Excepción,0
+view,calendar.event.exrule,0,Exception Rule,Regla de Excepción,0
+view,calendar.event.exrule,0,Exception Rules,Reglas de Excepción,0
+view,calendar.event.rdate,0,Recurrence Date,Fecha de Repetición,0
+view,calendar.event.rdate,0,Recurrence Dates,Fechas de Repetición,0
+view,calendar.event.rrule,0,Recurrence Rule,Regla de Repetición,0
+view,calendar.event.rrule,0,Recurrence Rules,Reglas de Repetición,0
+view,calendar.location,0,Location,Lugar,0
+view,calendar.location,0,Locations,Lugares,0
diff --git a/es_ES.csv b/es_ES.csv
new file mode 100644
index 0000000..6feec26
--- /dev/null
+++ b/es_ES.csv
@@ -0,0 +1,190 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.calendar,0,A user can have only one calendar!,Un usuario solo puede tener un calendario,0
+error,calendar.calendar,0,The name of calendar must be unique!,El nombre del calendario debe ser único,0
+error,calendar.category,0,The name of calendar category must be unique!,El nombre de la categoría del calendario debe ser único,0
+error,calendar.event,0,Recurrence can not be recurrent!,Una recurrencia no puede ser recurrente,0
+error,calendar.event,0,UUID and recurrence must be unique in a calendar!,UUID y recurrencia deben ser únicos en un calendario,0
+error,calendar.location,0,The name of calendar location must be unique!,El nombre de la ubicación del calendario debe ser único,0
+error,calendar.rrule,0,"Invalid ""By Day""",Inválido «por día»,0
+error,calendar.rrule,0,"Invalid ""By Hour""",Inválido «por hora»,0
+error,calendar.rrule,0,"Invalid ""By Minute""",Inválido «por minuto»,0
+error,calendar.rrule,0,"Invalid ""By Month""",Inválido «por mes»,0
+error,calendar.rrule,0,"Invalid ""By Month Day""",Inválido «por día del mes»,0
+error,calendar.rrule,0,"Invalid ""By Position""",Inválido «por posición»,0
+error,calendar.rrule,0,"Invalid ""By Second""",Inválido «por segundos»,0
+error,calendar.rrule,0,"Invalid ""By Week Number""",Inválido «por número de semana»,0
+error,calendar.rrule,0,"Invalid ""By Year Day""",Inválido «por día del año»,0
+error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!",Solo se puede usar o «hasta» o «Número de veces»,0
+field,"calendar.alarm,rec_name",0,Name,Nombre,0
+field,"calendar.alarm,valarm",0,valarm,valarm,0
+field,"calendar.attendee,attendee",0,attendee,asistentes,0
+field,"calendar.attendee,email",0,Email,Correo electrónico,0
+field,"calendar.attendee,rec_name",0,Name,Nombre,0
+field,"calendar.attendee,status",0,Participation Status,Estado de participación,0
+field,"calendar.calendar,description",0,Description,Descripción,0
+field,"calendar.calendar,name",0,Name,Nombre,0
+field,"calendar.calendar,owner",0,Owner,Dueño,0
+field,"calendar.calendar-read-res.user,calendar",0,Calendar,Calendario,0
+field,"calendar.calendar-read-res.user,rec_name",0,Name,Nombre,0
+field,"calendar.calendar-read-res.user,user",0,User,Usuario,0
+field,"calendar.calendar,read_users",0,Read Users,Usuarios con lectura,0
+field,"calendar.calendar,rec_name",0,Name,Nombre,0
+field,"calendar.calendar-write-res.user,calendar",0,Calendar,Calendario,0
+field,"calendar.calendar-write-res.user,rec_name",0,Name,Nombre,0
+field,"calendar.calendar-write-res.user,user",0,User,Usuario,0
+field,"calendar.calendar,write_users",0,Write Users,Usuarios con escritura,0
+field,"calendar.category,name",0,Name,Nombre,0
+field,"calendar.category,rec_name",0,Name,Nombre,0
+field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Alarma del calendario,0
+field,"calendar.event.alarm,event",0,Event,Evento,0
+field,"calendar.event.alarm,rec_name",0,Name,Nombre,0
+field,"calendar.event,alarms",0,Alarms,Alarmas,0
+field,"calendar.event,all_day",0,All Day,Todo el día,0
+field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Calendario de asistentes,0
+field,"calendar.event.attendee,event",0,Event,Evento,0
+field,"calendar.event.attendee,rec_name",0,Name,Nombre,0
+field,"calendar.event,attendees",0,Attendees,Asistentes,0
+field,"calendar.event,calendar",0,Calendar,Calendario,0
+field,"calendar.event-calendar.category,category",0,Category,Categoría,0
+field,"calendar.event-calendar.category,event",0,Event,Evento,0
+field,"calendar.event-calendar.category,rec_name",0,Name,Nombre,0
+field,"calendar.event,calendar_owner",0,Owner,Dueño,0
+field,"calendar.event,calendar_read_users",0,Read Users,Usuarios con lectura,0
+field,"calendar.event,calendar_write_users",0,Write Users,Usuarios con escritura,0
+field,"calendar.event,categories",0,Categories,Categorías,0
+field,"calendar.event,classification",0,Classification,Clasificación,0
+field,"calendar.event,classification_public",0,Classification Public,Clasificación pública,0
+field,"calendar.event,description",0,Description,Descripción,0
+field,"calendar.event,dtend",0,End Date,Fecha fin,0
+field,"calendar.event,dtstart",0,Start Date,Fecha inicio,0
+field,"calendar.event.exdate,calendar_rdate",0,Calendar RDate,Fecha de recurrencia,0
+field,"calendar.event.exdate,event",0,Event,Evento,0
+field,"calendar.event.exdate,rec_name",0,Name,Nombre,0
+field,"calendar.event,exdates",0,Exception Dates,Fechas excluidas,0
+field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Regla de recurrencia,0
+field,"calendar.event.exrule,event",0,Event,Evento,0
+field,"calendar.event.exrule,rec_name",0,Name,Nombre,0
+field,"calendar.event,exrules",0,Exception Rules,Reglas de excepción,0
+field,"calendar.event,location",0,Location,Ubicación,0
+field,"calendar.event,occurences",0,Occurences,Ocurrencias,0
+field,"calendar.event,organizer",0,Organizer,Organizador,0
+field,"calendar.event,parent",0,Parent,Padre,0
+field,"calendar.event.rdate,calendar_rdate",0,Calendar RDate,Fecha de recurrencia,0
+field,"calendar.event.rdate,event",0,Event,Evento,0
+field,"calendar.event.rdate,rec_name",0,Name,Nombre,0
+field,"calendar.event,rdates",0,Recurrence Dates,Fechas de recurrencia,0
+field,"calendar.event,rec_name",0,Name,Nombre,0
+field,"calendar.event,recurrence",0,Recurrence,Recurrencia,0
+field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Regla de recurrencia,0
+field,"calendar.event.rrule,event",0,Event,Evento,0
+field,"calendar.event.rrule,rec_name",0,Name,Nombre,0
+field,"calendar.event,rrules",0,Recurrence Rules,Reglas de recurrencia,0
+field,"calendar.event,sequence",0,Sequence,Secuencia,0
+field,"calendar.event,status",0,Status,Estado,0
+field,"calendar.event,summary",0,Summary,Resumen,0
+field,"calendar.event,timezone",0,Timezone,Zona horaria,0
+field,"calendar.event,transp",0,Time Transparency,Tiempo de transparencia,0
+field,"calendar.event,uuid",0,UUID,UUID,0
+field,"calendar.event,vevent",0,vevent,vevent,0
+field,"calendar.location,name",0,Name,Nombre,0
+field,"calendar.location,rec_name",0,Name,Nombre,0
+field,"calendar.rdate,date",0,Is Date,Es fecha,0
+field,"calendar.rdate,datetime",0,Date,Fecha,0
+field,"calendar.rdate,rec_name",0,Name,Nombre,0
+field,"calendar.rrule,byday",0,By Day,Por día,0
+field,"calendar.rrule,byhour",0,By Hour,Por hora,0
+field,"calendar.rrule,byminute",0,By Minute,Por minuto,0
+field,"calendar.rrule,bymonth",0,By Month,Por mes,0
+field,"calendar.rrule,bymonthday",0,By Month Day,Por día del mes,0
+field,"calendar.rrule,bysecond",0,By Second,Por segundo,0
+field,"calendar.rrule,bysetpos",0,By Position,Por posición,0
+field,"calendar.rrule,byweekno",0,By Week Number,Por día de la semana,0
+field,"calendar.rrule,byyearday",0,By Year Day,Por día del año,0
+field,"calendar.rrule,count",0,Count,Número de veces,0
+field,"calendar.rrule,freq",0,Frequency,Frecuencia,0
+field,"calendar.rrule,interval",0,Interval,Intervalo,0
+field,"calendar.rrule,rec_name",0,Name,Nombre,0
+field,"calendar.rrule,until",0,Until Date,Hasta la fecha,0
+field,"calendar.rrule,until_date",0,Is Date,Es fecha,0
+field,"calendar.rrule,wkst",0,Week Day,Día de la semana,0
+field,"res.user,calendars",0,Calendars,Calendarios,0
+help,"calendar.calendar,owner",0,The user must have an email,El usuario debe tener un correo electrónico,0
+help,"calendar.event,uuid",0,Universally Unique Identifier,Identificador universal único,0
+help,"calendar.rdate,date",0,"Ignore time of field ""Date"", but handle as date only.",Ignora la hora del campo «Fecha» y lo trata como fecha.,0
+help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","Ignora la hora del campo «Hasta la fecha», y trata solo la fecha",0
+model,"calendar.alarm,name",0,Alarm,Alarma,0
+model,"calendar.attendee,name",0,Attendee,Asistentes,0
+model,"calendar.calendar,name",0,Calendar,Calendario,0
+model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Calendario - leer - usuario,0
+model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Calendario - escribir - usuario,0
+model,"calendar.category,name",0,Category,Categoría,0
+model,"calendar.event.alarm,name",0,Alarm,Alarma,0
+model,"calendar.event.attendee,name",0,Attendee,Asistentes,0
+model,"calendar.event-calendar.category,name",0,Event - Category,Evento - Categoría,0
+model,"calendar.event.exdate,name",0,Exception Date,Fecha excluida,0
+model,"calendar.event.exrule,name",0,Exception Rule,Regla de excepción,0
+model,"calendar.event,name",0,Event,Evento,0
+model,"calendar.event.rdate,name",0,Recurrence Date,Fecha de recurrencia,0
+model,"calendar.event.rrule,name",0,Recurrence Rule,Regla de recurrencia,0
+model,"calendar.location,name",0,Location,Ubicación,0
+model,"calendar.rdate,name",0,Recurrence Date,Fecha de recurrencia,0
+model,"calendar.rrule,name",0,Recurrence Rule,Regla de recurrencia,0
+model,"ir.action,name",act_calendar_form,Calendars,Calendarios,0
+model,"ir.action,name",act_event_form,Events,Eventos,0
+model,"ir.ui.menu,name",menu_calendar,Calendar Management,Gestión de calendario,0
+model,"ir.ui.menu,name",menu_calendar_form,Calendars,Calendarios,0
+model,"ir.ui.menu,name",menu_event_form,Events,Eventos,0
+model,"res.group,name",group_calendar_admin,Calendar Administration,Administración de calendario,0
+selection,"calendar.attendee,status",0,,,0
+selection,"calendar.attendee,status",0,Accepted,Aceptada,0
+selection,"calendar.attendee,status",0,Declined,Rehusado,0
+selection,"calendar.attendee,status",0,Delegated,Delegada,0
+selection,"calendar.attendee,status",0,Needs Action,Necesita una acción,0
+selection,"calendar.attendee,status",0,Tentative,Tentativa,0
+selection,"calendar.event,classification",0,Confidential,Confidencial,0
+selection,"calendar.event,classification",0,Private,Privado,0
+selection,"calendar.event,classification",0,Public,Público,0
+selection,"calendar.event,status",0,,,0
+selection,"calendar.event,status",0,Cancelled,Cancelado,0
+selection,"calendar.event,status",0,Confirmed,Confirmada,0
+selection,"calendar.event,status",0,Tentative,Tentativo,0
+selection,"calendar.event,transp",0,Opaque,Opaco,0
+selection,"calendar.event,transp",0,Transparent,Transparente,0
+selection,"calendar.rrule,freq",0,Daily,Diariamente,0
+selection,"calendar.rrule,freq",0,Hourly,Cada hora,0
+selection,"calendar.rrule,freq",0,Minutely,Cada minuto,0
+selection,"calendar.rrule,freq",0,Monthly,Mensualmente,0
+selection,"calendar.rrule,freq",0,Secondly,Cada segundo,0
+selection,"calendar.rrule,freq",0,Weekly,Semanalmente,0
+selection,"calendar.rrule,freq",0,Yearly,Anualmente,0
+selection,"calendar.rrule,wkst",0,Friday,Viernes,0
+selection,"calendar.rrule,wkst",0,Monday,Lunes,0
+selection,"calendar.rrule,wkst",0,Saturday,Sábado,0
+selection,"calendar.rrule,wkst",0,Sunday,Domingo,0
+selection,"calendar.rrule,wkst",0,Thursday,Jueves,0
+selection,"calendar.rrule,wkst",0,Tuesday,Martes,0
+selection,"calendar.rrule,wkst",0,Wednesday,Miércoles,0
+view,calendar.calendar,0,Calendar,Calendario,0
+view,calendar.calendar,0,Calendars,Calendarios,0
+view,calendar.calendar,0,General,General,0
+view,calendar.calendar,0,Security,Seguridad,0
+view,calendar.category,0,Categories,Categorías,0
+view,calendar.category,0,Category,Categoría,0
+view,calendar.event,0,Attendees,Asistentes,0
+view,calendar.event,0,Categories,Categorías,0
+view,calendar.event,0,Event,Evento,0
+view,calendar.event,0,Events,Eventos,0
+view,calendar.event,0,General,General,0
+view,calendar.event,0,Occurences,Ocurrencias,0
+view,calendar.event.attendee,0,Attendee,Asistentes,0
+view,calendar.event.attendee,0,Attendees,Asistentes,0
+view,calendar.event.exdate,0,Exception Date,Fecha excluida,0
+view,calendar.event.exdate,0,Exception Dates,Fechas excluidas,0
+view,calendar.event.exrule,0,Exception Rule,Regla de excepción,0
+view,calendar.event.exrule,0,Exception Rules,Reglas de excepciones,0
+view,calendar.event.rdate,0,Recurrence Date,Fecha de recurrencia,0
+view,calendar.event.rdate,0,Recurrence Dates,Fechas de recurrencia,0
+view,calendar.event.rrule,0,Recurrence Rule,Regla de recurrencia,0
+view,calendar.event.rrule,0,Recurrence Rules,Reglas de recurrencia,0
+view,calendar.location,0,Location,Ubicación,0
+view,calendar.location,0,Locations,Ubicaciones,0
diff --git a/fr_FR.csv b/fr_FR.csv
new file mode 100644
index 0000000..68ec678
--- /dev/null
+++ b/fr_FR.csv
@@ -0,0 +1,190 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.calendar,0,A user can have only one calendar!,Un utilisateur ne peut avoir qu'un seul calendrier !,0
+error,calendar.calendar,0,The name of calendar must be unique!,Le nom du calendrier doit être unique !,0
+error,calendar.category,0,The name of calendar category must be unique!,Le nom de la catégorie de calendrier doit être unique,0
+error,calendar.event,0,Recurrence can not be recurrent!,Une récurrence ne peut pas être récurrente !,0
+error,calendar.event,0,UUID and recurrence must be unique in a calendar!,UUID et récurrence doivent être uniques sur un calendrier !,0
+error,calendar.location,0,The name of calendar location must be unique!,Le nom de l'emplacement doit être unique !,0
+error,calendar.rrule,0,"Invalid ""By Day""","""Par jour"" invalide",0
+error,calendar.rrule,0,"Invalid ""By Hour""","""Par heure"" invalide",0
+error,calendar.rrule,0,"Invalid ""By Minute""","""Par minute"" invalide",0
+error,calendar.rrule,0,"Invalid ""By Month""","""Par mois"" invalide",0
+error,calendar.rrule,0,"Invalid ""By Month Day""","""Par jour du mois"" invalide",0
+error,calendar.rrule,0,"Invalid ""By Position""","""Par position"" invalide",0
+error,calendar.rrule,0,"Invalid ""By Second""","""Par seconde"" invalide",0
+error,calendar.rrule,0,"Invalid ""By Week Number""","""Par jour de la semaine"" invalide",0
+error,calendar.rrule,0,"Invalid ""By Year Day""","""Par jour de l'année"" invalide",0
+error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!","""Date de fin"" et ""Répétitions"" ne peuvent être remplis en même temps !",0
+field,"calendar.alarm,rec_name",0,Name,Nom,0
+field,"calendar.alarm,valarm",0,valarm,valarm,0
+field,"calendar.attendee,attendee",0,attendee,participant,0
+field,"calendar.attendee,email",0,Email,E-mail,0
+field,"calendar.attendee,rec_name",0,Name,Nom,0
+field,"calendar.attendee,status",0,Participation Status,Statut de participation,0
+field,"calendar.calendar,description",0,Description,Description,0
+field,"calendar.calendar,name",0,Name,Nom,0
+field,"calendar.calendar,owner",0,Owner,Propriétaire,0
+field,"calendar.calendar-read-res.user,calendar",0,Calendar,Calendrier,0
+field,"calendar.calendar-read-res.user,rec_name",0,Name,Nom,0
+field,"calendar.calendar-read-res.user,user",0,User,Utilisateur,0
+field,"calendar.calendar,read_users",0,Read Users,Utilisateurs en lecture,0
+field,"calendar.calendar,rec_name",0,Name,Nom,0
+field,"calendar.calendar-write-res.user,calendar",0,Calendar,Calendrier,0
+field,"calendar.calendar-write-res.user,rec_name",0,Name,Nom,0
+field,"calendar.calendar-write-res.user,user",0,User,Utilisateur,0
+field,"calendar.calendar,write_users",0,Write Users,Utilisateurs en écriture,0
+field,"calendar.category,name",0,Name,Nom,0
+field,"calendar.category,rec_name",0,Name,Nom,0
+field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Alarme calendrier,0
+field,"calendar.event.alarm,event",0,Event,Événement,0
+field,"calendar.event.alarm,rec_name",0,Name,Nom,0
+field,"calendar.event,alarms",0,Alarms,Alarmes,0
+field,"calendar.event,all_day",0,All Day,Toute la journée,0
+field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Participant calendrier,0
+field,"calendar.event.attendee,event",0,Event,Événement,0
+field,"calendar.event.attendee,rec_name",0,Name,Nom,0
+field,"calendar.event,attendees",0,Attendees,Participants,0
+field,"calendar.event,calendar",0,Calendar,Calendrier,0
+field,"calendar.event-calendar.category,category",0,Category,Catégorie,0
+field,"calendar.event-calendar.category,event",0,Event,Événement,0
+field,"calendar.event-calendar.category,rec_name",0,Name,Nom,0
+field,"calendar.event,calendar_owner",0,Owner,Propriétaire,0
+field,"calendar.event,calendar_read_users",0,Read Users,Utilisateurs en lecture,0
+field,"calendar.event,calendar_write_users",0,Write Users,Utilisateurs en écriture,0
+field,"calendar.event,categories",0,Categories,Catégories,0
+field,"calendar.event,classification",0,Classification,Classification,0
+field,"calendar.event,classification_public",0,Classification Public,Classification publique,0
+field,"calendar.event,description",0,Description,Description,0
+field,"calendar.event,dtend",0,End Date,Date de fin,0
+field,"calendar.event,dtstart",0,Start Date,Date de début,0
+field,"calendar.event.exdate,calendar_rdate",0,Calendar RDate,Date de récurrence,0
+field,"calendar.event.exdate,event",0,Event,Événement,0
+field,"calendar.event.exdate,rec_name",0,Name,Nom,0
+field,"calendar.event,exdates",0,Exception Dates,Dates d'exception,0
+field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
+field,"calendar.event.exrule,event",0,Event,Événement,0
+field,"calendar.event.exrule,rec_name",0,Name,Nom,0
+field,"calendar.event,exrules",0,Exception Rules,Règles d'exception,0
+field,"calendar.event,location",0,Location,Emplacement,0
+field,"calendar.event,occurences",0,Occurences,Occurrences,0
+field,"calendar.event,organizer",0,Organizer,Organisateur,0
+field,"calendar.event,parent",0,Parent,Parent,0
+field,"calendar.event.rdate,calendar_rdate",0,Calendar RDate,Date de récurrence,0
+field,"calendar.event.rdate,event",0,Event,Événement,0
+field,"calendar.event.rdate,rec_name",0,Name,Nom,0
+field,"calendar.event,rdates",0,Recurrence Dates,Dates de récurrence,0
+field,"calendar.event,rec_name",0,Name,Nom,0
+field,"calendar.event,recurrence",0,Recurrence,Récurrence,0
+field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
+field,"calendar.event.rrule,event",0,Event,Événement,0
+field,"calendar.event.rrule,rec_name",0,Name,Nom,0
+field,"calendar.event,rrules",0,Recurrence Rules,Règles de récurrence,0
+field,"calendar.event,sequence",0,Sequence,Séquence,0
+field,"calendar.event,status",0,Status,Statut,0
+field,"calendar.event,summary",0,Summary,Résumé,0
+field,"calendar.event,timezone",0,Timezone,Fuseau Horaire,0
+field,"calendar.event,transp",0,Time Transparency,Transparence,0
+field,"calendar.event,uuid",0,UUID,UUID,0
+field,"calendar.event,vevent",0,vevent,vevent,0
+field,"calendar.location,name",0,Name,Nom,0
+field,"calendar.location,rec_name",0,Name,Nom,0
+field,"calendar.rdate,date",0,Is Date,Est une date,0
+field,"calendar.rdate,datetime",0,Date,Date,0
+field,"calendar.rdate,rec_name",0,Name,Nom,0
+field,"calendar.rrule,byday",0,By Day,Par jour,0
+field,"calendar.rrule,byhour",0,By Hour,Par heure,0
+field,"calendar.rrule,byminute",0,By Minute,Par minute,0
+field,"calendar.rrule,bymonth",0,By Month,Par mois,0
+field,"calendar.rrule,bymonthday",0,By Month Day,Par jour du mois,0
+field,"calendar.rrule,bysecond",0,By Second,Par seconde,0
+field,"calendar.rrule,bysetpos",0,By Position,Par position,0
+field,"calendar.rrule,byweekno",0,By Week Number,Par numéro de semaine,0
+field,"calendar.rrule,byyearday",0,By Year Day,Par jour de l'année,0
+field,"calendar.rrule,count",0,Count,Répétitions,0
+field,"calendar.rrule,freq",0,Frequency,Fréquence,0
+field,"calendar.rrule,interval",0,Interval,Intervalle,0
+field,"calendar.rrule,rec_name",0,Name,Nom,0
+field,"calendar.rrule,until",0,Until Date,Date de fin,0
+field,"calendar.rrule,until_date",0,Is Date,Est une date,0
+field,"calendar.rrule,wkst",0,Week Day,Jour de la semaine,0
+field,"res.user,calendars",0,Calendars,Calendriers,0
+help,"calendar.calendar,owner",0,The user must have an email,L'utilisateur doit avoir une adresse mail,0
+help,"calendar.event,uuid",0,Universally Unique Identifier,Identificateur unique universel,0
+help,"calendar.rdate,date",0,"Ignore time of field ""Date"", but handle as date only.","Ignore l'heure du champ ""Date""",0
+help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","Ignore l'heure du champ ""Date de fin""",0
+model,"calendar.alarm,name",0,Alarm,Alarme,0
+model,"calendar.attendee,name",0,Attendee,Participant,0
+model,"calendar.calendar,name",0,Calendar,Calendrier,0
+model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Calendrier - Lecture - Utilisateur,0
+model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Calendrier - Écriture - Utilisateur,0
+model,"calendar.category,name",0,Category,Catégorie,0
+model,"calendar.event.alarm,name",0,Alarm,Alarme,0
+model,"calendar.event.attendee,name",0,Attendee,Participant,0
+model,"calendar.event-calendar.category,name",0,Event - Category,Évenement - Catégorie,0
+model,"calendar.event.exdate,name",0,Exception Date,Date d'exception,0
+model,"calendar.event.exrule,name",0,Exception Rule,Règle d'exception,0
+model,"calendar.event,name",0,Event,Événement,0
+model,"calendar.event.rdate,name",0,Recurrence Date,Date de récurrence,0
+model,"calendar.event.rrule,name",0,Recurrence Rule,Règle de récurrence,0
+model,"calendar.location,name",0,Location,Emplacement,0
+model,"calendar.rdate,name",0,Recurrence Date,Date de récurrence,0
+model,"calendar.rrule,name",0,Recurrence Rule,Règle de récurrence,0
+model,"ir.action,name",act_calendar_form,Calendars,Calendriers,0
+model,"ir.action,name",act_event_form,Events,Événement,0
+model,"ir.ui.menu,name",menu_calendar,Calendar Management,Gestion de calendrier,0
+model,"ir.ui.menu,name",menu_calendar_form,Calendars,Calendriers,0
+model,"ir.ui.menu,name",menu_event_form,Events,Évenement,0
+model,"res.group,name",group_calendar_admin,Calendar Administration,Administration calendrier,0
+selection,"calendar.attendee,status",0,,,0
+selection,"calendar.attendee,status",0,Accepted,Accepté,0
+selection,"calendar.attendee,status",0,Declined,Décliné,0
+selection,"calendar.attendee,status",0,Delegated,Délégué,0
+selection,"calendar.attendee,status",0,Needs Action,Nécessite une action,0
+selection,"calendar.attendee,status",0,Tentative,Tentative,0
+selection,"calendar.event,classification",0,Confidential,Confidentiel,0
+selection,"calendar.event,classification",0,Private,Privé,0
+selection,"calendar.event,classification",0,Public,Publique,0
+selection,"calendar.event,status",0,,,0
+selection,"calendar.event,status",0,Cancelled,Annulé,0
+selection,"calendar.event,status",0,Confirmed,Confirmé,0
+selection,"calendar.event,status",0,Tentative,Tentative,0
+selection,"calendar.event,transp",0,Opaque,Opaque,0
+selection,"calendar.event,transp",0,Transparent,transparent,0
+selection,"calendar.rrule,freq",0,Daily,Journalier,0
+selection,"calendar.rrule,freq",0,Hourly,Horaire,0
+selection,"calendar.rrule,freq",0,Minutely,Chaque minute,0
+selection,"calendar.rrule,freq",0,Monthly,Mensuel,0
+selection,"calendar.rrule,freq",0,Secondly,Chaque seconde,0
+selection,"calendar.rrule,freq",0,Weekly,hebdomadaire,0
+selection,"calendar.rrule,freq",0,Yearly,Annuel,0
+selection,"calendar.rrule,wkst",0,Friday,Vendredi,0
+selection,"calendar.rrule,wkst",0,Monday,Lundi,0
+selection,"calendar.rrule,wkst",0,Saturday,Samedi,0
+selection,"calendar.rrule,wkst",0,Sunday,Dimanche,0
+selection,"calendar.rrule,wkst",0,Thursday,Jeudi,0
+selection,"calendar.rrule,wkst",0,Tuesday,Mardi,0
+selection,"calendar.rrule,wkst",0,Wednesday,Mercredi,0
+view,calendar.calendar,0,Calendar,Calendrier,0
+view,calendar.calendar,0,Calendars,Calendriers,0
+view,calendar.calendar,0,General,Général,0
+view,calendar.calendar,0,Security,Sécurité,0
+view,calendar.category,0,Categories,Catégories,0
+view,calendar.category,0,Category,Catégorie,0
+view,calendar.event,0,Attendees,Participants,0
+view,calendar.event,0,Categories,Catégories,0
+view,calendar.event,0,Event,Événement,0
+view,calendar.event,0,Events,Événements,0
+view,calendar.event,0,General,Général,0
+view,calendar.event,0,Occurences,Occurrences,0
+view,calendar.event.attendee,0,Attendee,Participant,0
+view,calendar.event.attendee,0,Attendees,Participants,0
+view,calendar.event.exdate,0,Exception Date,Date d'exception,0
+view,calendar.event.exdate,0,Exception Dates,Dates d'exception,0
+view,calendar.event.exrule,0,Exception Rule,Règle d'exception,0
+view,calendar.event.exrule,0,Exception Rules,Règles d'exception,0
+view,calendar.event.rdate,0,Recurrence Date,Date de récurrence,0
+view,calendar.event.rdate,0,Recurrence Dates,Dates de récurrence,0
+view,calendar.event.rrule,0,Recurrence Rule,Règle de récurrence,0
+view,calendar.event.rrule,0,Recurrence Rules,Règles de récurrence,0
+view,calendar.location,0,Location,Emplacement,0
+view,calendar.location,0,Locations,Emplacements,0
diff --git a/res.py b/res.py
new file mode 100644
index 0000000..66e3a3f
--- /dev/null
+++ b/res.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.
+from trytond.model import ModelView, ModelSQL, fields
+import copy
+
+
+class User(ModelSQL, ModelView):
+ _name = 'res.user'
+
+ calendars = fields.One2Many('calendar.calendar', 'owner', 'Calendars')
+
+ def __init__(self):
+ super(User, self).__init__()
+ self.email = copy.copy(self.email)
+ self.email.states = copy.copy(self.email.states)
+ self.email.depends = copy.copy(self.email.depends)
+ if 'required' in self.email.states:
+ self.email.states['required'] = '(' + self.email.states['required'] \
+ + ') or bool(calendars)'
+ else:
+ self.email.states['required'] = 'bool(calendars)'
+ if 'calendars' not in self.email.depends:
+ self.email.depends.append('calendars')
+
+User()
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..acce95a
--- /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',
+ 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': '.'},
+ packages=[
+ 'trytond.modules.calendar',
+ ],
+ package_data={
+ 'trytond.modules.calendar': 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 = trytond.modules.calendar
+ """,
+)
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..2680025
--- /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 import *
diff --git a/tests/test_calendar.py b/tests/test_calendar.py
new file mode 100644
index 0000000..78e6314
--- /dev/null
+++ b/tests/test_calendar.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 CalendarTestCase(unittest.TestCase):
+ '''
+ Test Calendar module.
+ '''
+
+ def setUp(self):
+ trytond.tests.test_tryton.install_module('calendar')
+
+ def test0005views(self):
+ '''
+ Test views.
+ '''
+ self.assertRaises(Exception, test_view('calendar'))
+
+def suite():
+ return unittest.TestLoader().loadTestsFromTestCase(CalendarTestCase)
+
+if __name__ == '__main__':
+ suiteTrytond = trytond.tests.test_tryton.suite()
+ suiteCalendar = suite()
+ alltests = unittest.TestSuite([suiteTrytond, suiteCalendar])
+ unittest.TextTestRunner(verbosity=2).run(alltests)
+ SOCK.disconnect()
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
new file mode 100644
index 0000000..d54b60d
--- /dev/null
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -0,0 +1,25 @@
+Metadata-Version: 1.0
+Name: trytond-calendar
+Version: 1.4.0
+Summary: Add CalDAV support
+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.egg-info/SOURCES.txt b/trytond_calendar.egg-info/SOURCES.txt
new file mode 100644
index 0000000..bafc0ca
--- /dev/null
+++ b/trytond_calendar.egg-info/SOURCES.txt
@@ -0,0 +1,27 @@
+CHANGELOG
+COPYRIGHT
+INSTALL
+LICENSE
+MANIFEST.in
+README
+calendar.xml
+de_DE.csv
+es_CO.csv
+es_ES.csv
+fr_FR.csv
+setup.py
+./__init__.py
+./__tryton__.py
+./caldav.py
+./calendar.py
+./res.py
+./webdav.py
+tests/__init__.py
+tests/test_calendar.py
+trytond_calendar.egg-info/PKG-INFO
+trytond_calendar.egg-info/SOURCES.txt
+trytond_calendar.egg-info/dependency_links.txt
+trytond_calendar.egg-info/entry_points.txt
+trytond_calendar.egg-info/not-zip-safe
+trytond_calendar.egg-info/requires.txt
+trytond_calendar.egg-info/top_level.txt
\ No newline at end of file
diff --git a/trytond_calendar.egg-info/dependency_links.txt b/trytond_calendar.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/trytond_calendar.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/trytond_calendar.egg-info/entry_points.txt b/trytond_calendar.egg-info/entry_points.txt
new file mode 100644
index 0000000..b136ca9
--- /dev/null
+++ b/trytond_calendar.egg-info/entry_points.txt
@@ -0,0 +1,4 @@
+
+ [trytond.modules]
+ calendar = trytond.modules.calendar
+
\ No newline at end of file
diff --git a/trytond_calendar.egg-info/not-zip-safe b/trytond_calendar.egg-info/not-zip-safe
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/trytond_calendar.egg-info/not-zip-safe
@@ -0,0 +1 @@
+
diff --git a/trytond_calendar.egg-info/requires.txt b/trytond_calendar.egg-info/requires.txt
new file mode 100644
index 0000000..2160975
--- /dev/null
+++ b/trytond_calendar.egg-info/requires.txt
@@ -0,0 +1,6 @@
+vobject
+PyWebDAV
+python-dateutil
+pytz
+trytond >= 1.4
+trytond < 1.5
\ No newline at end of file
diff --git a/trytond_calendar.egg-info/top_level.txt b/trytond_calendar.egg-info/top_level.txt
new file mode 100644
index 0000000..93df119
--- /dev/null
+++ b/trytond_calendar.egg-info/top_level.txt
@@ -0,0 +1 @@
+trytond
diff --git a/webdav.py b/webdav.py
new file mode 100644
index 0000000..66a3966
--- /dev/null
+++ b/webdav.py
@@ -0,0 +1,603 @@
+#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
+
+CALDAV_NS = 'urn:ietf:params:xml:ns:caldav'
+
+
+class Collection(ModelSQL, ModelView):
+
+ _name = "webdav.collection"
+
+ def calendar(self, cursor, user, uri, ics=False, context=None):
+ '''
+ Return the calendar id in the uri or False
+
+ :param cursor: the database cursor
+ :param user: the user id
+ :param uri: the uri
+ :param context: the context
+ :return: calendar id
+ or False if there is no calendar
+ '''
+ calendar_obj = self.pool.get('calendar.calendar')
+
+ if uri and uri.startswith('Calendars/'):
+ calendar, uri = (uri[10:].split('/', 1) + [None])[0:2]
+ if ics:
+ if calendar.endswith('.ics'):
+ calendar = calendar[:-4]
+ else:
+ return False
+ return calendar_obj.get_name(cursor, user, calendar, context=context)
+ return False
+
+ def event(self, cursor, user, uri, calendar_id=False, context=None):
+ '''
+ Return the event 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: event id
+ or False if there is no event
+ '''
+ event_obj = self.pool.get('calendar.event')
+
+ if uri and uri.startswith('Calendars/'):
+ calendar, event_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
+ event_ids = event_obj.search(cursor, user, [
+ ('calendar', '=', calendar_id),
+ ('uuid', '=', event_uri[:-4]),
+ ('parent', '=', False),
+ ], limit=1, context=context)
+ if event_ids:
+ return event_ids[0]
+ return False
+
+ event = Cache('webdav_collection.event')(event)
+
+ def _caldav_filter_domain_calendar(self, cursor, user, filter, context=None):
+ '''
+ Return a domain for caldav filter on calendar
+
+ :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
+ '''
+ if not filter:
+ return []
+ if filter.localName == 'principal-property-search':
+ return [('id', '=', 0)]
+ return [('id', '=', 0)]
+
+ def _caldav_filter_domain_event(self, cursor, user, filter, context=None):
+ '''
+ Return a domain for caldav filter on event
+
+ :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)]
+ vevent_filter = None
+ for vevent_filter in vcalendar_filter.childNodes:
+ if vevent_filter.nodeType == vevent_filter.TEXT_NODE:
+ vevent_filter = None
+ continue
+ if vevent_filter.localName == 'comp-filter':
+ if vevent_filter.getAttribute('name') != 'VEVENT':
+ vevent_filter = None
+ continue
+ break
+ if vevent_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)
+ event_id = self.event(cursor, user, uri, context=context)
+ if event_id:
+ ids.append(event_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')
+ event_obj = self.pool.get('calendar.event')
+
+ if uri in ('Calendars', 'Calendars/'):
+ domain = self._caldav_filter_domain_calendar(cursor, user,
+ filter, context=context)
+ calendar_ids = calendar_obj.search(cursor, user, domain,
+ context=context)
+ calendars = calendar_obj.browse(cursor, user, calendar_ids,
+ context=context)
+ if cache is not None:
+ cache.setdefault('_calendar', {})
+ cache['_calendar'].setdefault(calendar_obj._name, {})
+ for calendar_id in calendar_ids:
+ cache['_calendar'][calendar_obj._name][calendar_id] = {}
+ return [x.name for x in calendars] + \
+ [x.name + '.ics' for x in calendars]
+ if uri 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_event(cursor, user, filter,
+ context=context)
+ event_ids = event_obj.search(cursor, user, [
+ ('calendar', '=', calendar_id),
+ domain,
+ ], context=context)
+ events = event_obj.browse(cursor, user, event_ids,
+ context=context)
+ if cache is not None:
+ cache.setdefault('_calendar', {})
+ cache['_calendar'].setdefault(event_obj._name, {})
+ for event_id in event_ids:
+ cache['_calendar'][event_obj._name][event_id] = {}
+ return [x.uuid + '.ics' for x in events]
+ return []
+ res = super(Collection, self).get_childs(cursor, user, uri,
+ filter=filter, context=context, cache=cache)
+ if not uri and not filter:
+ res.append('Calendars')
+ elif not uri and filter:
+ if filter.localName == 'principal-property-search':
+ res.append('Calendars')
+ 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.event(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.event(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')
+ event_obj = self.pool.get('calendar.event')
+
+ 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:
+ if not (uri[10:].split('/', 1) + [None])[1]:
+ if cache is not None:
+ cache.setdefault('_calendar', {})
+ cache['_calendar'].setdefault(calendar_obj._name, {})
+ ids = cache['_calendar'][calendar_obj._name].keys()
+ if calendar_id not in ids:
+ ids.append(calendar_id)
+ elif 'creationdate' in cache['_calendar']\
+ [calendar_obj._name][calendar_id]:
+ return cache['_calendar'][calendar_obj._name]\
+ [calendar_id]['creationdate']
+ else:
+ ids = [calendar_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 "' + calendar_obj._table + '" ' \
+ 'WHERE ' + red_sql, red_ids)
+ for calendar_id2, date in cursor.fetchall():
+ if calendar_id2 == calendar_id:
+ res = date
+ if cache is not None:
+ cache['_calendar'][calendar_obj._name]\
+ .setdefault(calendar_id2, {})
+ cache['_calendar'][calendar_obj._name]\
+ [calendar_id2]['creationdate'] = date
+ if res is not None:
+ return res
+ else:
+ event_id = self.event(cursor, user, uri, calendar_id=calendar_id,
+ context=context)
+ if event_id:
+ if cache is not None:
+ cache.setdefault('_calendar', {})
+ cache['_calendar'].setdefault(event_obj._name, {})
+ ids = cache['_calendar'][event_obj._name].keys()
+ if event_id not in ids:
+ ids.append(event_id)
+ elif 'creationdate' in cache['_calendar']\
+ [event_obj._name][event_id]:
+ return cache['_calendar'][event_obj._name]\
+ [event_id]['creationdate']
+ else:
+ ids = [event_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 "' + event_obj._table + '" ' \
+ 'WHERE ' + red_sql, red_ids)
+ for event_id2, date in cursor.fetchall():
+ if event_id2 == event_id:
+ res = date
+ if cache is not None:
+ cache['_calendar'][event_obj._name]\
+ .setdefault(event_id2, {})
+ cache['_calendar'][event_obj._name]\
+ [event_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')
+ event_obj = self.pool.get('calendar.event')
+
+ calendar_id = self.calendar(cursor, user, uri, context=context)
+ if calendar_id:
+ if not (uri[10:].split('/', 1) + [None])[1]:
+ if cache is not None:
+ cache.setdefault('_calendar', {})
+ cache['_calendar'].setdefault(calendar_obj._name, {})
+ ids = cache['_calendar'][calendar_obj._name].keys()
+ if calendar_id not in ids:
+ ids.append(calendar_id)
+ elif 'lastmodified' in cache['_calendar']\
+ [calendar_obj._name][calendar_id]:
+ return cache['_calendar'][calendar_obj._name]\
+ [calendar_id]['lastmodified']
+ else:
+ ids = [calendar_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 ' \
+ 'COALESCE(write_date, create_date)) ' \
+ 'FROM "' + calendar_obj._table + '" ' \
+ 'WHERE ' + red_sql, red_ids)
+ for calendar_id2, date in cursor.fetchall():
+ if calendar_id2 == calendar_id:
+ res = date
+ if cache is not None:
+ cache['_calendar'][calendar_obj._name]\
+ .setdefault(calendar_id2, {})
+ cache['_calendar'][calendar_obj._name]\
+ [calendar_id2]['lastmodified'] = date
+ if res is not None:
+ return res
+ else:
+ event_id = self.event(cursor, user, uri, calendar_id=calendar_id,
+ context=context)
+ if event_id:
+ if cache is not None:
+ cache.setdefault('_calendar', {})
+ cache['_calendar'].setdefault(event_obj._name, {})
+ ids = cache['_calendar'][event_obj._name].keys()
+ if event_id not in ids:
+ ids.append(event_id)
+ elif 'lastmodified' in cache['_calendar']\
+ [event_obj._name][event_id]:
+ return cache['_calendar'][event_obj._name]\
+ [event_id]['lastmodified']
+ else:
+ ids = [event_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 "' + event_obj._table + '" ' \
+ 'WHERE ' + red_id_sql + ' ' \
+ 'OR ' + red_parent_sql + ' ' \
+ 'GROUP BY parent, id',
+ red_id_ids + red_parent_ids)
+ for event_id2, date in cursor.fetchall():
+ if event_id2 == event_id:
+ res = date
+ if cache is not None:
+ cache['_calendar'][event_obj._name]\
+ .setdefault(event_id2, {})
+ cache['_calendar'][event_obj._name]\
+ [event_id2]['lastmodified'] = date
+ if res is not None:
+ return res
+ calendar_ics_id = self.calendar(cursor, user, uri, ics=True,
+ context=context)
+ if calendar_ics_id:
+ if cache is not None:
+ cache.setdefault('_calendar', {})
+ cache['_calendar'].setdefault(calendar_obj._name, {})
+ ids = cache['_calendar'][calendar_obj._name].keys()
+ if calendar_ics_id not in ids:
+ ids.append(calendar_ics_id)
+ elif 'lastmodified ics' in cache['_calendar']\
+ [calendar_obj._name][calendar_ics_id]:
+ return cache['_calendar'][calendar_obj._name]\
+ [calendar_ics_id]['lastmodified ics']
+ else:
+ ids = [calendar_ics_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('calendar', sub_ids)
+ cursor.execute('SELECT calendar, MAX(EXTRACT(epoch FROM ' \
+ 'COALESCE(write_date, create_date))) ' \
+ 'FROM "' + event_obj._table + '" ' \
+ 'WHERE ' + red_sql + ' ' \
+ 'GROUP BY calendar', red_ids)
+ for calendar_id2, date in cursor.fetchall():
+ if calendar_id2 == calendar_ics_id:
+ res = date
+ if cache is not None:
+ cache['_calendar'][calendar_obj._name]\
+ .setdefault(calendar_id2, {})
+ cache['_calendar'][calendar_obj._name]\
+ [calendar_id2]['lastmodified ics'] = 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):
+ event_obj = self.pool.get('calendar.event')
+ 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
+ event_id = self.event(cursor, user, uri, calendar_id=calendar_id,
+ context=context)
+ if not event_id:
+ raise DAV_NotFound
+ ical = event_obj.event2ical(cursor, user, event_id, context=context)
+ return ical.serialize()
+ calendar_ics_id = self.calendar(cursor, user, uri, ics=True,
+ context=context)
+ if calendar_ics_id:
+ ical = calendar_obj.calendar2ical(cursor, user, calendar_ics_id,
+ context=context)
+ return ical.serialize()
+ return super(Collection, self).get_data(cursor, user, uri,
+ context=context, cache=cache)
+
+ def get_calendar_description(self, cursor, user, uri, context=None,
+ cache=None):
+ 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]:
+ if cache is not None:
+ cache.setdefault('_calendar', {})
+ cache['_calendar'].setdefault(calendar_obj._name, {})
+ ids = cache['_calendar'][calendar_obj._name].keys()
+ if calendar_id not in ids:
+ ids.append(calendar_id)
+ elif 'calendar_description' in cache['_calendar']\
+ [calendar_obj._name][calendar_id]:
+ return cache['_calendar'][calendar_obj._name]\
+ [calendar_id]['calendar_description']
+ else:
+ ids = [calendar_id]
+ res = None
+ for calendar in calendar_obj.browse(cursor, user, ids,
+ context=context):
+ if calendar.id == calendar_id:
+ res = calendar.description
+ if cache is not None:
+ cache['_calendar'][calendar_obj._name]\
+ .setdefault(calendar.id, {})
+ cache['_calendar'][calendar_obj._name]\
+ [calendar.id]['calendar_description'] = \
+ calendar.description
+ if res is not None:
+ return res
+ raise DAV_NotFound
+
+ def get_calendar_data(self, cursor, user, uri, context=None, cache=None):
+ return self.get_data(cursor, user, uri, context=context, cache=cache)\
+ .decode('utf-8')
+
+ def get_calendar_home_set(self, cursor, user, uri, context=None,
+ cache=None):
+ return '/Calendars'
+
+ def get_calendar_user_address_set(self, cursor, user_id, uri, context=None,
+ cache=None):
+ user_obj = self.pool.get('res.user')
+ user = user_obj.browse(cursor, user_id, user_id, context=context)
+ if user.email:
+ return user.email
+ raise DAV_NotFound
+
+ def get_schedule_inbox_URL(self, cursor, user, uri, context=None,
+ cache=None):
+ calendar_obj = self.pool.get('calendar.calendar')
+
+ calendar_ids = calendar_obj.search(cursor, user, [
+ ('owner', '=', user),
+ ], limit=1, context=context)
+ if not calendar_ids:
+ raise DAV_NotFound
+ calendar = calendar_obj.browse(cursor, user, calendar_ids[0],
+ context=context)
+ return '/Calendars/' + calendar.name
+
+ def get_schedule_outbox_URL(self, cursor, user, uri, context=None,
+ cache=None):
+ return self.get_schedule_inbox_URL(cursor, user, uri, context=context,
+ cache=cache)
+
+ def put(self, cursor, user, uri, data, content_type, context=None,
+ cache=None):
+ event_obj = self.pool.get('calendar.event')
+ 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
+ event_id = self.event(cursor, user, uri, calendar_id=calendar_id,
+ context=context)
+ if not event_id:
+ ical = vobject.readOne(data)
+ values = event_obj.ical2values(cursor, user, None, ical,
+ calendar_id, context=context)
+ event_id = event_obj.create(cursor, user, values,
+ context=context)
+ event = event_obj.browse(cursor, user, event_id,
+ context=context)
+ calendar = calendar_obj.browse(cursor, user, calendar_id,
+ context=context)
+ return cursor.database_name + '/Calendars/' + calendar.name + \
+ '/' + event.uuid + '.ics'
+ else:
+ ical = vobject.readOne(data)
+ values = event_obj.ical2values(cursor, user, event_id, ical,
+ calendar_id, context=context)
+ event_obj.write(cursor, user, event_id, values,
+ context=context)
+ return
+ calendar_ics_id = self.calendar(cursor, user, uri, ics=True,
+ context=context)
+ if calendar_ics_id:
+ raise DAV_Forbidden
+ return super(Collection, self).put(cursor, user, uri, data,
+ content_type, context=context)
+
+ def mkcol(self, cursor, user, uri, context=None, cache=None):
+ if uri and uri.startswith('Calendars/'):
+ raise DAV_Forbidden
+ return super(Collection, self).mkcol(cursor, user, uri, context=context,
+ cache=cache)
+
+ def rmcol(self, cursor, user, uri, context=None, cache=None):
+ 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]:
+ try:
+ calendar_obj.delete(cursor, user, calendar_id,
+ context=context)
+ except:
+ raise DAV_Forbidden
+ return 200
+ raise DAV_Forbidden
+ return super(Collection, self).rmcol(cursor, user, uri, context=context,
+ cache=cache)
+
+ def rm(self, cursor, user, uri, context=None, cache=None):
+ event_obj = self.pool.get('calendar.event')
+
+ calendar_id = self.calendar(cursor, user, uri, context=context)
+ if calendar_id:
+ if not (uri[10:].split('/', 1) + [None])[1]:
+ raise DAV_Forbidden
+ event_id = self.event(cursor, user, uri, calendar_id=calendar_id,
+ context=context)
+ if event_id:
+ try:
+ event_obj.delete(cursor, user, event_id, context=context)
+ except:
+ raise DAV_Forbidden
+ return 200
+ calendar_ics_id = self.calendar(cursor, user, uri, ics=True,
+ context=context)
+ if calendar_ics_id:
+ raise DAV_Forbidden
+ 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.event(cursor, user, uri, calendar_id=calendar_id,
+ context=context):
+ return 1
+ calendar_ics_id = self.calendar(cursor, user, uri, ics=True,
+ context=context)
+ if calendar_ics_id:
+ return 1
+ return super(Collection, self).exists(cursor, user, uri, context=context,
+ cache=cache)
+
+Collection()
--
tryton-modules-calendar
More information about the tryton-debian-vcs
mailing list