示例#1
0
def saveJobProgress(event):
    """ Save job progress
    """
    portal = getToolByName(event.object, 'portal_url').getPortalObject()
    portal_anno = IAnnotations(portal)
    annotation = portal_anno.get('async_move_jobs')
    annotation_job = annotation.setdefault(event.job_id, {})

    if event.operation == 'initialize':
        annotation_job['sub_progress'] = {}
        operation_type = getattr(event, 'operation_type', 'Moved')
        annotation_job['title'] = "%s below objects within: %s" % (
            operation_type, event.object.absolute_url()
        )

        for oid, title in event.oblist_id:
            annotation_job['sub_progress'][oid] = {}
            annotation_job['sub_progress'][oid]['progress'] = 0
            annotation_job['sub_progress'][oid]['title'] = title

    if event.operation == 'sub_progress':
        obj_id = event.obj_id
        annotation_job.setdefault('sub_progress', {})
        annotation_job['sub_progress'].setdefault(obj_id, {})
        annotation_job['sub_progress'][obj_id]['progress'] = event.progress

    if event.operation == 'progress':
        annotation_job['progress'] = event.progress
示例#2
0
def cleanup_convert_figure_jobs(context):
    """ Cleanup Async jobs saved on EEAFIgureFile
    """
    ctool = getToolByName(context, 'portal_catalog')
    brains = ctool.unrestrictedSearchResults(portal_type=['EEAFigureFile'])

    logger.info('Removing async jobs')
    count = 0
    for brain in brains:
        try:
            doc = brain.getObject()
            if getattr(doc, '_convertjob', None):
                del doc._convertjob
            try:
                anno = IAnnotations(doc)
            except TypeError:
                continue
            convert_job = anno.get('convert_figure_job')
            if convert_job and not isinstance(convert_job, dict):
                del anno['convert_figure_job']
            else:
                continue
            logger.info('Removing async for %s', brain.getURL())
            count += 1
            if count % 100 == 0:
                logger.info('INFO: Transaction committed to zodb %s', count)
                transaction.commit()
        except Exception, err:
            logger.warn('Couldn\'t remove async for %s', brain.getURL())
            # ctool.uncatalog_object(brain.getPath())
            logger.exception(err)
            continue
示例#3
0
def import_oggbundle(app, args):
    """Handler for the 'bin/instance import' zopectl command.
    """
    setup_logging()
    bundle_path = sys.argv[3]
    log.info("Importing OGGBundle %s" % bundle_path)

    plone = setup_plone(get_first_plone_site(app))

    # mark request with GEVER layer
    alsoProvides(plone.REQUEST, IOpengeverBaseLayer)

    # Don't use a separate ZODB connection to issue sequence numbers in
    # order to avoid conflict errors during OGGBundle import
    alsoProvides(plone.REQUEST, INoSeparateConnectionForSequenceNumbers)

    transmogrifier = Transmogrifier(plone)
    IAnnotations(transmogrifier)[BUNDLE_PATH_KEY] = bundle_path

    with DisabledLDAP(plone):
        transmogrifier(u'opengever.bundle.oggbundle')

    bundle = IAnnotations(transmogrifier)[BUNDLE_KEY]
    timings = bundle.stats['timings']
    duration = timings['done_post_processing'] - timings['start_loading']
    log.info("Duration: %.2fs" % duration.total_seconds())

    log.info("Committing transaction...")
    transaction.get().note("Finished import of OGGBundle %r" % bundle_path)
    transaction.commit()
    log.info("Done.")
示例#4
0
 def after_resolve_jobs_pending(self):
     """This flag tracks whether these jobs have already been executed for
     a resolved dossier, or are still pending (because they have been
     deferred to a nightly job).
     """
     ann = IAnnotations(self.context)
     return ann.get(AFTER_RESOLVE_JOBS_PENDING_KEY, False)
示例#5
0
    def _annotation_storage(self, create_if_missing=False):
        annotations = IAnnotations(self.context)
        # Avoid writes on read
        if REMINDER_ANNOTATIONS_KEY not in annotations and create_if_missing:
            annotations[REMINDER_ANNOTATIONS_KEY] = PersistentDict()

        return annotations.get(REMINDER_ANNOTATIONS_KEY, {})
示例#6
0
def disable_behaviors(obj, behaviors, ifaces):
    """ Disable behaviors on an object.

    :param obj: The Dexterity content object to disable behaviors on.
    :type obj: object
    :param behaviors: Behaviors to be disabled on the object. This is a list of
                      dotted names of behavior schema interfaces.
    :type behaviors: list
    :param ifaces: Behavior marker interfaces belonging to the behaviors to be
                   disabled. This is a list of interface classes.
    :type ifaces: class

    Use it like so:
    >>> from plone.app.event.dx.interfaces import IDXEvent
    >>> disable_behaviors(obj, ['plone.app.event.dx.behaviors.IEventBasic',],
    ...                        [IDXEvent,])

    """
    annotations = IAnnotations(obj)
    instance_behaviors = annotations.get(KEY, ())
    instance_behaviors = filter(lambda x: x not in behaviors,
                                instance_behaviors)
    annotations[KEY] = instance_behaviors

    for iface in ifaces:
        noLongerProvides(obj, iface)

    obj.reindexObject(idxs=('object_provides'))
    def __call__(self, *args, **kw):
        context = self.context
        request = self.request
        request.set('disable_border', 1)
        # following two only on Plone 4+
        request.set('disable_plone.leftcolumn', 1)
        request.set('disable_plone.rightcolumn', 1)
        self.error = False

        token = request.form.get('token')
        path = request.form.get('path')
        comment = request.form.get('comment', None)

        doc = context.unrestrictedTraverse(path)
        conf = IAnnotations(doc).get('share-tokens')

        if conf.get('reject') and conf.get(
                'reject') == token and not comment.strip():
            # comment when rejecting is required
            context.plone_utils.addPortalMessage(
                _(u'When rejecting, a motivation is required'), type='error')
            request.response.redirect(
                request.form.get('came_from') or context.absolute_url())
            return

        try:
            self.result = ConsumePowerTokenView.__call__(self,
                                                         comment=comment,
                                                         **kw)[0]
        except PowerTokenSecurityError:
            self.result = None
            self.error = True
        return self.index()
示例#8
0
 def __init__(self, context):
     self.ideal_wrapper = getUtility(IMollieIdeal)
     annotations = IAnnotations(context)
     self._metadata = annotations.get(IDEAL_PAYMENT_ANNOTATION_KEY, None)
     if self._metadata is None:
         self._metadata = PersistentMapping()
         annotations[IDEAL_PAYMENT_ANNOTATION_KEY] = self._metadata
示例#9
0
 def test_cktemplate_moved(self):
     oemf = self.portal['templates']['oem']
     srvf = self.portal['contacts']['plonegroup-organization']
     org1 = srvf['direction-generale']
     org2 = srvf['direction-generale']['secretariat']
     self.assertIn(org1.UID(), oemf)
     self.assertIn(org2.UID(), oemf)
     mod1 = api.content.create(container=oemf,
                               type='cktemplate',
                               id='mod1',
                               title='Modèle 1')
     annot = IAnnotations(mod1)
     self.assertEqual(annot['dmsmail.cke_tpl_tit'], u'')
     mod1 = api.content.move(mod1, oemf[org1.UID()])
     annot = IAnnotations(mod1)
     self.assertEqual(annot['dmsmail.cke_tpl_tit'], u'Direction générale')
     mod2 = api.content.copy(mod1, oemf[org2.UID()], id='mod2')
     annot = IAnnotations(mod2)
     self.assertEqual(annot['dmsmail.cke_tpl_tit'],
                      u'Direction générale - Secrétariat')
     folder = api.content.create(container=oemf,
                                 type='Folder',
                                 id='fold1',
                                 title='héhéhé')
     mod2 = api.content.move(mod2, folder)
     annot = IAnnotations(mod2)
     self.assertEqual(annot['dmsmail.cke_tpl_tit'], u'héhéhé')
     mod2 = api.content.rename(mod2, 'mod-nextgen')
     annot = IAnnotations(mod2)
     self.assertEqual(annot['dmsmail.cke_tpl_tit'], u'héhéhé')
 def __call__(self, *args, **kw):
     context = self.context
     request = self.request
     request.set('disable_border', 1)
     # following two only on Plone 4+
     request.set('disable_plone.leftcolumn', 1)
     request.set('disable_plone.rightcolumn', 1)
     self.error = False
     
     token = request.form.get('token')
     path = request.form.get('path')
     comment = request.form.get('comment', None)
     
     doc = context.unrestrictedTraverse(path)
     conf = IAnnotations(doc).get('share-tokens')
     
     if conf.get('reject') and conf.get('reject')==token and not comment.strip():
         # comment when rejecting is required
         context.plone_utils.addPortalMessage(_(u'When rejecting, a motivation is required'),
                                              type='error')
         request.response.redirect(request.form.get('came_from') or context.absolute_url())
         return
     
     try:
         self.result = ConsumePowerTokenView.__call__(self, comment=comment, **kw)[0]
     except PowerTokenSecurityError:
         self.result = None
         self.error = True
     return self.index()
示例#11
0
文件: profile.py 项目: ilshad/tackle
class BasicProfile(object):

    implements(IBasicProfile)
    adapts(IPrincipal)

    def __init__(self, principal):
        self.annotations = IAnnotations(principal)
        self.principal = principal

    @setproperty
    def name(self, v):
        self.annotations['name'] = v

        # for principalfolder search
        ip = internal_principal(self.principal.id)
        ip.title = v

    @getproperty
    def name(self):
        return self.annotations.get('name', self.principal.title)

    @setproperty
    def email(self, v):
        self.annotations['email'] = v

    @getproperty
    def email(self):
        return self.annotations.get('email', u'')
示例#12
0
def count_dataset_created(obj, event):
    # IBLobDataset
    # IRemoteDataset
    # IDatasetCollection -> IMultiSpeciesDataset
    if IAnnotations(obj.REQUEST).get('org.bccvl.site.stats.delay'):
        # skip this event, we have been called from transmogrify chain, where
        # we collect stats later
        # tell stats collector that we really created a new object
        IAnnotations(obj.REQUEST)['org.bccvl.site.stats.created'] = True
        return
    dataSrc = obj.dataSource
    if not dataSrc:
        if obj.part_of:
            # part of multispecies file ... get dataSource from master file
            master = uuidToObject(obj.part_of)
            dataSrc = master.dataSource
    if not dataSrc:
        # find default
        # check whether we are inside an experiment:
        if defaults.EXPERIMENTS_FOLDER_ID in obj.getPhysicalPath():
            dataSrc = 'experiment'
        else:
            dataSrc = 'upload'
    getUtility(IStatsUtility).count_dataset(source=dataSrc,
                                            portal_type=obj.portal_type)
示例#13
0
 def get_slid(self):
     """slideshare slideshowid or redirect to upload"""
     annotations = IAnnotations(self.context)
     sl_id = annotations.get(KEY, None)
     if sl_id:
         return sl_id
     else:
         if IATFile.providedBy(self.context):
             if self.context.getContentType() in SLIDES_MIMETYPES:
                 self.request.response.redirect(
                     self.context.absolute_url() +
                             '/@@slideshare_post.html')
             else:
                 msg = _(u"This file does not seem to be a presentation")
                 IStatusMessage(self.request).addStatusMessage(msg,
                         type='error')
         elif IATLink.providedBy(self.context):
             urlob = urlparse(self.context.getRemoteUrl())
             if urlob.hostname == 'www.slideshare.net':
                  self.request.response.redirect(
                     self.context.absolute_url() +
                             '/@@slideshare_getid.html')
             else:
                 msg = _(u"This is not a valid slideshare URL")
                 IStatusMessage(self.request).addStatusMessage(msg,
                         type='error')
示例#14
0
 def _default_stylebook(self):
     if not getattr(self, '_default', None):
         if not [o.getId() for o in self.stylebooks()]:
             return None
         anno = IAnnotations(self.context).get(ANNO_KEY, {})
         self._default = anno.get('default_stylebook', None)
     return self._default
示例#15
0
def import_oggbundle(app, args):
    """Handler for the 'bin/instance import' zopectl command.
    """
    setup_logging()

    # Discard the first three arguments, because they're not "actual" arguments
    # but cruft that we get because of the way bin/instance [zopectl_cmd]
    # scripts work.
    args = parse_args(sys.argv[3:])

    log.info("Importing OGGBundle %s" % args.bundle_path)

    plone = setup_plone(get_first_plone_site(app))

    # mark request with GEVER layer
    alsoProvides(plone.REQUEST, IOpengeverBaseLayer)

    # Don't use a separate ZODB connection to issue sequence numbers in
    # order to avoid conflict errors during OGGBundle import
    alsoProvides(plone.REQUEST, INoSeparateConnectionForSequenceNumbers)

    # Add index to track imported GUIDs (if it doesn't exist yet)
    add_guid_index()

    transmogrifier = Transmogrifier(plone)

    ann = IAnnotations(transmogrifier)
    ann[BUNDLE_PATH_KEY] = args.bundle_path
    ann[INTERMEDIATE_COMMITS_KEY] = not args.no_intermediate_commits

    solr_enabled = api.portal.get_registry_record(
        'opengever.base.interfaces.ISearchSettings.use_solr', default=False)

    if solr_enabled:
        # Check if solr is running
        conn = getUtility(ISolrConnectionManager).connection
        if conn.get('/schema').status == -1:
            raise Exception(
                "Solr isn't running, but solr reindexing is enabled. "
                "Skipping solr reindexing via `--skip-solr`.")
    else:
        # Disable collective indexing as it can lead to too many
        # subtransactions
        unpatch_collective_indexing()

    with DisabledLDAP(plone):
        transmogrifier(u'opengever.bundle.oggbundle')

    bundle = IAnnotations(transmogrifier)[BUNDLE_KEY]
    timings = bundle.stats['timings']

    if 'migration_finished' in timings:
        duration = timings['migration_finished'] - timings['start_loading']
        log.info("Duration: %.2fs" % duration.total_seconds())

    log.info("Committing transaction...")
    transaction.get().note("Finished import of OGGBundle %r" %
                           args.bundle_path)
    transaction.commit()
    log.info("Done.")
def registerPersistentConfig(site, type_):
    """ Try to get persistent pipeline configuration of given type (export or import)
        and register it for use with transmogrifier.
    """
    global CONFIGFILE
    anno = IAnnotations(site)
    key = '%s.%s' % (ANNOKEY, type_)
    config = anno.has_key(key) and anno[key] or None

    # unregister old config
    name = 'persitent-%s' % type_
    if name in configuration_registry._config_ids:
        configuration_registry._config_ids.remove(name)
        del configuration_registry._config_info[name]

    # register new
    if config is not None:
        title = description = u'Persistent %s pipeline'
        tf = tempfile.NamedTemporaryFile('w+t', suffix='.cfg')
        tf.write(config)
        tf.seek(0)
        CONFIGFILE = tf
        configuration_registry.registerConfiguration(name, title, description, tf.name)
        return name
    else:
        return None
示例#17
0
 def is_available(self, obj, data_type='preview'):
     if data_type == 'pdf':
         annotations = IAnnotations(obj)
         if annotations.get(PDF_VERSION_KEY):
             return True
         else:
             return False
 def _getHandle(self, context):
     """
     Helper method looking up the handle in the context's annotation.
     Returns None if not existing.
     """
     annotations = IAnnotations(context)
     return annotations.get(KEY, None)
def get_users_statistics_reports(site):
    """ Get existing reports saved in annotations
    """
    annotations = IAnnotations(site)
    reports = annotations.get(USERS_STATISTICS_KEY, None)

    return reports
示例#20
0
 def get_statuses(self, create_if_missing=False):
     """Get the mapping of delivery statuses by transport.
     """
     ann = IAnnotations(self.disposition)
     if TRANSPORT_STATUSES_KEY not in ann and create_if_missing:
         ann[TRANSPORT_STATUSES_KEY] = PersistentMapping()
     return ann.get(TRANSPORT_STATUSES_KEY, {})
def disable_behaviors(obj, behaviors, ifaces, reindex=True):
    """ Disable behaviors on an object.

    :param obj: The Dexterity content object to disable behaviors on.
    :type obj: object
    :param behaviors: Behaviors to be disabled on the object. This is a list of
                      dotted names of behavior schema interfaces.
    :type behaviors: list or tuple
    :param ifaces: Behavior marker interfaces belonging to the behaviors to be
                   disabled. This is a list of interface classes.
    :type ifaces: class
    :param reindex: Flag whether to reindex object after modification
    :type reindex: bool

    Use it like so:

    >>> from plone.app.event.dx.interfaces import IDXEvent
    >>> disable_behaviors(obj, ['plone.app.event.dx.behaviors.IEventBasic',],
    ...                        [IDXEvent,])
    """
    annotations = IAnnotations(obj)
    instance_behaviors = annotations.get(ANNOTATION_KEY, ())
    instance_behaviors = filter(lambda x: x not in behaviors,
                                instance_behaviors)
    annotations[ANNOTATION_KEY] = instance_behaviors

    for iface in ifaces:
        noLongerProvides(obj, iface)

    if reindex:
        obj.reindexObject(idxs=('object_provides'))
示例#22
0
文件: profile.py 项目: ilshad/tackle
class BasicProfile(object):

    implements(IBasicProfile)
    adapts(IPrincipal)

    def __init__(self, principal):
        self.annotations = IAnnotations(principal)
        self.principal = principal

    @setproperty
    def name(self, v):
        self.annotations['name'] = v

        # for principalfolder search
        ip = internal_principal(self.principal.id)
        ip.title = v

    @getproperty
    def name(self):
        return self.annotations.get('name', self.principal.title)

    @setproperty
    def email(self, v):
        self.annotations['email'] = v

    @getproperty
    def email(self):
        return self.annotations.get('email', u'')
示例#23
0
    def __iter__(self):
        for item in self.previous:
            keys = item.keys()
            pathkey = self.pathkey(*keys)[0]

            objpath = item[pathkey]
            obj = self.context.unrestrictedTraverse(objpath)

            # The contructor generated an empty object (which triggered our
            # stats event handler.) Let's update the stats here manually.
            created = IAnnotations(obj.REQUEST).get(
                'org.bccvl.site.stats.created', False)
            if created:
                # our created subscriber has been invoked
                getUtility(IStatsUtility).count_dataset(
                    source=obj.dataSource, portal_type=obj.portal_type)
                # reset the flag ... we can do that, because the pipeline runs
                # sequentially
                IAnnotations(
                    obj.REQUEST)['org.bccvl.site.stats.created'] = False

            # Attach a job tracker only for species dataset from multispecies
            if item.get('_partof', {}):
                jt = IJobTracker(obj)
                jt.new_job('TODO: generate id',
                           'generate taskname: ala_import',
                           function=obj.dataSource,
                           type=obj.portal_type,
                           state='COMPLETED')

            yield item
示例#24
0
def has_metadata_changed_been_filled():
    site = getSite()
    annotations = IAnnotations(site)
    if METADATA_CHANGED_FILLED_KEY not in annotations:
        # This is a newly setup deployment or one where the first upgrade has not been run.
        return True
    return bool(annotations.get(METADATA_CHANGED_FILLED_KEY))
 def setUp(self):
     super(TestReceiveDocumentPDF, self).setUp()
     self.document = create(
         Builder('document').titled(
             u'\xdcberpr\xfcfung XY')).as_shadow_document()
     IAnnotations(self.document)[PDF_SAVE_TOKEN_KEY] = self.save_token
     IAnnotations(self.document)[PDF_SAVE_OWNER_ID_KEY] = self.user.userid
示例#26
0
 def __call__(self):
     form = self.request.form
     context = aq_inner(self.context)
     annotations = IAnnotations(context)['collective.pfg.payment']
     if form.get("form.button.UpdateNumber", None) is not None:
         sdm = getToolByName(context, 'session_data_manager')
         session = sdm.getSessionData(create=False)
         if session is not None:
             if session.get('collective.pfg.payment.number', None) is not None:
                 del session['collective.pfg.payment.number']
         re = getUtility(IRegularExpression)
         numbering_type = form.get('numbering_type')
         if numbering_type == 'Incremental':
             annotations.numbering_type = 'Incremental'
             next_incremental_number = form.get('next_incremental_number', None)
             if re.integer(next_incremental_number):
                 annotations.next_incremental_number = int(next_incremental_number)
             else:
                 message = _(u"Please input integer number for the incremental number.")
                 IStatusMessage(self.request).addStatusMessage(message, type='warn')
         elif numbering_type == 'Random':
             annotations.numbering_type = 'Random'
             random_number_digits = form.get('random_number_digits', None)
             if re.integer(random_number_digits):
                 annotations.random_number_digits = int(random_number_digits)
             else:
                 message = _(u"Please input integer number for the randome digits.")
                 IStatusMessage(self.request).addStatusMessage(message, type='warn')
     return self.template()
def patched_getScale(self, instance, scale):
    """ return scaled and aq-wrapped version for given image data """
    field = self.context
    available = field.getAvailableSizes(instance)
    if scale in available or scale is None:
        image = self.retrieveScale(instance, scale=scale)
        if not image:  # create the scale if it doesn't exist
            width, height = available[scale]
            data = self.createScale(instance, scale, width, height)
            if data is not None:
                self.storeScale(instance, scale, **data)
                image = self.retrieveScale(instance, scale=scale)

        # retrieve scale width and height from annotation for image that has
        # missing info, this happens when we get the svg scale
        if image and not image.width:
            width, height = available[scale]
            annotations = IAnnotations(instance)
            scale_annotations = annotations.get('plone.scale')
            filename = image.getFilename()
            for value in scale_annotations.values():
                scale_key = value.get('key')
                scale_height = scale_key[1][1]
                scale_width = scale_key[2][1]
                if scale_height == height and scale_width == width and \
                        filename == value.get('filename'):
                    image.width = value.get('width')
                    image.height = value.get('height')
                    break
        if image is not None and not isinstance(image, basestring):
            return image
    return None
 def handle(self):
     """
     Looks up the handle in the context's annotation.
     Returns None if not found.
     """
     annotations = IAnnotations(self.context)
     return annotations.get(KEY, None)
示例#29
0
 def __init__(self, context):
     self.context = self.__parent__  = context # see PvWh book site 269
     annotations = IAnnotations(context)
     mapping = annotations.get(EntryNavAnnotations_KEY)
     if mapping is None:
         mapping = annotations[EntryNavAnnotations_KEY] = PersistentDict({'name': '', 'order': 0})
     self.mapping = mapping
 def __init__(self, context):
     self.context = context
     self.portal = getToolByName(self.context, 'portal_url').getPortalObject()
     storage = IAnnotations(self.portal)
     if not storage.has_key(STORAGE_KEY):
         storage[STORAGE_KEY] = PersistentDict()
     self.storage = storage[STORAGE_KEY]
示例#31
0
def update_opengraphable_objects(context, new_ct):
    g_marker = queryUtility(IOpengraphMarkerUtility)
    if not g_marker:
        return
    options = IAnnotations(context)

    ct = getToolByName(context, 'portal_catalog')

    olds_pt = options.get('old_content_types', [])
    if new_ct == olds_pt:
        return
    adds = []
    for new in new_ct:
        if new in olds_pt:
            olds_pt.remove(new)
        else:
            adds.append(new)

    nb_items, bad_items = g_marker.update(context, adds, olds_pt)
    updated = u'%d %s' % (nb_items, _(u'objects updated.'))
    if not bad_items:
        message = updated
    else:
        message = u'%s, %d %s: %s' % (updated,
                                      len(bad_items),
                                      _(u'update(s) on object(s) failed'),
                                      ','.join(bad_items), )
    pu = getToolByName(context, 'plone_utils')
    pu.addPortalMessage(message)
示例#32
0
    def test_customstyles_are_stored_in_btree(self):
        adapter = ICustomStyles(self.portal)
        adapter.set('css.body-background', 'blue')

        annotations = IAnnotations(self.portal)
        self.assertEquals(OOBTree,
                          type(annotations.get(CUSTOMSTYLES_ANNOTATION_KEY)))
 def _getHandle(self, context):
     """
     Helper method looking up the handle in the context's annotation.
     Returns None if not existing.
     """
     annotations = IAnnotations(context)
     return annotations.get(KEY, None)
 def handle(self):
     """
     Looks up the handle in the context's annotation.
     Returns None if not found.
     """
     annotations = IAnnotations(self.context)
     return annotations.get(KEY, None)
def get_users_statistics_reports(site):
    """ Get existing reports saved in annotations
    """
    annotations = IAnnotations(site)
    reports = annotations.get(USERS_STATISTICS_KEY, None)

    return reports
示例#36
0
def disable_behaviors(obj, behaviors, ifaces):
    """ Disable behaviors on an object.

    :param obj: The Dexterity content object to disable behaviors on.
    :type obj: object
    :param behaviors: Behaviors to be disabled on the object. This is a list of
                      dotted names of behavior schema interfaces.
    :type behaviors: list
    :param ifaces: Behavior marker interfaces belonging to the behaviors to be
                   disabled. This is a list of interface classes.
    :type ifaces: class

    Use it like so:
    >>> from plone.app.event.dx.interfaces import IDXEvent
    >>> disable_behaviors(obj, ['plone.app.event.dx.behaviors.IEventBasic',],
    ...                        [IDXEvent,])

    """
    annotations = IAnnotations(obj)
    instance_behaviors = list(annotations.get(KEY, []))
    instance_behaviors = filter(lambda x: x not in behaviors,
                                instance_behaviors)
    annotations[KEY] = instance_behaviors

    for iface in ifaces:
        noLongerProvides(obj, iface)

    # TODO UNTESTED:
    obj.reindexObject(idxs=('object_provides'))
示例#37
0
    def get_table_filters():
        """get_table_filters."""
        site = getSite()
        anno = IAnnotations(site)
        matrix = anno.get('matrix_1', {})

        return matrix.get('select_categories', {})
示例#38
0
 def after_resolve_jobs_pending(self):
     """This flag tracks whether these jobs have already been executed for
     a resolved dossier, or are still pending (because they have been
     deferred to a nightly job).
     """
     ann = IAnnotations(self.context)
     return ann.get(AFTER_RESOLVE_JOBS_PENDING_KEY, False)
class NotificationConfiglet(BrowserView):
    
    template = ViewPageTemplateFile('configlet.pt')
    
    def __call__(self, delete=None):
        self.storage = IAnnotations(self.context)
        if delete and self.storage.has_key(STORAGE_KEY) and self.storage[STORAGE_KEY].has_key(delete):
            del self.storage[STORAGE_KEY][delete]
            statusmessages = IStatusMessage(self.request)
            statusmessages.addStatusMessage(_('message_deleted', default='Notification template deleted'), type='info')
        
        return self.template()
    
    @memoize
    def templates(self):
        if not self.storage.has_key(STORAGE_KEY):
            return []
        templates_raw = self.storage.get(STORAGE_KEY)
        vocabulary = availableWorkflows(self.context)
        templates = []
        for name, template in templates_raw.items():
            template = {'name': name,
                        'template': template}
            try:
                term = vocabulary.getTermByToken(name)
                template.update(dict(title=(term.title or term.token)))
            except:
                pass
            templates.append(template)
        return templates
示例#40
0
 def queue(self):
     queue = getattr(self, "_queue", None)
     if queue is None:
         annotations = IAnnotations(self.context)
         if not annotations.has_key(self.key):
             annotations[self.key] = IOBTree()
         self._queue = annotations[self.key]
     return self._queue
    def test_setData_stores_data(self):
        annotations = IAnnotations(self.layer['portal'])
        self.assertIsNone(annotations.get(ANNOTATION_KEY))

        component = getAdapter(self.layer['portal'], IDataCollector,
                               name='ftw.servicenavigation')
        component.setData(EXAMPLE_DATA)
        self.assertEqual(EXAMPLE_DATA, annotations[ANNOTATION_KEY])
示例#42
0
 def _migrate_related_items_annotations(self):
     query = {'portal_type': 'opengever.document.document',
              'object_provides': IHasRelations.__identifier__}
     for obj in self.objects(query, 'Migrate relatedItems annotations'):
         ann = IAnnotations(obj)
         if OLD_KEY in ann:
             ann[NEW_KEY] = ann[OLD_KEY]
             ann.pop(OLD_KEY)
def instance_behaviors_of(obj):
    """Return applied instance behavior names of object.

    :param obj: The Dexterity content object to enable behaviors on.
    :type obj: object
    """
    annotations = IAnnotations(obj)
    return annotations.get(ANNOTATION_KEY, ())
示例#44
0
    def get_payment_data(self):
        adapted = IAnnotations(self.context)
        payment_code = self.request.SESSION.get(MIPAGO_PAYMENT_CODE, None)
        if payment_code is not None:
            payments = adapted.get(ANNOTATION_KEY, {})
            return payments.get(payment_code, None)

        return None
示例#45
0
    def post(self, **kwargs):
        """ POST
        """
        newids = self.request.get('new_ids')
        newtitles = self.request.get('new_titles', '')
        paths = self.request.get('paths', '')
        if 'form.button.Cancel' in kwargs:
            return self._redirect(_(u"Rename cancelled"), redirect_to='')
        elif 'form.button.rename' in kwargs:
            return self.original_action(action='rename')
        elif 'form.button.async_rename' in kwargs:
            return self.index()

        worker = getUtility(IAsyncService)
        queue = worker.getQueues()['']
        email = api.user.get_current().getProperty('email')

        try:
            job = worker.queueJobInQueue(
                queue, (ASYNCMOVE_QUEUE,),
                async_rename,
                self.context,
                new_ids=newids,
                new_titles=newtitles,
                paths=paths,
                success_event=AsyncRenameSuccess,
                fail_event=AsyncRenameFail,
                email=email
            )
            job_id = u64(job._p_oid)

            context = self.context
            wrapper = IContextWrapper(context)(
                folder_move_from=context.absolute_url(1),
                folder_move_to=', '.join(newids),
                folder_move_objects=', '.join(paths),
                asyncmove_email=email,
                async_operation_type='rename',
                email=email
            )
            notify(AsyncOperationAdded(wrapper))

            anno = IAnnotations(self.context)
            anno['async_move_job'] = job_id
            portal = getToolByName(self, 'portal_url').getPortalObject()
            portal_anno = IAnnotations(portal)
            if not portal_anno.get('async_move_jobs'):
                portal_anno['async_move_jobs'] = OOBTree()

            message_type = 'info'
            message = _(u"Item added to the queue. "
                        u"We will notify you by email at '%s' when the job is "
                        u"completed" % email)
        except Exception, err:
            logger.exception(err)
            message_type = 'error'
            message = u"Failed to add items to the sync queue"
示例#46
0
    def store(self, conf):
        self.check_permission(conf)
        annotations = IAnnotations(self.context)

        storage = annotations.get(SL_ANNOTATION_KEY, None)
        if storage:
            storage.update(make_resursive_persistent(conf))
        else:
            annotations[SL_ANNOTATION_KEY] = make_resursive_persistent(conf)
示例#47
0
def uninstall(context):
    if context.readDataFile('raptus.notification.uninstall.txt') is None:
        return
    portal = context.getSite()

    # Remove notification storage to prevent broken object errors after removal
    storage = IAnnotations(portal)
    if storage.get(ANNOTATIONS_KEY, None) is not None:
        del storage[ANNOTATIONS_KEY]
示例#48
0
    def storage(self):
        obj = self.config.get_annotated_object()
        ann = IAnnotations(obj)

        key = self.config.get_annotations_key()
        if key not in ann.keys():
            ann[key] = PersistentDict()

        return ann[key]
示例#49
0
 def storage(self):
     annotations = IAnnotations(self.context)
     scales = annotations.setdefault('plone.scale', ScalesDict())
     if not isinstance(scales, ScalesDict):
         # migrate from PersistentDict to ScalesDict
         new_scales = ScalesDict(scales)
         annotations['plone.scale'] = new_scales
         return new_scales
     return scales
示例#50
0
 def getInfoByRevision(self, instance, name, rev):
     """ Get info about a storage item by a give revision
     """
     annotations = IAnnotations(instance)
     if not annotations.has_key(LOG_KEY) or \
        not annotations[LOG_KEY].has_key(name) or \
        not annotations[LOG_KEY][name].has_key(rev):
         return
     return annotations[LOG_KEY][name][rev]
    def test_setData_stores_data(self):
        annotations = IAnnotations(self.layer['portal'])
        self.assertIsNone(annotations.get(ANNOTATION_KEY))

        component = getAdapter(self.layer['portal'],
                               IDataCollector,
                               name='ftw.servicenavigation')
        component.setData(EXAMPLE_DATA)
        self.assertEqual(EXAMPLE_DATA, annotations[ANNOTATION_KEY])
示例#52
0
    def storage(self):
        obj = self.config.get_annotated_object()
        ann = IAnnotations(obj)

        key = self.config.get_annotations_key()
        if key not in ann.keys():
            ann[key] = PersistentDict()

        return ann[key]
示例#53
0
def async_move(context, success_event, fail_event, **kwargs):
    """ Async job
    """
    newid = kwargs.get('newid', '')
    email = kwargs.get('email', '')

    anno = IAnnotations(context)
    job_id = anno.get('async_move_job')

    if not newid:
        wrapper = IContextWrapper(context)(
            error=u'Invalid newid'
        )
        notify(fail_event(wrapper))
        raise CopyError(eNoItemsSpecified)

    try:
        _op, mdatas = _cb_decode(newid)
    except:
        raise CopyError(eInvalid)
    oblist = []
    app = context.getPhysicalRoot()

    for mdata in mdatas:
        m = loadMoniker(mdata)
        try:
            ob = m.bind(app)
        except ConflictError:
            raise
        except:
            raise CopyError(eNotFound)

        oblist.append(ob)

    wrapper = IContextWrapper(context)(
        folder_move_from=oblist and aq_parent(
            aq_inner(oblist[0])).absolute_url(),
        folder_move_to=context.absolute_url(),
        folder_move_objects=', '.join([obj.getId() for obj in oblist]),
        asyncmove_email=email
    )

    try:
        manage_pasteObjects_no_events(context, cb_copy_data=newid)
    except Exception, err:
        logger.exception(err)

        wrapper.error = err.message
        wrapper.job_id = job_id

        notify(fail_event(wrapper))
        raise CopyError(MessageDialog(
            title='Error',
            message=err.message,
            action='manage_main',
        ))
示例#54
0
 def _initialize(self, create=False):
     if self.storage is not None:
         return
     storage = IAnnotations(self.context)
     if storage.get(ANNOTATIONS_KEY, None) is None:
         storage[ANNOTATIONS_KEY] = dict.PersistentDict()
         storage[ANNOTATIONS_KEY]['notifications'] = IOBTree()
         storage[ANNOTATIONS_KEY]['user'] = OOBTree()
         storage[ANNOTATIONS_KEY]['intid'] = 1
     self.storage = storage.get(ANNOTATIONS_KEY, None)
    def __call__(self):
        disable_edit_bar()

        annotations = IAnnotations(self.context)
        self.source_document = uuidToObject(annotations.get(PDF_SAVE_SOURCE_UUID_KEY))
        self.version_id = annotations.get(PDF_SAVE_SOURCE_VERSION_KEY)
        self.destination_document = self.context
        self.destination = self.context.get_parent_dossier()
        self.trigger_conversion()
        return self.template()
示例#56
0
 def update(self):
     form = self.request.form
     if form.get("form.button.UseLocalPayment") is not None:
         res = form.get("local_payment")
         numbers = IAnnotations(self.context)['collective.pfg.payment']
         if res is True or res == 'on':
             numbers.local_payment = True
         else:
             numbers.local_payment = False
         self.request.response.redirect(self.current_url)