Mercurial > p > roundup > code
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': |
