Skip to content

Commit

Permalink
Merge pull request #24 from plone/scale-factories
Browse files Browse the repository at this point in the history
use latest plone.scale scaling factories
  • Loading branch information
agitator committed May 12, 2016
2 parents fe13ac8 + a7c7d91 commit a9a0904
Show file tree
Hide file tree
Showing 17 changed files with 687 additions and 543 deletions.
22 changes: 18 additions & 4 deletions CHANGES.rst
Original file line number Diff line number Diff line change
@@ -1,20 +1,34 @@
Changelog
=========

3.0.9 (unreleased)
4.0.0 (unreleased)
------------------

Incompatibilities:

- *add item here*
- Targets Plone 5.1 only, coredev 5.0 and 4.3 are on 3.0.x branch [jensens]:

- ``plone.supermodel``, ``plone.scale`` and ``plone.schemaeditor`` are now hard depedencies.
The extras in setup.py are kept for bbb reasons, but are empty.
Conditional code is now no longer conditional.
This simplifies the code a lot.

- ``zope.app.file`` is no longer hard dependency.
If it is there, its FileChunk implementation is still checked for, otherwise not.


New:

- *add item here*
- uses adapter as factory for scales as in plone.scale>=1.5
[jensens]

Fixes:

- *add item here*
- Fixed test setup to use layers properly.
[jensens]

- Fixed test isolation problem in ``test_blobfile.py``.
[jensens]


3.0.8 (2016-02-26)
Expand Down
8 changes: 4 additions & 4 deletions plone/namedfile/configure.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@
/>

<include file="z3c-blobfile.zcml" />
<include zcml:condition="installed plone.supermodel" file="handler.zcml" />
<include zcml:condition="installed plone.rfc822" file="marshaler.zcml" />
<include zcml:condition="installed plone.schemaeditor" file="editor.zcml" />
<include zcml:condition="installed plone.scale" file="scaling.zcml" />
<include file="handler.zcml" />
<include file="marshaler.zcml" />
<include file="scaling.zcml" />
<include file="editor.zcml" />

</configure>
31 changes: 13 additions & 18 deletions plone/namedfile/handler.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,18 @@
# -*- coding: utf-8 -*-
try:
from plone.supermodel.exportimport import ObjectHandler
HAVE_SUPERMODEL = True
except ImportError:
HAVE_SUPERMODEL = False
from plone.supermodel.exportimport import ObjectHandler
from plone.namedfile import field

if HAVE_SUPERMODEL:
from plone.namedfile import field

class FileFieldHandler(ObjectHandler):
filteredAttributes = ObjectHandler.filteredAttributes.copy()
filteredAttributes.update({
'default': 'rw',
'missing_value': 'rw',
'schema': 'rw'
})
class FileFieldHandler(ObjectHandler):
filteredAttributes = ObjectHandler.filteredAttributes.copy()
filteredAttributes.update({
'default': 'rw',
'missing_value': 'rw',
'schema': 'rw'
})

NamedFileHandler = FileFieldHandler(field.NamedFile)
NamedImageHandler = FileFieldHandler(field.NamedImage)
NamedFileHandler = FileFieldHandler(field.NamedFile)
NamedImageHandler = FileFieldHandler(field.NamedImage)

NamedBlobFileHandler = FileFieldHandler(field.NamedBlobFile)
NamedBlobImageHandler = FileFieldHandler(field.NamedBlobImage)
NamedBlobFileHandler = FileFieldHandler(field.NamedBlobFile)
NamedBlobImageHandler = FileFieldHandler(field.NamedBlobImage)
182 changes: 90 additions & 92 deletions plone/namedfile/marshaler.py
Original file line number Diff line number Diff line change
@@ -1,100 +1,98 @@
# -*- coding: utf-8 -*-
try:
from plone.rfc822.defaultfields import BaseFieldMarshaler
HAVE_MARSHALER = True
except ImportError:
HAVE_MARSHALER = False

if HAVE_MARSHALER:

from email.Encoders import encode_base64
from plone.namedfile import NamedBlobFile
from plone.namedfile import NamedBlobImage
from plone.namedfile import NamedFile
from plone.namedfile import NamedImage
from plone.namedfile.interfaces import INamedBlobFileField
from plone.namedfile.interfaces import INamedBlobImageField
from plone.namedfile.interfaces import INamedFileField
from plone.namedfile.interfaces import INamedImageField
from zope.component import adapter
from zope.interface import Interface

class BaseNamedFileFieldMarshaler(BaseFieldMarshaler):
"""Base marshaler for plone.namedfile values. Actual adapters are
registered as subclasses.
"""
from email.Encoders import encode_base64
from plone.namedfile import NamedBlobFile
from plone.namedfile import NamedBlobImage
from plone.namedfile import NamedFile
from plone.namedfile import NamedImage
from plone.namedfile.interfaces import INamedBlobFileField
from plone.namedfile.interfaces import INamedBlobImageField
from plone.namedfile.interfaces import INamedFileField
from plone.namedfile.interfaces import INamedImageField
from plone.rfc822.defaultfields import BaseFieldMarshaler
from zope.component import adapter
from zope.interface import Interface


class BaseNamedFileFieldMarshaler(BaseFieldMarshaler):
"""Base marshaler for plone.namedfile values. Actual adapters are
registered as subclasses.
"""

ascii = False
factory = None

def encode(self, value, charset='utf-8', primary=False):
# we only support encoding a file value in the body of a message,
# never in a header
if not primary:
raise ValueError(
'File fields can only be marshaled as primary fields')
if value is None:
return None
return value.data

def decode(
self,
value,
message=None,
charset='utf-8',
contentType=None,
primary=False):
filename = None
if primary and message is not None:
filename = message.get_filename(None)
return self.factory(value, contentType or '', filename)

def getContentType(self):
value = self._query()
if value is None:
return None
return value.contentType

def getCharset(self, default='utf-8'):
ascii = False
factory = None

def encode(self, value, charset='utf-8', primary=False):
# we only support encoding a file value in the body of a message,
# never in a header
if not primary:
raise ValueError(
'File fields can only be marshaled as primary fields')
if value is None:
return None
return value.data

def postProcessMessage(self, message):
"""Encode message as base64 and set content disposition
"""
value = self._query()
if value is not None:
filename = value.filename
if filename:
message.add_header('Content-Disposition', 'attachment')
message.set_param(
'filename',
filename.encode('utf-8'),
header='Content-Disposition',
charset='utf-8'
)

encode_base64(message)

@adapter(Interface, INamedFileField)
class NamedFileFieldMarshaler(BaseNamedFileFieldMarshaler):
"""Marshaler for an INamedFile field
"""
factory = NamedFile
def decode(
self,
value,
message=None,
charset='utf-8',
contentType=None,
primary=False):
filename = None
if primary and message is not None:
filename = message.get_filename(None)
return self.factory(value, contentType or '', filename)

@adapter(Interface, INamedImageField)
class NamedImageFieldMarshaler(BaseNamedFileFieldMarshaler):
"""Marshaler for an INamedImage field
"""
factory = NamedImage
def getContentType(self):
value = self._query()
if value is None:
return None
return value.contentType

@adapter(Interface, INamedBlobFileField)
class NamedBlobFileFieldMarshaler(BaseNamedFileFieldMarshaler):
"""Marshaler for an INamedBlobFile field
"""
factory = NamedBlobFile
def getCharset(self, default='utf-8'):
return None

@adapter(Interface, INamedBlobImageField)
class NamedBlobImageFieldMarshaler(BaseNamedFileFieldMarshaler):
"""Marshaler for an INamedBlobImage field
def postProcessMessage(self, message):
"""Encode message as base64 and set content disposition
"""
factory = NamedBlobImage
value = self._query()
if value is not None:
filename = value.filename
if filename:
message.add_header('Content-Disposition', 'attachment')
message.set_param(
'filename',
filename.encode('utf-8'),
header='Content-Disposition',
charset='utf-8'
)

encode_base64(message)


@adapter(Interface, INamedFileField)
class NamedFileFieldMarshaler(BaseNamedFileFieldMarshaler):
"""Marshaler for an INamedFile field
"""
factory = NamedFile


@adapter(Interface, INamedImageField)
class NamedImageFieldMarshaler(BaseNamedFileFieldMarshaler):
"""Marshaler for an INamedImage field
"""
factory = NamedImage


@adapter(Interface, INamedBlobFileField)
class NamedBlobFileFieldMarshaler(BaseNamedFileFieldMarshaler):
"""Marshaler for an INamedBlobFile field
"""
factory = NamedBlobFile


@adapter(Interface, INamedBlobImageField)
class NamedBlobImageFieldMarshaler(BaseNamedFileFieldMarshaler):
"""Marshaler for an INamedBlobImage field
"""
factory = NamedBlobImage
Loading

0 comments on commit a9a0904

Please sign in to comment.