Skip to content

Commit

Permalink
add outputfilter to enable croppingeditor link on editable images
Browse files Browse the repository at this point in the history
  • Loading branch information
petschki committed Apr 15, 2013
1 parent c0b8954 commit 4b20e6e
Show file tree
Hide file tree
Showing 8 changed files with 98 additions and 12 deletions.
10 changes: 7 additions & 3 deletions src/plone/app/imagecropping/browser/editor.pt
Expand Up @@ -20,8 +20,9 @@

<div class="row"
tal:define="image_field_names view/image_field_names;
multiple_flds python:len(image_field_names) &gt; 1;
scales view/scales;
multiple_flds python:len(image_field_names) &gt; 1;
hide_scales python:bool(request.get('hide_scales'));
current_scale view/current_scale">
<div class="cell width-1:4 position-0"
tal:condition="multiple_flds">
Expand All @@ -46,7 +47,7 @@
</div>

<div class="cell width-1:4"
tal:attributes="class python:'cell width-1:4 position-%s' % (multiple_flds and '1:4' or '0')">
tal:attributes="class python:'cell width-1:4 position-%s%s' % (multiple_flds and '1:4' or '0', hide_scales and ' hiddenStructure' or '')">

<h3 i18n:translate="">Available Image Scales for Field: &quot;<span i18n:name="field_name" tal:content="view/fieldname" tal:omit-tag="">Field Name</span>&quot;</h3>
<ul class="scales visualNoMarker">
Expand All @@ -72,7 +73,7 @@
</div>

<div class="cell width-1:2 position-1:2"
tal:attributes="class python:'cell width-%s position-%s' % (multiple_flds and '1:2' or '3:4', multiple_flds and '1:2' or '1:4')">
tal:attributes="class python:'cell width-%s position-%s' % ((multiple_flds and not hide_scales and '1:2') or (hide_scales and 'full') or '3:4', (multiple_flds and not hide_scales and '1:2') or (hide_scales and '0') or '1:4')">

<form method="post" id="coords" class="coords" tal:attributes="action context_state/current_base_url"
tal:condition="scales">
Expand Down Expand Up @@ -120,6 +121,9 @@
<input type="hidden" name="ajax_load"
tal:condition="ajax_load"
tal:attributes="value ajax_load" />

<input type="hidden" name="hide_scales:boolean"
tal:attributes="value hide_scales" />
</form>

</div>
Expand Down
9 changes: 4 additions & 5 deletions src/plone/app/imagecropping/browser/editor.py
Expand Up @@ -35,12 +35,10 @@ def default_editor_size(self):

@property
def fieldname(self):
if 'fieldname' in self.request.form.keys():
# TODO: check if requested fieldname is available
# in self.image_fields
return self.request.form.get('fieldname')

img_field_names = self.image_field_names()
req_field_name = self.request.get('fieldname')
if req_field_name and req_field_name in img_field_names:
return req_field_name
return len(img_field_names) > 0 and img_field_names[0]

def scales(self, fieldname=None):
Expand All @@ -62,6 +60,7 @@ def scales(self, fieldname=None):
for size in all_sizes:
if constrain_cropping and size not in cropping_for:
continue

scale = dict()
# scale jcrop config
min_width, min_height = self._min_size(image_size, all_sizes[size])
Expand Down
12 changes: 12 additions & 0 deletions src/plone/app/imagecropping/browser/static/editor_overlay.js
@@ -0,0 +1,12 @@
(function($) {
$(function() {
$("a.croppingeditor").prepOverlay({
subtype:'ajax',
formselector:'#coords',
closeselector:"input[name='form.button.Cancel']"
});
$(document).bind("formOverlayLoadSuccess", function() {
imagecropping.init_editor();
})
})
})(jQuery);
18 changes: 17 additions & 1 deletion src/plone/app/imagecropping/configure.zcml
Expand Up @@ -25,7 +25,17 @@
sortkey="1"
profile="plone.app.imagecropping:default"
/>


<genericsetup:upgradeStep
title="Upgrade plone.app.imagecropping to profile 0004"
description="Migrates plone.app.imagecropping upgrade to 0004"
source="0003"
destination="0004"
handler=".setuphandler.migrate0003to0004"
sortkey="1"
profile="plone.app.imagecropping:default"
/>

<genericsetup:registerProfile
name="uninstall"
title="plone.app.imagecropping Uninstallation"
Expand Down Expand Up @@ -65,4 +75,10 @@
<adapter zcml:condition="installed plone.namedfile"
factory=".utils.CroppingUtilsDexterity" />

<!-- outputfilter for cropping editor link -->
<adapter
name="cropping_editor_link"
factory=".outputfilter.CroppingEditorLink"
/>

</configure>
47 changes: 47 additions & 0 deletions src/plone/app/imagecropping/outputfilter.py
@@ -0,0 +1,47 @@
'''
Created on 15.04.2013
@author: peterm
'''
from Products.CMFCore.utils import _checkPermission
from plone.outputfilters.interfaces import IFilter
from zope.component import adapter
from zope.interface import Interface, implementer
from zope.publisher.interfaces import IRequest
import re


img_tag = re.compile(r"<img[^>]*>")
src_attr = re.compile(r'src="([^"]*)"')


@adapter(Interface, IRequest)
@implementer(IFilter)
class CroppingEditorLink(object):

# important, that our order is before
# resolveuid_and_caption filter order=800
# so we can read the scale out of the src attribute
# XXX: there might be a better approach to do this
order = 700

def __init__(self, context, request):
self.context = context
self.request = request

def is_enabled(self):
return _checkPermission("Modify portal content", self.context)

def __call__(self, data):
img_tags = img_tag.findall(data)
for tag in img_tags:
src = src_attr.search(tag).groups(0)
if len(src) > 0:
x, uuid, x, field, scale = src[0].split("/")
editor_link = \
"""<a href="resolveuid/%(uid)s/@@croppingeditor?""" \
"""fieldname=%(field)s&amp;scalename=%(scale)s&amp;""" \
"""hide_scales=1" class="croppingeditor">%(tag)s</a>""" % \
dict(uid=uuid, field=field, scale=scale, tag=tag)
data = data.replace(tag, editor_link)
return data
4 changes: 3 additions & 1 deletion src/plone/app/imagecropping/profiles/default/jsregistry.xml
@@ -1,4 +1,6 @@
<?xml version="1.0"?>
<object name="portal_javascripts">

<javascript id="++resource++plone.app.imagecropping.static/editor_overlay.js"
enabled="1" compression="safe" authenticated="True" cacheable="True"
cookable="True" expression="" inline="False" />
</object>
2 changes: 1 addition & 1 deletion src/plone/app/imagecropping/profiles/default/metadata.xml
@@ -1,4 +1,4 @@
<?xml version="1.0"?>
<metadata>
<version>0003</version>
<version>0004</version>
</metadata>
8 changes: 7 additions & 1 deletion src/plone/app/imagecropping/setuphandler.py
Expand Up @@ -5,7 +5,7 @@
from zope.component import queryUtility
import logging

logger = logging.getLogger('plone.app.imagecropping')
logger = logging.getLogger(PRODUCT_NAME)
PROFILE_ID = 'profile-%s:default' % PRODUCT_NAME


Expand All @@ -23,3 +23,9 @@ def migrate0002to0003(context):
settings.default_cropping_for = []
logger.info('Registry cleanup operation performed')
logger.info('Migrated to profile version 0003')


def migrate0003to0004(context):
setup_tool = getToolByName(context, 'portal_setup')
setup_tool.runImportStepFromProfile(PROFILE_ID, 'jsregistry')
logger.info('Migrated to profile version 0004')

0 comments on commit 4b20e6e

Please sign in to comment.