comparison roundup/cgi/client.py @ 4740:fe9568a6cbd6

Untangle template selection logic from template loading functionality.
author anatoly techtonik <techtonik@gmail.com>
date Tue, 15 Jan 2013 00:10:01 +0300
parents 94be76e04140
children 6e9b9743de89
comparison
equal deleted inserted replaced
4739:94be76e04140 4740:fe9568a6cbd6
1061 self.classname = self.nodeid = None 1061 self.classname = self.nodeid = None
1062 self.template = '' 1062 self.template = ''
1063 self.error_message.append(message) 1063 self.error_message.append(message)
1064 self.write_html(self.renderContext()) 1064 self.write_html(self.renderContext())
1065 1065
1066 def selectTemplate(self): 1066 def selectTemplate(self, name, view):
1067 """ Template selection logic """ 1067 """ Choose existing template for the given combination of
1068 classname (name parameter) and template request variable
1069 (view parameter) and return its name.
1070
1071 In most cases the name will be "classname.view", but
1072 if "view" is None, then template name "classname" will
1073 be returned.
1074
1075 If "classname.view" template doesn't exist, the
1076 "_generic.view" is used as a fallback.
1077
1078 [ ] cover with tests
1079 """
1068 loader = self.instance.templates 1080 loader = self.instance.templates
1069 1081
1070 name = self.classname
1071 view = self.template
1072
1073 # if classname is not set, use "home" template 1082 # if classname is not set, use "home" template
1074 if name is None: 1083 if name is None:
1075 name = 'home' 1084 name = 'home'
1076 1085
1077 return name, view 1086 tplname = name
1087 if view:
1088 tplname = '%s.%s' % (name, view)
1089
1090 if loader.check(tplname):
1091 return tplname
1092
1093 # rendering class/context with generic template for this view.
1094 # with no view it's impossible to choose which generic template to use
1095 if not view:
1096 raise templating.NoTemplate('Template "%s" doesn\'t exist' % name)
1097
1098 generic = '_generic.%s' % view
1099 if loader.check(generic):
1100 return generic
1101
1102 raise templating.NoTemplate('No template file exists for templating '
1103 '"%s" with template "%s" (neither "%s" nor "%s")' % (name, view,
1104 tplname, generic))
1078 1105
1079 def renderContext(self): 1106 def renderContext(self):
1080 """ Return a PageTemplate for the named page 1107 """ Return a PageTemplate for the named page
1081 """ 1108 """
1082 name, view = self.selectTemplate() 1109 tplname = self.selectTemplate(self.classname, self.template)
1083 1110
1084 # catch errors so we can handle PT rendering errors more nicely 1111 # catch errors so we can handle PT rendering errors more nicely
1085 args = { 1112 args = {
1086 'ok_message': self.ok_message, 1113 'ok_message': self.ok_message,
1087 'error_message': self.error_message 1114 'error_message': self.error_message
1088 } 1115 }
1089 try: 1116 try:
1090 pt = self.instance.templates.load(name, view) 1117 pt = self.instance.templates.load(tplname)
1091 # let the template render figure stuff out 1118 # let the template render figure stuff out
1092 result = pt.render(self, None, None, **args) 1119 result = pt.render(self, None, None, **args)
1093 self.additional_headers['Content-Type'] = pt.content_type 1120 self.additional_headers['Content-Type'] = pt.content_type
1094 if self.env.get('CGI_SHOW_TIMING', ''): 1121 if self.env.get('CGI_SHOW_TIMING', ''):
1095 if self.env['CGI_SHOW_TIMING'].upper() == 'COMMENT': 1122 if self.env['CGI_SHOW_TIMING'].upper() == 'COMMENT':

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