Lizard-map models
=================


Workspaces
----------

All map-related work uses workspaces and workspace items.

    >>> from lizard_map.models import Workspace
    >>> from lizard_map.models import WorkspaceItem

A workspace can contain workspace items:

    >>> workspace1 = Workspace()
    >>> workspace1.save()
    >>> workspace1
    <Workspace: ...>
    >>> workspace1.workspace_items.all()
    []
    >>> workspace_item1 = workspace1.workspace_items.create()
    >>> workspace_item2 = workspace1.workspace_items.create()
    >>> workspace1.workspace_items.all()
    [<WorkspaceItem: (1) name= ws=... >, <WorkspaceItem: (2) name= ws=... >]

A workspace item can point to a method that returns a layer:

    >>> workspace_item1.has_adapter()
    False
    >>> workspace_item1.adapter_class = 'todo'
    >>> workspace_item1.has_adapter()
    True

That string that identifies a method is looked up as a so-called entry point:

    >>> import pkg_resources
    >>> list(pkg_resources.iter_entry_points(group='lizard_map.adapter_class'))
    [EntryPoint.parse(...)]
    >>> workspace_item1.adapter
    Traceback (most recent call last):
    ...
    AdapterClassNotFoundError: Entry point for 'todo' not found
    >>> workspace_item1.adapter_class = 'adapter_shapefile'
    >>> workspace_item1.adapter
    <... object at ...>

The layer method probably needs arguments. You can store them as a json string:

    >>> workspace_item1.adapter_layer_json
    ''
    >>> workspace_item1.adapter_layer_arguments
    {}
    >>> workspace_item1.adapter_layer_json = '{"bla": "yes"}'
    >>> workspace_item1.adapter_layer_arguments
    {'bla': 'yes'}

The method (looked up as a setuptools entry point) is called with the
parameters (from json):

    >>> workspace_item1.adapter_layer_json =  ''
    >>> workspace_item1.adapter.layer()
    ([<mapnik._mapnik.Layer object at ...>], {...})

A workspace item always has a name:

    >>> workspace_item1.name
    ''

Collages in workspaces
----------------------
Collages contain user selected locations from workspace items,
called snippets.

To get a list of all collages, make collage and add snippet:

    >>> workspace1.collages.all()
    [...]
    >>> collage = workspace1.collages.create(name='user collage')
    >>> collage
    <...>
    >>> workspace_item = workspace1.workspace_items.create()
    >>> snippet = collage.snippets.create(workspace_item=workspace_item, identifier='abcd')
    >>> snippet
    <...>

