[Checkins] SVN: z3c.imagewidget/trunk/src/z3c/imagewidget/ The edit form writes it's data to the session instead of applying it directly

Jürgen Kartnaller juergen at kartnaller.at
Wed Jan 3 12:56:49 EST 2007


Log message for revision 71702:
  The edit form writes it's data to the session instead of applying it directly
  to the context. This must be done by the form.
  
  Also fixed browser caching problems by providing a timestamp for the image
  URL.
  

Changed:
  U   z3c.imagewidget/trunk/src/z3c/imagewidget/README.txt
  U   z3c.imagewidget/trunk/src/z3c/imagewidget/form.py
  U   z3c.imagewidget/trunk/src/z3c/imagewidget/tests.py

-=-
Modified: z3c.imagewidget/trunk/src/z3c/imagewidget/README.txt
===================================================================
--- z3c.imagewidget/trunk/src/z3c/imagewidget/README.txt	2007-01-03 16:21:02 UTC (rev 71701)
+++ z3c.imagewidget/trunk/src/z3c/imagewidget/README.txt	2007-01-03 17:56:48 UTC (rev 71702)
@@ -64,7 +64,7 @@
 You can also generate the URL for the image for display:
 
   >>> editForm.imageURL
-  u'.../++session++z3c.sessionwidget.SessionInputWidget/field.img/++item++data/'
+  u'.../++session++z3c.sessionwidget.SessionInputWidget/field.img/++item++data?ts=0'
 
 When uploading an empty image, the image is set to None:
 
@@ -190,7 +190,7 @@
   >>> editForm.status
   ''
 
-So let us define som other data.
+So let us define some other data.
 
   >>> editForm.handle_edit_action.success({'data': '%PNG...'})
   >>> editForm.status
@@ -202,11 +202,12 @@
   >>> imgWidget.session['data'].getImageSize()
   (-1, -1)
 
-We now send our flower image again. Whis is stell larger than 100, 100
+We now send our flower image again. Which is still larger than 100, 100
 of course.
 
   >>> image.getImageSize()
   (103, 118)
+  >>> editForm.status = ''
   >>> editForm.handle_edit_action.success({'data': image.data})
   >>> editForm.status
   u'Image updated.'
@@ -215,5 +216,4 @@
 
   >>> imgWidget.session['data'].getImageSize()
   (87, 100)
-  
 

Modified: z3c.imagewidget/trunk/src/z3c/imagewidget/form.py
===================================================================
--- z3c.imagewidget/trunk/src/z3c/imagewidget/form.py	2007-01-03 16:21:02 UTC (rev 71701)
+++ z3c.imagewidget/trunk/src/z3c/imagewidget/form.py	2007-01-03 17:56:48 UTC (rev 71702)
@@ -16,9 +16,17 @@
 $Id$
 """
 __docformat__ = "reStructuredText"
+
+import time
+
+from zope import event
+
 from zope.formlib import form
 from zope.publisher.browser import BrowserPage
 from zope.traversing.browser.absoluteurl import absoluteURL
+from zope.lifecycleevent import ObjectCreatedEvent
+from zope.dublincore.interfaces import IZopeDublinCore
+
 from zope.app.component import hooks
 from zope.app.file.interfaces import IImage
 from zope.app.file.image import Image
@@ -74,8 +82,8 @@
                                 self.context.width,
                                 self.context.height)
             image = Image(imagedata)
+            event.notify(ObjectCreatedEvent(image))
             self.context.session['data'] = image
-            #self.context.setRenderedValue(image)
             self.context.session['changed'] = True
 
 
@@ -99,19 +107,28 @@
         if data['data'] == '':
             self.widget.session['data'] = None
         else:
-            data['data'] = _resize(data['data'],
-                                   self.widget.width,
-                                   self.widget.height)
-            if form.applyChanges(
-                self.context, self.form_fields, data, self.adapters):
+            imagedata = _resize(data['data'],
+                                self.widget.width,
+                                self.widget.height)
+            sessionImg = self.widget.session['data']
+            if sessionImg is None or imagedata != sessionImg.data:
+                image = Image(imagedata)
+                event.notify(ObjectCreatedEvent(image))
+                self.widget.session['data'] = image
                 self.status = _('Image updated.')
         self.widget.session['changed'] = True
 
     @property
     def imageURL(self):
         baseURL = absoluteURL(hooks.getSite(), self.request)
-        return baseURL + '/++session++%s/%s/++item++data/' %(
-            SESSION_KEY, self.widget.name)
+        # we add a timestamp to the url to make sure the image is not cached
+        modified = IZopeDublinCore(self.widget.session['data']).modified
+        if modified is not None:
+            lmt = long(time.mktime(modified.timetuple()))
+        else:
+            lmt = 0
+        return baseURL + '/++session++%s/%s/++item++data?ts=%s' %(
+            SESSION_KEY, self.widget.name, lmt)
 
 
 class ImageSessionWidgetForm(BrowserPage):

Modified: z3c.imagewidget/trunk/src/z3c/imagewidget/tests.py
===================================================================
--- z3c.imagewidget/trunk/src/z3c/imagewidget/tests.py	2007-01-03 16:21:02 UTC (rev 71701)
+++ z3c.imagewidget/trunk/src/z3c/imagewidget/tests.py	2007-01-03 17:56:48 UTC (rev 71702)
@@ -25,10 +25,16 @@
 from zope.app.session.http import CookieClientIdManager
 from zope.publisher.interfaces import IRequest
 from zope.testing.doctestunit import DocFileSuite
+from zope.dublincore.testing import setUpDublinCore
 from z3c.image.proc.adapter import ProcessableImage
+from zope.annotation.interfaces import IAttributeAnnotatable
+from zope.app.file.image import Image
 
+
 def setUp(test):
     setup.placefulSetUp()
+    setUpDublinCore()
+    zope.interface.classImplements(Image, IAttributeAnnotatable)
     zope.component.provideAdapter(
         session.ClientId, (IRequest,), interfaces.IClientId)
     zope.component.provideAdapter(



More information about the Checkins mailing list