from Globals import InitializeClass
from OFS.SimpleItem import SimpleItem
from OFS.Folder import Folder
-from OFS.Image import File, cookId
+from OFS.Image import cookId
+from Products.Photo.blobbases import File
from zExceptions import Unauthorized
from zExceptions import BadRequest
from Products.Photo import Photo
from webdav.common import PreconditionFailed
from zope.contenttype import guess_content_type
-
+from libxml2 import HTML_PARSE_RECOVER, HTML_PARSE_NOERROR, HTML_PARSE_NOWARNING
+from libxml2 import htmlReadDoc
+PARSE_OPTIONS = HTML_PARSE_RECOVER + HTML_PARSE_NOERROR + HTML_PARSE_NOWARNING
class AttachmentTool( UniqueObject, SimpleItem):
""" Links attachment objects to contents.
ob.PUT(REQUEST, RESPONSE)
RESPONSE.setStatus(httpRespCode)
RESPONSE.setHeader('Content-Type', 'text/xml;;charset=utf-8')
- if ob.meta_type == 'File' :
+ if ob.meta_type == 'Blob File' :
return '<element id="%s" title="%s"/>' % (ob.getId(), escape(ob.title_or_id()))
elif ob.meta_type == 'Photo' :
width, height = ob.getResizedImageSize(size=(310, 310))
'width' : width,
'height' : height
}
-
+
+ security.declareProtected(ModifyPortalContent, 'removeUnusedAttachments')
+ def removeUnusedAttachments(self, html) :
+ html = '<div>%s</div>' % html
+ doc = htmlReadDoc(html, '', None, PARSE_OPTIONS)
+ used = {}
+
+ hrefs = doc.xpathEval('//a/@href')
+ for href in [a.get_content() for a in hrefs] :
+ if href.startswith('attachments/') :
+ used[href[len('attachments/'):]] = True
+
+ srcs = doc.xpathEval('//img/@src')
+ for src in [a.get_content() for a in srcs] :
+ if src.startswith('attachments/') :
+ parts = src.split('/')
+ if len(parts) >=2 :
+ used[parts[1]] = True
+
+ unused = [id for id in self.objectIds() if not used.has_key(id)]
+ if unused :
+ self.manage_delObjects(unused)
InitializeClass(AttachmentContainer)
\ No newline at end of file
elif change_and_view and \
context.validateTextFile(**form) and \
context.validateHTML(**form) and \
- context.document_edit_control(text=form.get('text'), text_format='html') and \
- context.setRedirect(context, 'object/view', **{'ajax':ajax}):
- return
+ context.document_edit_control(text=form.get('text'), text_format='html') :
+ attachments.removeUnusedAttachments(context.EditableBody())
+ return context.setRedirect(context, 'object/view', **{'ajax':ajax})
options = {}