Add LilSnippets-AddExecOptionsForBatch
parent
3db4034abe
commit
62ed0f2aed
78
LilSnippets-AddExecOptionsForBatch.-.md
Normal file
78
LilSnippets-AddExecOptionsForBatch.-.md
Normal file
|
@ -0,0 +1,78 @@
|
|||
# Add Execution Options for a Batch
|
||||
|
||||
This assumes you already have a batch (table, handler, master view), and population / execution works as expected, but you wish to provide user with some options at the execution step.
|
||||
|
||||
## Batch Handler
|
||||
|
||||
Ultimately the new execution options must be recognized and implemented by the batch handler, so that's our first step.
|
||||
|
||||
Let's say we have a "pricing" batch handler and we want to let the user declare whether or not new labels should be deployed along with the new prices, and to which label printer if so.
|
||||
|
||||
We might edit a class called `PricingBatchHandler` in a file like `~/src/poser/poser/batch/pricing.py`:
|
||||
|
||||
```python
|
||||
from rattail.batch import pricing as base
|
||||
|
||||
class PricingBatchHandler(base.PricingBatchHandler):
|
||||
|
||||
# must add new options to method signature
|
||||
def execute(self, batch, deploy_labels=False, label_printer=None, progress=None, **kwargs):
|
||||
|
||||
# do whatever you normally do for execution here
|
||||
self.deploy_prices(batch, progress=progress)
|
||||
|
||||
# check status of new option, and act accordingly
|
||||
if deploy_labels:
|
||||
self.deploy_labels(batch, label_printer, progress=progress)
|
||||
|
||||
return True
|
||||
|
||||
def deploy_labels(self, batch, label_printer, progress=None):
|
||||
|
||||
# must do something here
|
||||
print("deploying labels to printer: %s" % label_printer)
|
||||
|
||||
```
|
||||
|
||||
## Batch Master View
|
||||
|
||||
Now that the batch handler will honor the new execution options, we declare them for the UI, in the batch master view.
|
||||
|
||||
Note that the important part, is that you define this "execution options schema" such that its nodes correspond to the options accepted by your batch handler's `execute()` method, i.e. per the above step. They should match in both "name" and "data type".
|
||||
|
||||
Here we might edit a class called `PricingBatchView` in a file like `~/src/poser/poser/web/views/batch/pricing.py`:
|
||||
|
||||
```python
|
||||
import colander
|
||||
from tailbone import forms
|
||||
|
||||
from tailbone.views.batch import pricing as base
|
||||
|
||||
|
||||
POSSIBLE_PRINTERS = {
|
||||
'zebra001': "Zebra #1",
|
||||
'zebra002': "Zebra #2",
|
||||
'cognitive001': "Cognitive #1",
|
||||
}
|
||||
|
||||
|
||||
# must add this; can call it whatever you like
|
||||
class ExecutionOptions(colander.Schema):
|
||||
|
||||
# NOTE: these schema nodes must correspond in both name and type,
|
||||
# to the options accepted by handler's `execute()` method
|
||||
|
||||
deploy_labels = colander.SchemaNode(colander.Bool())
|
||||
|
||||
label_printer = colander.SchemaNode(
|
||||
colander.String(),
|
||||
validator=colander.OneOf(POSSIBLE_PRINTERS),
|
||||
widget=forms.widgets.PlainSelectWidget(values=POSSIBLE_PRINTERS.items()))
|
||||
|
||||
|
||||
class PricingBatchView(base.PricingBatchView):
|
||||
|
||||
# must add this; should refer to schema defined above
|
||||
execution_options_schema = ExecutionOptions
|
||||
|
||||
```
|
Loading…
Reference in a new issue