The Admin Interface
===================

In addition to a RESTful API service, sandman2 provides and HTML-based *admin interface*
that allows you to view and manipulate the data in your tables. To access the
admin interface, simplay navigate to ``/admin`` once your service is started.

On the left sidebar, you'll see a list of all the services you specified (i.e.
the database tables you chose to include). Clicking one will show the contents
of that table, paginated. You can edit a record by clicking on the pencil icon
or delete a record using the trashcan icon.

You may notice that *foreign keys* are displayed with their default Python
representation (i.e. ``<flask_sqlalchemy.Artist object @ 0xdeadbeef>``). To show
foreign keys in a more useful way, you can define your own extensions to the
classes reflected in the database and add a ``__unicode__`` member function.

Imagine we have a simple blog application consisting of Blog, Post, and User
models. As expected, each post belongs to a specific user and the model has the
requisite foreign key to the User table. When we view a Post's assoicated user
in the admin site, however, we see the following::

    <flask_sqlalchemy.user object at 0x10d3cea10>

To provide a more useful representation in the admin, we *extend* the reflected
class by creating a ``models.py`` file and adding functionality to our model
classes. Deriving from ``sandman2.AutomapModel`` accomplishes this::

    
    from sandman2 import AutomapModel

    class User(AutomapModel):

        """A user of the blogging application."""

        __tablename__ = 'user'

        def __unicode__(self):
            return self.name


    class Blog(AutomapModel):

        """An online weblog."""

        __tablename__ = 'blog'

        def __unicode__(self):
            return self.name

    class Post(AutomapModel):

        """An individual blog post."""

        __tablename__ = 'post'

        def __unicode__(self):
            return self.title

Notice that you can refer to attributes of the class that you know to be present
(like ``user.name``) without defining the ``name`` column; all other
columns/properties are reflected. You're meerly *extending* the existing model
class.
