Django bindings to the Storymarket API
======================================
.. module:: django_storymarket
:synopsis: Sync Django models to Storymarket
.. currentmodule:: django_storymarket
This library binds Django models to the `Storymarket API
`_.
You'll need a Storymarket account to use this library, and you'll need to
generate an API token by visiting the
`Developer API page `_.
.. warning::
This library is, at best, of beta quality. It works, but is
under-tested and -documented, prone to API changes, and likely has
bugs. At this point in time it should be considered a sketch, not
a finished work.
Getting started
---------------
First, add your Storymarket API key to your settings module::
STORYMARKET_API_KEY = '80ae06462d691445834ed2263677b795'
And make sure ``"django_storymarket"`` is in your ``INSTALLED_APPS`` and
you've run ``syncdb``.
Next, each model that you want to sync needs to have a converting function
defined and registered. Here's an example::
import django_storymarket.converters
from yourapp.models import ExampleStory
def story_to_storymarket(api, obj):
return {
"type": "text",
"title": obj.headline,
"author": "jacobian",
"org": api.orgs.get(12),
"category": api.subcategories.get(12),
"content": obj.body,
}
django_storymarket.converters.register(ExampleStory, story_to_storymarket)
Of note here:
* The conversion function takes an instance of the
:class:`~storymarket.Storymarket` API object and the Django model to
convert.
* It must return a dictionary of converted data. This dictionary should
be in the form described `in the python-storymarket documentation`__
with one additional key: the ``type`` of object to upload. This type
must be one of ``"audio"``, ``"data"``, ``"photos"``, ``"text"``, or
``"video"``.
* This dictionary *may* be overridden by users, but it also might not
be, so it must contain a full, valid set of data.
* Binary object types must return an additional ``blob`` field. Its
value should be a string of binary data or a file-like object.
__ http://packages.python.org/python-storymarket/content.html#uploading-new-objects
You may define these functions and register them anywhere. However, if you
place a ``storymarket_converters.py`` in any app directory it'll be loaded
automatically and can be used as a convenient place to register converters.
Finally, you need to hook the upload functions into the admin interface.
``django-storymarket`` ships with admin actions and a quasi-inline type.
Together, these allow bulk uploads from changelist pages and individual
uploads from object detail pages. Wire 'em into the admin like so::
from django.contrib import admin
from django_storymarket.admin import (upload_to_storymarket,
is_synced_to_storymarket,
StorymarketUploaderInline)
from yourapp.models import ExampleStory
class ExampleStoryAdmin(admin.ModelAdmin):
actions = [upload_to_storymarket]
list_display = ['headline', is_synced_to_storymarket]
inlines = [StorymarketUploaderInline]
admin.site.register(ExampleStory, ExampleStoryAdmin)
Of course, each of these bits is optional; you can mix and match.
Contributing
------------
Run tests with ``python setup.py test``.
Development takes place
`on GitHub `_; please file
bugs/pull requests there.
Development on this project was funded by the
`Lawrence Journal-World `_ - thanks!
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`