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.
This commit is contained in:
parent
36237c3ee5
commit
4e848ce0a8
|
@ -1210,15 +1210,20 @@ class BaseMixin:
|
||||||
if field:
|
if field:
|
||||||
# Maybe we do not have the field itself, but only its name
|
# Maybe we do not have the field itself, but only its name
|
||||||
if isinstance(field, basestring):
|
if isinstance(field, basestring):
|
||||||
field = self.getAppyType(field, className=className)
|
appyField = self.getAppyType(field, className=className)
|
||||||
# Include field-specific mapping if any.
|
else:
|
||||||
fieldMapping = field.mapping[label]
|
appyField = field
|
||||||
|
if appyField:
|
||||||
|
fieldMapping = appyField.mapping[label]
|
||||||
if fieldMapping:
|
if fieldMapping:
|
||||||
if callable(fieldMapping):
|
if callable(fieldMapping):
|
||||||
fieldMapping = field.callMethod(self, fieldMapping)
|
fieldMapping=appyField.callMethod(self,fieldMapping)
|
||||||
mapping.update(fieldMapping)
|
mapping.update(fieldMapping)
|
||||||
# Get the label
|
# Get the label
|
||||||
label = getattr(field, label+'Id')
|
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.
|
# We will get the translation from a Translation object.
|
||||||
# In what language must we get the translation?
|
# In what language must we get the translation?
|
||||||
if not language: language = self.getUserLanguage()
|
if not language: language = self.getUserLanguage()
|
||||||
|
|
|
@ -239,11 +239,11 @@ class Renderer:
|
||||||
return Xhtml2OdtConverter(xhtmlContent, encoding, self.stylesManager,
|
return Xhtml2OdtConverter(xhtmlContent, encoding, self.stylesManager,
|
||||||
stylesMapping, ns).run()
|
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
|
'''Method that can be used (under the name 'text') into a pod template
|
||||||
for inserting a text containing carriage returns.'''
|
for inserting a text containing carriage returns.'''
|
||||||
text = text.replace('\r\n', '<br/>').replace('\n', '<br/>')
|
text = text.replace('\r\n', '<br/>').replace('\n', '<br/>')
|
||||||
return self.renderXhtml(text, encoding)
|
return self.renderXhtml(text, encoding, stylesMapping)
|
||||||
|
|
||||||
def evalIfExpression(self, condition, ifTrue, ifFalse):
|
def evalIfExpression(self, condition, ifTrue, ifFalse):
|
||||||
'''This method implements the method 'test' which is proposed in the
|
'''This method implements the method 'test' which is proposed in the
|
||||||
|
|
|
@ -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 urllib import quote
|
||||||
from StringIO import StringIO
|
from StringIO import StringIO
|
||||||
from mimetypes import guess_type
|
from mimetypes import guess_type
|
||||||
|
@ -87,7 +87,14 @@ class HttpResponse:
|
||||||
if self.duration: duration = ', got in %.4f seconds' % self.duration
|
if self.duration: duration = ', got in %.4f seconds' % self.duration
|
||||||
return '<HttpResponse %s (%s)%s>' % (self.code, self.text, duration)
|
return '<HttpResponse %s (%s)%s>' % (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):
|
def extractData(self):
|
||||||
'''This method extracts, from the various parts of the HTTP response,
|
'''This method extracts, from the various parts of the HTTP response,
|
||||||
some useful information. For example, it will find the URI where to
|
some useful information. For example, it will find the URI where to
|
||||||
|
@ -96,12 +103,15 @@ class HttpResponse:
|
||||||
if self.code == 302:
|
if self.code == 302:
|
||||||
return urlparse.urlparse(self.headers['location'])[2]
|
return urlparse.urlparse(self.headers['location'])[2]
|
||||||
elif self.headers.has_key('content-type'):
|
elif self.headers.has_key('content-type'):
|
||||||
contentType = self.headers['content-type']
|
contentType = self.extractContentType(self.headers['content-type'])
|
||||||
for xmlHeader in self.xmlHeaders:
|
for xmlHeader in self.xmlHeaders:
|
||||||
if contentType.startswith(xmlHeader):
|
if contentType.startswith(xmlHeader):
|
||||||
# Return an unmarshalled version of the XML content, for
|
# Return an unmarshalled version of the XML content, for
|
||||||
# easy use in Python.
|
# easy use in Python.
|
||||||
|
try:
|
||||||
return XmlUnmarshaller().parse(self.body)
|
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)
|
urlRex = re.compile(r'http://([^:/]+)(:[0-9]+)?(/.+)?', re.I)
|
||||||
|
|
Loading…
Reference in a new issue