def getContent(self): context = aq_inner(self.context) editor_data = self.panel_editor[context.UID()] widget_node_id = editor_data["widget_node"] storage = IContentWidgets(context) stored_widget_data = storage.read_widget(editor_data['widget_id']) widget_content = dict() if stored_widget_data: widget_node = stored_widget_data["items"].get(widget_node_id, None) if widget_node: schemata = self.additionalSchemata + (self.schema, ) for widget_schema in schemata: fields = getFieldsInOrder(widget_schema) for key, value in fields: if key == "image": image_uid = widget_node.get("image", None) if image_uid: asset = api.content.get(UID=image_uid) widget_content[key] = getattr( asset, key, value) elif key.endswith('_related'): # Make sure we do not fall over old widget attribute values widget_content[key] = RelationValue(None) else: widget_content[key] = widget_node.get(key, None) return widget_content
def _remove_widget(self, form_data): context = aq_inner(self.context) editor_data = self.panel_editor()[context.UID()] storage = IContentWidgets(context) widget_node_id = form_data.get('nid', None) widget_nodes = self.widget_item_nodes() if widget_node_id and widget_node_id in widget_nodes: records = self.widget_item_records() widget_nodes_content = records.get('items', dict()) try: del widget_nodes_content[widget_node_id] except KeyError: # TODO: add logger for edge case behavior pass try: widget_nodes.remove(widget_node_id) except ValueError: pass records["item_order"] = widget_nodes editor_data['widget_content']['item_order'] = widget_nodes records["items"] = widget_nodes_content editor_data['widget_content']['items'] = widget_nodes_content storage.store_widget(editor_data['widget_id'], records, self.request) self._update_panel_editor(editor_data) next_url = self.panel_editor_close() return self.request.response.redirect(next_url)
def applyChanges(self, data): context = aq_inner(self.context) editor_data = self.panel_editor[context.UID()] storage = IContentWidgets(context) widget_content = dict() for key, value in data.items(): entry_key = self.prettify_key(key) # Additional schemata are posted as 'ISchemaInterface.field_name' # and need to be resolved to their original key field_key = key.split('.')[-1] # Handle image like content if INamedBlobImage.providedBy(value): image_uid = self._process_image_asset(entry_key, value) widget_content[entry_key] = image_uid else: if value is NOT_CHANGED: # Keep existing value for fields signaling as not updated stored_content = editor_data.get('widget_content') if widget_content: value = stored_content.get(field_key, None) if entry_key.endswith('_related'): # Handle asset relation choice widget_content[entry_key] = self._process_relations(value) source_entry_key = key.replace('_related', '') source_value = data.get(source_entry_key, None) if not source_value: # Actual image uploads take preference. Only if no image has # been uploaded write relation choice to image field. widget_content[source_entry_key] = value.UID() widget_content[entry_key] = value storage.store_widget(editor_data['widget_id'], widget_content, self.request) next_url = '{0}/@@panel-page'.format(context.absolute_url()) return self.request.response.redirect(next_url)
def applyChanges(self, data): context = aq_inner(self.context) editor_data = self.panel_editor[context.UID()] storage = IContentWidgets(context) record = storage.read_widget(editor_data["widget_id"]) if record: item_order = record.get("item_order") if item_order: widget_content = record else: widget_content = editor_data["widget_content"] if not widget_content: widget_content = dict() for key, value in data.items(): entry_key = self.prettify_key(key) if INamedBlobImage.providedBy(value): image_uid = self._process_image_asset(entry_key, value) widget_content[entry_key] = image_uid elif IRichTextValue.providedBy(value): # Handle rich text value that is not serializable text_value = value.output widget_content[entry_key] = text_value else: widget_content[entry_key] = value storage.store_widget(editor_data['widget_id'], record, self.request) next_url = '{url}/@@panel-edit?section={section}&panel={panel}'.format( url=context.absolute_url(), section=editor_data["content_section"], panel=editor_data["content_section_panel"]) return self.request.response.redirect(next_url)
def widget_stored_data(self): context = aq_inner(self.context) try: storage = IContentWidgets(context) content = storage.read_widget(self.widget_uid()) except TypeError: content = dict() return content
def widget_item_nodes(self): context = aq_inner(self.context) ordered_nodes = list() storage = IContentWidgets(context) stored_widget = storage.read_widget(self.widget_uid()) if stored_widget: ordered_nodes = stored_widget["item_order"] return ordered_nodes
def widget_item_content(self): context = aq_inner(self.context) item_content = dict() storage = IContentWidgets(context) stored_widget = storage.read_widget(self.configuration['widget_id']) if stored_widget: item_content = stored_widget["items"] return item_content
def applyChanges(self, data): context = aq_inner(self.context) editor_data = self.panel_editor[context.UID()] storage = IContentWidgets(context) record = storage.read_widget(editor_data["widget_id"]) item_order = record["item_order"] if item_order: widget_content = record["items"] else: widget_content = editor_data["widget_content"] if not widget_content: widget_content = dict() widget_item = dict() widget_item_node = editor_data["widget_node"] for key, value in data.items(): entry_key = self.prettify_key(key) # Additional schemata are posted as 'ISchemaInterface.field_name' # and need to be resolved to their original key field_key = key.split('.')[-1] if INamedBlobImage.providedBy(value): image_uid = self._process_image_asset(entry_key, value) widget_item[entry_key] = image_uid elif IRichTextValue.providedBy(value): # Handle rich text value that is not serializable text_value = value widget_item[entry_key] = text_value else: if value is NOT_CHANGED: # Keep existing value for fields signaling as not updated value = widget_content[widget_item_node][field_key] # continue if entry_key.endswith('_related'): # Handle asset relation choice widget_item[entry_key] = self._process_relations(value) source_entry_key = key.replace('_related', '') source_value = data.get(source_entry_key, None) if not source_value: # Actual image uploads take preference. Only if no image has # been uploaded write relation choice to image field. widget_item[source_entry_key] = value.UID() widget_item[entry_key] = value if widget_item_node in item_order: widget_content[widget_item_node] = widget_item else: widget_content.update({widget_item_node: widget_item}) item_order.append(widget_item_node) record["item_order"] = item_order record["items"] = widget_content storage.store_widget(editor_data['widget_id'], record, self.request) next_url = '{url}/@@panel-edit?section={section}&panel={panel}'.format( url=context.absolute_url(), section=editor_data["content_section"], panel=editor_data["content_section_panel"]) return self.request.response.redirect(next_url)
def widget_item_content(self, widget_node): context = aq_inner(self.context) item_content = {"uid": widget_node} storage = IContentWidgets(context) stored_widget = storage.read_widget(self.widget_uid()) if stored_widget: content_items = stored_widget["items"] if content_items: try: item_content.update(content_items[widget_node]) except KeyError: item_content = None return item_content
def _content_widget_factory(self): context = aq_inner(self.context) tool = getUtility(IPanelEditor) editor_data = tool.get()[context.UID()] node_uid = str(uuid_tool.uuid4()) editor_data["widget_node"] = node_uid tool.update(key=context.UID(), data=editor_data) storage = IContentWidgets(context) if not self.widget_item_nodes(): widget_content = {"items": dict(), "item_order": list()} storage.store_widget(editor_data['widget_id'], widget_content, self.request) return node_uid
def widget_item_content(self, widget_node): context = aq_inner(self.context) item_content = {"uid": widget_node} storage = IContentWidgets(context) stored_widget = storage.read_widget(self.widget_uid()) if stored_widget: content_items = stored_widget["items"] if content_items: try: node_content = content_items[widget_node] if node_content['is_public']: item_content.update(node_content) except KeyError: item_content['is_public'] = False return item_content
def getContent(self): context = aq_inner(self.context) editor_data = self.panel_editor[context.UID()] storage = IContentWidgets(context) stored_widget_data = storage.read_widget(editor_data['widget_id']) widget_content = dict() if stored_widget_data: schemata = self.additionalSchemata + (self.schema, ) for widget_schema in schemata: fields = getFieldsInOrder(widget_schema) for key, value in fields: if key == "image": image_uid = stored_widget_data.get("image", None) if image_uid: asset = api.content.get(UID=image_uid) widget_content[key] = getattr(asset, key, value) else: widget_content[key] = stored_widget_data.get( key, value.title) return widget_content
def handle_widget_collection_reorder(self): """ Update widget node ordering Should also update the stored session details to allow for smooth panel page editor workflow """ # TODO: implement order storage context = aq_inner(self.context) payload = self.payload editor = self.panel_editor() editor_data = editor[context.UID()] storage = IContentWidgets(context) record = storage.read_widget(editor_data["widget_id"]) item_order = record["item_order"] if item_order: updated_order = payload['node-order'] if not isinstance(updated_order, list): updated_order = list() record["item_order"] = updated_order storage.store_widget(editor_data['widget_id'], record, self.request) msg = _(u"Collection node order updated") data = {"success": True, "message": msg} return data
def widget_storage(uuid): context = api.content.get(UID=uuid) return IContentWidgets(context)
def widget_image_cover(self): context = aq_inner(self.context) storage = IContentWidgets(context) content = storage.read_widget(self.widget_uid()) return content
def widget_text_formatted(self): context = aq_inner(self.context) storage = IContentWidgets(context) content = storage.read_widget(self.widget_uid()) return content
def widget_item_records(self): context = aq_inner(self.context) storage = IContentWidgets(context) records = storage.read_widget(self.configuration['widget_id']) return records