diff roundup/cgi/templating.py @ 3164:24476db8872f

nicer error looking up values of None (response to [SF#1108697]) also, fixed some translation lookups in templating
author Richard Jones <richard@users.sourceforge.net>
date Mon, 14 Feb 2005 04:53:41 +0000
parents b2fc512f145d
children d8d1ebd80930
line wrap: on
line diff
--- a/roundup/cgi/templating.py	Mon Feb 14 04:37:37 2005 +0000
+++ b/roundup/cgi/templating.py	Mon Feb 14 04:53:41 2005 +0000
@@ -326,6 +326,7 @@
     '''
     def __init__(self, client):
         self._client = client
+        self._ = client._
         self._db = client.db
 
         # we want config to be exposed
@@ -441,6 +442,7 @@
     '''
     def __init__(self, client, classname, anonymous=0):
         self._client = client
+        self._ = client._
         self._db = client.db
         self._anonymous = anonymous
 
@@ -668,7 +670,7 @@
 
     def history(self):
         if not self.is_view_ok():
-            return _('[hidden]')
+            return self._('[hidden]')
         return self._('New node - no history')
 
     def renderWith(self, name, **kwargs):
@@ -787,7 +789,7 @@
 
     def history(self, direction='descending', dre=re.compile('^\d+$')):
         if not self.is_view_ok():
-            return _('[hidden]')
+            return self._('[hidden]')
 
         # pre-load the history with the current state
         current = {}
@@ -1075,6 +1077,7 @@
             anonymous=0):
         self._client = client
         self._db = client.db
+        self._ = client._
         self._classname = classname
         self._nodeid = nodeid
         self._prop = prop
@@ -1160,7 +1163,7 @@
           addresses and designators
         '''
         if not self.is_view_ok():
-            return _('[hidden]')
+            return self._('[hidden]')
 
         if self._value is None:
             return ''
@@ -1181,7 +1184,7 @@
             This requires the StructureText module to be installed separately.
         '''
         if not self.is_view_ok():
-            return _('[hidden]')
+            return self._('[hidden]')
 
         s = self.plain(escape=escape)
         if not StructuredText:
@@ -1225,7 +1228,7 @@
         ''' Render the value of the property as an obscured email address
         '''
         if not self.is_view_ok():
-            return _('[hidden]')
+            return self._('[hidden]')
 
         if self._value is None:
             value = ''
@@ -1247,7 +1250,7 @@
         ''' Render a "plain" representation of the property
         '''
         if not self.is_view_ok():
-            return _('[hidden]')
+            return self._('[hidden]')
 
         if self._value is None:
             return ''
@@ -1281,7 +1284,7 @@
         ''' Render a "plain" representation of the property
         '''
         if not self.is_view_ok():
-            return _('[hidden]')
+            return self._('[hidden]')
 
         if self._value is None:
             return ''
@@ -1320,7 +1323,7 @@
         ''' Render a "plain" representation of the property
         '''
         if not self.is_view_ok():
-            return _('[hidden]')
+            return self._('[hidden]')
 
         if self._value is None:
             return ''
@@ -1371,7 +1374,7 @@
         ''' Render a "plain" representation of the property
         '''
         if not self.is_view_ok():
-            return _('[hidden]')
+            return self._('[hidden]')
 
         if self._value is None:
             return ''
@@ -1388,7 +1391,7 @@
             DateHTMLProperty.
         '''
         if not self.is_view_ok():
-            return _('[hidden]')
+            return self._('[hidden]')
 
         ret = date.Date('.', translator=self._client)
 
@@ -1432,7 +1435,7 @@
                 elif isinstance(default, DateHTMLProperty):
                     raw_value = default._value
                 else:
-                    raise ValueError, _('default value for '
+                    raise ValueError, self._('default value for '
                         'DateHTMLProperty must be either DateHTMLProperty '
                         'or string date representation.')
         elif isinstance(value, str) or isinstance(value, unicode):
@@ -1464,7 +1467,7 @@
             If the "pretty" flag is true, then make the display pretty.
         '''
         if not self.is_view_ok():
-            return _('[hidden]')
+            return self._('[hidden]')
 
         if not self._value:
             return ''
@@ -1484,7 +1487,7 @@
             for the situatin when a date only specifies a month and a year.
         '''
         if not self.is_view_ok():
-            return _('[hidden]')
+            return self._('[hidden]')
 
         if not self._value:
             return ''
@@ -1497,7 +1500,7 @@
         ''' Return the date/time as a local (timezone offset) date/time.
         '''
         if not self.is_view_ok():
-            return _('[hidden]')
+            return self._('[hidden]')
 
         return DateHTMLProperty(self._client, self._classname, self._nodeid,
             self._prop, self._formname, self._value, offset=offset)
@@ -1514,7 +1517,7 @@
         ''' Render a "plain" representation of the property
         '''
         if not self.is_view_ok():
-            return _('[hidden]')
+            return self._('[hidden]')
 
         if self._value is None:
             return ''
@@ -1524,7 +1527,7 @@
         ''' Render the interval in a pretty format (eg. "yesterday")
         '''
         if not self.is_view_ok():
-            return _('[hidden]')
+            return self._('[hidden]')
 
         return self._value.pretty()
 
@@ -1565,7 +1568,8 @@
         ''' return a new HTMLItem '''
        #print 'Link.getattr', (self, attr, self._value)
         if not self._value:
-            raise AttributeError, "Can't access missing value"
+            msg = self._('Attempt to look up %(attr)s on a missing value')
+            return MissingValue(msg%locals())
         i = HTMLItem(self._client, self._prop.classname, self._value)
         return getattr(i, attr)
 
@@ -1573,7 +1577,7 @@
         ''' Render a "plain" representation of the property
         '''
         if not self.is_view_ok():
-            return _('[hidden]')
+            return self._('[hidden]')
 
         if self._value is None:
             return ''
@@ -1760,7 +1764,7 @@
         ''' Render a "plain" representation of the property
         '''
         if not self.is_view_ok():
-            return _('[hidden]')
+            return self._('[hidden]')
 
         linkcl = self._db.classes[self._prop.classname]
         k = linkcl.labelprop(1)
@@ -2330,4 +2334,29 @@
             raise AttributeError, name
         return self.client.instance.templating_utils[name]
 
+class MissingValue:
+    def __init__(self, description, **kwargs):
+        self.__description = description
+        for key, value in kwargs.items():
+            self.__dict__[key] = value
+
+    def __call__(self, *args, **kwargs): return MissingValue(self.__description)
+    def __getattr__(self, name):
+        # This allows assignments which assume all intermediate steps are Null
+        # objects if they don't exist yet.
+        #
+        # For example (with just 'client' defined):
+        #
+        # client.db.config.TRACKER_WEB = 'BASE/'
+        self.__dict__[name] = MissingValue(self.__description)
+        return getattr(self, name)
+
+    def __getitem__(self, key): return self
+    def __nonzero__(self): return 0
+    def __str__(self): return '[%s]'%self.__description
+    def __repr__(self): return '<MissingValue 0x%x "%s">'%(id(self),
+        self.__description)
+    def gettext(self, str): return str
+    _ = gettext
+
 # vim: set et sts=4 sw=4 :

Roundup Issue Tracker: http://roundup-tracker.org/