[tryton-debian-vcs] tryton-modules-calendar branch upstream updated. upstream/3.4.1-1-g3cac6c6

Mathias Behrle tryton-debian-vcs at alioth.debian.org
Thu Apr 23 16:02:59 UTC 2015


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=upstream/3.4.1-1-g3cac6c6

commit 3cac6c613d519ffca1bb0090c8a054adfeed957e
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Thu Apr 23 16:59:54 2015 +0200

    Adding upstream version 3.6.0.
    
    Signed-off-by: Mathias Behrle <mathiasb at m9s.biz>

diff --git a/CHANGELOG b/CHANGELOG
index 47f7057..da8c30e 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,8 @@
-Version 3.4.1 - 2015-03-01
+Version 3.6.0 - 2015-04-20
 * Bug fixes (see mercurial logs for details)
+* Add support for PyPy
+* Add record rule to calendar
+* Add full access to calendar admin. group
 
 Version 3.4.0 - 2014-10-20
 * Bug fixes (see mercurial logs for details)
diff --git a/INSTALL b/INSTALL
index 463e08a..2bb9cd8 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,5 +1,5 @@
 Installing trytond_calendar
-=================================
+===========================
 
 Prerequisites
 -------------
diff --git a/PKG-INFO b/PKG-INFO
index 0513922..cd5f507 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond_calendar
-Version: 3.4.1
+Version: 3.6.0
 Summary: Tryton module for CalDAV
 Home-page: http://www.tryton.org/
 Author: Tryton
 Author-email: issue_tracker at tryton.org
 License: GPL-3
-Download-URL: http://downloads.tryton.org/3.4/
+Download-URL: http://downloads.tryton.org/3.6/
 Description: trytond_calendar
         ================
         
@@ -66,4 +66,6 @@ Classifier: Natural Language :: Slovenian
 Classifier: Natural Language :: Spanish
 Classifier: Operating System :: OS Independent
 Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
 Classifier: Topic :: Office/Business
diff --git a/__init__.py b/__init__.py
index caf0820..a8f3f1e 100644
--- a/__init__.py
+++ b/__init__.py
@@ -1,5 +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.
+# 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
diff --git a/caldav.py b/caldav.py
index a5fd3b1..f79a0e1 100644
--- a/caldav.py
+++ b/caldav.py
@@ -1,5 +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.
+# 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 urlparse
 import urllib
 from string import atoi
@@ -16,12 +16,12 @@ from trytond.transaction import Transaction
 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',
+    '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'])
@@ -41,13 +41,13 @@ 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')
-        #Disable groupdav attribute for iPhone
-        #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
@@ -126,8 +126,8 @@ def _get_caldav_calendar_home_set(self, uri):
     doc = domimpl.createDocument(None, 'href', None)
     href = doc.documentElement
     href.tagName = 'D:href'
-    #iPhone doesn't handle "http" in 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
@@ -298,7 +298,7 @@ def do_POST(self):
         except DAV_Error, exception:
             ec, _ = exception
             return self.send_status(ec)
-        self.send_body_chunks(DATA, '200', 'OK', 'OK')
+        self.send_body_chunks(DATA, 200, 'OK', 'OK')
         return
     return _prev_do_POST(self)
 
diff --git a/calendar.xml b/calendar.xml
index bd3055a..68f6d49 100644
--- a/calendar.xml
+++ b/calendar.xml
@@ -48,8 +48,27 @@ this repository contains the full copyright notices and license terms. -->
         <menuitem parent="menu_calendar" sequence="1"
             action="act_calendar_form" id="menu_calendar_form"/>
 
+        <record model="ir.rule.group" id="rule_group_calendar_admin">
+            <field name="model" search="[('model', '=', 'calendar.calendar')]"/>
+            <field name="global_p" eval="False"/>
+            <field name="default_p" eval="False"/>
+            <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_calendar_admin_line1">
+            <field name="domain">[]</field>
+            <field name="rule_group" ref="rule_group_calendar_admin"/>
+        </record>
+        <record model="ir.rule.group-res.group"
+            id="rule_group_calendar_admin-calendar_admin">
+            <field name="rule_group" ref="rule_group_calendar_admin"/>
+            <field name="group" ref="group_calendar_admin"/>
+        </record>
+
         <record model="ir.rule.group" id="rule_group_read_calendar">
-            <field name="model" search="[('model', '=', 'calendar.event')]"/>
+            <field name="model" search="[('model', '=', 'calendar.calendar')]"/>
             <field name="global_p" eval="False"/>
             <field name="default_p" eval="True"/>
             <field name="perm_read" eval="True"/>
@@ -58,16 +77,20 @@ 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="domain">[('calendar_owner', '=', user.id)]</field>
+            <field name="domain"
+                eval="[('owner', '=', Eval('user', {}).get('id', -1))]"
+                pyson="1"/>
             <field name="rule_group" ref="rule_group_read_calendar"/>
         </record>
         <record model="ir.rule" id="rule_group_read_calendar_line2">
-            <field name="domain">[('calendar_read_users', '=', user.id)]</field>
+            <field name="domain"
+                eval="[('read_users', '=', Eval('user', {}).get('id', -1))]"
+                pyson="1"/>
             <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="model" search="[('model', '=', 'calendar.calendar')]"/>
             <field name="global_p" eval="False"/>
             <field name="default_p" eval="True"/>
             <field name="perm_read" eval="True"/>
@@ -76,11 +99,15 @@ 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="domain">[('calendar_owner', '=', user.id)]</field>
+            <field name="domain"
+                eval="[('owner', '=', Eval('user', {}).get('id', -1))]"
+                pyson="1"/>
             <field name="rule_group" ref="rule_group_write_calendar"/>
         </record>
         <record model="ir.rule" id="rule_group_write_calendar_line2">
-            <field name="domain">[('calendar_write_users', '=', user.id)]</field>
+            <field name="domain"
+                eval="[('write_users', '=', Eval('user', {}).get('id', -1))]"
+                pyson="1"/>
             <field name="rule_group" ref="rule_group_write_calendar"/>
         </record>
 
@@ -131,7 +158,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', '=', None)]</field>
+            <field name="domain" eval="[('parent', '=', None)]" pyson="1"/>
         </record>
         <record model="ir.action.act_window.view" id="act_event_form_view1">
             <field name="sequence" eval="10"/>
@@ -146,10 +173,75 @@ this repository contains the full copyright notices and license terms. -->
         <menuitem parent="menu_calendar_form" sequence="20"
             action="act_event_form" id="menu_event_form"/>
 
+        <record model="ir.rule.group" id="rule_group_event_admin">
+            <field name="model" search="[('model', '=', 'calendar.event')]"/>
+            <field name="global_p" eval="False"/>
+            <field name="default_p" eval="False"/>
+            <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_event_admin_line1">
+            <field name="domain" eval="[]" pyson="1"/>
+            <field name="rule_group" ref="rule_group_event_admin"/>
+        </record>
+        <record model="ir.rule.group-res.group"
+            id="rule_group_event_admin-calendar_admin">
+            <field name="rule_group" ref="rule_group_event_admin"/>
+            <field name="group" ref="group_calendar_admin"/>
+        </record>
+
+        <record model="ir.rule.group" id="rule_group_read_event">
+            <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_event_line1">
+            <field name="domain"
+                eval="[('calendar.owner', '=', Eval('user', {}).get('id', -1))]"
+                pyson="1"/>
+            <field name="rule_group" ref="rule_group_read_event"/>
+        </record>
+        <record model="ir.rule" id="rule_group_read_event_line2">
+            <field name="domain"
+                eval="[('calendar.read_users', '=', Eval('user', {}).get('id', -1))]"
+                pyson="1"/>
+            <field name="rule_group" ref="rule_group_read_event"/>
+        </record>
+
+        <record model="ir.rule.group" id="rule_group_write_event">
+            <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_event_line1">
+            <field name="domain"
+                eval="[('calendar.owner', '=', Eval('user', {}).get('id', -1))]"
+                pyson="1"/>
+            <field name="rule_group" ref="rule_group_write_event"/>
+        </record>
+        <record model="ir.rule" id="rule_group_write_event_line2">
+            <field name="domain"
+                eval="[('calendar.write_users', '=', Eval('user', {}).get('id', -1))]"
+                pyson="1"/>
+            <field name="rule_group" ref="rule_group_write_event"/>
+        </record>
+
         <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', '=', None), ('calendar', 'in', Eval('active_ids'))]</field>
+            <field name="domain"
+                eval="[('parent', '=', None), ('calendar', 'in', Eval('active_ids'))]"
+                pyson="1"/>
         </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 68a25c2..6b4115e 100644
--- a/calendar_.py
+++ b/calendar_.py
@@ -1,5 +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.
+# 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 uuid
 import vobject
 import dateutil.tz
@@ -11,7 +11,7 @@ from sql import Table, Column
 from trytond.model import Model, ModelSQL, ModelView, fields
 from trytond.tools import reduce_ids, grouped_slice
 from trytond import backend
-from trytond.pyson import If, Bool, Eval
+from trytond.pyson import If, Bool, Eval, PYSONEncoder
 from trytond.transaction import Transaction
 from trytond.cache import Cache
 from trytond.pool import Pool
@@ -121,24 +121,6 @@ class Calendar(ModelSQL, ModelView):
             ical.vevent_list.extend(ical2.vevent_list)
         return ical
 
-    @property
-    def _fbtype(self):
-        '''
-        Return the freebusy type for give transparent and status
-        '''
-        if self.transp == 'opaque':
-            if not self.status or self.status == 'confirmed':
-                fbtype = 'BUSY'
-            elif self.status == 'cancelled':
-                fbtype = 'FREE'
-            elif self.status == 'tentative':
-                fbtype = 'BUSY-TENTATIVE'
-            else:
-                fbtype = 'BUSY'
-        else:
-            fbtype = 'FREE'
-        return fbtype
-
     @classmethod
     def freebusy(cls, calendar_id, dtstart, dtend):
         '''
@@ -163,7 +145,7 @@ class Calendar(ModelSQL, ModelView):
         else:
             ical.vfreebusy.add('dtend').value = dtend.astimezone(tzutc)
 
-        with Transaction().set_context(_check_access=False):
+        with Transaction().set_user(0):
             events = Event.search([
                     ['OR',
                         [('dtstart', '<=', dtstart),
@@ -200,7 +182,7 @@ class Calendar(ModelSQL, ModelView):
                 freebusy_dtstart.astimezone(tzutc),
                 freebusy_dtend.astimezone(tzutc))]
 
-        with Transaction().set_context(_check_access=False):
+        with Transaction().set_user(0):
             events = Event.search([
                     ('parent', '=', None),
                     ('dtstart', '<=', dtend),
@@ -217,7 +199,6 @@ class Calendar(ModelSQL, ModelView):
         for event in events:
             event_ical = event.event2ical()
             if event_ical.vevent.rruleset:
-                between_dtstart, between_dtend = dtstart, dtend
                 for freebusy_dtstart in event_ical.vevent.rruleset:
                     if freebusy_dtstart.replace(tzinfo=tzlocal) > dtend:
                         break
@@ -320,7 +301,7 @@ class Calendar(ModelSQL, ModelView):
                 email = attendee.value
                 if attendee.value.lower().startswith('mailto:'):
                     email = attendee.value[7:]
-                with Transaction().set_context(_check_access=False):
+                with Transaction().set_user(0):
                     calendars = cls.search([
                             ('owner.email', '=', email),
                             ])
@@ -473,12 +454,6 @@ class Event(ModelSQL, ModelView):
             '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',
-        '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')
 
     @classmethod
@@ -497,13 +472,14 @@ class Event(ModelSQL, ModelView):
         # Migrate from 1.4: remove classification_public
         ModelData = Pool().get('ir.model.data')
         Rule = Pool().get('ir.rule')
-        models_data = ModelData.search([
-                ('fs_id', '=', 'rule_group_read_calendar_line3'),
-                ('module', '=', module_name),
-                ], limit=1)
-        if models_data:
-            model_data, = models_data
-            Rule.delete([Rule(model_data.db_id)])
+        with Transaction().set_user(0):
+            models_data = ModelData.search([
+                    ('fs_id', '=', 'rule_group_read_calendar_line3'),
+                    ('module', '=', module_name),
+                    ], limit=1)
+            if models_data:
+                model_data, = models_data
+                Rule.delete([Rule(model_data.db_id)])
         return super(Event, cls).__register__(module_name)
 
     @staticmethod
@@ -526,18 +502,23 @@ class Event(ModelSQL, ModelView):
     def timezones():
         return [(x, x) for x in pytz.common_timezones] + [('', '')]
 
-    def get_calendar_field(self, name):
-        assert name in ('calendar_owner', 'calendar_read_users',
-                'calendar_write_users'), 'Invalid name'
-        name = name[9:]
-        if name in ('read_users', 'write_users'):
-            return [x.id for x in getattr(self.calendar, name)]
+    @property
+    def _fbtype(self):
+        '''
+        Return the freebusy type for give transparent and status
+        '''
+        if self.transp == 'opaque':
+            if not self.status or self.status == 'confirmed':
+                fbtype = 'BUSY'
+            elif self.status == 'cancelled':
+                fbtype = 'FREE'
+            elif self.status == 'tentative':
+                fbtype = 'BUSY-TENTATIVE'
+            else:
+                fbtype = 'BUSY'
         else:
-            return getattr(self.calendar, name).id
-
-    @classmethod
-    def search_calendar_field(cls, name, clause):
-        return [('calendar.' + name[9:],) + tuple(clause[1:])]
+            fbtype = 'FREE'
+        return fbtype
 
     @classmethod
     def validate(cls, events):
@@ -558,6 +539,12 @@ class Event(ModelSQL, ModelView):
                 self.raise_user_error('invalid_recurrence', (self.rec_name,))
 
     @classmethod
+    def view_attributes(cls):
+        return [('//page[@id="occurences"]', 'states', {
+                    'invisible': Bool(Eval('_parent_parent')),
+                    })]
+
+    @classmethod
     def create(cls, vlist):
         pool = Pool()
         Calendar = pool.get('calendar.calendar')
@@ -579,7 +566,7 @@ class Event(ModelSQL, ModelView):
                             if x.status != 'declined'
                             and x.email != event.parent.organizer]
                 if attendee_emails:
-                    with Transaction().set_context(_check_access=False):
+                    with Transaction().set_user(0):
                         calendars = Calendar.search([
                                 ('owner.email', 'in', attendee_emails),
                                 ])
@@ -682,7 +669,7 @@ class Event(ModelSQL, ModelView):
                             for x in event.parent.attendees
                             if x.status != 'declined'
                             and x.email != event.parent.organizer]
-                    with Transaction().set_context(_check_access=False):
+                    with Transaction().set_user(0):
                         events2 = cls.search([
                                 ('uuid', '=', event.uuid),
                                 ('id', '!=', event.id),
@@ -698,7 +685,7 @@ class Event(ModelSQL, ModelView):
                         if events2:
                             cls.write(events2, event._event2update())
                     if attendee_emails:
-                        with Transaction().set_context(_check_access=False):
+                        with Transaction().set_user(0):
                             calendars = Calendar.search([
                                     ('owner.email', 'in', attendee_emails),
                                     ])
@@ -764,7 +751,7 @@ class Event(ModelSQL, ModelView):
                     attendee_emails = [x.email for x in event.parent.attendees
                             if x.email != event.parent.organizer]
                 if attendee_emails:
-                    with Transaction().set_context(_check_access=False):
+                    with Transaction().set_user(0):
                         cls.delete(cls.search([
                                     ('uuid', '=', event.uuid),
                                     ('calendar.owner.email', 'in',
@@ -778,7 +765,7 @@ class Event(ModelSQL, ModelView):
                     organizer = event.organizer
                 else:
                     organizer = event.parent.organizer
-                with Transaction().set_context(_check_access=False):
+                with Transaction().set_user(0):
                     events2 = cls.search([
                             ('uuid', '=', event.uuid),
                             ('calendar.owner.email', '=', organizer),
@@ -879,7 +866,8 @@ class Event(ModelSQL, ModelView):
             res['status'] = vevent.status.value.lower()
         else:
             res['status'] = ''
-        res['categories'] = [('remove', [c.id for c in event.categories])]
+        if event:
+            res['categories'] = [('remove', [c.id for c in event.categories])]
         if hasattr(vevent, 'categories'):
             with Transaction().set_context(active_test=False):
                 categories = Category.search([
@@ -902,7 +890,7 @@ class Event(ModelSQL, ModelView):
                     dict(cls.classification.selection):
                 res['classification'] = getattr(vevent, 'class').value.lower()
             else:
-                res['classification'] = 'public'
+                res['classification'] = 'private'
         else:
             res['classification'] = 'public'
         if hasattr(vevent, 'location'):
@@ -1405,7 +1393,7 @@ class EventAttendee(AttendeeMixin, ModelSQL, ModelView):
                     attendee_emails = [x.email for x in event.parent.attendees
                             if x.email != event.parent.organizer]
                 if attendee_emails:
-                    with Transaction().set_context(_check_access=False):
+                    with Transaction().set_user(0):
                         events = Event.search([
                                 ('uuid', '=', event.uuid),
                                 ('calendar.owner.email', 'in',
@@ -1455,7 +1443,7 @@ class EventAttendee(AttendeeMixin, ModelSQL, ModelView):
                     attendee_emails = [x.email for x in event.parent.attendees
                             if x.email != event.parent.organizer]
                 if attendee_emails:
-                    with Transaction().set_context(_check_access=False):
+                    with Transaction().set_user(0):
                         other_attendees = cls.search([
                                 ('event.uuid', '=', event.uuid),
                                 ('event.calendar.owner.email', 'in',
@@ -1492,7 +1480,7 @@ class EventAttendee(AttendeeMixin, ModelSQL, ModelView):
                     attendee_emails = [x.email for x in event.parent.attendees
                             if x.email != event.parent.organizer]
                 if attendee_emails:
-                    with Transaction().set_context(_check_access=False):
+                    with Transaction().set_user(0):
                         attendees = cls.search([
                                 ('event.uuid', '=', event.uuid),
                                 ('event.calendar.owner.email', 'in',
@@ -1511,7 +1499,7 @@ class EventAttendee(AttendeeMixin, ModelSQL, ModelView):
                     organizer = event.organizer
                 else:
                     organizer = event.parent.organizer
-                with Transaction().set_context(_check_access=False):
+                with Transaction().set_user(0):
                     attendees = cls.search([
                             ('event.uuid', '=', event.uuid),
                             ('event.calendar.owner.email', '=', organizer),
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
index 9137db1..7adb40e 100644
--- a/locale/bg_BG.po
+++ b/locale/bg_BG.po
@@ -262,18 +262,6 @@ msgctxt "field:calendar.event,calendar:"
 msgid "Calendar"
 msgstr "Календар"
 
-msgctxt "field:calendar.event,calendar_owner:"
-msgid "Owner"
-msgstr "Собственик"
-
-msgctxt "field:calendar.event,calendar_read_users:"
-msgid "Read Users"
-msgstr "Потребители с права за четене"
-
-msgctxt "field:calendar.event,calendar_write_users:"
-msgid "Write Users"
-msgstr "Записване на потребители"
-
 msgctxt "field:calendar.event,categories:"
 msgid "Categories"
 msgstr "Категории"
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index 9f992f8..d705d8b 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -270,18 +270,6 @@ msgctxt "field:calendar.event,calendar:"
 msgid "Calendar"
 msgstr "Calendari"
 
-msgctxt "field:calendar.event,calendar_owner:"
-msgid "Owner"
-msgstr "Propietari"
-
-msgctxt "field:calendar.event,calendar_read_users:"
-msgid "Read Users"
-msgstr "Usuaris amb permisos de lectura"
-
-msgctxt "field:calendar.event,calendar_write_users:"
-msgid "Write Users"
-msgstr "Usuaris amb permisos d'escriptura"
-
 msgctxt "field:calendar.event,categories:"
 msgid "Categories"
 msgstr "Categories"
@@ -308,7 +296,7 @@ msgstr "Data final"
 
 msgctxt "field:calendar.event,dtstart:"
 msgid "Start Date"
-msgstr "Data inici"
+msgstr "Data inicial"
 
 msgctxt "field:calendar.event,exdates:"
 msgid "Exception Dates"
@@ -902,7 +890,7 @@ msgstr "Cancel·lat"
 
 msgctxt "selection:calendar.event,status:"
 msgid "Confirmed"
-msgstr "Confirmada"
+msgstr "Confirmat"
 
 msgctxt "selection:calendar.event,status:"
 msgid "Tentative"
@@ -1100,6 +1088,10 @@ msgctxt "view:calendar.event.exdate:"
 msgid "Exception Dates"
 msgstr "Dates excloses"
 
+msgctxt "view:calendar.event.exdate:"
+msgid "Time"
+msgstr "Temps"
+
 msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rule"
 msgstr "Regla d'excepció"
@@ -1116,6 +1108,10 @@ msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Dates"
 msgstr "Dates de recurrència"
 
+msgctxt "view:calendar.event.rdate:"
+msgid "Time"
+msgstr "Temps"
+
 msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rule"
 msgstr "Regla de recurrència"
@@ -1133,6 +1129,10 @@ msgid "Categories"
 msgstr "Categories"
 
 msgctxt "view:calendar.event:"
+msgid "End Time"
+msgstr "Temps finalització"
+
+msgctxt "view:calendar.event:"
 msgid "Event"
 msgstr "Esdeveniment"
 
@@ -1148,6 +1148,10 @@ msgctxt "view:calendar.event:"
 msgid "Occurences"
 msgstr "Ocurrències"
 
+msgctxt "view:calendar.event:"
+msgid "Start Time"
+msgstr "Hora d'inici"
+
 msgctxt "view:calendar.location:"
 msgid "Location"
 msgstr "Ubicació"
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
index d7152bd..a1186e1 100644
--- a/locale/cs_CZ.po
+++ b/locale/cs_CZ.po
@@ -262,18 +262,6 @@ msgctxt "field:calendar.event,calendar:"
 msgid "Calendar"
 msgstr ""
 
-msgctxt "field:calendar.event,calendar_owner:"
-msgid "Owner"
-msgstr ""
-
-msgctxt "field:calendar.event,calendar_read_users:"
-msgid "Read Users"
-msgstr ""
-
-msgctxt "field:calendar.event,calendar_write_users:"
-msgid "Write Users"
-msgstr ""
-
 msgctxt "field:calendar.event,categories:"
 msgid "Categories"
 msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
index 527edfb..2323e89 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -263,18 +263,6 @@ msgctxt "field:calendar.event,calendar:"
 msgid "Calendar"
 msgstr "Kalender"
 
-msgctxt "field:calendar.event,calendar_owner:"
-msgid "Owner"
-msgstr "Besitzer"
-
-msgctxt "field:calendar.event,calendar_read_users:"
-msgid "Read Users"
-msgstr "Benutzer mit Leseberechtigung"
-
-msgctxt "field:calendar.event,calendar_write_users:"
-msgid "Write Users"
-msgstr "Benutzer mit Schreibberechtigung"
-
 msgctxt "field:calendar.event,categories:"
 msgid "Categories"
 msgstr "Kategorien"
@@ -497,7 +485,7 @@ msgstr "Erstellt durch"
 
 msgctxt "field:calendar.event.exdate,date:"
 msgid "Is Date"
-msgstr "Als Datum"
+msgstr "Nur Datum verwenden"
 
 msgctxt "field:calendar.event.exdate,datetime:"
 msgid "Date"
@@ -597,7 +585,7 @@ msgstr "Bis Datum"
 
 msgctxt "field:calendar.event.exrule,until_date:"
 msgid "Is Date"
-msgstr "Als Datum"
+msgstr "Nur Datum verwenden"
 
 msgctxt "field:calendar.event.exrule,wkst:"
 msgid "Week Day"
@@ -621,7 +609,7 @@ msgstr "Erstellt durch"
 
 msgctxt "field:calendar.event.rdate,date:"
 msgid "Is Date"
-msgstr "Als Datum"
+msgstr "Nur Datum verwenden"
 
 msgctxt "field:calendar.event.rdate,datetime:"
 msgid "Date"
@@ -721,7 +709,7 @@ msgstr "Bis Datum"
 
 msgctxt "field:calendar.event.rrule,until_date:"
 msgid "Is Date"
-msgstr "Als Datum"
+msgstr "Nur Datum verwenden"
 
 msgctxt "field:calendar.event.rrule,wkst:"
 msgid "Week Day"
@@ -1099,6 +1087,10 @@ msgctxt "view:calendar.event.exdate:"
 msgid "Exception Dates"
 msgstr "Ausnahmedaten"
 
+msgctxt "view:calendar.event.exdate:"
+msgid "Time"
+msgstr "Zeit"
+
 msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rule"
 msgstr "Ausnahmeregel"
@@ -1115,6 +1107,10 @@ msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Dates"
 msgstr "Wiederholungsdaten"
 
+msgctxt "view:calendar.event.rdate:"
+msgid "Time"
+msgstr "Zeit"
+
 msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rule"
 msgstr "Wiederholungsregel"
@@ -1132,6 +1128,10 @@ msgid "Categories"
 msgstr "Kategorien"
 
 msgctxt "view:calendar.event:"
+msgid "End Time"
+msgstr "Endzeit"
+
+msgctxt "view:calendar.event:"
 msgid "Event"
 msgstr "Termin"
 
@@ -1147,6 +1147,10 @@ msgctxt "view:calendar.event:"
 msgid "Occurences"
 msgstr "Ereignisse"
 
+msgctxt "view:calendar.event:"
+msgid "Start Time"
+msgstr "Anfangszeit"
+
 msgctxt "view:calendar.location:"
 msgid "Location"
 msgstr "Ort"
diff --git a/locale/es_AR.po b/locale/es_AR.po
index dfda857..a3c35ee 100644
--- a/locale/es_AR.po
+++ b/locale/es_AR.po
@@ -274,18 +274,6 @@ 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"
@@ -312,7 +300,7 @@ msgstr "Fecha fin"
 
 msgctxt "field:calendar.event,dtstart:"
 msgid "Start Date"
-msgstr "Fecha inicio"
+msgstr "Fecha inicial"
 
 msgctxt "field:calendar.event,exdates:"
 msgid "Exception Dates"
@@ -1104,6 +1092,10 @@ msgctxt "view:calendar.event.exdate:"
 msgid "Exception Dates"
 msgstr "Fechas excluidas"
 
+msgctxt "view:calendar.event.exdate:"
+msgid "Time"
+msgstr "Tiempo"
+
 msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rule"
 msgstr "Regla de excepción"
@@ -1120,6 +1112,10 @@ msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Dates"
 msgstr "Fechas de recurrencia"
 
+msgctxt "view:calendar.event.rdate:"
+msgid "Time"
+msgstr "Tiempo"
+
 msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rule"
 msgstr "Regla de recurrencia"
@@ -1137,6 +1133,10 @@ msgid "Categories"
 msgstr "Categorías"
 
 msgctxt "view:calendar.event:"
+msgid "End Time"
+msgstr "Hora de finalización"
+
+msgctxt "view:calendar.event:"
 msgid "Event"
 msgstr "Evento"
 
@@ -1152,6 +1152,10 @@ msgctxt "view:calendar.event:"
 msgid "Occurences"
 msgstr "Ocurrencias"
 
+msgctxt "view:calendar.event:"
+msgid "Start Time"
+msgstr "Hora de inicio"
+
 msgctxt "view:calendar.location:"
 msgid "Location"
 msgstr "Ubicación"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index 591cc01..d62d4ae 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -262,18 +262,6 @@ msgctxt "field:calendar.event,calendar:"
 msgid "Calendar"
 msgstr "Calendario"
 
-msgctxt "field:calendar.event,calendar_owner:"
-msgid "Owner"
-msgstr "Propietario"
-
-msgctxt "field:calendar.event,calendar_read_users:"
-msgid "Read Users"
-msgstr "Usuarios que pueden Leer"
-
-msgctxt "field:calendar.event,calendar_write_users:"
-msgid "Write Users"
-msgstr "Modificado por Usuario"
-
 msgctxt "field:calendar.event,categories:"
 msgid "Categories"
 msgstr "Categorías"
@@ -1094,6 +1082,10 @@ msgctxt "view:calendar.event.exdate:"
 msgid "Exception Dates"
 msgstr "Fechas de Excepción"
 
+msgctxt "view:calendar.event.exdate:"
+msgid "Time"
+msgstr "Tiempo"
+
 msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rule"
 msgstr "Regla de Excepción"
@@ -1110,6 +1102,10 @@ msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Dates"
 msgstr "Fechas de Repetición"
 
+msgctxt "view:calendar.event.rdate:"
+msgid "Time"
+msgstr "Tiempo"
+
 msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rule"
 msgstr "Regla de Repetición"
@@ -1127,6 +1123,10 @@ msgid "Categories"
 msgstr "Categorías"
 
 msgctxt "view:calendar.event:"
+msgid "End Time"
+msgstr "Hora Final"
+
+msgctxt "view:calendar.event:"
 msgid "Event"
 msgstr "Evento"
 
@@ -1142,6 +1142,10 @@ msgctxt "view:calendar.event:"
 msgid "Occurences"
 msgstr "Ocurrencias"
 
+msgctxt "view:calendar.event:"
+msgid "Start Time"
+msgstr "Hora de Inicio"
+
 msgctxt "view:calendar.location:"
 msgid "Location"
 msgstr "Lugar"
diff --git a/locale/es_EC.po b/locale/es_EC.po
index cecfc1a..f92be61 100644
--- a/locale/es_EC.po
+++ b/locale/es_EC.po
@@ -12,47 +12,49 @@ 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 de calendario debe ser único."
+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 de calendario debe ser único."
+msgstr "El nombre de la categoría del calendario debe ser único."
 
 msgctxt "error:calendar.event.exrule:"
 msgid "Invalid \"By Day\" in recurrence rule \"%s\""
-msgstr "No válido campo \"Por Día\" en regla de recurrencia \"%s\""
+msgstr "El campo \"Por día\" de la regla de recurrencia \"%s\" no es válido."
 
 msgctxt "error:calendar.event.exrule:"
 msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
-msgstr "No válido campo \"Por Hora\" en regla de recurrencia \"%s\""
+msgstr "El campo \"Por hora\" de la regla de recurrencia \"%s\" no es válido."
 
 msgctxt "error:calendar.event.exrule:"
 msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
-msgstr "No válido campo \"Por Minuto\" en regla de recurrencia \"%s\""
+msgstr "El campo \"Por minuto\" de la regla de recurrencia \"%s\" no es válido."
 
 msgctxt "error:calendar.event.exrule:"
 msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
-msgstr "No válido campo \"Por Día del Mes\" en regla de recurrencia \"%s\""
+msgstr "El campo \"Por día del mes\" de la regla de recurrencia \"%s\" no es válido."
 
 msgctxt "error:calendar.event.exrule:"
 msgid "Invalid \"By Month\" in recurrence rule \"%s\""
-msgstr "No válido campo \"Por Mes\" en regla de recurrencia \"%s\""
+msgstr "El campo \"Por mes\" de la regla de recurrencia \"%s\" no es válido."
 
 msgctxt "error:calendar.event.exrule:"
 msgid "Invalid \"By Position\" in recurrence rule \"%s\""
-msgstr "No válido campo \"Por Posición\" en regla de recurrencia \"%s\""
+msgstr "El campo \"Por ubicación\" de la regla de recurrencia \"%s\" no es válido."
 
 msgctxt "error:calendar.event.exrule:"
 msgid "Invalid \"By Second\" in recurrence rule \"%s\""
-msgstr "No válido campo \"Por Segundo\" en regla de recurrencia \"%s\""
+msgstr "El campo \"Por segundo\" de la regla de recurrencia \"%s\" no es válido."
 
 msgctxt "error:calendar.event.exrule:"
 msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
-msgstr "No válido campo \"Por Número de la Semana\" en regla de recurrencia \"%s\""
+msgstr ""
+"El campo \"Por número de la semana\" de la regla de recurrencia \"%s\" no es"
+" válido."
 
 msgctxt "error:calendar.event.exrule:"
 msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
-msgstr "No válido campo \"Por Día del Año\" en regla de recurrencia \"%s\""
+msgstr "El campo \"Por día del año\" de la regla de recurrencia \"%s\" no es válido."
 
 msgctxt "error:calendar.event.exrule:"
 msgid "Only one of \"until\" and \"count\" can be set."
@@ -60,39 +62,41 @@ msgstr "Solo un \"hasta\" y \"contar\" pude ser establecido!"
 
 msgctxt "error:calendar.event.rrule:"
 msgid "Invalid \"By Day\" in recurrence rule \"%s\""
-msgstr "No válido campo \"Por Día\" en regla de recurrencia \"%s\""
+msgstr "El campo \"Por día\" de la regla de recurrencia \"%s\" no es válido."
 
 msgctxt "error:calendar.event.rrule:"
 msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
-msgstr "No válido campo \"Por Hora\" en regla de recurrencia \"%s\""
+msgstr "El campo \"Por hora\" de la regla de recurrencia \"%s\" no es válido."
 
 msgctxt "error:calendar.event.rrule:"
 msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
-msgstr "No válido campo \"Por Minuto\" en regla de recurrencia \"%s\""
+msgstr "El campo \"Por minuto\" de la regla de recurrencia \"%s\" no es válido."
 
 msgctxt "error:calendar.event.rrule:"
 msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
-msgstr "No válido campo \"Por Día del Mes\" en regla de recurrencia \"%s\""
+msgstr "El campo \"Por día del mes\" de la regla de recurrencia \"%s\" no es válido."
 
 msgctxt "error:calendar.event.rrule:"
 msgid "Invalid \"By Month\" in recurrence rule \"%s\""
-msgstr "No válido campo \"Por Mes\" en regla de recurrencia \"%s\""
+msgstr "El campo \"Por mes\" de la regla de recurrencia \"%s\" no es válido."
 
 msgctxt "error:calendar.event.rrule:"
 msgid "Invalid \"By Position\" in recurrence rule \"%s\""
-msgstr "No válido campo \"Por Posición\" en regla de recurrencia \"%s\""
+msgstr "El campo \"Por ubicación\" de la regla de recurrencia \"%s\" no es válido."
 
 msgctxt "error:calendar.event.rrule:"
 msgid "Invalid \"By Second\" in recurrence rule \"%s\""
-msgstr "No válido campo \"Por Segundo\" en regla de recurrencia \"%s\""
+msgstr "El campo \"Por segundo\" de la regla de recurrencia \"%s\" no es válido."
 
 msgctxt "error:calendar.event.rrule:"
 msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
-msgstr "No válido campo \"Por Número de Semana\" en regla de recurrencia \"%s\""
+msgstr ""
+"El campo \"Por número de la semana\" de la regla de recurrencia \"%s\" no es"
+" válido."
 
 msgctxt "error:calendar.event.rrule:"
 msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
-msgstr "No válido campo \"Por Día del Año\" en regla de recurrencia \"%s\""
+msgstr "El campo \"Por día del año\" de la regla de recurrencia \"%s\" no es válido."
 
 msgctxt "error:calendar.event.rrule:"
 msgid "Only one of \"until\" and \"count\" can be set."
@@ -112,11 +116,11 @@ msgstr "El nombre de la ubicación del calendario bede ser único."
 
 msgctxt "field:calendar.calendar,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Fecha de creación"
 
 msgctxt "field:calendar.calendar,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Creado por usuario"
 
 msgctxt "field:calendar.calendar,description:"
 msgid "Description"
@@ -144,15 +148,15 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.calendar,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Fecha de modificación"
 
 msgctxt "field:calendar.calendar,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Modificado por usuario"
 
 msgctxt "field:calendar.calendar,write_users:"
 msgid "Write Users"
-msgstr "Usuarios con Permisos de Escritura"
+msgstr "Usuarios con permisos de escritura"
 
 msgctxt "field:calendar.calendar-read-res.user,calendar:"
 msgid "Calendar"
@@ -160,11 +164,11 @@ msgstr "Calendario"
 
 msgctxt "field:calendar.calendar-read-res.user,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Fecha de creación"
 
 msgctxt "field:calendar.calendar-read-res.user,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Creado por usuario"
 
 msgctxt "field:calendar.calendar-read-res.user,id:"
 msgid "ID"
@@ -180,11 +184,11 @@ msgstr "Usuario"
 
 msgctxt "field:calendar.calendar-read-res.user,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Fecha de modificación"
 
 msgctxt "field:calendar.calendar-read-res.user,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Modificado por usuario"
 
 msgctxt "field:calendar.calendar-write-res.user,calendar:"
 msgid "Calendar"
@@ -192,11 +196,11 @@ msgstr "Calendario"
 
 msgctxt "field:calendar.calendar-write-res.user,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Fecha de creación"
 
 msgctxt "field:calendar.calendar-write-res.user,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Creado por usuario"
 
 msgctxt "field:calendar.calendar-write-res.user,id:"
 msgid "ID"
@@ -212,19 +216,19 @@ msgstr "Usuario"
 
 msgctxt "field:calendar.calendar-write-res.user,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Fecha de modificación"
 
 msgctxt "field:calendar.calendar-write-res.user,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Modificado por usuario"
 
 msgctxt "field:calendar.category,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Fecha de creación"
 
 msgctxt "field:calendar.category,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Creado por usuario"
 
 msgctxt "field:calendar.category,id:"
 msgid "ID"
@@ -240,11 +244,11 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.category,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Fecha de modificación"
 
 msgctxt "field:calendar.category,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Modificado por usuario"
 
 msgctxt "field:calendar.event,alarms:"
 msgid "Alarms"
@@ -262,18 +266,6 @@ msgctxt "field:calendar.event,calendar:"
 msgid "Calendar"
 msgstr "Calendario"
 
-msgctxt "field:calendar.event,calendar_owner:"
-msgid "Owner"
-msgstr "Propietario"
-
-msgctxt "field:calendar.event,calendar_read_users:"
-msgid "Read Users"
-msgstr "Usuarios con permisos de lectura"
-
-msgctxt "field:calendar.event,calendar_write_users:"
-msgid "Write Users"
-msgstr "Usuarios con Permisos de Escritura"
-
 msgctxt "field:calendar.event,categories:"
 msgid "Categories"
 msgstr "Categorías"
@@ -284,11 +276,11 @@ msgstr "Clasificación"
 
 msgctxt "field:calendar.event,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Fecha de creación"
 
 msgctxt "field:calendar.event,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Creado por usuario"
 
 msgctxt "field:calendar.event,description:"
 msgid "Description"
@@ -296,19 +288,19 @@ msgstr "Descripción"
 
 msgctxt "field:calendar.event,dtend:"
 msgid "End Date"
-msgstr "Fecha Final"
+msgstr "Fecha de Fin"
 
 msgctxt "field:calendar.event,dtstart:"
 msgid "Start Date"
-msgstr "Fecha Inicial"
+msgstr "Fecha de Inicio"
 
 msgctxt "field:calendar.event,exdates:"
 msgid "Exception Dates"
-msgstr "Fechas de Excepción"
+msgstr "Fechas de excepción"
 
 msgctxt "field:calendar.event,exrules:"
 msgid "Exception Rules"
-msgstr "Reglas de Excepción"
+msgstr "Reglas de excepción"
 
 msgctxt "field:calendar.event,id:"
 msgid "ID"
@@ -332,7 +324,7 @@ msgstr "Padre"
 
 msgctxt "field:calendar.event,rdates:"
 msgid "Recurrence Dates"
-msgstr "Fechas de Recurrencia"
+msgstr "Fechas de recurrencia"
 
 msgctxt "field:calendar.event,rec_name:"
 msgid "Name"
@@ -344,7 +336,7 @@ msgstr "Recurrencia"
 
 msgctxt "field:calendar.event,rrules:"
 msgid "Recurrence Rules"
-msgstr "Reglas de Recurrencia"
+msgstr "Reglas de recurrencia"
 
 msgctxt "field:calendar.event,sequence:"
 msgid "Sequence"
@@ -364,7 +356,7 @@ msgstr "Zona horaria"
 
 msgctxt "field:calendar.event,transp:"
 msgid "Time Transparency"
-msgstr "Tiempo de Transparencia"
+msgstr "Tiempo de transparencia"
 
 msgctxt "field:calendar.event,uuid:"
 msgid "UUID"
@@ -376,11 +368,11 @@ msgstr "vevento"
 
 msgctxt "field:calendar.event,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Fecha de modificación"
 
 msgctxt "field:calendar.event,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Modificado por usuario"
 
 msgctxt "field:calendar.event-calendar.category,category:"
 msgid "Category"
@@ -388,11 +380,11 @@ msgstr "Categoría"
 
 msgctxt "field:calendar.event-calendar.category,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Fecha de creación"
 
 msgctxt "field:calendar.event-calendar.category,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Creado por usuario"
 
 msgctxt "field:calendar.event-calendar.category,event:"
 msgid "Event"
@@ -408,19 +400,19 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.event-calendar.category,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Fecha de modificación"
 
 msgctxt "field:calendar.event-calendar.category,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Modificado por usuario"
 
 msgctxt "field:calendar.event.alarm,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Fecha de creación"
 
 msgctxt "field:calendar.event.alarm,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Creado por usuario"
 
 msgctxt "field:calendar.event.alarm,event:"
 msgid "Event"
@@ -440,11 +432,11 @@ msgstr "valarm"
 
 msgctxt "field:calendar.event.alarm,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Fecha de modificación"
 
 msgctxt "field:calendar.event.alarm,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Modificado por usuario"
 
 msgctxt "field:calendar.event.attendee,attendee:"
 msgid "attendee"
@@ -452,15 +444,15 @@ msgstr "asistente"
 
 msgctxt "field:calendar.event.attendee,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Fecha de creación"
 
 msgctxt "field:calendar.event.attendee,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Creado por usuario"
 
 msgctxt "field:calendar.event.attendee,email:"
 msgid "Email"
-msgstr "Correo Electrónico"
+msgstr "Correo electrónico"
 
 msgctxt "field:calendar.event.attendee,event:"
 msgid "Event"
@@ -476,27 +468,27 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.event.attendee,status:"
 msgid "Participation Status"
-msgstr "Estado de Participación"
+msgstr "Estado de participación"
 
 msgctxt "field:calendar.event.attendee,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Fecha de modificación"
 
 msgctxt "field:calendar.event.attendee,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Modificado por usuario"
 
 msgctxt "field:calendar.event.exdate,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Fecha de creación"
 
 msgctxt "field:calendar.event.exdate,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Creado por usuario"
 
 msgctxt "field:calendar.event.exdate,date:"
 msgid "Is Date"
-msgstr "Es una Fecha"
+msgstr "Es una fecha"
 
 msgctxt "field:calendar.event.exdate,datetime:"
 msgid "Date"
@@ -516,47 +508,47 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.event.exdate,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Fecha de modificación"
 
 msgctxt "field:calendar.event.exdate,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Modificado por usuario"
 
 msgctxt "field:calendar.event.exrule,byday:"
 msgid "By Day"
-msgstr "Por Día"
+msgstr "Por día"
 
 msgctxt "field:calendar.event.exrule,byhour:"
 msgid "By Hour"
-msgstr "Por Hora"
+msgstr "Por hora"
 
 msgctxt "field:calendar.event.exrule,byminute:"
 msgid "By Minute"
-msgstr "Por Minuto"
+msgstr "Por minuto"
 
 msgctxt "field:calendar.event.exrule,bymonth:"
 msgid "By Month"
-msgstr "Por Mes"
+msgstr "Por mes"
 
 msgctxt "field:calendar.event.exrule,bymonthday:"
 msgid "By Month Day"
-msgstr "Por Día del Mes"
+msgstr "Por día del mes"
 
 msgctxt "field:calendar.event.exrule,bysecond:"
 msgid "By Second"
-msgstr "Por Segundo"
+msgstr "Por segundo"
 
 msgctxt "field:calendar.event.exrule,bysetpos:"
 msgid "By Position"
-msgstr "Por Posición"
+msgstr "Por ubicación"
 
 msgctxt "field:calendar.event.exrule,byweekno:"
 msgid "By Week Number"
-msgstr "Por Número de la Semana"
+msgstr "Por número de la semana"
 
 msgctxt "field:calendar.event.exrule,byyearday:"
 msgid "By Year Day"
-msgstr "Por Día del Año"
+msgstr "Por día del año"
 
 msgctxt "field:calendar.event.exrule,count:"
 msgid "Count"
@@ -564,11 +556,11 @@ msgstr "Contar"
 
 msgctxt "field:calendar.event.exrule,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Fecha de creación"
 
 msgctxt "field:calendar.event.exrule,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Creado por usuario"
 
 msgctxt "field:calendar.event.exrule,event:"
 msgid "Event"
@@ -592,35 +584,35 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.event.exrule,until:"
 msgid "Until Date"
-msgstr "Hasta la Fecha"
+msgstr "Hasta la fecha"
 
 msgctxt "field:calendar.event.exrule,until_date:"
 msgid "Is Date"
-msgstr "Es una Fecha"
+msgstr "Es una fecha"
 
 msgctxt "field:calendar.event.exrule,wkst:"
 msgid "Week Day"
-msgstr "Día de la Semana"
+msgstr "Día de la semana"
 
 msgctxt "field:calendar.event.exrule,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Fecha de modificación"
 
 msgctxt "field:calendar.event.exrule,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Modificado por usuario"
 
 msgctxt "field:calendar.event.rdate,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Fecha de creación"
 
 msgctxt "field:calendar.event.rdate,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Creado por usuario"
 
 msgctxt "field:calendar.event.rdate,date:"
 msgid "Is Date"
-msgstr "Es una Fecha"
+msgstr "Es una fecha"
 
 msgctxt "field:calendar.event.rdate,datetime:"
 msgid "Date"
@@ -640,47 +632,47 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.event.rdate,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Fecha de modificación"
 
 msgctxt "field:calendar.event.rdate,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Modificado por usuario"
 
 msgctxt "field:calendar.event.rrule,byday:"
 msgid "By Day"
-msgstr "Por Día"
+msgstr "Por día"
 
 msgctxt "field:calendar.event.rrule,byhour:"
 msgid "By Hour"
-msgstr "Por Hora"
+msgstr "Por hora"
 
 msgctxt "field:calendar.event.rrule,byminute:"
 msgid "By Minute"
-msgstr "Por Minuto"
+msgstr "Por minuto"
 
 msgctxt "field:calendar.event.rrule,bymonth:"
 msgid "By Month"
-msgstr "Por Mes"
+msgstr "Por mes"
 
 msgctxt "field:calendar.event.rrule,bymonthday:"
 msgid "By Month Day"
-msgstr "Por Día del Mes"
+msgstr "Por día del mes"
 
 msgctxt "field:calendar.event.rrule,bysecond:"
 msgid "By Second"
-msgstr "Por Segundo"
+msgstr "Por segundo"
 
 msgctxt "field:calendar.event.rrule,bysetpos:"
 msgid "By Position"
-msgstr "Por Posición"
+msgstr "Por ubicación"
 
 msgctxt "field:calendar.event.rrule,byweekno:"
 msgid "By Week Number"
-msgstr "Por Número de la Semana"
+msgstr "Por número de la semana"
 
 msgctxt "field:calendar.event.rrule,byyearday:"
 msgid "By Year Day"
-msgstr "Por Día del Año"
+msgstr "Por día del año"
 
 msgctxt "field:calendar.event.rrule,count:"
 msgid "Count"
@@ -688,11 +680,11 @@ msgstr "Contar"
 
 msgctxt "field:calendar.event.rrule,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Fecha de creación"
 
 msgctxt "field:calendar.event.rrule,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Creado por usuario"
 
 msgctxt "field:calendar.event.rrule,event:"
 msgid "Event"
@@ -716,31 +708,31 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.event.rrule,until:"
 msgid "Until Date"
-msgstr "Hasta la Fecha"
+msgstr "Hasta la fecha"
 
 msgctxt "field:calendar.event.rrule,until_date:"
 msgid "Is Date"
-msgstr "Es una Fecha"
+msgstr "Es una fecha"
 
 msgctxt "field:calendar.event.rrule,wkst:"
 msgid "Week Day"
-msgstr "Día de la Semana"
+msgstr "Día de la semana"
 
 msgctxt "field:calendar.event.rrule,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Fecha de modificación"
 
 msgctxt "field:calendar.event.rrule,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Modificado por usuario"
 
 msgctxt "field:calendar.location,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Fecha de creación"
 
 msgctxt "field:calendar.location,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Creado por usuario"
 
 msgctxt "field:calendar.location,id:"
 msgid "ID"
@@ -756,11 +748,11 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.location,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Fecha de modificación"
 
 msgctxt "field:calendar.location,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Modificado por usuario"
 
 msgctxt "field:res.user,calendars:"
 msgid "Calendars"
@@ -776,23 +768,19 @@ msgstr "Identificador Universal Único"
 
 msgctxt "help:calendar.event.exdate,date:"
 msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr "Ignorar la hora del campo \"Fecha\", pero manejarla como fecha solamente."
+msgstr "Ignorar la hora del campo \"Fecha\" y considerar sólo la fecha."
 
 msgctxt "help:calendar.event.exrule,until_date:"
 msgid "Ignore time of field \"Until Date\", but handle as date only."
-msgstr ""
-"Ignorar la hora del campo \"Hasta la Fecha\", pero manejarla como fecha "
-"solamente."
+msgstr "Ignorar la hora del campo \"Hasta la fecha\" y considerar sólo la fecha."
 
 msgctxt "help:calendar.event.rdate,date:"
 msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr "Ignorar la hora del campo \"Fecha\", pero manejarla como fecha solamente."
+msgstr "Ignorar la hora del campo \"Fecha\" y considerar sólo la fecha."
 
 msgctxt "help:calendar.event.rrule,until_date:"
 msgid "Ignore time of field \"Until Date\", but handle as date only."
-msgstr ""
-"Ignorar la hora del campo \"Hasta la Fecha\", pero manejarla como fecha "
-"solamente."
+msgstr "Ignorar la hora del campo \"Hasta la fecha\" y considerar sólo la fecha."
 
 msgctxt "model:calendar.calendar,name:"
 msgid "Calendar"
@@ -828,19 +816,19 @@ msgstr "Asistente"
 
 msgctxt "model:calendar.event.exdate,name:"
 msgid "Exception Date"
-msgstr "Fecha de Excepción"
+msgstr "Fecha de excepción"
 
 msgctxt "model:calendar.event.exrule,name:"
 msgid "Exception Rule"
-msgstr "Regla de Excepción"
+msgstr "Regla de excepción"
 
 msgctxt "model:calendar.event.rdate,name:"
 msgid "Recurrence Date"
-msgstr "Fecha de Recurrencia"
+msgstr "Fecha de recurrencia"
 
 msgctxt "model:calendar.event.rrule,name:"
 msgid "Recurrence Rule"
-msgstr "Regla de Recurrencia"
+msgstr "Regla de recurrencia"
 
 msgctxt "model:calendar.location,name:"
 msgid "Location"
@@ -900,7 +888,7 @@ msgstr "Confirmado"
 
 msgctxt "selection:calendar.event,status:"
 msgid "Tentative"
-msgstr "Tentativa"
+msgstr "Tentativo"
 
 msgctxt "selection:calendar.event,transp:"
 msgid "Opaque"
@@ -920,7 +908,7 @@ msgstr "Aceptado"
 
 msgctxt "selection:calendar.event.attendee,status:"
 msgid "Declined"
-msgstr "Declinado"
+msgstr "Rechazado"
 
 msgctxt "selection:calendar.event.attendee,status:"
 msgid "Delegated"
@@ -928,11 +916,11 @@ msgstr "Delegado"
 
 msgctxt "selection:calendar.event.attendee,status:"
 msgid "Needs Action"
-msgstr "Necesita una Acción"
+msgstr "Necesita una acción"
 
 msgctxt "selection:calendar.event.attendee,status:"
 msgid "Tentative"
-msgstr "Tentativa"
+msgstr "Tentativo"
 
 msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Daily"
@@ -940,11 +928,11 @@ msgstr "Diariamente"
 
 msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Hourly"
-msgstr "Cada Hora"
+msgstr "Cada hora"
 
 msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Minutely"
-msgstr "Cada Minuto"
+msgstr "Cada minuto"
 
 msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Monthly"
@@ -952,7 +940,7 @@ msgstr "Mensualmente"
 
 msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Secondly"
-msgstr "Cada Segundo"
+msgstr "Cada segundo"
 
 msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Weekly"
@@ -1000,11 +988,11 @@ msgstr "Diariamente"
 
 msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Hourly"
-msgstr "Cada Hora"
+msgstr "Cada hora"
 
 msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Minutely"
-msgstr "Cada Minuto"
+msgstr "Cada minuto"
 
 msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Monthly"
@@ -1012,7 +1000,7 @@ msgstr "Mensualmente"
 
 msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Secondly"
-msgstr "Cada Segundo"
+msgstr "Cada segundo"
 
 msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Weekly"
@@ -1056,7 +1044,7 @@ msgstr "Miércoles"
 
 msgctxt "view:calendar.calendar:"
 msgid "Access Permissions"
-msgstr "Permisos de Acceso"
+msgstr "Permisos de acceso"
 
 msgctxt "view:calendar.calendar:"
 msgid "Calendar"
@@ -1088,35 +1076,43 @@ msgstr "Asistentes"
 
 msgctxt "view:calendar.event.exdate:"
 msgid "Exception Date"
-msgstr "Fecha de Excepción"
+msgstr "Fecha de excepción"
 
 msgctxt "view:calendar.event.exdate:"
 msgid "Exception Dates"
-msgstr "Fechas de Excepción"
+msgstr "Fechas de excepción"
+
+msgctxt "view:calendar.event.exdate:"
+msgid "Time"
+msgstr "Tiempo"
 
 msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rule"
-msgstr "Regla de Excepción"
+msgstr "Regla de excepción"
 
 msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rules"
-msgstr "Reglas de Excepción"
+msgstr "Reglas de excepción"
 
 msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Date"
-msgstr "Fecha de Recurrencia"
+msgstr "Fecha de recurrencia"
 
 msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Dates"
-msgstr "Fechas de Recurrencia"
+msgstr "Fechas de recurrencia"
+
+msgctxt "view:calendar.event.rdate:"
+msgid "Time"
+msgstr "Tiempo"
 
 msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rule"
-msgstr "Regla de Recurrencia"
+msgstr "Regla de recurrencia"
 
 msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rules"
-msgstr "Reglas de Recurrencia"
+msgstr "Reglas de recurrencia"
 
 msgctxt "view:calendar.event:"
 msgid "Attendees"
@@ -1127,6 +1123,10 @@ msgid "Categories"
 msgstr "Categorías"
 
 msgctxt "view:calendar.event:"
+msgid "End Time"
+msgstr "Hora de fin"
+
+msgctxt "view:calendar.event:"
 msgid "Event"
 msgstr "Evento"
 
@@ -1142,6 +1142,10 @@ msgctxt "view:calendar.event:"
 msgid "Occurences"
 msgstr "Ocurrencias"
 
+msgctxt "view:calendar.event:"
+msgid "Start Time"
+msgstr "Hora de inicio"
+
 msgctxt "view:calendar.location:"
 msgid "Location"
 msgstr "Ubicación"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index d6c2baa..29c8278 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -274,18 +274,6 @@ msgctxt "field:calendar.event,calendar:"
 msgid "Calendar"
 msgstr "Calendario"
 
-msgctxt "field:calendar.event,calendar_owner:"
-msgid "Owner"
-msgstr "Propietario"
-
-msgctxt "field:calendar.event,calendar_read_users:"
-msgid "Read Users"
-msgstr "Usuarios con permisos de lectura"
-
-msgctxt "field:calendar.event,calendar_write_users:"
-msgid "Write Users"
-msgstr "Usuarios con permisos de escritura"
-
 msgctxt "field:calendar.event,categories:"
 msgid "Categories"
 msgstr "Categorías"
@@ -1102,6 +1090,10 @@ msgctxt "view:calendar.event.exdate:"
 msgid "Exception Dates"
 msgstr "Fechas excluidas"
 
+msgctxt "view:calendar.event.exdate:"
+msgid "Time"
+msgstr "Tiempo"
+
 msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rule"
 msgstr "Regla de excepción"
@@ -1118,6 +1110,10 @@ msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Dates"
 msgstr "Fechas de recurrencia"
 
+msgctxt "view:calendar.event.rdate:"
+msgid "Time"
+msgstr "Tiempo"
+
 msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rule"
 msgstr "Regla de recurrencia"
@@ -1135,6 +1131,10 @@ msgid "Categories"
 msgstr "Categorías"
 
 msgctxt "view:calendar.event:"
+msgid "End Time"
+msgstr "Hora final"
+
+msgctxt "view:calendar.event:"
 msgid "Event"
 msgstr "Evento"
 
@@ -1150,6 +1150,10 @@ msgctxt "view:calendar.event:"
 msgid "Occurences"
 msgstr "Ocurrencias"
 
+msgctxt "view:calendar.event:"
+msgid "Start Time"
+msgstr "Hora de inicio"
+
 msgctxt "view:calendar.location:"
 msgid "Location"
 msgstr "Ubicación"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index c437d1b..43f793d 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -264,18 +264,6 @@ msgctxt "field:calendar.event,calendar:"
 msgid "Calendar"
 msgstr "Calendrier"
 
-msgctxt "field:calendar.event,calendar_owner:"
-msgid "Owner"
-msgstr "Propriétaire"
-
-msgctxt "field:calendar.event,calendar_read_users:"
-msgid "Read Users"
-msgstr "Utilisateurs en lecture"
-
-msgctxt "field:calendar.event,calendar_write_users:"
-msgid "Write Users"
-msgstr "Utilisateurs en écriture"
-
 msgctxt "field:calendar.event,categories:"
 msgid "Categories"
 msgstr "Catégories"
@@ -1094,6 +1082,10 @@ msgctxt "view:calendar.event.exdate:"
 msgid "Exception Dates"
 msgstr "Dates d'exception"
 
+msgctxt "view:calendar.event.exdate:"
+msgid "Time"
+msgstr "Heure"
+
 msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rule"
 msgstr "Règle d'exception"
@@ -1110,6 +1102,10 @@ msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Dates"
 msgstr "Dates de récurrence"
 
+msgctxt "view:calendar.event.rdate:"
+msgid "Time"
+msgstr "Heure"
+
 msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rule"
 msgstr "Règle de récurrence"
@@ -1127,6 +1123,10 @@ msgid "Categories"
 msgstr "Catégories"
 
 msgctxt "view:calendar.event:"
+msgid "End Time"
+msgstr "Heure de fin"
+
+msgctxt "view:calendar.event:"
 msgid "Event"
 msgstr "Événement"
 
@@ -1142,6 +1142,10 @@ msgctxt "view:calendar.event:"
 msgid "Occurences"
 msgstr "Occurrences"
 
+msgctxt "view:calendar.event:"
+msgid "Start Time"
+msgstr "Heure de début"
+
 msgctxt "view:calendar.location:"
 msgid "Location"
 msgstr "Emplacement"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
index 354dfa1..660890e 100644
--- a/locale/nl_NL.po
+++ b/locale/nl_NL.po
@@ -271,18 +271,6 @@ msgctxt "field:calendar.event,calendar:"
 msgid "Calendar"
 msgstr ""
 
-msgctxt "field:calendar.event,calendar_owner:"
-msgid "Owner"
-msgstr ""
-
-msgctxt "field:calendar.event,calendar_read_users:"
-msgid "Read Users"
-msgstr ""
-
-msgctxt "field:calendar.event,calendar_write_users:"
-msgid "Write Users"
-msgstr ""
-
 #, fuzzy
 msgctxt "field:calendar.event,categories:"
 msgid "Categories"
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
index 107ac2e..7049610 100644
--- a/locale/ru_RU.po
+++ b/locale/ru_RU.po
@@ -262,18 +262,6 @@ msgctxt "field:calendar.event,calendar:"
 msgid "Calendar"
 msgstr "Календарь"
 
-msgctxt "field:calendar.event,calendar_owner:"
-msgid "Owner"
-msgstr "Владелец"
-
-msgctxt "field:calendar.event,calendar_read_users:"
-msgid "Read Users"
-msgstr "Пользователи могут читать"
-
-msgctxt "field:calendar.event,calendar_write_users:"
-msgid "Write Users"
-msgstr "Пользователи могут писать"
-
 msgctxt "field:calendar.event,categories:"
 msgid "Categories"
 msgstr "Категория"
diff --git a/locale/sl_SI.po b/locale/sl_SI.po
index 00f2d17..bd490a5 100644
--- a/locale/sl_SI.po
+++ b/locale/sl_SI.po
@@ -262,18 +262,6 @@ msgctxt "field:calendar.event,calendar:"
 msgid "Calendar"
 msgstr "Koledar"
 
-msgctxt "field:calendar.event,calendar_owner:"
-msgid "Owner"
-msgstr "Imetnik"
-
-msgctxt "field:calendar.event,calendar_read_users:"
-msgid "Read Users"
-msgstr "Bralci"
-
-msgctxt "field:calendar.event,calendar_write_users:"
-msgid "Write Users"
-msgstr "Zapisovalci"
-
 msgctxt "field:calendar.event,categories:"
 msgid "Categories"
 msgstr "Kategorije"
@@ -1090,6 +1078,10 @@ msgctxt "view:calendar.event.exdate:"
 msgid "Exception Dates"
 msgstr "Izjemni datumi"
 
+msgctxt "view:calendar.event.exdate:"
+msgid "Time"
+msgstr "Čas"
+
 msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rule"
 msgstr "Izjemno pravilo"
@@ -1106,6 +1098,10 @@ msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Dates"
 msgstr "Datumi ponovitev"
 
+msgctxt "view:calendar.event.rdate:"
+msgid "Time"
+msgstr "Čas"
+
 msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rule"
 msgstr "Pravilo ponovitve"
@@ -1123,6 +1119,10 @@ msgid "Categories"
 msgstr "Kategorije"
 
 msgctxt "view:calendar.event:"
+msgid "End Time"
+msgstr "Konec"
+
+msgctxt "view:calendar.event:"
 msgid "Event"
 msgstr "Dogodek"
 
@@ -1138,6 +1138,10 @@ msgctxt "view:calendar.event:"
 msgid "Occurences"
 msgstr "Pojavljanje"
 
+msgctxt "view:calendar.event:"
+msgid "Start Time"
+msgstr "Začetek"
+
 msgctxt "view:calendar.location:"
 msgid "Location"
 msgstr "Lokacija"
diff --git a/res.py b/res.py
index cd9aee4..52a2a78 100644
--- a/res.py
+++ b/res.py
@@ -1,5 +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.
+# 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 fields
 from trytond.pool import PoolMeta
 from trytond.pyson import Bool, Eval
diff --git a/setup.py b/setup.py
index eba837b..003cdc6 100644
--- a/setup.py
+++ b/setup.py
@@ -1,6 +1,6 @@
 #!/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.
+# 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
 import re
@@ -87,6 +87,8 @@ setup(name=name,
         'Natural Language :: Spanish',
         'Operating System :: OS Independent',
         'Programming Language :: Python :: 2.7',
+        'Programming Language :: Python :: Implementation :: CPython',
+        'Programming Language :: Python :: Implementation :: PyPy',
         'Topic :: Office/Business',
         ],
     license='GPL-3',
diff --git a/tests/__init__.py b/tests/__init__.py
index 84d6a76..9779d1f 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -1,5 +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.
+# 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
 
diff --git a/tests/scenario_calendar.py b/tests/scenario_calendar.py
index d05c3d4..768672a 100644
--- a/tests/scenario_calendar.py
+++ b/tests/scenario_calendar.py
@@ -1,6 +1,6 @@
 #!/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.
+# 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 argparse import ArgumentParser
 from urlparse import urlparse
 import unittest
diff --git a/tests/test_calendar.py b/tests/test_calendar.py
index 70a076b..659eeb9 100644
--- a/tests/test_calendar.py
+++ b/tests/test_calendar.py
@@ -1,23 +1,13 @@
-#This file is part of Tryton.  The COPYRIGHT file at the top level of
-#this repository contains the full copyright notices and license terms.
+# 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 unittest
 import trytond.tests.test_tryton
-from trytond.tests.test_tryton import test_view, test_depends
+from trytond.tests.test_tryton import ModuleTestCase
 
 
-class CalendarTestCase(unittest.TestCase):
+class CalendarTestCase(ModuleTestCase):
     'Test Calendar module'
-
-    def setUp(self):
-        trytond.tests.test_tryton.install_module('calendar')
-
-    def test0005views(self):
-        'Test views'
-        test_view('calendar')
-
-    def test0006depends(self):
-        'Test depends'
-        test_depends()
+    module = 'calendar'
 
 
 def suite():
diff --git a/tryton.cfg b/tryton.cfg
index f6bec18..2f680bb 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
 [tryton]
-version=3.4.1
+version=3.6.0
 depends:
     ir
     res
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index fb7dddb..099f61e 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: 3.4.1
+Version: 3.6.0
 Summary: Tryton module for CalDAV
 Home-page: http://www.tryton.org/
 Author: Tryton
 Author-email: issue_tracker at tryton.org
 License: GPL-3
-Download-URL: http://downloads.tryton.org/3.4/
+Download-URL: http://downloads.tryton.org/3.6/
 Description: trytond_calendar
         ================
         
@@ -66,4 +66,6 @@ Classifier: Natural Language :: Slovenian
 Classifier: Natural Language :: Spanish
 Classifier: Operating System :: OS Independent
 Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
 Classifier: Topic :: Office/Business
diff --git a/trytond_calendar.egg-info/requires.txt b/trytond_calendar.egg-info/requires.txt
index 1b80913..8cc5d37 100644
--- a/trytond_calendar.egg-info/requires.txt
+++ b/trytond_calendar.egg-info/requires.txt
@@ -3,7 +3,7 @@ PyWebDAV >= 0.9.8
 python-dateutil
 pytz
 python-sql
-trytond >= 3.4, < 3.5
+trytond >= 3.6, < 3.7
 
 [test]
 caldav
\ No newline at end of file
diff --git a/view/event_form.xml b/view/event_form.xml
index 5eced8a..f337a5e 100644
--- a/view/event_form.xml
+++ b/view/event_form.xml
@@ -35,8 +35,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="organizer"/>
             <field name="attendees" colspan="4"/>
         </page>
-        <page string="Occurences" id="occurences"
-            states="{'invisible': Bool(Eval('_parent_parent'))}">
+        <page string="Occurences" id="occurences">
             <field name="rrules" colspan="2"/>
             <field name="rdates" colspan="2"/>
             <field name="exrules" colspan="2"/>
diff --git a/view/event_tree.xml b/view/event_tree.xml
index aba889b..cde3e24 100644
--- a/view/event_tree.xml
+++ b/view/event_tree.xml
@@ -5,7 +5,9 @@ this repository contains the full copyright notices and license terms. -->
     <field name="calendar"/>
     <field name="summary"/>
     <field name="all_day"/>
-    <field name="dtstart"/>
-    <field name="dtend"/>
+    <field name="dtstart" widget="date"/>
+    <field name="dtstart" widget="time" string="Start Time"/>
+    <field name="dtend" widget="date"/>
+    <field name="dtend" widget="time" string="End Time"/>
     <field name="status"/>
 </tree>
diff --git a/view/event_tree_occurence.xml b/view/event_tree_occurence.xml
index 94d560f..1e9a039 100644
--- a/view/event_tree_occurence.xml
+++ b/view/event_tree_occurence.xml
@@ -3,9 +3,12 @@
 this repository contains the full copyright notices and license terms. -->
 <tree string="Events">
     <field name="summary"/>
-    <field name="recurrence"/>
+    <field name="recurrence" widget="date"/>
+    <field name="recurrence" widget="time"/>
     <field name="all_day"/>
-    <field name="dtstart"/>
-    <field name="dtend"/>
+    <field name="dtstart" widget="date"/>
+    <field name="dtstart" widget="time" string="Start Time"/>
+    <field name="dtend" widget="date"/>
+    <field name="dtend" widget="time" string="End Time"/>
     <field name="status"/>
 </tree>
diff --git a/view/exdate_tree.xml b/view/exdate_tree.xml
index 6b353ff..27c1241 100644
--- a/view/exdate_tree.xml
+++ b/view/exdate_tree.xml
@@ -3,6 +3,7 @@
 this repository contains the full copyright notices and license terms. -->
 <tree string="Exception Dates">
     <field name="event"/>
-    <field name="datetime"/>
+    <field name="datetime" widget="date"/>
+    <field name="datetime" widget="time" string="Time"/>
     <field name="date"/>
 </tree>
diff --git a/view/rdate_tree.xml b/view/rdate_tree.xml
index adfd8ab..af762df 100644
--- a/view/rdate_tree.xml
+++ b/view/rdate_tree.xml
@@ -3,6 +3,7 @@
 this repository contains the full copyright notices and license terms. -->
 <tree string="Recurrence Dates">
     <field name="event"/>
-    <field name="datetime"/>
+    <field name="datetime" widget="date"/>
+    <field name="datetime" widget="time" string="Time"/>
     <field name="date"/>
 </tree>
diff --git a/webdav.py b/webdav.py
index e0d3350..1419e7b 100644
--- a/webdav.py
+++ b/webdav.py
@@ -1,5 +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.
+# 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 vobject
 import urllib
 from sql.functions import Extract
-- 
tryton-modules-calendar



More information about the tryton-debian-vcs mailing list