예제 #1
0
    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)
예제 #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_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)
예제 #4
0
파일: tests.py 프로젝트: CGTIC/Plone_SP
 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)
예제 #5
0
    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)
예제 #6
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.
    """

    draft = getCurrentDraft(request, create=True)
    if draft is None:
        return context

    return DraftProxy(draft, context)
예제 #7
0
    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
예제 #8
0
    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))
예제 #9
0
    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
예제 #10
0
    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
예제 #11
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
예제 #12
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)
예제 #13
0
 def __init__(self, form, request, context):
     draft = getCurrentDraft(request)
     context = DraftProxy(draft, context)
     super(DefaultDisplayFormGroupFieldWidgets,
           self).__init__(form, request, context)  # noqa