SVN: CMF/branches/yuppie-formlib/CMFCalendar/ - replaced event views by formlib based forms

Yvo Schubbe <[email protected]>
Newsgroups gmane.comp.web.zope.cmf.cvs
Message-ID <[email protected]>
Log message for revision 71031:
  - replaced event views by formlib based forms

Changed:
  U   CMF/branches/yuppie-formlib/CMFCalendar/browser/configure.zcml
  U   CMF/branches/yuppie-formlib/CMFCalendar/browser/event.py
  D   CMF/branches/yuppie-formlib/CMFCalendar/browser/templates/event.pt
  D   CMF/branches/yuppie-formlib/CMFCalendar/browser/templates/event_edit.pt
  U   CMF/branches/yuppie-formlib/CMFCalendar/locales/cmf_calendar.pot

-=-
Modified: CMF/branches/yuppie-formlib/CMFCalendar/browser/configure.zcml
===================================================================
--- CMF/branches/yuppie-formlib/CMFCalendar/browser/configure.zcml	2006-11-02 18:10:11 UTC (rev 71030)
+++ CMF/branches/yuppie-formlib/CMFCalendar/browser/configure.zcml	2006-11-02 18:26:56 UTC (rev 71031)
@@ -2,12 +2,18 @@
     xmlns="http://namespaces.zope.org/zope"
     xmlns:browser="http://namespaces.zope.org/browser">
 
+  <adapter factory=".event.EventSchemaAdapter"/>
+
+  <utility
+      component=".event.EventTypeVocabularyFactory"
+      name="AvailableEventTypes"
+      />
+
   <browser:page
       for="Products.CMFCalendar.interfaces.IEvent"
       layer="Products.CMFDefault.interfaces.ICMFDefaultSkin"
       name="view.html"
       class=".event.EventView"
-      template="templates/event.pt"
       permission="zope2.View"
       />
 
@@ -16,7 +22,6 @@
       layer="Products.CMFDefault.interfaces.ICMFDefaultSkin"
       name="edit.html"
       class=".event.EventEditView"
-      template="templates/event_edit.pt"
       permission="cmf.ModifyPortalContent"
       />
 

Modified: CMF/branches/yuppie-formlib/CMFCalendar/browser/event.py
===================================================================
--- CMF/branches/yuppie-formlib/CMFCalendar/browser/event.py	2006-11-02 18:10:11 UTC (rev 71030)
+++ CMF/branches/yuppie-formlib/CMFCalendar/browser/event.py	2006-11-02 18:26:56 UTC (rev 71031)
@@ -15,305 +15,161 @@
 $Id$
 """
 
-from DateTime.DateTime import DateTime
+from zope.app.form.browser import DatetimeI18nWidget
+from zope.app.schema.vocabulary import IVocabularyFactory
+from zope.component import adapts
+from zope.formlib import form
+from zope.interface import implements
+from zope.interface import Interface
+from zope.schema import Choice
+from zope.schema import Datetime
+from zope.schema import Field
+from zope.schema import Set
+from zope.schema import Tuple
+from zope.schema import Text
+from zope.schema import TextLine
+from zope.schema import URI
 
-from Products.CMFDefault.exceptions import ResourceLockedError
+from Products.CMFCore.utils import getToolByName
+from Products.CMFDefault.formlib.form import ContentEditFormBase
+from Products.CMFDefault.formlib.form import DisplayFormBase
+from Products.CMFDefault.formlib.schema import EmailLine
+from Products.CMFDefault.formlib.schema import ProxyFieldProperty
+from Products.CMFDefault.formlib.schema import SchemaAdapterBase
+from Products.CMFDefault.formlib.vocabulary import SimpleVocabulary
+
+from Products.CMFCalendar.interfaces import IMutableEvent
 from Products.CMFCalendar.utils import Message as _
 
-from Products.CMFDefault.browser.utils import decode
-from Products.CMFDefault.browser.utils import FormViewBase
-from Products.CMFDefault.browser.utils import memoize
-from Products.CMFDefault.browser.utils import ViewBase
 
+class EventTypeVocabulary(object):
 
-class EventView(ViewBase):
-
-    """View for IEvent.
+    """Vocabulary factory for available event types.
     """
 
-    # interface
+    implements(IVocabularyFactory)
 
-    @memoize
-    @decode
-    def contact_name(self):
-        return self.context.contact_name
+    def __call__(self, context):
+        context = getattr(context, 'context', context)
+        mdtool = getToolByName(context, 'portal_metadata')
+        items = [ (str(v), unicode(v), _(v))
+                  for v in mdtool.listAllowedSubjects(context) ]
+        return SimpleVocabulary.fromTitleItems(items)
 
-    @memoize
-    @decode
-    def location(self):
-        return self.context.location
+EventTypeVocabularyFactory = EventTypeVocabulary()
 
-    @memoize
-    @decode
-    def contact_email(self):
-        return self.context.contact_email
 
-    @memoize
-    @decode
-    def event_types(self):
-        return self.context.Subject()
+class IEventSchema(Interface):
 
-    @memoize
-    @decode
-    def contact_phone(self):
-        return self.context.contact_phone
-
-    @memoize
-    @decode
-    def event_url(self):
-        return self.context.event_url
-
-    @memoize
-    @decode
-    def start_date(self):
-        return DateTime(self.context.start()).Date()
-
-    @memoize
-    @decode
-    def start_time(self):
-        return DateTime(self.context.start()).Time()
-
-    @memoize
-    @decode
-    def stop_date(self):
-        return DateTime(self.context.end()).Date()
-
-    @memoize
-    @decode
-    def stop_time(self):
-        return DateTime(self.context.end()).Time()
-
-
-class EventEditView(FormViewBase):
-
-    """Edit view for IMutableEvent.
+    """Schema for event views.
     """
 
-    _BUTTONS = ({'id': 'change',
-                 'title': _(u'Change'),
-                 'transform': ('edit_control',),
-                 'redirect': ('portal_types', 'object/edit')},
-                {'id': 'change_and_view',
-                 'title': _(u'Change and View'),
-                 'transform': ('edit_control',),
-                 'redirect': ('portal_types', 'object/view')})
+    title = TextLine(
+        title=_(u'Title'),
+        required=False,
+        missing_value=u'',
+        max_length=100)
 
-    # interface
+    contact_name = TextLine(
+        title=_(u'Contact Name'),
+        required=False,
+        missing_value=u'',
+        max_length=100)
 
-    @memoize
-    @decode
-    def title(self):
-        title = self.request.form.get('title', None)
+    location = TextLine(
+        title=_(u'Location'),
+        required=False,
+        missing_value=u'',
+        max_length=100)
 
-        if title is None:
-            title = self.context.Title()
+    contact_email = EmailLine(
+        title=_(u'Contact Email'),
+        required=False)
 
-        return title
+    categories = Set(
+        title=_(u'Category'),
+        required=False,
+        missing_value=set(),
+        value_type=Choice(vocabulary="AvailableEventTypes"))
 
-    @memoize
-    @decode
-    def description(self):
-        description = self.request.form.get('description', None)
+    contact_phone = TextLine(
+        title=_(u'Contact Phone'),
+        required=False,
+        missing_value=u'',
+        max_length=100)
 
-        if description is None:
-            description = self.context.Description()
+    event_url = URI(
+        title=_(u'URL'),
+        required=False,
+        missing_value=u'',
+        max_length=100)
 
-        return description
+    start_date = Datetime(
+        title=_(u'From'),)
 
-    @memoize
-    @decode
-    def contact_name(self):
-        contact_name = self.request.form.get('contact_name', None)
+    stop_date = Datetime(
+        title=_(u'To'),)
 
-        if contact_name is None:
-            contact_name = self.context.contact_name
+    description = Text(
+        title=_(u'Description'),
+        required=False,
+        missing_value=u'')
 
-        return contact_name
 
-    @memoize
-    @decode
-    def location(self):
-        location = self.request.form.get('location', None)
+class EventSchemaAdapter(SchemaAdapterBase):
 
-        if location is None:
-            location = self.context.location
+    """Adapter for IMutableEvent.
+    """
 
-        return location
+    adapts(IMutableEvent)
+    implements(IEventSchema)
 
-    @memoize
-    @decode
-    def contact_email(self):
-        contact_email = self.request.form.get('contact_email', None)
+    title = ProxyFieldProperty(IEventSchema['title'], 'Title', 'setTitle')
+    contact_name = ProxyFieldProperty(IEventSchema['contact_name'])
+    location = ProxyFieldProperty(IEventSchema['location'])
+    contact_email = ProxyFieldProperty(IEventSchema['contact_email'])
+    categories = ProxyFieldProperty(IEventSchema['categories'],
+                                    'Subject', 'setSubject')
+    contact_phone = ProxyFieldProperty(IEventSchema['contact_phone'])
+    event_url = ProxyFieldProperty(IEventSchema['event_url'])
+    start_date = ProxyFieldProperty(IEventSchema['start_date'],
+                                    'start', 'setStartDate')
+    stop_date = ProxyFieldProperty(IEventSchema['stop_date'],
+                                   'end', 'setEndDate')
+    description = ProxyFieldProperty(IEventSchema['description'],
+                                     'Description', 'setDescription')
 
-        if contact_email is None:
-            contact_email = self.context.contact_email
 
-        return contact_email
+class EventViewMixin(object):
 
-    @memoize
-    @decode
-    def event_type(self):
-        event_type = self.request.form.get('event_type', None)
+    def setUpWidgets(self, ignore_request=False):
+        super(EventViewMixin,
+              self).setUpWidgets(ignore_request=ignore_request)
+        self.widgets['title'].split = True
+        self.widgets['contact_name'].split = True
+        self.widgets['location'].split = True
+        self.widgets['contact_email'].split = True
+        self.widgets['categories'].split = True
+        self.widgets['categories'].size = 4
+        self.widgets['contact_phone'].split = True
+        self.widgets['start_date'].split = True
+        self.widgets['stop_date'].split = True
+        self.widgets['description'].height = 5
 
-        if event_type is None:
-            event_type = self.context.Subject()
 
-        return event_type
+class EventView(EventViewMixin, DisplayFormBase):
 
-    @memoize
-    @decode
-    def contact_phone(self):
-        contact_phone = self.request.form.get('contact_phone', None)
+    """View for IEvent.
+    """
 
-        if contact_phone is None:
-            contact_phone = self.context.contact_phone
+    form_fields = form.FormFields(IEventSchema)
 
-        return contact_phone
 
-    @memoize
-    @decode
-    def event_url(self):
-        event_url = self.request.form.get('event_url', None)
+class EventEditView(EventViewMixin, ContentEditFormBase):
 
-        if event_url is None:
-            event_url = self.context.event_url
+    """Edit view for IMutableEvent.
+    """
 
-        return event_url
-
-    @memoize
-    @decode
-    def start_time(self):
-        start_string = self.request.form.get('start_time', None)
-
-        if start_string is None:
-            start_string = self.context.getStartTimeString().split()[0]
-
-        return start_string
-
-    @memoize
-    @decode
-    def startAMPM(self):
-        start_ampm = self.request.form.get('startAMPM', None)
-
-        if start_ampm is None:
-            time_strings = self.context.getStartTimeString().split()
-            start_ampm = (len(time_strings) == 2 and time_strings[1] or 'pm')
-
-        return start_ampm
-
-    @memoize
-    @decode
-    def stop_time(self):
-        stop_string = self.request.form.get('stop_time', None)
-
-        if stop_string is None:
-            stop_string = self.context.getStopTimeString().split()[0]
-
-        return stop_string
-
-    @memoize
-    @decode
-    def stopAMPM(self):
-        stop_ampm = self.request.form.get('stopAMPM', None)
-
-        if stop_ampm is None:
-            time_strings = self.context.getStopTimeString().split()
-            stop_ampm = (len(time_strings) == 2 and time_strings[1] or 'pm')
-
-        return stop_ampm
-
-    @memoize
-    @decode
-    def effectiveYear(self):
-        effective_year = self.request.form.get('effectiveYear', None)
-
-        if effective_year is None:
-            effective_year = self.context.getStartStrings()['year']
-
-        return effective_year
-
-    @memoize
-    @decode
-    def effectiveMo(self):
-        effective_month = self.request.form.get('effectiveMo', None)
-
-        if effective_month is None:
-            effective_month = self.context.getStartStrings()['month']
-
-        return effective_month
-
-    @memoize
-    @decode
-    def effectiveDay(self):
-        effective_day = self.request.form.get('effectiveDay', None)
-
-        if effective_day is None:
-            effective_day = self.context.getStartStrings()['day']
-
-        return effective_day
-
-    @memoize
-    @decode
-    def expirationYear(self):
-        expiration_year = self.request.form.get('expirationYear', None)
-
-        if expiration_year is None:
-            expiration_year = self.context.getEndStrings()['year']
-
-        return expiration_year
-
-    @memoize
-    @decode
-    def expirationMo(self):
-        expiration_month = self.request.form.get('expirationMo', None)
-
-        if expiration_month is None:
-            expiration_month = self.context.getEndStrings()['month']
-
-        return expiration_month
-
-    @memoize
-    @decode
-    def expirationDay(self):
-        expiration_day = self.request.form.get('expirationDay', None)
-
-        if expiration_day is None:
-            expiration_day = self.context.getEndStrings()['day']
-
-        return expiration_day
-
-    # controllers
-
-    def edit_control( self
-                    , title=None
-                    , description=None
-                    , event_type=None
-                    , effectiveDay=None
-                    , effectiveMo=None
-                    , effectiveYear=None
-                    , expirationDay=None
-                    , expirationMo=None
-                    , expirationYear=None
-                    , start_time=None
-                    , startAMPM=None
-                    , stop_time=None
-                    , stopAMPM=None
-                    , location=None
-                    , contact_name=None
-                    , contact_email=None
-                    , contact_phone=None
-                    , event_url=None
-                    , **kw
-                    ):
-
-        try:
-            self.context.edit( title, description, event_type, effectiveDay
-                             , effectiveMo, effectiveYear, expirationDay
-                             , expirationMo, expirationYear, start_time
-                             , startAMPM, stop_time, stopAMPM, location
-                             , contact_name, contact_email, contact_phone
-                             , event_url)
-            return True, _(u'Event changed.')
-        except ResourceLockedError, errmsg:
-            return False, errmsg
-
+    form_fields = form.FormFields(IEventSchema)
+    form_fields['start_date'].custom_widget = DatetimeI18nWidget
+    form_fields['stop_date'].custom_widget = DatetimeI18nWidget

Deleted: CMF/branches/yuppie-formlib/CMFCalendar/browser/templates/event.pt
===================================================================
--- CMF/branches/yuppie-formlib/CMFCalendar/browser/templates/event.pt	2006-11-02 18:10:11 UTC (rev 71030)
+++ CMF/branches/yuppie-formlib/CMFCalendar/browser/templates/event.pt	2006-11-02 18:26:56 UTC (rev 71031)
@@ -1,74 +0,0 @@
-<html metal:use-macro="context/@@standard_macros/page">
-<head>
-
-<metal:slot fill-slot="style_slot">
-<tal:span tal:replace="structure context/getBaseTag" />
-</metal:slot>
-
-</head>
-<body>
-
-<metal:slot metal:fill-slot="body" i18n:domain="cmf_calendar">
-
-<table class="Event" border="0" cellpadding="5" width="100%" cellspacing="3">
- <tr>
-  <th width="10%" i18n:translate="">Event Name</th>
-  <td nowrap="nowrap" tal:content="view/title">Title</td>
-  <th width="10%" i18n:translate="">Contact Name</th>
-  <td nowrap="nowrap" tal:content="view/contact_name">contact_name</td>
- </tr>
- <tr>
-  <th width="10%" i18n:translate="">Location</th>
-  <td nowrap="nowrap" tal:content="view/location">location</td>
-  <th width="10%" i18n:translate="">Contact Email</th>
-  <td nowrap="nowrap" tal:condition="view/contact_email">
-   <a tal:attributes="href string:mailto:${view/contact_email}"
-      tal:content="view/contact_email"
-      href="mailto:contact_email">contact_email</a></td>
- </tr>
- <tr>
-  <th width="10%" i18n:translate="">Event type</th>
-  <td valign="top" nowrap="nowrap"><tal:loop
-      tal:repeat="event_type view/event_types"><tal:span
-       tal:content="event_type" i18n:translate="" /> </tal:loop></td>
-  <th width="10%" i18n:translate="">Contact Phone</th>
-  <td nowrap="nowrap" tal:content="view/contact_phone">contact_phone</td>
- </tr>
- <tr tal:condition="view/event_url">
-  <th width="10%" i18n:translate="">Event URL</th>
-  <td colspan="3" nowrap="nowrap"><a href="event_url"
-     tal:attributes="href view/event_url"
-     tal:content="view/event_url">event_url</a></td>
- </tr>
- <tr>
-  <td colspan="4"><hr /></td>
- </tr>
- <tr>
-  <th width="10%" i18n:translate="">Start Date</th>
-  <td tal:content="view/start_date">start</td>
-  <th width="10%" i18n:translate="">Stop Date</th>
-  <td tal:content="view/stop_date">end</td>
- </tr>
- <tr>
-  <th width="10%" i18n:translate="">Start Time</th>
-  <td tal:content="view/start_time">start</td>
-  <th width="10%" i18n:translate="">Stop Time</th>
-  <td tal:content="view/stop_time">end</td>
- </tr>
- <tr>
-  <td colspan="4"><hr /></td>
- </tr>
- <tr>
-  <th width="10%" i18n:translate="">Description</th>
-  <td colspan="3" valign="top" nowrap="nowrap"
-     tal:content="view/description">Description</td>
- </tr>
- <tr>
-  <td colspan="4">&nbsp;</td>
- </tr>
-</table>
-
-</metal:slot>
-
-</body>
-</html>

Deleted: CMF/branches/yuppie-formlib/CMFCalendar/browser/templates/event_edit.pt
===================================================================
--- CMF/branches/yuppie-formlib/CMFCalendar/browser/templates/event_edit.pt	2006-11-02 18:10:11 UTC (rev 71030)
+++ CMF/branches/yuppie-formlib/CMFCalendar/browser/templates/event_edit.pt	2006-11-02 18:26:56 UTC (rev 71031)
@@ -1,175 +0,0 @@
-<html metal:use-macro="context/@@standard_macros/page">
-<body>
-
-<metal:slot metal:fill-slot="body" i18n:domain="cmf_calendar">
-<h1 i18n:translate="">Edit: <tal:span
-    tal:content="view/title" i18n:name="obj_title">Title</tal:span></h1>
-
-<form action="event_edit_form" method="post"
-      tal:attributes="action view/form_action">
-<table class="FormLayout">
- <tr>
-  <th i18n:translate="">Event Name</th>
-  <td>
-   <input type="text"
-      name="title" maxlength="100" size="35" value="Title"
-      tal:attributes="value view/title" />
-  </td>
-  <th i18n:translate="">Contact Name</th>
-  <td>
-   <input type="text"
-      name="contact_name" maxlength="100" size="35" value="contact_name"
-      tal:attributes="value view/contact_name" />
-  </td>
- </tr>
- <tr>
-  <th i18n:translate="">Location</th>
-  <td>
-   <input type="text"
-      name="location" maxlength="100" size="35" value="location"
-      tal:attributes="value view/location" />
-  </td>
-  <th i18n:translate="">Contact Email</th>
-  <td>
-   <input type="text"
-      name="contact_email" maxlength="100" size="35" value="contact_email"
-      tal:attributes="value view/contact_email" />
-  </td>
- </tr>
- <tr>
-  <th i18n:translate="">Event type</th>
-  <td>
-   <select name="event_type:list" multiple="multiple">
-    <option tal:replace="nothing">Event Type 1</option>
-    <option tal:replace="nothing">Event Type 2</option>
-    <option tal:replace="nothing">...</option>
-    <option value="subj"
-       tal:repeat="subj python: context.portal_metadata.listAllowedSubjects(context)"
-       tal:attributes="value subj;
-                       selected python: subj in view.event_type()"
-       tal:content="subj" i18n:translate="">Event Type N</option>
-   </select>
-  </td>
-  <th i18n:translate="">Contact Phone</th>
-  <td>
-   <input type="text" name="contact_phone" maxlength="100" size="35"
-      value="contact_phone" id="cb_contact_phone"
-      tal:attributes="value view/contact_phone" />
-  </td>
- </tr>
- <tr>
-  <th i18n:translate="">Event URL</th>
-  <td colspan="3">
-   <input type="text" name="event_url" size="55" maxlength="100"
-      value="event_url"
-      tal:attributes="value view/event_url" />
-  </td>
- </tr>
- <tr>
-  <th i18n:translate="">Start Date</th>
-  <td>
-   <select name="effectiveYear">
-    <option value=""
-       tal:repeat="year context/buildYears"
-       tal:attributes="value year;
-                       selected python: year == view.effectiveYear()"
-       tal:content="year">Year</option>
-   </select>
-   &nbsp;
-   <select name="effectiveMo">
-    <option value=""
-       tal:repeat="month context/buildMonths"
-       tal:attributes="value month;
-                       selected python: month == view.effectiveMo()"
-       tal:content="month">Month</option>
-   </select>
-   &nbsp;
-   <select name="effectiveDay">
-    <option value=""
-       tal:repeat="day context/buildDays"
-       tal:attributes="value day;
-                       selected python: day == view.effectiveDay()"
-       tal:content="day">Day</option>
-   </select>
-  </td>
-  <th i18n:translate="">Stop Date</th>
-  <td>
-   <select name="expirationYear">
-    <option value=""
-       tal:repeat="year context/buildYears"
-       tal:attributes="value year;
-                       selected python: year == view.expirationYear()"
-       tal:content="year">Day</option>
-   </select>
-   &nbsp;
-   <select name="expirationMo">
-    <option value=""
-       tal:repeat="month context/buildMonths"
-       tal:attributes="value month;
-                       selected python: month == view.expirationMo()"
-       tal:content="month">Month</option>
-   </select>
-   &nbsp;
-   <select name="expirationDay">
-    <option value=""
-       tal:repeat="day context/buildDays"
-       tal:attributes="value day;
-                       selected python: day == view.expirationDay()"
-       tal:content="day">Day</option>
-   </select>
-  </td>
- </tr>
- <tr>
-  <th i18n:translate="">Start Time</th>
-  <td>
-   <select name="start_time">
-    <option value=""
-       tal:repeat="bt context/buildTimes"
-       tal:attributes="value bt; selected python: bt == view.start_time()"
-       tal:content="bt">start time</option>
-   </select>
-   &nbsp;
-   <input type="radio" name="startAMPM" value="am" id="cb_start_am"
-      tal:attributes="checked python: view.startAMPM() == 'am'" />
-   <label for="cb_start_am" i18n:translate="">am</label>
-   <input type="radio" name="startAMPM" value="pm" id="cb_start_pm"
-      tal:attributes="checked python: view.startAMPM() == 'pm'" />
-   <label for="cb_start_pm" i18n:translate="">pm</label>
-  </td>
-  <th i18n:translate="">Stop Time</th>
-  <td>
-   <select name="stop_time">
-   <option value=""
-      tal:repeat="bt context/buildTimes"
-      tal:attributes="value bt; selected python: bt == view.stop_time()"
-      tal:content="bt">end time</option>
-   </select>
-   &nbsp;
-   <input type="radio" name="stopAMPM" value="am" id="cb_stop_am"
-      tal:attributes="checked python: view.stopAMPM() == 'am'" />
-   <label for="cb_stop_am" i18n:translate="">am</label>
-   <input type="radio" name="stopAMPM" value="pm" id="cb_stop_pm"
-      tal:attributes="checked python: view.stopAMPM() == 'pm'" />
-   <label for="cb_stop_pm" i18n:translate="">pm</label>
-  </td>
- </tr>
- <tr>
-  <th i18n:translate="">Description</th>
-  <td class="TextField" colspan="3">
-   <textarea name="description:text" rows="5" cols="70" wrap="soft"
-      tal:content="view/description"></textarea>
-  </td>
- </tr>
- <tr>
-  <td>&nbsp;</td>
-  <td colspan="3">
-   <metal:macro metal:use-macro="context/@@form_widget/buttons" />
-  </td>
- </tr>
-</table>
-</form>
-
-</metal:slot>
-
-</body>
-</html>

Modified: CMF/branches/yuppie-formlib/CMFCalendar/locales/cmf_calendar.pot
===================================================================
--- CMF/branches/yuppie-formlib/CMFCalendar/locales/cmf_calendar.pot	2006-11-02 18:10:11 UTC (rev 71030)
+++ CMF/branches/yuppie-formlib/CMFCalendar/locales/cmf_calendar.pot	2006-11-02 18:26:56 UTC (rev 71031)
@@ -12,175 +12,166 @@
 ##############################################################################
 msgid ""
 msgstr ""
-"Project-Id-Version: CMF 2.0\n"
+"Project-Id-Version: CMF 2.1\n"
 "POT-Creation-Date: $Date$\n"
 "Language-Team: CMF Developers <[email protected]>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: CMFCalendar/browser/event.py:316
-#: CMFCalendar/skins/zpt_calendar/event_edit_control.py:11
-msgid "Event changed."
+#: CMFCalendar/browser/event.py:102
+msgid "URL"
 msgstr ""
 
-#: CMFCalendar/browser/event.py:93
-#: CMFCalendar/skins/zpt_calendar/event_edit_form.py:50
-msgid "Change"
+#: CMFCalendar/browser/event.py:108
+msgid "From"
 msgstr ""
 
-#: CMFCalendar/browser/event.py:97
-#: CMFCalendar/skins/zpt_calendar/event_edit_form.py:51
-msgid "Change and View"
+#: CMFCalendar/browser/event.py:111
+msgid "To"
 msgstr ""
 
-#: CMFCalendar/browser/templates/calendar_widgets.pt:13
-#: CMFCalendar/skins/zpt_calendar/calendarBox.pt:12
-msgid "CMF Calendar"
+#: CMFCalendar/browser/event.py:114
+#: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:160
+#: CMFCalendar/skins/zpt_calendar/event_view_template.pt:61
+msgid "Description"
 msgstr ""
 
-#: CMFCalendar/browser/templates/calendar_widgets.pt:29
-#: CMFCalendar/browser/templates/calendar_widgets.pt:42
-#: CMFCalendar/browser/templates/event.pt:32
-#: CMFCalendar/browser/templates/event_edit.pt:46
-#: CMFCalendar/skins/zpt_calendar/calendarBox.pt:28
-#: CMFCalendar/skins/zpt_calendar/calendarBox.pt:41
-#: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:49
-#: CMFCalendar/skins/zpt_calendar/event_view_template.pt:31
-msgid "${DYNAMIC_CONTENT}"
+#: CMFCalendar/browser/event.py:68
+msgid "Title"
 msgstr ""
 
-#: CMFCalendar/browser/templates/event.pt:15
-#: CMFCalendar/browser/templates/event_edit.pt:12
-#: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:15
-#: CMFCalendar/skins/zpt_calendar/event_view_template.pt:14
-msgid "Event Name"
-msgstr ""
-
-#: CMFCalendar/browser/templates/event.pt:17
-#: CMFCalendar/browser/templates/event_edit.pt:18
+#: CMFCalendar/browser/event.py:74
 #: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:21
 #: CMFCalendar/skins/zpt_calendar/event_view_template.pt:16
 msgid "Contact Name"
 msgstr ""
 
-#: CMFCalendar/browser/templates/event.pt:21
-#: CMFCalendar/browser/templates/event_edit.pt:26
+#: CMFCalendar/browser/event.py:80
 #: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:29
 #: CMFCalendar/skins/zpt_calendar/event_view_template.pt:20
 msgid "Location"
 msgstr ""
 
-#: CMFCalendar/browser/templates/event.pt:23
-#: CMFCalendar/browser/templates/event_edit.pt:32
+#: CMFCalendar/browser/event.py:86
 #: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:35
 #: CMFCalendar/skins/zpt_calendar/event_view_template.pt:22
 msgid "Contact Email"
 msgstr ""
 
-#: CMFCalendar/browser/templates/event.pt:30
-#: CMFCalendar/browser/templates/event_edit.pt:40
-#: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:43
-#: CMFCalendar/skins/zpt_calendar/event_view_template.pt:29
-msgid "Event type"
+#: CMFCalendar/browser/event.py:90
+msgid "Category"
 msgstr ""
 
-#: CMFCalendar/browser/templates/event.pt:34
-#: CMFCalendar/browser/templates/event_edit.pt:53
+#: CMFCalendar/browser/event.py:96
 #: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:56
 #: CMFCalendar/skins/zpt_calendar/event_view_template.pt:33
 msgid "Contact Phone"
 msgstr ""
 
-#: CMFCalendar/browser/templates/event.pt:38
-#: CMFCalendar/browser/templates/event_edit.pt:61
-#: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:64
-#: CMFCalendar/skins/zpt_calendar/event_view_template.pt:37
-msgid "Event URL"
+#: CMFCalendar/browser/templates/calendar_widgets.pt:13
+#: CMFCalendar/skins/zpt_calendar/calendarBox.pt:12
+msgid "CMF Calendar"
 msgstr ""
 
-#: CMFCalendar/browser/templates/event.pt:47
-#: CMFCalendar/browser/templates/event_edit.pt:69
-#: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:72
-#: CMFCalendar/skins/zpt_calendar/event_view_template.pt:46
-msgid "Start Date"
+#: CMFCalendar/browser/templates/calendar_widgets.pt:29
+#: CMFCalendar/browser/templates/calendar_widgets.pt:42
+#: CMFCalendar/skins/zpt_calendar/calendarBox.pt:28
+#: CMFCalendar/skins/zpt_calendar/calendarBox.pt:41
+#: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:49
+#: CMFCalendar/skins/zpt_calendar/event_view_template.pt:31
+msgid "${DYNAMIC_CONTENT}"
 msgstr ""
 
-#: CMFCalendar/browser/templates/event.pt:49
-#: CMFCalendar/browser/templates/event_edit.pt:95
-#: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:98
-#: CMFCalendar/skins/zpt_calendar/event_view_template.pt:48
-msgid "Stop Date"
+#: CMFCalendar/profiles/default/types/Event.xml:5
+msgid "Event"
 msgstr ""
 
-#: CMFCalendar/browser/templates/event.pt:53
-#: CMFCalendar/browser/templates/event_edit.pt:123
-#: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:126
-#: CMFCalendar/skins/zpt_calendar/event_view_template.pt:52
-msgid "Start Time"
+#: CMFCalendar/profiles/default/types/Event.xml:6
+msgid "Events are objects for use in Calendar topical queries on the catalog."
 msgstr ""
 
-#: CMFCalendar/browser/templates/event.pt:55
-#: CMFCalendar/browser/templates/event_edit.pt:139
-#: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:142
-#: CMFCalendar/skins/zpt_calendar/event_view_template.pt:54
-msgid "Stop Time"
+#: CMFCalendar/setuphandlers.py:42
+msgid "Appointment"
 msgstr ""
 
-#: CMFCalendar/browser/templates/event.pt:62
-#: CMFCalendar/browser/templates/event_edit.pt:157
-#: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:160
-#: CMFCalendar/skins/zpt_calendar/event_view_template.pt:61
-msgid "Description"
+#: CMFCalendar/setuphandlers.py:43
+msgid "Convention"
 msgstr ""
 
-#: CMFCalendar/browser/templates/event_edit.pt:134
-#: CMFCalendar/browser/templates/event_edit.pt:150
+#: CMFCalendar/setuphandlers.py:44
+msgid "Meeting"
+msgstr ""
+
+#: CMFCalendar/setuphandlers.py:45
+msgid "Social Event"
+msgstr ""
+
+#: CMFCalendar/setuphandlers.py:46
+msgid "Work"
+msgstr ""
+
+#: CMFCalendar/skins/zpt_calendar/event_edit_control.py:11
+msgid "Event changed."
+msgstr ""
+
+#: CMFCalendar/skins/zpt_calendar/event_edit_form.py:50
+msgid "Change"
+msgstr ""
+
+#: CMFCalendar/skins/zpt_calendar/event_edit_form.py:51
+msgid "Change and View"
+msgstr ""
+
+#: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:126
+#: CMFCalendar/skins/zpt_calendar/event_view_template.pt:52
+msgid "Start Time"
+msgstr ""
+
 #: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:137
 #: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:153
 msgid "am"
 msgstr ""
 
-#: CMFCalendar/browser/templates/event_edit.pt:137
-#: CMFCalendar/browser/templates/event_edit.pt:153
 #: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:140
 #: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:156
 msgid "pm"
 msgstr ""
 
-#: CMFCalendar/browser/templates/event_edit.pt:5
-#: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:5
-msgid "Edit: ${obj_title}"
+#: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:142
+#: CMFCalendar/skins/zpt_calendar/event_view_template.pt:54
+msgid "Stop Time"
 msgstr ""
 
-#: CMFCalendar/profiles/default/types/Event.xml:5
-msgid "Event"
+#: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:15
+#: CMFCalendar/skins/zpt_calendar/event_view_template.pt:14
+msgid "Event Name"
 msgstr ""
 
-#: CMFCalendar/profiles/default/types/Event.xml:6
-msgid "Events are objects for use in Calendar topical queries on the catalog."
+#: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:43
+#: CMFCalendar/skins/zpt_calendar/event_view_template.pt:29
+msgid "Event type"
 msgstr ""
 
-#: CMFCalendar/setuphandlers.py:42
-msgid "Appointment"
+#: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:5
+msgid "Edit: ${obj_title}"
 msgstr ""
 
-#: CMFCalendar/setuphandlers.py:43
-msgid "Convention"
+#: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:64
+#: CMFCalendar/skins/zpt_calendar/event_view_template.pt:37
+msgid "Event URL"
 msgstr ""
 
-#: CMFCalendar/setuphandlers.py:44
-msgid "Meeting"
+#: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:72
+#: CMFCalendar/skins/zpt_calendar/event_view_template.pt:46
+msgid "Start Date"
 msgstr ""
 
-#: CMFCalendar/setuphandlers.py:45
-msgid "Social Event"
+#: CMFCalendar/skins/zpt_calendar/event_edit_template.pt:98
+#: CMFCalendar/skins/zpt_calendar/event_view_template.pt:48
+msgid "Stop Date"
 msgstr ""
 
-#: CMFCalendar/setuphandlers.py:46
-msgid "Work"
-msgstr ""
-
 msgid "Su"
 msgstr ""
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.