Skip to content

Commit

Permalink
Merge pull request #6 from abstract-open-solutions/master
Browse files Browse the repository at this point in the history
Some fixes and added italian translation
  • Loading branch information
kroman0 committed Jun 4, 2014
2 parents ee42807 + 985401c commit 448e99e
Show file tree
Hide file tree
Showing 7 changed files with 887 additions and 29 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,5 @@
/docs/html
/docs/Makefile
/docs/make.bat
*.mo
/dist
9 changes: 8 additions & 1 deletion CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,11 @@ Changelog
1.0a1 (unreleased)
-------------------

- Initial release
- Fix unicode encoding in download csv
[gborelli]

- Added Italian translation
[gborelli]

- Added fields parameter in Mailer override expressions
[gborelli]
4 changes: 4 additions & 0 deletions MANIFEST.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
recursive-include collective *
recursive-include docs *
include *
global-exclude *.pyc
110 changes: 82 additions & 28 deletions collective/easyform/actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
from email.utils import formataddr
from logging import getLogger
from plone.namedfile.interfaces import INamedFile
from plone.namedfile.interfaces import INamedBlobFile
from plone.supermodel.exportimport import BaseHandler
from time import time
from types import StringTypes
Expand Down Expand Up @@ -90,6 +91,13 @@ def onSuccess(self, fields, request):
raise NotImplementedError(
"There is not implemented 'onSuccess' of {0!r}".format(self))

def _is_file_data(self, value):
ifaces = (INamedFile, INamedBlobFile)
for i in ifaces:
if i.providedBy(value):
return True
return False


class Mailer(Action):
implements(IMailer)
Expand Down Expand Up @@ -125,6 +133,7 @@ def _destFormat(self, input):
else:
return ''


def get_mail_body(self, fields, request, context):
"""Returns the mail-body with footer.
"""
Expand All @@ -134,15 +143,19 @@ def get_mail_body(self, fields, request, context):
# TODO
# if not (f.isLabel() or f.isFileField()) and not (getattr(self,
# 'showAll', True) and f.getServerSide())]
if not (INamedFile.providedBy(fields[f])) and not (getattr(self, 'showAll', True) and IFieldExtender(schema[f]).serverSide)
if not (self._is_file_data(fields[f])) and not (getattr(self, 'showAll', True) and IFieldExtender(schema[f]).serverSide)
]

# which fields should we show?
if getattr(self, 'showAll', True):
live_fields = all_fields
else:
showFields = getattr(self, 'showFields', [])
if showFields is None:
showFields = []

live_fields = [
f for f in all_fields if f in getattr(self, 'showFields', ())]
f for f in all_fields if f in showFields]

if not getattr(self, 'includeEmpties', True):
all_fields = live_fields
Expand Down Expand Up @@ -200,21 +213,32 @@ def get_addresses(self, fields, request, context, from_addr=None, to_addr=None):
reply_addr = fields.get(self.replyto_field, None)

# Get From address
if hasattr(self, 'senderOverride') and self.senderOverride and get_expression(context, self.senderOverride):
from_addr = get_expression(context, self.senderOverride).strip()
else:
from_addr = from_addr or site_props.getProperty('email_from_address') or \
portal.getProperty('email_from_address')
from_addr = (
from_addr or
site_props.getProperty('email_from_address') or
portal.getProperty('email_from_address')
)

if hasattr(self, 'senderOverride') and self.senderOverride:
_from = get_expression(context, self.senderOverride, fields=fields)
if _from:
from_addr = _from

# Get To address and full name
if hasattr(self, 'recipientOverride') and self.recipientOverride and get_expression(context, self.recipientOverride):
recip_email = get_expression(context, self.recipientOverride)
else:
recip_email = None
if hasattr(self, 'to_field') and self.to_field:
recip_email = fields.get(self.to_field, None)
if not recip_email:
recip_email = self.recipient_email
recip_email = None
if hasattr(self, 'to_field') and self.to_field:
recip_email = fields.get(self.to_field, None)
if not recip_email:
recip_email = self.recipient_email

if hasattr(self, 'recipientOverride') and self.recipientOverride:
_recip = get_expression(
context,
self.recipientOverride,
fields=fields
)
if _recip:
recip_email = _recip

recip_email = self._destFormat(recip_email)

Expand Down Expand Up @@ -251,10 +275,16 @@ def get_subject(self, fields, request, context):
"""
# get subject header
nosubject = '(no subject)'
if hasattr(self, 'subjectOverride') and self.subjectOverride and get_expression(context, self.subjectOverride):
subject = None
if hasattr(self, 'subjectOverride') and self.subjectOverride:
# subject has a TALES override
subject = get_expression(context, self.subjectOverride).strip()
else:
subject = get_expression(
context,
self.subjectOverride,
fields=fields
).strip()

if not subject:
subject = getattr(self, 'msg_subject', nosubject)
subjectField = fields.get(self.subject_field, None)
if subjectField is not None:
Expand Down Expand Up @@ -301,15 +331,21 @@ def get_header_info(self, fields, request, context,

# CC
cc_recips = filter(None, self.cc_recipients)
if hasattr(self, 'ccOverride') and self.ccOverride and get_expression(context, self.ccOverride):
cc_recips = get_expression(context, self.ccOverride)
if hasattr(self, 'ccOverride') and self.ccOverride:
_cc = get_expression(context, self.ccOverride, fields=fields)
if _cc:
cc_recips = _cc

if cc_recips:
headerinfo['Cc'] = self._destFormat(cc_recips)

# BCC
bcc_recips = filter(None, self.bcc_recipients)
if hasattr(self, 'bccOverride') and self.bccOverride and get_expression(context, self.bccOverride):
bcc_recips = get_expression(context, self.bccOverride)
if hasattr(self, 'bccOverride') and self.bccOverride:
_bcc = get_expression(context, self.bccOverride, fields=fields)
if _bcc:
bcc_recips = _bcc

if bcc_recips:
headerinfo['Bcc'] = self._destFormat(bcc_recips)

Expand All @@ -327,7 +363,9 @@ def get_attachments(self, fields, request):

for fname in fields:
field = fields[fname]
if INamedFile.providedBy(field) and (getattr(self, 'showAll', True) or fname in getattr(self, 'showFields', ())):
showFields = getattr(self, 'showFields', []) or []

if self._is_file_data(field) and (getattr(self, 'showAll', True) or fname in showFields):
data = field.data
filename = field.filename
mimetype, enc = guess_content_type(filename, data, None)
Expand Down Expand Up @@ -519,13 +557,24 @@ def getSavedFormInputForEdit(self, header=False, delimiter=','):
sbuf = StringIO()
writer = csvwriter(sbuf, delimiter=delimiter)
names = self.getColumnNames()
titles = self.getColumnTitles()

if header:
writer.writerow(names)
encoded_titles = []
for t in titles:
if isinstance(t, unicode):
t = t.encode('utf-8')
encoded_titles.append(t)
writer.writerow(encoded_titles)
for row in self.getSavedFormInput():
writer.writerow([
row[i].filename if INamedFile.providedBy(
row.get(i, '')) else row.get(i, '')
for i in names])
def get_data(row, i):
data = row.get(i, '')
if self._is_file_data(data):
return data.filename
if isinstance(data, unicode):
return data.encode('utf-8')
return data
writer.writerow([get_data(row, i) for i in names])
res = sbuf.getvalue()
sbuf.close()
return res
Expand All @@ -534,6 +583,8 @@ def getColumnNames(self):
# """Returns a list of column names"""
context = get_context(self)
showFields = getattr(self, 'showFields', [])
if showFields is None:
showFields = []
names = [
name
for name, field in getFieldsInOrder(get_fields(context))
Expand All @@ -548,6 +599,9 @@ def getColumnTitles(self):
# """Returns a list of column titles"""
context = get_context(self)
showFields = getattr(self, 'showFields', [])
if showFields is None:
showFields = []

names = [
field.title
for name, field in getFieldsInOrder(get_fields(context))
Expand Down
5 changes: 5 additions & 0 deletions collective/easyform/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@ def get_expression(context, expression_string, **kwargs):
:param dict kwargs: additional arguments for expression
:returns: result of TALES expression
"""
if isinstance(expression_string, unicode):
expression_string = expression_string.encode('utf-8')

expression_context = getExprContext(context, context)
for key in kwargs:
expression_context.setGlobal(key, kwargs[key])
Expand All @@ -88,6 +91,8 @@ def get_context(field):

def get_fields_cache(method, context):
data = context.fields_model + str(context.modification_date)
if isinstance(data, unicode):
data = data.encode('utf-8')
return md5(data).hexdigest()


Expand Down
Loading

0 comments on commit 448e99e

Please sign in to comment.