.. _topics-wizard:

======
Wizard
======

A wizard describes a series of steps defined as :class:`trytond.wizard.State`.
The wizard uses a :class:`trytond.wizard.Session` to store data between states.

The basics:

    * Each wizard is a Python class that subclasses
      :class:`trytond.wizard.Wizard`.

    * The states of the wizard are attributes that are instances of
      :class:`trytond.wizard.State`.

Example
=======

This example defines a wizard which export translations::

    from trytond.wizard import Wizard, StateView, StateTransition, Button

    class TranslationExport(Wizard):
        "Export translation"
        _name = "ir.translation.export"

        start = StateView('ir.translation.export.start',
            'ir.translation_export_start_view_form', [
                Button('Cancel', 'end', 'tryton-cancel'),
                Button('Export', 'export', 'tryton-ok', default=True),
                ])
        export = StateTransition()
        result = StateView('ir.translation.export.result',
            'ir.translation_export_result_view_form', [
                Button('Close', 'end', 'tryton-close'),
                ])

        def transition_export(self, session):
            pool = Pool()
            translation_obj = pool.get('ir.translation')
            file_data = translation_obj.translation_export(
                session.start.language.code, session.start.module.name)
            session.result.file = buffer(file_data)
            return 'result'

        def default_result(self, session, fields):
            return {
                'file': session.result.file,
                }

    TranslationExport()

Instantiating the class registers the wizard class in the framework. Later the
class will be instantiated once per database and stored in the
:ref:`Pool <topics-pool>`.
