Skip to content

Instantly share code, notes, and snippets.

@tomgross
Created August 30, 2017 06:18
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tomgross/bb6d741c032207b22bcbf1e936ae18ee to your computer and use it in GitHub Desktop.
Save tomgross/bb6d741c032207b22bcbf1e936ae18ee to your computer and use it in GitHub Desktop.
# -*- coding: utf-8 -*-
from plone import api
from plone.behavior.interfaces import IBehaviorAssignable
from plone.dexterity.interfaces import IDexterityFTI
from plone.dexterity.interfaces import IDexteritySchema
from plone.namedfile.interfaces import INamedBlobFileField
from plone.namedfile.interfaces import INamedImageField
from z3c.caching.interfaces import IPurgePaths
from zope.component import adapter
from zope.component import getUtility
from zope.interface import implementer
from zope.schema import getFieldsInOrder
@implementer(IPurgePaths)
@adapter(IDexteritySchema)
class ContentPurgePaths(object):
"""Paths to purge for Dexterity object fields
"""
def __init__(self, context):
self.context = context
def getScales(self):
reg_list = api.portal.get_registry_record('plone.allowed_sizes')
sizes = [i.split(' ', 1)[0] for i in reg_list]
sizes.append('download')
return sizes
def getRelativePaths(self):
prefix = '/' + self.context.virtual_url_path()
def fieldFilter():
portal_type = self.context.getPortalTypeName()
fti = getUtility(IDexterityFTI, name=portal_type)
schema = fti.lookupSchema()
fields = getFieldsInOrder(schema)
assignable = IBehaviorAssignable(self.context, None)
for behavior in assignable.enumerateBehaviors():
if behavior.marker:
new_fields = getFieldsInOrder(behavior.marker)
if len(new_fields) > 0:
fields = fields + new_fields
obj_fields = []
for key, value in fields:
is_image = INamedImageField.providedBy(value)
is_file = INamedBlobFileField.providedBy(value)
if is_image or is_file:
obj_fields.append(value)
return obj_fields
for item in fieldFilter():
field = item.getName()
value = item.get(self.context)
if not value:
continue
if INamedImageField.providedBy(item):
for size in self.getScales():
yield '{0}/@@images/{1}/{2}'.format(prefix, field, size,)
yield '{0}/@@download/{1}'.format(prefix, field)
else:
filename = value.filename
if isinstance(filename, unicode):
filename = filename.encode('utf-8')
yield '{0}/@@download/{1}/{2}'.format(prefix, field, filename)
def getAbsolutePaths(self):
return []
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment