rattail-manual/docs/data/batch/custom.rst

76 lines
2.9 KiB
ReStructuredText
Raw Normal View History

=====================
Adding a Custom Batch
=====================
If none of the native batch types fit your needs, you can always add a new one.
See :doc:`native` for the list of what's available.
Adding a new batch type involves 3 steps:
* add the batch table schema
* add the batch handler
* add web views for user interaction
For sake of example here, we'll define a "Please Come Back" batch. The purpose
of this batch is to identify members who've not shopped in the store within the
last 6 months, and generate custom coupons for each, to encourage them to come
back.
Adding the batch table schema is not much different than adding any other table
to the DB; see also :doc:`/data/db/extend`. Note that you should always prefix
table names with something unique to your app, and generally speaking the word
"batch" should go in there somewhere too. For instance we might call them:
* ``poser_batch_plzcomeback``
* ``poser_batch_plzcomeback_row``
To add the batch tables, create a new Python module. This would go in
``~/src/poser/poser/db/model/batch/plzcomeback.py`` for instance. Within that
module you then define the batch table classes. Be sure to also define the
``batch_key`` for the main table, which should also get the app-specific
prefix, e.g.::
from rattail.db.model import Base, BatchMixin, BatchRowMixin
class PleaseComeBack(BatchMixin, Base):
__tablename__ = 'poser_batch_plzcomeback'
__batchrow_class__ = 'PleaseComeBackRow'
batch_key = 'poser_plzcomeback'
model_title = "Please Come Back Batch"
model_title_plural = "Please Come Back Batches"
class PleaseComeBackRow(BatchRowMixin, Base):
__tablename__ = 'poser_batch_plzcomeback_row'
__batch_class__ = PleaseComeBack
model_title = "Please Come Back Batch Row"
To add the batch handler, create a new Python module. This would go in
``~/src/poser/poser/batch/plzcomeback.py`` for instance. Within that module
you then define the batch handler class. Be sure to tie this back to the main
batch table, e.g.::
from rattail.batch import BatchHandler
from poser.db import model
class PleaseComeBackHandler(BatchHandler):
batch_model_class = model.PleaseComeBack
To add the web views, also create a new Python module. This one would go in
``~/src/poser/poser/web/views/batch/plzcomeback.py`` for instance. Within that
module you then define the batch master view class. Be sure to tie this back
to both the batch and row tables, as well as the handler, e.g.::
from tailbone.views.batch import BatchMasterView
from poser.db import model
class PleaseComeBackView(BatchMasterView):
model_class = model.PleaseComeBack
model_row_class = model.PleaseComeBackRow
default_handler_spec = 'poser.batch.plzcomeback:PleaseComeBackHandler'
route_prefix = 'batch.poser_plzcomeback'
url_prefix = '/batches/please-come-back'
def includeme(config):
PleaseComeBackView.defaults(config)