appy.gen: bugfixes.
This commit is contained in:
parent
6245023365
commit
8cc20b0d34
|
@ -1,5 +1,5 @@
|
|||
'''This package contains functions for sending email notifications.'''
|
||||
import smtplib
|
||||
import smtplib, socket
|
||||
from email.MIMEMultipart import MIMEMultipart
|
||||
from email.MIMEBase import MIMEBase
|
||||
from email.MIMEText import MIMEText
|
||||
|
@ -50,6 +50,8 @@ def sendMail(tool, to, subject, body, attachments=None):
|
|||
if attachments:
|
||||
for fileName, fileContent in attachments:
|
||||
part = MIMEBase('application', 'octet-stream')
|
||||
if fileContent.__class__.__name__ == 'FileWrapper':
|
||||
fileContent = fileContent._zopeFile
|
||||
if hasattr(fileContent, 'data'):
|
||||
# It is a File instance coming from the database
|
||||
data = fileContent.data
|
||||
|
@ -87,6 +89,8 @@ def sendMail(tool, to, subject, body, attachments=None):
|
|||
type='warning')
|
||||
except smtplib.SMTPException, e:
|
||||
tool.log('Mail sending failed: %s' % str(e), type='error')
|
||||
except socket.error, se:
|
||||
tool.log('Mail sending failed: %s' % str(se), type='error')
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
def sendNotification(obj, transition, transitionName, workflow):
|
||||
|
|
|
@ -223,6 +223,7 @@ class Tool(ModelClass):
|
|||
|
||||
# Tool attributes
|
||||
def isManager(self): pass
|
||||
def isManagerEdit(self): pass
|
||||
title = gen.String(show=False, page=gen.Page('main', show=False))
|
||||
mailHost = gen.String(default='localhost:25')
|
||||
mailEnabled = gen.Boolean(default=False)
|
||||
|
@ -249,7 +250,7 @@ class Tool(ModelClass):
|
|||
page=gen.Page('pages', show=isManager))
|
||||
|
||||
# Document generation page
|
||||
dgp = {'page': gen.Page('documentGeneration', show=isManager)}
|
||||
dgp = {'page': gen.Page('documentGeneration', show=isManagerEdit)}
|
||||
def validPythonWithUno(self, value): pass # Real method in the wrapper
|
||||
unoEnabledPython = gen.String(show=False,validator=validPythonWithUno,**dgp)
|
||||
openOfficePort = gen.Integer(default=2002, show=False, **dgp)
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html metal:define-macro="main"
|
||||
tal:define="user tool/getUser;
|
||||
isAnon tool/userIsAnon;
|
||||
|
@ -8,7 +9,7 @@
|
|||
_ python: tool.translate;
|
||||
req python: request;
|
||||
resp req/RESPONSE;
|
||||
x python: resp.setHeader('Content-Type', 'text/html;;charset=UTF-8');
|
||||
x python: resp.setHeader('Content-type', 'text/html;;charset=UTF-8');
|
||||
x python: resp.setHeader('Expires', 'Thu, 11 Dec 1975 12:05:00 GMT+2');
|
||||
x python: resp.setHeader('Content-Language', req.get('language', 'en'))">
|
||||
|
||||
|
|
|
@ -34,6 +34,10 @@ class ToolWrapper(AbstractWrapper):
|
|||
'''Some pages on the tool can only be accessed by God.'''
|
||||
if self.user.has_role('Manager'): return 'view'
|
||||
|
||||
def isManagerEdit(self):
|
||||
'''Some pages on the tool can only be accessed by God, also in edit.'''
|
||||
if self.user.has_role('Manager'): return True
|
||||
|
||||
podOutputFormats = ('odt', 'pdf', 'doc', 'rtf')
|
||||
def getPodOutputFormats(self):
|
||||
'''Gets the available output formats for POD documents.'''
|
||||
|
@ -54,7 +58,11 @@ class ToolWrapper(AbstractWrapper):
|
|||
|
||||
def getDiskFolder(self):
|
||||
'''Returns the disk folder where the Appy application is stored.'''
|
||||
return self.o.getProductConfig().diskFolder
|
||||
return self.o.config.diskFolder
|
||||
|
||||
def getClass(self, zopeName):
|
||||
'''Gets the Appy class corresponding to technical p_zopeName.'''
|
||||
return self.o.getAppyClass(zopeName)
|
||||
|
||||
def getAttributeName(self, attributeType, klass, attrName=None):
|
||||
'''Some names of Tool attributes are not easy to guess. For example,
|
||||
|
|
|
@ -281,23 +281,20 @@ def cleanXhtml(s, keepStyles=False):
|
|||
return s
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
toLower = {'Ç':'ç','Ù':'ù','Û':'û','Ü':'ü','Î':'î','Ï':'ï','Ô':'ô','Ö':'ö',
|
||||
'É':'é','È':'è','Ê':'ê','Ë':'ë','À':'à','Â':'â','Ä':'ä'}
|
||||
toUpper = {'ç':'Ç','ù':'Ù','û':'Û','ü':'Ü','î':'Î','ï':'Ï','ô':'Ô','ö':'Ö',
|
||||
'é':'É','è':'È','ê':'Ê','ë':'Ë','à':'À','â':'Â','ä':'Ä'}
|
||||
|
||||
def lower(s):
|
||||
'''French-accents-aware variant of string.lower.'''
|
||||
isUnicode = isinstance(s, unicode)
|
||||
if not isUnicode: s = s.decode('utf-8')
|
||||
res = s.lower()
|
||||
for upp, low in toLower.iteritems():
|
||||
if upp in res: res = res.replace(upp, low)
|
||||
if not isUnicode: res = res.encode('utf-8')
|
||||
return res
|
||||
|
||||
def upper(s):
|
||||
'''French-accents-aware variant of string.upper.'''
|
||||
isUnicode = isinstance(s, unicode)
|
||||
if not isUnicode: s = s.decode('utf-8')
|
||||
res = s.upper()
|
||||
for low, upp in toUpper.iteritems():
|
||||
if low in res: res = res.replace(low, upp)
|
||||
if not isUnicode: res = res.encode('utf-8')
|
||||
return res
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
|
|
Loading…
Reference in a new issue