CMS Models

The CMS section consists of two base type models, that define attributes, look and behaviour of their implementing counterparts. The PageType is implemented by Page and BlockType have their Block.

Additionally, the ReferencingPage is a special subclass that only accepts base attributes as well as a referenced page from which it will get all its attributes.

class PageType(*args, **values)[source]

A page type defines the template being used for a single page.

Page types will have any number of content areas, which can later be filled by blocks (which in turn are defined by blocktypes).

A page type contains one or more areas that will be placed on the page according to its template.

class BlockType(*args, **values)[source]

A single block inside a page type template.

A block type defines the expected content defined by the implementing block.

BlockTypes specify fields with a defined type that will be defined by the implementing Block.

ex: BlockType Product defines a sub-template that displays a product’s details, contains only one field to select a product, which will be chosen on the Block instance.

(This could also make for dynamic blocks, that fill the given blocktype’s fields from, say, a URL parameter for automatic browsing of models maybe).

identifier

The identifier of a blocktype is different from others, in that it is actually a Jinja2 template. You can use all common Jinja2 template tags and filters when defining your preview template.

This template currently receives the following context variables:

  • block The block we want to create a preview for.

  • blocktype The BlockType object of this block.

  • request The current HTTP request to the XMM system.

It is currently not possible to reference the current page the block is on.

Example usage:

  • Show a scalar value in the template:

    {{ block.fields.my_decimal }}
    {{ block.fields.my_text }}
    {{ block.fields.my_translated.de }}
    
  • Render a reference or file attribute:

    {% set file = block.get_attribute('myfile') %}
    File size: {{ file.view_size() }}<br />
    File name: {{ file.filename }}<br />
    Preview: <img src="//xmm.mysite.com/{{ url_for('main.thumbnail', object_id=file.id, size='100x100') }}" />
    

Rendering a reference attribute requires using the get_attribute method, otherwise the value would just be an ObjectId.

  • Show an attribute with multiple values:

    <ul>
      {% for film in block.fields.films %}
        <li><b>{{ film }}</b> (Runtime: {{ film.fields.length }}min)
          <ul>
          {% for category in film.fields.categories %}
            <li>{{ category }}</li>
          {% endfor %}
          </ul>
        </li>
      {% endfor %}
    </ul>
    
class Page(*args, **values)[source]

A page that must implement a single page type (i.e. template).

Metadata such as SEO description and keywords will be stored on this model instance.

Associated with a page should be all blocks, and blocks in turn are defined by their block type, so we can define the way they will be rendered on the page.

parent

Page that is parent of this page.

pos

Represents position of page in tree in CMS.

pagetype

References type of this page.

name

Name of page.

blocks

Blocks that are on this page.

slug

Substring in Url to share with others.

metatags

Additional info about the page.

classmethod get_module_permission()[source]

Get the module permission required for this model.

to_api_json(**options)[source]

Return json data for api methods.

clean()[source]

Ensure page slug uniqueness across languages.

classmethod pre_save(sender, document, **kwargs)[source]

Ensure proper positions of this page and the contained blocks.

classmethod get_elastic_mapping()[source]

Return the ES mapping for the Page class, extended with field mappings for all blockstypes.

to_elastic()[source]

Return ES data with reduced block data.

classmethod resolve_url(url_parts, lang=None, host=None, **kwargs)[source]

Resolve a CMS page URL.

Walks up the URL until it doesn’t find a match and throws a 404 or returns the desired page.

Parameters
  • url_parts (list|str) – The url, or url parts to resolve.

  • lang (str) – Language code to use if not default.

  • host (str) – Domain or IP to look up pages on.

  • parent_id (ObjectId) – Parent ID to look up in this iteration.

  • version (int) – A specific version to lookup (not possible for drafts)

  • find_deleted (bool) – Returns deleted pages as well.

identify(depth=0)[source]

Identify this object based on its identifier template.

build_urls(host=None, absolute=False)[source]

Build page url(s) without trailing slash.

If a slug is not defined in a different language, we will use the slug provided in the default language.

Parameters
  • host (str) – Specify the host for which we are building the URL.

  • absolute (bool) – Build absolute URLs (without protocol).

get_children()[source]

Return a QuerySet with the children in this page.

to_dict(**data)[source]

Get a dict representation suitable for JSON of this instance.

Parameters

data – additional items to be added.

Return the Referencing class object for this model.

classmethod create_from_json(json)[source]

Create a new instance and set its properties with data from the given json dict.

update_from_json(json, compare_timestamps=True)[source]

Update the current instance with data from the given json dict.

get_blocks(block_key, path=None)[source]

Get a specific block from this page.

Return type

xmm.models.cms.block.Block

set_blocks(new_block, path=None)[source]

Create or update a block on this page.

remove_blocks(block_key, path=None)[source]

Remove a block from this page.

api_move_block(source_path=None, target_path=None, pos=None, copy=False)[source]

Move a block around on this page.

Moving a block to another page will be supported at another time.

Parameters
  • source_path – The path down to the target block to move.

  • target_path – The path down to the new parent.

  • pos (int) – New position to save to block at.

  • copy (bool) – New position to save to block at.

Rules: Position numbering starts at 1. Blocks below the one being moved get their position adjusted -1.

If the new position exceeds the number of blocks currently in that area, it will be set to n+1 instead.

If the new target+position are already occupied, all blocks on and below the new position move one position down (+1)

exception DoesNotExist
exception MultipleObjectsReturned
class ReferencingPage(*args, **values)[source]

A special kind of Page that will get all its type and fields from a referenced page.

Apart from the base attributes, only the referenced_page can and must be set.

referenced_page

A Page object that this page will fetch its attributes and contents from.

class Block(*args, **kwargs)[source]

A block that implements a single blocktype’s expected contents.

Will show a field to be filled out for every defined property in the block’s type.

This can be anything from freetext, free HTML, a number or a number of models from a defined list.

Could also possibly be dynamically calculated by the current page’s parameters and status, such as URL and user login status.