コード例 #1
0
    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
コード例 #2
0
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)
コード例 #3
0
    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'],
        )
コード例 #4
0
ファイル: tests.py プロジェクト: CGTIC/Plone_SP
 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)
コード例 #5
0
    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)
コード例 #6
0
    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)
コード例 #7
0
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
コード例 #8
0
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
コード例 #9
0
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)
コード例 #10
0
ファイル: drafting.py プロジェクト: sixfeetup/plone.app.tiles
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)
コード例 #11
0
ファイル: drafting.py プロジェクト: CGTIC/Plone_SP
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)
コード例 #12
0
ファイル: tests.py プロジェクト: CGTIC/Plone_SP
 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)
コード例 #13
0
    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)
コード例 #14
0
    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)
コード例 #15
0
    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
コード例 #16
0
    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)
コード例 #17
0
ファイル: tests.py プロジェクト: CGTIC/Plone_SP
 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)
コード例 #18
0
    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)
コード例 #19
0
    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)
コード例 #20
0
ファイル: tests.py プロジェクト: CGTIC/Plone_SP
 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)
コード例 #21
0
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)
コード例 #22
0
ファイル: tests.py プロジェクト: CGTIC/Plone_SP
 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'])
コード例 #23
0
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)
コード例 #24
0
ファイル: lead.py プロジェクト: rnunez80/castle.cms
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
コード例 #25
0
ファイル: lifecycle.py プロジェクト: plone/plone.app.drafts
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()
コード例 #26
0
ファイル: __init__.py プロジェクト: b4oshany/castle.cms
 def __call__(self):
     draft = getCurrentDraft(self.request, create=False)
     if draft is not None:
         draft._p_changed = 1
コード例 #27
0
    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
コード例 #28
0
 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
コード例 #29
0
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)
コード例 #30
0
 def __init__(self, form, request, context):
     draft = getCurrentDraft(request)
     context = DraftProxy(draft, context)
     super(DefaultDisplayFormGroupFieldWidgets,
           self).__init__(form, request, context)  # noqa
コード例 #31
0
 def __init__(self, form, request, context):
     draft = getCurrentDraft(request)
     context = DraftProxy(draft, context)
     super(DefaultDisplayFormGroupFieldWidgets, self).__init__(form, request, context)  # noqa
コード例 #32
0
 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