def test_attribute_deletion(self): self.folder.invokeFactory('Document', 'd1') target = self.folder['d1'] target.title = u'Old title' target.description = u'Old description' draft = Draft() draft.someAttribute = 1 draft.description = u'New description' proxy = DraftProxy(draft, target) del proxy.someAttribute del proxy.title del proxy.description self.assertEqual( set(['someAttribute', 'title', 'description']), draft._proxyDeleted ) self.assertFalse(hasattr(draft, 'someAttribute')) self.assertFalse(hasattr(draft, 'title')) self.assertFalse(hasattr(draft, 'description')) self.assertFalse(hasattr(proxy, 'someAttribute')) self.assertFalse(hasattr(proxy, 'title')) self.assertFalse(hasattr(proxy, 'description')) self.assertEqual(u'Old title', target.title) self.assertEqual(u'Old description', target.description)
def draftingTileDataContext(context, request, tile): """If we are drafting a content item, record tile data information to the draft, but read existing data from the underlying object. """ # When drafted content with tiles is saved, IDrafting is provided if IDrafting.providedBy(request): if request.method == 'POST': draft = getCurrentDraft(request, create=True) else: draft = getCurrentDraft(request, create=False) if draft is None: return context # When tile is previewed during drafted content is edited, heuristics... else: # Manually configure draft user id, if we are still in traverse if getattr(request, 'PUBLISHED', None) is None: IAnnotations(request)[USERID_KEY] = request.cookies.get(USERID_KEY) # No active draft for the request draft = getCurrentDraft(request) if draft is None: return context # Not referring from an edit form referrer = request.get('HTTP_REFERER', '') path = urlparse(referrer).path if all((not path.endswith('/edit'), not path.endswith('/@@edit'), not path.split('/')[-1].startswith('++add++'))): return context ICurrentDraftManagement(request).mark() return DraftProxy(draft, context)
def test_annotations(self): self.folder.invokeFactory('Document', 'd1') target = self.folder['d1'] targetAnnotations = IAnnotations(target) targetAnnotations[u'test.key'] = 123 targetAnnotations[u'other.key'] = 456 draft = Draft() draftAnnotations = IAnnotations(draft) draftAnnotations[u'some.key'] = 234 proxy = DraftProxy(draft, target) proxyAnnotations = IAnnotations(proxy) self.assertEqual(123, proxyAnnotations[u'test.key']) self.assertEqual(234, proxyAnnotations[u'some.key']) proxyAnnotations[u'test.key'] = 789 self.assertEqual(789, proxyAnnotations[u'test.key']) self.assertEqual(123, targetAnnotations[u'test.key']) # Annotations API self.assertEqual(789, proxyAnnotations.get(u'test.key')) keys = proxyAnnotations.keys() self.assertTrue(u'test.key' in keys) self.assertTrue(u'some.key' in keys) self.assertTrue(u'other.key' in keys) self.assertEqual(789, proxyAnnotations.setdefault(u'test.key', -1)) self.assertEqual(234, proxyAnnotations.setdefault(u'some.key', -1)) self.assertEqual(456, proxyAnnotations.setdefault(u'other.key', -1)) self.assertEqual(-1, proxyAnnotations.setdefault(u'new.key', -1)) del proxyAnnotations[u'test.key'] self.assertFalse(u'test.key' in proxyAnnotations) self.assertFalse(u'test.key' in draftAnnotations) self.assertTrue(u'test.key' in targetAnnotations) self.assertTrue(u'test.key' in draft._proxyAnnotationsDeleted) del proxyAnnotations[u'some.key'] self.assertFalse(u'some.key' in proxyAnnotations) self.assertFalse(u'some.key' in draftAnnotations) self.assertFalse(u'some.key' in targetAnnotations) self.assertTrue(u'some.key' in draft._proxyAnnotationsDeleted) # this key was never in the proxy/draft del proxyAnnotations[u'other.key'] self.assertFalse(u'other.key' in proxyAnnotations) self.assertFalse(u'other.key' in draftAnnotations) self.assertTrue(u'other.key' in targetAnnotations) self.assertTrue(u'other.key' in draft._proxyAnnotationsDeleted)
def test_attributes(self): self.folder.invokeFactory('Document', 'd1') target = self.folder['d1'] target.title = u"Old title" draft = Draft() draft.someAttribute = 1 proxy = DraftProxy(draft, target) self.assertEquals(u"Old title", proxy.title) self.assertEquals(1, proxy.someAttribute) proxy.title = u"New title" self.assertEquals(u"New title", proxy.title)
def test_attributes(self): self.folder.invokeFactory('Document', 'd1') target = self.folder['d1'] target.title = u'Old title' draft = Draft() draft.someAttribute = 1 proxy = DraftProxy(draft, target) self.assertEqual(u'Old title', proxy.title) self.assertEqual(1, proxy.someAttribute) proxy.title = u'New title' self.assertEqual(u'New title', proxy.title)
def draftingTileDataContext(context, request, tile): """If we are drafting a content item, record tile data information to the draft, but read existing data from the underlying object. """ draft = getCurrentDraft(request, create=True) if draft is None: return context return DraftProxy(draft, context)
def __init__(self, form, request, context): fti = queryUtility(IDexterityFTI, name=context.portal_type) if isDraftable(fti): current = ICurrentDraftManagement(request) if current.targetKey is not None: current.mark() if current.draft: context = DraftProxy(current.draft, context) super(DefaultDisplayFormFieldWidgets, self).__init__(form, request, context) # noqa
def test_interfaces(self): self.folder.invokeFactory('Document', 'd1') target = self.folder['d1'] draft = Draft() proxy = DraftProxy(draft, target) self.assertFalse(IDraft.providedBy(proxy)) self.assertTrue(IDraftProxy.providedBy(proxy)) if HAS_PLONE_APP_CONTENTTYPES: from plone.app.contenttypes.interfaces import IDocument self.assertTrue(IDocument.providedBy(proxy)) elif HAS_ATCONTENTTYPES: from Products.ATContentTypes.interfaces import IATDocument self.assertTrue(IATDocument.providedBy(proxy))
def __init__(self, form, request, context): fti = queryUtility(IDexterityFTI, name=form.portal_type) if isDraftable(fti): current = ICurrentDraftManagement(request) if current.targetKey is None: beginDrafting(context, None) current.path = '/'.join(context.getPhysicalPath()) current.targetKey = IUUID(context) current.save() else: current.mark() if current.draft: context = DraftProxy(current.draft, context) alsoProvides(request, IEditFormDrafting) super(DefaultEditFormFieldWidgets, self).__init__(form, request, context) # noqa
def __init__(self, form, request, context): fti = queryUtility(IDexterityFTI, name=form.portal_type) if isDraftable(fti): current = ICurrentDraftManagement(request) if current.targetKey != '++add++{0}'.format(form.portal_type): beginDrafting(context, None) current.path = '/'.join(context.getPhysicalPath()) current.targetKey = '++add++{0}'.format(form.portal_type) current.save() else: current.mark() target = getattr(current.draft, '_draftAddFormTarget', None) if current.draft and target: context = DraftProxy(current.draft, target.__of__(context)) alsoProvides(request, IAddFormDrafting) super(DefaultAddFormFieldWidgets, self).__init__(form, request, context) # noqa
def __init__(self, form, request, context): draft = getCurrentDraft(request) target = getattr(draft, '_draftAddFormTarget') context = DraftProxy(draft, target.__of__(context)) super(DefaultAddFormGroupFieldWidgets, self).__init__(form, request, context) # noqa
def autosave(event): # noqa context = getattr(event, 'object', None) request = getattr(context, 'REQUEST', getRequest()) if not request.URL.endswith('/@@z3cform_validate_field'): return view = getattr(request, 'PUBLISHED', None) form = getattr(view, 'context', None) if getattr(aq_base(form), 'form_instance', None): form = form.form_instance if IAddForm.providedBy(form): fti = queryUtility(IDexterityFTI, name=form.portal_type) if not isDraftable(fti): return draft = getCurrentDraft(request, create=True) target = getattr(draft, '_draftAddFormTarget', None) if target is None: target = createContent(form.portal_type) target.id = '' IMutableUUID(target).set('++add++{0}'.format(form.portal_type)) draft._draftAddFormTarget = target target = target.__of__(context) else: fti = queryUtility(IDexterityFTI, name=context.portal_type) if not isDraftable(fti): return draft = getCurrentDraft(request, create=True) target = context fti = queryUtility(IDexterityFTI, name=target.portal_type) if not isDraftable(fti): return if not getattr(form, 'extractData', None): return data, errors = form.extractData() if not errors: content = DraftProxy(draft, target) # Drop known non-draftable values data = dict([(k, v) for k, v in data.items() if k not in AUTOSAVE_BLACKLIST]) # noqa # Values are applied within savepoint to allow revert of any # unexpected side-effects from setting field values sp = transaction.savepoint(optimistic=True) try: applyChanges(form, content, data) for group in getattr(form, 'groups', []): applyChanges(group, content, data) except Exception: # If shortname was not blacklisted, it could fail because the # behavior trying to rename object on add form. pass values = dict(draft.__dict__) sp.rollback() for key, value in values.items(): setattr(draft, key, value) # Disable Plone 5 implicit CSRF to update draft if HAS_PLONE_PROTECT: alsoProvides(request, IDisableCSRFProtection)
def __init__(self, form, request, context): draft = getCurrentDraft(request) context = DraftProxy(draft, context) super(DefaultDisplayFormGroupFieldWidgets, self).__init__(form, request, context) # noqa