Example #1
0
def migrate_imagecharts(context):
    """ Migrate dashboard image charts"""
    ctool = getToolByName(context, 'portal_catalog')
    brains = ctool.unrestrictedSearchResults(portal_type='DavizVisualization')
    previews = [
        "googlechart.motionchart.preview.png",
        "googlechart.organizational.preview.png",
        "googlechart.imagechart.preview.png",
        "googlechart.sparkline.preview.png", "googlechart.table.preview.png",
        "googlechart.annotatedtimeline.preview.png",
        "googlechart.treemap.preview.png"
    ]

    logger.info('Migrating %s Visualizations ...', len(brains))

    for brain in brains:
        logger.info('Migrating %s', brain.getURL())

        visualization = brain.getObject()
        if IFolderish.providedBy(visualization):
            for previewname in previews:
                if not visualization.get(previewname, None):
                    logger.info('Create img: %s', previewname)

                    img = context.restrictedTraverse('++resource++' +
                                                     previewname)
                    visualization.invokeFactory('Image',
                                                id=previewname,
                                                title=previewname,
                                                image=img.GET())
                else:
                    logger.info('Img: %s already exists', previewname)

    logger.info('Migrating Visualizations ... DONE')
Example #2
0
def migrate_sortfilter(context):
    """ Migrate sort filters"""
    ctool = getToolByName (context, 'portal_catalog')
    brains = ctool.unrestrictedSearchResults(portal_type='DavizVisualization')

    logger.info('Migrating %s Visualizations ...', len(brains))
    for brain in brains:

        visualization = brain.getObject()
        mutator = queryAdapter(visualization, IVisualizationConfig)

        for view in mutator.views:
            if view.get('chartsconfig'):
                logger.info('Migrating %s', brain.getURL())
                config = view.get('chartsconfig')
                shouldUpgrade = False
                for chart in config.get('charts', []):
                    if chart.get('showSort', False):
                        shouldUpgrade = True
                        chart['sortFilter'] = '__default__'
                if shouldUpgrade:
                    data = {}
                    data['chartsconfig'] = config
                    mutator.edit_view('googlechart.googlecharts', **data)

    logger.info('Migrating Visualizations ... DONE')
Example #3
0
def cleanup_fallback_images(context):
    """ Migrate exhibit image charts"""
    ctool = getToolByName(context, 'portal_catalog')
    iface = interfaceToName(context, IVisualizationEnabled)
    brains = ctool(object_provides=iface, show_inactive=True, Language='all')

    count = 0
    nbrains = len(brains)
    logger.info("Start removing aprox. %s Google Charts images", nbrains * 8)
    for idx, brain in enumerate(brains):
        doc = brain.getObject()
        clean = []
        for item in CLEANUP:
            if item in doc.objectIds():
                clean.append(item)

        if not clean:
            continue

        length = len(clean)
        logger.info('Removing %s Google Charts fallback images from %s',
                    length, doc.absolute_url())
        doc.manage_delObjects(clean)
        count += length

        if idx % 100 == 0:
            logger.info("Cleanup: Transaction commit: %s/%s", idx, nbrains)
            transaction.commit()

    logger.info('Done removing %s Google Charts fallback images', count)
Example #4
0
def migrate_imagecharts(context):
    """ Migrate dashboard image charts"""
    ctool = getToolByName(context, 'portal_catalog')
    brains = ctool.unrestrictedSearchResults(portal_type='DavizVisualization')
    previews = [
        "googlechart.motionchart.preview.png",
        "googlechart.organizational.preview.png",
        "googlechart.imagechart.preview.png",
        "googlechart.sparkline.preview.png",
        "googlechart.table.preview.png",
        "googlechart.annotatedtimeline.preview.png",
        "googlechart.treemap.preview.png"
    ]

    logger.info('Migrating %s Visualizations ...', len(brains))

    for brain in brains:
        logger.info('Migrating %s', brain.getURL())

        visualization = brain.getObject()
        if IFolderish.providedBy(visualization):
            for previewname in previews:
                if not visualization.get(previewname, None):
                    logger.info('Create img: %s', previewname)

                    img = context.restrictedTraverse(
                        '++resource++' + previewname)
                    visualization.invokeFactory('Image',
                        id=previewname,
                        title=previewname,
                        image=img.GET())
                else:
                    logger.info('Img: %s already exists', previewname)

    logger.info('Migrating Visualizations ... DONE')
Example #5
0
def migrate_filters(context):
    """ Migrate sort filters"""
    ctool = getToolByName(context, 'portal_catalog')
    brains = ctool.unrestrictedSearchResults(portal_type='DavizVisualization')

    logger.info('Migrating %s Visualizations ...', len(brains))
    for brain in brains:

        visualization = brain.getObject()
        mutator = queryAdapter(visualization, IVisualizationConfig)

        for view in mutator.views:
            if view.get('chartsconfig'):
                logger.info('Migrating %s', brain.getURL())
                config = view.get('chartsconfig')
                for chart in config.get('charts', []):
                    filters_str = chart.get('filters', '{}')
                    filters = json.loads(filters_str)
                    migrated_filters = {}
                    for filter_key in filters.keys():
                        if not isinstance(filters[filter_key], dict):
                            migrated_filters[filter_key] = {}
                            migrated_filters[filter_key]['type'] = \
                                filters[filter_key]
                            migrated_filters[filter_key]['defaults'] = []
                            migrated_filters_str = json.dumps(migrated_filters)
                            chart['filters'] = migrated_filters_str
                data = {}
                data['chartsconfig'] = config
                mutator.edit_view('googlechart.googlecharts', **data)

    logger.info('Migrating Visualizations ... DONE')
Example #6
0
def cleanup_fallback_images(context):
    """ Migrate exhibit image charts"""
    ctool = getToolByName(context, 'portal_catalog')
    iface = interfaceToName(context, IVisualizationEnabled)
    brains = ctool(
        object_provides=iface,
        show_inactive=True, Language='all'
    )

    count = 0
    nbrains = len(brains)
    logger.info("Start removing aprox. %s Google Charts images", nbrains*8)
    for idx, brain in enumerate(brains):
        doc = brain.getObject()
        clean = []
        for item in CLEANUP:
            if item in doc.objectIds():
                clean.append(item)

        if not clean:
            continue

        length = len(clean)
        logger.info('Removing %s Google Charts fallback images from %s',
                    length, doc.absolute_url())
        doc.manage_delObjects(clean)
        count += length

        if idx % 100 == 0:
            logger.info("Cleanup: Transaction commit: %s/%s", idx, nbrains)
            transaction.commit()

    logger.info('Done removing %s Google Charts fallback images', count)
Example #7
0
def migrate_filters(context):
    """ Migrate sort filters"""
    ctool = getToolByName(context, 'portal_catalog')
    brains = ctool.unrestrictedSearchResults(portal_type='DavizVisualization')

    logger.info('Migrating %s Visualizations ...', len(brains))
    for brain in brains:

        visualization = brain.getObject()
        mutator = queryAdapter(visualization, IVisualizationConfig)

        for view in mutator.views:
            if view.get('chartsconfig'):
                logger.info('Migrating %s', brain.getURL())
                config = view.get('chartsconfig')
                for chart in config.get('charts', []):
                    filters_str = chart.get('filters', '{}')
                    filters = json.loads(filters_str)
                    migrated_filters = {}
                    for filter_key in filters.keys():
                        if (type(filters[filter_key]) != type({})):
                            migrated_filters[filter_key] = {}
                            migrated_filters[filter_key]['type'] = \
                                filters[filter_key]
                            migrated_filters[filter_key]['defaults'] = []
                            migrated_filters_str = json.dumps(migrated_filters)
                            chart['filters'] = migrated_filters_str
                data = {}
                data['chartsconfig'] = config
                mutator.edit_view('googlechart.googlecharts', **data)

    logger.info('Migrating Visualizations ... DONE')
Example #8
0
def migrate_notes(context):
    """ Migrate notes"""
    ctool = getToolByName(context, 'portal_catalog')
    pr = getToolByName(context, 'portal_repository')
    brains = ctool.unrestrictedSearchResults(portal_type='DavizVisualization')
    view_name = 'googlechart.googlecharts'
    config_name = 'chartsconfig'

    logger.info('Migrating %s Visualizations ...', len(brains))
    for brain in brains:
        visualization = brain.getObject()
        mutator = queryAdapter(visualization, IVisualizationConfig)

        view = mutator.view(view_name, {})
        config = view.get(config_name, None)

        if config:
            url = brain.getURL()
            logger.info('Migrating %s', url)
            create_version(pr, visualization, url)

            extracted_notes = []

            for chart in config.get('charts', []):
                chart_id = chart.get('id')
                for idx, note in enumerate(chart.get('notes', [])):
                    note.setdefault('charts', []).append(chart_id)
                    note['id'] = str(uuid.uuid4())
                    note.setdefault('order', {})[chart_id] = idx
                    extracted_notes.append(note)

                chart.pop('notes', None)

            data = {}

            if config.get('notes', None) is None:
                config['notes'] = extracted_notes

            data[config_name] = config

            mutator.edit_view(view_name, **data)

    logger.info('Migrating Visualizations ... DONE')
Example #9
0
    def __init__(self, context, request, resources=()):
        self.context = context
        self.request = request
        self._resources = resources
        self.duration = 3600*24*365
        self.debug = False

        self.csstool = getToolByName(context, 'portal_css', None)
        if self.csstool:
            self.debug = self.csstool.getDebugMode()
Example #10
0
    def __init__(self, context, request, resources=()):
        self.context = context
        self.request = request
        self._resources = resources
        self.duration = 3600 * 24 * 365
        self.debug = False

        self.csstool = getToolByName(context, 'portal_css', None)
        if self.csstool:
            self.debug = self.csstool.getDebugMode()
Example #11
0
    def bundle(self):
        """ Enable bundle
        """
        if self._bundle is not None:
            return self._bundle

        self.jstool = getToolByName(self.context, 'portal_javascripts', None)
        if self.jstool:
            self._bundle = not self.jstool.getDebugMode()
        else:
            self._bundle = True
        return json.dumps(self._bundle)
Example #12
0
def migrate_imagecharts(context):
    """ Migrate dashboard image charts"""
    ctool = getToolByName(context, 'portal_catalog')
    brains = ctool.unrestrictedSearchResults(portal_type='DavizVisualization')
    for brain in brains:
        visualization = brain.getObject()
        if IFolderish.providedBy(visualization):
            tabs = queryMultiAdapter((visualization, context.REQUEST),
                                     name='daviz-view.html').tabs

            for tab in tabs:
                if tab['name'] == 'googlechart.googledashboard':
                    previewname = tab['name'] + '.preview.png'
                    if not visualization.get(previewname, None):
                        img = context.restrictedTraverse('++resource++' +
                            str(previewname))
                        visualization.invokeFactory('Image',
                            id=previewname,
                            title=previewname,
                            image=img.GET())
Example #13
0
def migrate_dashboards(context):
    """ Migrate single dashboard settings to multiple-dashboards
    """
    ctool = getToolByName(context, 'portal_catalog')
    brains = ctool(object_provides=('eea.app.visualization.subtypes.interfaces.'
                                    'IVisualizationEnabled'))

    logger.info('Migrating %s Google Dashboards ...', len(brains))
    for brain in brains:
        doc = brain.getObject()
        migrate = queryMultiAdapter(
            (doc, doc.REQUEST), name=u'migrate-dashboards')
        if not migrate:
            continue

        info = migrate()
        if info:
            logger.info(info)
        else:
            logger.info('Skipping %s', brain.getURL())

    logger.info('Migrating Google Dashboards ... DONE')
Example #14
0
def migrate_rowfilters(context):
    """ Migrate dashboard image charts"""
    ctool = getToolByName(context, 'portal_catalog')
    brains = ctool.unrestrictedSearchResults(portal_type='DavizVisualization')

    logger.info('Migrating %s Visualizations ...', len(brains))

    for brain in brains:
        logger.info('Migrating %s', brain.getURL())

        visualization = brain.getObject()
        mutator = queryAdapter(visualization, IVisualizationConfig)

        for view in mutator.views:
            if view.get('chartsconfig'):
                config = view.get('chartsconfig')
                for chart in config.get('charts', []):
                    if chart.get('row_filters'):
                        row_filters_str = chart.get('row_filters')
                        row_filters = json.loads(row_filters_str)
                        migrated_rf = {}
                        for row in row_filters.keys():
                            filters = row_filters.get(row)
                            if isinstance(filters, list):
                                migrated_rf[row] = {}
                                migrated_rf[row]['values'] = filters
                                migrated_rf[row]['type'] = 'hidden'
                            else:
                                migrated_rf[row] = filters
                        migrated_rf_str = json.dumps(migrated_rf)
                        chart['row_filters'] = migrated_rf_str
                data = {}
                data['chartsconfig'] = config
                mutator.edit_view('googlechart.googlecharts', **data)

    logger.info('Migrating Visualizations ... DONE')
Example #15
0
def migrate_rowfilters(context):
    """ Migrate dashboard image charts"""
    ctool = getToolByName(context, 'portal_catalog')
    brains = ctool.unrestrictedSearchResults(portal_type='DavizVisualization')

    logger.info('Migrating %s Visualizations ...', len(brains))

    for brain in brains:
        logger.info('Migrating %s', brain.getURL())

        visualization = brain.getObject()
        mutator = queryAdapter(visualization, IVisualizationConfig)

        for view in mutator.views:
            if view.get('chartsconfig'):
                config = view.get('chartsconfig')
                for chart in config.get('charts', []):
                    if chart.get('row_filters'):
                        row_filters_str = chart.get('row_filters')
                        row_filters = json.loads(row_filters_str)
                        migrated_rf = {}
                        for row in row_filters.keys():
                            filters = row_filters.get(row)
                            if type(filters) == list:
                                migrated_rf[row] = {}
                                migrated_rf[row]['values'] = filters
                                migrated_rf[row]['type'] = 'hidden'
                            else:
                                migrated_rf[row] = filters
                        migrated_rf_str = json.dumps(migrated_rf)
                        chart['row_filters'] = migrated_rf_str
                data = {}
                data['chartsconfig'] = config
                mutator.edit_view('googlechart.googlecharts', **data)

    logger.info('Migrating Visualizations ... DONE')
Example #16
0
    def save_svg_and_png(self, kwargs):
        """ Save png out of the svg version of the chart
        """
        if not IFolderish.providedBy(self.context):
            return _("Can't save png chart on a non-folderish object !")
        form = getattr(self.request, 'form', {})
        kwargs.update(form)
        filename = kwargs.get('filename', 'img')
        chart_url = self.context.absolute_url() + "#" + "tab-" + filename
        svg_filename = filename + ".svg"
        filename += ".png"
        sp = self.siteProperties
        qr_size = sp.get('googlechart.qrcode_size', '70')
        object_ids = self.context.objectIds()
        if qr_size == '0':
            qr_size = '70'
        qr_url = (
            u"https://chart.apis.google.com"
            "/chart?cht=qr&chld=H%sC0&chs=%sx%s&chl=%s" % (
                "%7", qr_size, qr_size, urllib2.quote(chart_url)))
        self.request.form['qr_url'] = qr_url
        svg_data = kwargs.get('svg', '')
        if not svg_data:
            return _("Success")
        new_svg = False
        if svg_filename not in object_ids:
            new_svg = True
            svg_filename = self.context.invokeFactory('File', id=svg_filename)
        svg_obj = self.context._getOb(svg_filename)
        svg_file_field = svg_obj.getField('file')
        svg_field_data = svg_file_field.getRaw(svg_obj).getIterator().read()
        if svg_field_data and svg_data == svg_field_data:
            return _("Success")
        elif svg_field_data:
            # 21894 svg_data from the form and the data saved within the current
            # svg files sometimes has the clipPath id number changed, otherwise
            # the files are identical in which case we no longer need to perform
            # any svg and image generation
            pattern = re.compile(r'_ABSTRACT_RENDERER_ID_\d+')
            # 79908 check if we have a result for pattern search
            pattern_match = pattern.search(svg_data)
            if pattern_match:
                svg_data_match = pattern_match.group()
                svg_field_data_matched = pattern.sub(svg_data_match,
                                                     svg_field_data)
                if svg_data == svg_field_data_matched:
                    return _("Success")
        # create image from the current svg
        img = super(SavePNGChart, self).__call__()
        # 79908 check if img return has PNG within the string
        # as img can contain ERROR message in case of an error
        # which means the image will contain a string instead of actual
        # image data
        if not img or img and 'PNG' not in img:
            return _("ERROR: An error occured while exporting your image. "
                     "Please try again later.")
        new_file = False
        if filename not in object_ids:
            new_file = True
            filename = self.context.invokeFactory('Image', id=filename)
        img_obj = self.context._getOb(filename)
        if new_file:
            img_obj.setExcludeFromNav(True)
        image_field = img_obj.getField('image')
        image_field.getMutator(img_obj)(img)
        if new_svg:
            svg_obj.setExcludeFromNav(True)
        svg_file_field.getMutator(svg_obj)(svg_data)

        wftool = getToolByName(svg_obj, "portal_workflow")
        state = wftool.getInfoFor(svg_obj, 'review_state', None)
        if state:
            if state != 'visible':
                workflows = wftool.getWorkflowsFor(svg_obj)
                workflow = workflows[0]
                transitions = workflow.transitions

                # publish
                for transition in wftool.getTransitionsFor(svg_obj):
                    tid = transition.get('id')
                    tob = transitions.get(tid)
                    if not tob:
                        continue

                    if tob.new_state_id != 'published':
                        continue

                    self.request.form['_no_emails_'] = True
                    workflow.doActionFor(svg_obj, tid)
                    break

                # then make it public draft
                for transition in wftool.getTransitionsFor(svg_obj):
                    tid = transition.get('id')
                    tob = transitions.get(tid)
                    if not tob:
                        continue

                    if tob.new_state_id != 'visible':
                        continue

                    workflow.doActionFor(svg_obj, tid)
                    break

                svg_obj.reindexObject()
        if not new_svg:
            notify(InvalidateCacheEvent(svg_obj))
        return _("Success")
Example #17
0
    def save_svg_and_png(self, kwargs):
        """ Save png out of the svg version of the chart
        """
        if not IFolderish.providedBy(self.context):
            return _("Can't save png chart on a non-folderish object !")
        form = getattr(self.request, 'form', {})
        kwargs.update(form)
        filename = kwargs.get('filename', 'img')
        chart_url = self.context.absolute_url() + "#" + "tab-" + filename
        svg_filename = filename + ".svg"
        filename += ".png"
        sp = self.siteProperties
        qr_size = sp.get('googlechart.qrcode_size', '70')
        object_ids = self.context.objectIds()
        if qr_size == '0':
            qr_size = '70'
        qr_url = (u"https://chart.apis.google.com"
                  "/chart?cht=qr&chld=H%sC0&chs=%sx%s&chl=%s" %
                  ("%7", qr_size, qr_size, urllib2.quote(chart_url)))
        self.request.form['qr_url'] = qr_url
        svg_data = kwargs.get('svg', '')
        if not svg_data:
            return _("Success")
        new_svg = False
        if svg_filename not in object_ids:
            new_svg = True
            svg_filename = self.context.invokeFactory('File', id=svg_filename)
        svg_obj = self.context._getOb(svg_filename)
        svg_file_field = svg_obj.getField('file')
        svg_field_data = svg_file_field.getRaw(svg_obj).getIterator().read()
        if svg_field_data and svg_data == svg_field_data:
            return _("Success")
        elif svg_field_data:
            # 21894 svg_data from the form and the data saved within the current
            # svg files sometimes has the clipPath id number changed, otherwise
            # the files are identical in which case we no longer need to perform
            # any svg and image generation
            pattern = re.compile(r'_ABSTRACT_RENDERER_ID_\d+')
            # 79908 check if we have a result for pattern search
            pattern_match = pattern.search(svg_data)
            if pattern_match:
                svg_data_match = pattern_match.group()
                svg_field_data_matched = pattern.sub(svg_data_match,
                                                     svg_field_data)
                if svg_data == svg_field_data_matched:
                    return _("Success")
        # create image from the current svg
        img = super(SavePNGChart, self).__call__()
        # 79908 check if img return has PNG within the string
        # as img can contain ERROR message in case of an error
        # which means the image will contain a string instead of actual
        # image data
        if not img or img and 'PNG' not in img:
            return _("ERROR: An error occured while exporting your image. "
                     "Please try again later.")
        new_file = False
        if filename not in object_ids:
            new_file = True
            filename = self.context.invokeFactory('Image', id=filename)
        img_obj = self.context._getOb(filename)
        if new_file:
            img_obj.setExcludeFromNav(True)
        image_field = img_obj.getField('image')
        image_field.getMutator(img_obj)(img)
        if new_svg:
            svg_obj.setExcludeFromNav(True)
        svg_file_field.getMutator(svg_obj)(svg_data)

        wftool = getToolByName(svg_obj, "portal_workflow")
        state = wftool.getInfoFor(svg_obj, 'review_state', None)
        if state:
            if state != 'visible':
                workflows = wftool.getWorkflowsFor(svg_obj)
                workflow = workflows[0]
                transitions = workflow.transitions

                # publish
                for transition in wftool.getTransitionsFor(svg_obj):
                    tid = transition.get('id')
                    tob = transitions.get(tid)
                    if not tob:
                        continue

                    if tob.new_state_id != 'published':
                        continue

                    self.request.form['_no_emails_'] = True
                    workflow.doActionFor(svg_obj, tid)
                    break

                # then make it public draft
                for transition in wftool.getTransitionsFor(svg_obj):
                    tid = transition.get('id')
                    tob = transitions.get(tid)
                    if not tob:
                        continue

                    if tob.new_state_id != 'visible':
                        continue

                    workflow.doActionFor(svg_obj, tid)
                    break

                svg_obj.reindexObject()
        if not new_svg:
            notify(InvalidateCacheEvent(svg_obj))
        return _("Success")