[Erp5-report] r17839 - /erp5/trunk/products/ERP5Form/FormulatorPatch.py

nobody at svn.erp5.org nobody at svn.erp5.org
Wed Nov 28 09:18:19 CET 2007


Author: ivan
Date: Wed Nov 28 09:18:17 2007
New Revision: 17839

URL: http://svn.erp5.org?rev=17839&view=rev
Log:
Extend DateTime field so it's possible now to input timezone (it's disabled by default).


Modified:
    erp5/trunk/products/ERP5Form/FormulatorPatch.py

Modified: erp5/trunk/products/ERP5Form/FormulatorPatch.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/FormulatorPatch.py?rev=17839&r1=17838&r2=17839&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Form/FormulatorPatch.py (original)
+++ erp5/trunk/products/ERP5Form/FormulatorPatch.py Wed Nov 28 09:18:17 2007
@@ -776,9 +776,14 @@
         "Defines wether hidden day means, you want the last day of the month"
         "Else it will be the first day"),
                                   default=0)
-
+                          
+    timezone_style = fields.CheckBoxField('timezone_style',
+                                     title="Display timezone",
+                                     description=("Display timezone"),
+                                     default=0)
+    
     property_names = old_date_time_widget_property_names \
-        + ['hide_day', 'hidden_day_is_last_day']
+        + ['timezone_style', 'hide_day', 'hidden_day_is_last_day']
 
     def getInputOrder(self, field):
       input_order = field.get_value('input_order')
@@ -813,10 +818,11 @@
 
     def render(self, field, key, value, REQUEST):
         use_ampm = field.get_value('ampm_time_style')
+        use_timezone = field.get_value('timezone_style')
         # FIXME: backwards compatibility hack:
         if not hasattr(field, 'sub_form'):
             field.sub_form = create_datetime_text_sub_form()
-
+            
         # Is it still usefull to test the None value,
         # as DateTimeField should be considerer as the other field
         # and get an empty string as default value?
@@ -832,6 +838,7 @@
         hour   = None
         minute = None
         ampm   = None
+        timezone = None
         if isinstance(value, DateTime):
             year = "%04d" % value.year()
             month = "%02d" % value.month()
@@ -842,6 +849,7 @@
                 hour = "%02d" % value.hour()
             minute = "%02d" % value.minute()
             ampm = value.ampm()
+            timezone = value.timezone()
         input_order = self.getInputOrder(field)
         if input_order == 'ymd':
             order = [('year', year),
@@ -878,7 +886,9 @@
             if use_ampm:
                 time_result += ' ' + field.render_sub_field('ampm',
                                                             ampm, REQUEST, key=key)
-
+            if use_timezone:
+                time_result += ' ' + field.render_sub_field('timezone',
+                                                            timezone, REQUEST, key=key)
             return date_result + '   ' + time_result
         else:
             return date_result
@@ -891,6 +901,7 @@
             return ''
 
         use_ampm = field.get_value('ampm_time_style')
+        use_timezone = field.get_value('timezone_style')
 
         year = "%04d" % value.year()
         month = "%02d" % value.month()
@@ -901,6 +912,7 @@
             hour = "%02d" % value.hour()
         minute = "%02d" % value.minute()
         ampm = value.ampm()
+        timezone = value.timezone()
 
         order = self.getInputOrder(field)
         if order == 'ymd':
@@ -926,6 +938,8 @@
             time_result = hour + field.get_value('time_separator') + minute
             if use_ampm:
                 time_result += space + ampm
+            if use_timezone:
+                time_result += space + timezone
             return date_result + (space * 3) + time_result
         else:
             return date_result
@@ -940,7 +954,133 @@
 
 from Products.Formulator.Validator import DateTimeValidator, ValidationError, DateTime
 from DateTime.DateTime import DateError, TimeError
-
+from Products.Formulator.StandardFields import ListField, StringField, IntegerField, create_items
+from Products.Formulator.Form import BasicForm
+import Products.Formulator.StandardFields
+
+gmt_timezones =  [('GMT%s' %zone, 'GMT%s' %zone,) for zone in range(-12, 0)]\
+                  + [('GMT', 'GMT',),] \
+                  + [('GMT+%s' %zone, 'GMT+%s' %zone,) for zone in range(1, 13)]
+                  
+def Patched_create_datetime_text_sub_form():
+    """ Patch Products.Formulator.StandardFields so we can add timezone subfield """
+    sub_form = BasicForm()
+        
+    year = IntegerField('year',
+                        title="Year",
+                        required=0,
+                        display_width=4,
+                        display_maxwidth=4,
+                        max_length=4)
+    
+    month = IntegerField('month',
+                         title="Month",
+                         required=0,
+                         display_width=2,
+                         display_maxwidth=2,
+                         max_length=2)
+    
+    day = IntegerField('day',
+                       title="Day",
+                       required=0,
+                       display_width=2,
+                       display_maxwidth=2,
+                       max_length=2)
+    sub_form.add_group("date")
+    sub_form.add_fields([year, month, day], "date")
+    
+    hour = IntegerField('hour',
+                        title="Hour",
+                        required=0,
+                        display_width=2,
+                        display_maxwidth=2,
+                        max_length=2)
+    
+    minute = IntegerField('minute',
+                          title="Minute",
+                          required=0,
+                          display_width=2,
+                          display_maxwidth=2,
+                          max_length=2)
+
+    ampm = StringField('ampm',
+                       title="am/pm",
+                       required=0,
+                       display_width=2,
+                       display_maxwidth=2,
+                       max_length=2)
+    timezone_field = ListField('timezone',
+                               title = "Timezone",
+                               required = 0,
+                               default = 'GMT',
+                               items = gmt_timezones,
+                               size = 1)                       
+    sub_form.add_fields([hour, minute, ampm, timezone_field], "time")
+    return sub_form
+    
+def Patched_create_datetime_list_sub_form():
+    """ Patch Products.Formulator.StandardFields so we can add timezone subfield """
+    sub_form = BasicForm()
+
+    year = ListField('year',
+                     title="Year",
+                     required=0,
+                     default="",
+                     items=create_items(2000, 2010, digits=4),
+                     size=1)
+    
+    month = ListField('month',
+                      title="Month",
+                      required=0,
+                      default="",
+                      items=create_items(1, 13, digits=2),
+                      size=1)
+    
+    day = ListField('day',
+                    title="Day",
+                    required=0,
+                    default="",
+                    items=create_items(1, 32, digits=2),
+                    size=1)
+
+    sub_form.add_group("date")
+    sub_form.add_fields([year, month, day], "date")
+    
+    hour = IntegerField('hour',
+                        title="Hour",
+                        required=0,
+                        display_width=2,
+                        display_maxwidth=2,
+                        max_length=2)
+    
+    minute = IntegerField('minute',
+                          title="Minute",
+                          required=0,
+                          display_width=2,
+                          display_maxwidth=2,
+                          max_length=2)
+
+    ampm = ListField('ampm',
+                     title="am/pm",
+                     required=0,
+                     default="am",
+                     items=[("am","am"),
+                            ("pm","pm")],
+                     size=1)
+    timezone = ListField('timezone',
+                          title = "Timezone",
+                          required = 0,
+                          default = 'GMT',
+                          items = gmt_timezones,
+                          size = 1)                                            
+    sub_form.add_group("time")
+
+    sub_form.add_fields([hour, minute, ampm, timezone], "time")
+    return sub_form
+
+Products.Formulator.StandardFields.create_datetime_text_sub_form = Patched_create_datetime_text_sub_form
+Products.Formulator.StandardFields.create_datetime_list_sub_form = Patched_create_datetime_list_sub_form
+    
 class PatchedDateTimeValidator(DateTimeValidator):
     """
       Added support for key in every call to validate_sub_field
@@ -989,7 +1129,6 @@
              (hour == '' or minute == ''))):
             self.raise_error('not_datetime', field)
 
-
         if field.get_value('ampm_time_style'):
             ampm = field.validate_sub_field('ampm', REQUEST, key=key)
             if field.get_value('allow_empty_time'):
@@ -1004,7 +1143,12 @@
                 self.raise_error('not_datetime', field)
             elif ampm == 'pm' and hour < 12:
                 hour += 12
-
+                
+        # handle possible timezone input
+        timezone = ''
+        if field.get_value('timezone_style'):
+          timezone =  field.validate_sub_field('timezone', REQUEST, key=key)
+          
         try:
             # handling of hidden day, which can be first or last day of the month:
             if field.get_value('hidden_day_is_last_day'):
@@ -1017,8 +1161,8 @@
               tmp_day = DateTime(tmp_year, tmp_month, 1, hour, minute)
               result = tmp_day - 1
             else:
-              result = DateTime(int(year), int(month), int(day), hour, minute)
-        # ugh, a host of string based exceptions (not since Zope 2.7)
+              result = DateTime('%s/%s/%s %s:%s %s' %(int(year), int(month), int(day), hour, minute, timezone))
+         # ugh, a host of string based exceptions (not since Zope 2.7)
         except ('DateTimeError', 'Invalid Date Components', 'TimeError',
                 DateError, TimeError) :
             self.raise_error('not_datetime', field)




More information about the Erp5-report mailing list