Ejemplo n.º 1
0
 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
Ejemplo n.º 2
0
 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)
Ejemplo n.º 3
0
 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)
Ejemplo n.º 4
0
 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)
Ejemplo n.º 5
0
 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
Ejemplo n.º 6
0
 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
Ejemplo n.º 7
0
 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
Ejemplo n.º 8
0
 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)
Ejemplo n.º 9
0
 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
Ejemplo n.º 10
0
 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
Ejemplo n.º 11
0
 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
Ejemplo n.º 12
0
 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
Ejemplo n.º 13
0
    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
Ejemplo n.º 14
0
 def widget_storage(uuid):
     context = api.content.get(UID=uuid)
     return IContentWidgets(context)
Ejemplo n.º 15
0
 def widget_image_cover(self):
     context = aq_inner(self.context)
     storage = IContentWidgets(context)
     content = storage.read_widget(self.widget_uid())
     return content
Ejemplo n.º 16
0
 def widget_text_formatted(self):
     context = aq_inner(self.context)
     storage = IContentWidgets(context)
     content = storage.read_widget(self.widget_uid())
     return content
Ejemplo n.º 17
0
 def widget_item_records(self):
     context = aq_inner(self.context)
     storage = IContentWidgets(context)
     records = storage.read_widget(self.configuration['widget_id'])
     return records