From 4e848ce0a8ec15b53fc46de1780a2180fcf4f8e3 Mon Sep 17 00:00:00 2001 From: Gaetan Delannay Date: Fri, 15 Apr 2011 11:26:20 +0200 Subject: [PATCH] appy.pod: added param 'stylesMapping' for the 'text' function (which calls 'xhtml' internally); appy.gen: bufgix in the translation system (translation of group-related labels); appy.shared.dav: bugfix while getting the 'content-type' HTTP header key; appy.shared.dav: smart error handling when parsing wrong XML content. --- gen/plone25/mixins/__init__.py | 23 ++++++++++++++--------- pod/renderer.py | 4 ++-- shared/dav.py | 18 ++++++++++++++---- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/gen/plone25/mixins/__init__.py b/gen/plone25/mixins/__init__.py index 2e6e6a0..f2a66b5 100644 --- a/gen/plone25/mixins/__init__.py +++ b/gen/plone25/mixins/__init__.py @@ -1210,15 +1210,20 @@ class BaseMixin: if field: # Maybe we do not have the field itself, but only its name if isinstance(field, basestring): - field = self.getAppyType(field, className=className) - # Include field-specific mapping if any. - fieldMapping = field.mapping[label] - if fieldMapping: - if callable(fieldMapping): - fieldMapping = field.callMethod(self, fieldMapping) - mapping.update(fieldMapping) - # Get the label - label = getattr(field, label+'Id') + appyField = self.getAppyType(field, className=className) + else: + appyField = field + if appyField: + fieldMapping = appyField.mapping[label] + if fieldMapping: + if callable(fieldMapping): + fieldMapping=appyField.callMethod(self,fieldMapping) + mapping.update(fieldMapping) + # Get the label + label = getattr(appyField, label+'Id') + else: + # It must be a group. + label = '%s_group_%s_%s' % (self.meta_type, field, label) # We will get the translation from a Translation object. # In what language must we get the translation? if not language: language = self.getUserLanguage() diff --git a/pod/renderer.py b/pod/renderer.py index a0e1137..d0a6191 100644 --- a/pod/renderer.py +++ b/pod/renderer.py @@ -239,11 +239,11 @@ class Renderer: return Xhtml2OdtConverter(xhtmlContent, encoding, self.stylesManager, stylesMapping, ns).run() - def renderText(self, text, encoding='utf-8'): + def renderText(self, text, encoding='utf-8', stylesMapping={}): '''Method that can be used (under the name 'text') into a pod template for inserting a text containing carriage returns.''' text = text.replace('\r\n', '
').replace('\n', '
') - return self.renderXhtml(text, encoding) + return self.renderXhtml(text, encoding, stylesMapping) def evalIfExpression(self, condition, ifTrue, ifFalse): '''This method implements the method 'test' which is proposed in the diff --git a/shared/dav.py b/shared/dav.py index 5cc77f5..d71568e 100644 --- a/shared/dav.py +++ b/shared/dav.py @@ -1,5 +1,5 @@ # ------------------------------------------------------------------------------ -import os, re, httplib, sys, stat, urlparse, time, socket +import os, re, httplib, sys, stat, urlparse, time, socket, xml.sax from urllib import quote from StringIO import StringIO from mimetypes import guess_type @@ -87,7 +87,14 @@ class HttpResponse: if self.duration: duration = ', got in %.4f seconds' % self.duration return '' % (self.code, self.text, duration) - xmlHeaders = ('text/xml', 'application/xml') + def extractContentType(self, contentType): + '''Extract the content type from the HTTP header, potentially removing + encoding-related data.''' + i = contentType.find(';') + if i != -1: return contentType[:i] + return contentType + + xmlHeaders = ('text/xml', 'application/xml', 'application/soap+xml') def extractData(self): '''This method extracts, from the various parts of the HTTP response, some useful information. For example, it will find the URI where to @@ -96,12 +103,15 @@ class HttpResponse: if self.code == 302: return urlparse.urlparse(self.headers['location'])[2] elif self.headers.has_key('content-type'): - contentType = self.headers['content-type'] + contentType = self.extractContentType(self.headers['content-type']) for xmlHeader in self.xmlHeaders: if contentType.startswith(xmlHeader): # Return an unmarshalled version of the XML content, for # easy use in Python. - return XmlUnmarshaller().parse(self.body) + try: + return XmlUnmarshaller().parse(self.body) + except xml.sax.SAXParseException, se: + raise ResourceError('Invalid XML response (%s)'%str(se)) # ------------------------------------------------------------------------------ urlRex = re.compile(r'http://([^:/]+)(:[0-9]+)?(/.+)?', re.I)