def __init__(self, form, request, context): fti = queryUtility(IDexterityFTI, name=form.portal_type) if IDraftable.__identifier__ in fti.behaviors: draft = getCurrentDraft(request, create=False) target = getattr(draft, '_draftAddFormTarget', createContent(form.portal_type)) if draft is None: IMutableUUID(target).set('++add++%s' % form.portal_type) beginDrafting(target.__of__(context), None) draft = getCurrentDraft(request, create=True) draft._draftAddFormTarget = target # Disable Plone 5 implicit CSRF when no form action if HAS_PLONE_PROTECT: if not ([key for key in request.form if key.startswith('form.buttons.')]): alsoProvides(request, IDisableCSRFProtection) else: current = ICurrentDraftManagement(request) current.mark() context = DraftProxy(draft, target.__of__(context)) alsoProvides(request, IAddFormDrafting) super(DefaultAddFormFieldWidgets, self).__init__(form, request, context) # noqa
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_getCurrentDraft_draft_details_set_not_in_storage_create(self): request = self.request management = ICurrentDraftManagement(request) management.userId = u'user1' management.targetKey = u'123' management.draftName = u'bogus' draft = getCurrentDraft(request, create=True) inStorage = getUtility(IDraftStorage).getDraft( u'user1', u'123', draft.__name__) self.assertEqual(inStorage, draft) response = request.response self.assertTrue('plone.app.drafts.targetKey' in response.cookies) self.assertTrue('plone.app.drafts.draftName' in response.cookies) self.assertEqual( '123', response.cookies['plone.app.drafts.targetKey']['value'], ) self.assertEqual( draft.__name__, response.cookies['plone.app.drafts.draftName']['value'], )
def test_getCurrentDraft_not_set_no_details_create(self): request = self.request draft = getCurrentDraft(request, create=True) self.assertEquals(None, draft) response = request.response self.failIf('plone.app.drafts.targetKey' in response.cookies) self.failIf('plone.app.drafts.draftName' in response.cookies)
def test_getCurrentDraft_not_set_no_details_create(self): request = self.request draft = getCurrentDraft(request, create=True) self.assertEqual(None, draft) response = request.response self.assertFalse('plone.app.drafts.targetKey' in response.cookies) self.assertFalse('plone.app.drafts.draftName' in response.cookies)
def test_getCurrentDraft_not_set_no_create(self): request = self.request draft = getCurrentDraft(request) self.assertEqual(None, draft) response = request.response self.assertFalse('plone.app.drafts.targetKey' in response.cookies) self.assertFalse('plone.app.drafts.draftName' in response.cookies)
def capture(ob, event): request = getattr(ob, 'REQUEST', getRequest()) if not IAddFormDrafting.providedBy(request): return draft = getCurrentDraft(request) target = getattr(draft, '_draftAddFormTarget', None) if draft and target and target.portal_type == target.portal_type: draft._draftAddFormTarget = ob
def autosave(event): context = getattr(event, 'object', None) request = getattr(context, 'REQUEST', getRequest()) if not request.URL.endswith('/@@z3cform_validate_field'): return draft = getCurrentDraft(request) if draft is None: return view = getattr(request, 'PUBLISHED', None) form = getattr(view, 'context', None) if hasattr(aq_base(form), 'form_instance'): form = form.form_instance if IAddForm.providedBy(form): target = getattr(draft, '_draftAddFormTarget', None) if not target: return target = target.__of__(context) else: target = context fti = queryUtility(IDexterityFTI, name=target.portal_type) if IDraftable.__identifier__ not in fti.behaviors: return if not hasattr(form, "extractData"): return data, errors = form.extractData() if not errors: content = DraftProxy(draft, target) # Drop known non-draftable values map(data.pop, [key for key in AUTOSAVE_BLACKLIST if key in data]) # 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 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 test_getCurrentDraft_draft_set_create(self): request = self.request management = ICurrentDraftManagement(request) management.draft = setDraft = Draft() draft = getCurrentDraft(request, create=True) self.assertEquals(setDraft, draft) response = request.response self.failIf('plone.app.drafts.targetKey' in response.cookies) self.failIf('plone.app.drafts.draftName' in response.cookies)
def test_getCurrentDraft_draft_set_create(self): request = self.request management = ICurrentDraftManagement(request) management.draft = setDraft = Draft() draft = getCurrentDraft(request, create=True) self.assertEqual(setDraft, draft) response = request.response self.assertFalse('plone.app.drafts.targetKey' in response.cookies) self.assertFalse('plone.app.drafts.draftName' in response.cookies)
def test_getCurrentDraft_draft_set(self): request = self.request management = ICurrentDraftManagement(request) management.draft = setDraft = Draft() draft = getCurrentDraft(request) self.assertEqual(setDraft, draft) response = request.response self.assertFalse('plone.app.drafts.targetKey' in response.cookies) self.assertFalse('plone.app.drafts.draftName' in response.cookies)
def __init__(self, form, request, context): fti = queryUtility(IDexterityFTI, name=form.portal_type) if IDraftable.__identifier__ in fti.behaviors: draft = getCurrentDraft(request, create=False) if draft is None: beginDrafting(context, None) draft = getCurrentDraft(request, create=True) # Disable Plone 5 implicit CSRF when no form action if HAS_PLONE_PROTECT: if not ([key for key in request.form if key.startswith('form.buttons.')]): alsoProvides(request, IDisableCSRFProtection) else: current = ICurrentDraftManagement(request) current.mark() context = DraftProxy(draft, context) alsoProvides(request, IEditFormDrafting) super(DefaultEditFormFieldWidgets, self).__init__(form, request, context) # noqa
def test_getCurrentDraft_draft_details_set_not_in_storage(self): request = self.request management = ICurrentDraftManagement(request) management.userId = u'user1' management.targetKey = u'123' management.draftName = u'bogus' draft = getCurrentDraft(request) self.assertEqual(None, draft) response = request.response self.assertFalse('plone.app.drafts.targetKey' in response.cookies) self.assertFalse('plone.app.drafts.draftName' in response.cookies)
def test_getCurrentDraft_draft_details_set_not_in_storage(self): request = self.request management = ICurrentDraftManagement(request) management.userId = u"user1" management.targetKey = u"123" management.draftName = u"bogus" draft = getCurrentDraft(request) self.assertEquals(None, draft) response = request.response self.failIf('plone.app.drafts.targetKey' in response.cookies) self.failIf('plone.app.drafts.draftName' in response.cookies)
def test_getCurrentDraft_draft_details_set_in_storage(self): request = self.request inStorage = getUtility(IDraftStorage).createDraft(u'user1', u'123') management = ICurrentDraftManagement(request) management.userId = u'user1' management.targetKey = u'123' management.draftName = inStorage.__name__ draft = getCurrentDraft(request) self.assertEqual(inStorage, draft) response = request.response self.assertFalse('plone.app.drafts.targetKey' in response.cookies) self.assertFalse('plone.app.drafts.draftName' in response.cookies)
def test_getCurrentDraft_draft_details_set_in_storage_create(self): request = self.request inStorage = getUtility(IDraftStorage).createDraft(u'user1', u'123') management = ICurrentDraftManagement(request) management.userId = u'user1' management.targetKey = u'123' management.draftName = inStorage.__name__ draft = getCurrentDraft(request, create=True) self.assertEqual(inStorage, draft) response = request.response self.assertFalse('plone.app.drafts.targetKey' in response.cookies) self.assertFalse('plone.app.drafts.draftName' in response.cookies)
def test_getCurrentDraft_draft_details_set_in_storage_create(self): request = self.request inStorage = getUtility(IDraftStorage).createDraft(u"user1", u"123") management = ICurrentDraftManagement(request) management.userId = u"user1" management.targetKey = u"123" management.draftName = inStorage.__name__ draft = getCurrentDraft(request, create=True) self.assertEquals(inStorage, draft) response = request.response self.failIf('plone.app.drafts.targetKey' in response.cookies) self.failIf('plone.app.drafts.draftName' in response.cookies)
def save(event): if not IDrafting.providedBy(event.action.request): return if event.action.name != 'form.buttons.save': return data, errors = event.action.form.extractData() if errors: return if IAddForm.providedBy(event.action.form): draft = getCurrentDraft(event.action.form.request) target = getattr(draft, '_draftAddFormTarget') if target: syncDraftOnSave(target, event) else: syncDraftOnSave(event.action.form.context, event)
def test_getCurrentDraft_draft_details_set_not_in_storage_create(self): request = self.request management = ICurrentDraftManagement(request) management.userId = u"user1" management.targetKey = u"123" management.draftName = u"bogus" draft = getCurrentDraft(request, create=True) inStorage = getUtility(IDraftStorage).getDraft(u"user1", u"123", draft.__name__) self.assertEquals(inStorage, draft) response = request.response self.failUnless('plone.app.drafts.targetKey' in response.cookies) self.failUnless('plone.app.drafts.draftName' in response.cookies) self.assertEquals('123', response.cookies['plone.app.drafts.targetKey']['value']) self.assertEquals(draft.__name__, response.cookies['plone.app.drafts.draftName']['value'])
def save(event): if not IDrafting.providedBy(event.action.request): return if event.action.name != 'form.buttons.save': return data, errors = event.action.form.extractData() if errors: return if IAddForm.providedBy(event.action.form): draft = getCurrentDraft(event.action.form.request) target = getattr(draft, '_draftAddFormTarget', None) if target: syncDraftOnSave(target, event) else: discardDraftsOnCancel(event.action.form.context, event) else: syncDraftOnSave(event.action.form.context, event)
def check_lead_image(obj, request=None): original_obj = obj if request is not None: # if request is passed in, we check for current draft to use... draft = getCurrentDraft(request) if draft is not None: obj = draft if has_image(obj): return image = find_image(obj) if image is not None: try: try: ct = image.image.contentType except AttributeError: ct = None value = NamedBlobImage(contentType=ct) alsoProvides(value, IReferenceNamedImage) value.reference = IUUID(image) original_obj.image = value except AttributeError: pass
def syncDraftOnSave(context, event): """When the edit form is saved, sync the draft (if set) and discard it. Also discard the drafting cookies. """ storage = queryUtility(IDraftStorage) if storage is None or not storage.enabled: return request = getattr(context, 'REQUEST', None) if request is None: return draft = getCurrentDraft(request) if draft is not None: syncDraft(draft, context) current = ICurrentDraftManagement(request) if current.userId and current.targetKey: storage.discardDrafts(current.userId, current.targetKey) current.discard()
def __call__(self): draft = getCurrentDraft(self.request, create=False) if draft is not None: draft._p_changed = 1
def adapt(self): """If we are drafting a content item, record form data information to the draft, but read existing data from the underlying object. """ # Check to see if we have a cahced copy already if IZ3cDraft.providedBy(self.request): return self.request.DRAFT.context if IDraftable.providedBy(self.request): self.createDraft = True # Set up the draft (sets cookies, markers, etc) draft = getCurrentDraft(self.request, create=False) if not draft and not self.createDraft: return self.content if not draft: beginDrafting(self.content, self.form) draft = getCurrentDraft(self.request, create=self.createDraft) if draft is None: return self.content # return contnet, not context context = getattr(draft, 'context', None) # Initial draft; populate initial values if context is None: context = PersistentDict() # Get all fields from from, including groups so we can store them # on draft _fields = [] for field in self.form.fields.items(): _fields.append(field) if hasattr(self.form, 'groups'): for group in self.form.groups: for field in group.fields.items(): _fields.append(field) for name, field in _fields: # Provide default value on draft dm = zope.component.getMultiAdapter( (self.content, field.field), interfaces.IDataManager) try: value = dm.query(field) except TypeError: value = field.field.default or field.field.missing_value context[field.field.__name__] = value zope.interface.alsoProvides(context, IZ3cDraft) zope.interface.alsoProvides(context, IDrafting) setattr(draft, 'context', context) zope.interface.alsoProvides(draft, IZ3cDraft) zope.interface.alsoProvides(self.request, IZ3cDraft) # Cache draft self.request['DRAFT'] = draft return context
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