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')
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')
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)
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')
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')
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)
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')
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')
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()
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()
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)
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())
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')
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')
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')
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")
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")