fobi package

Subpackages

Submodules

fobi.admin module

class fobi.admin.BasePluginModelAdmin(model, admin_site)[source]

Bases: django.contrib.admin.options.ModelAdmin

Base plugin admin.

class Meta[source]

Bases: object

Meta.

app_label = 'Fobi'
bulk_change_plugins(request)[source]

Bulk change plugins.

This is where the data is actually processed.

fieldsets = ((None, {'fields': ('plugin_uid', 'users', 'groups')}),)
filter_horizontal = ('users', 'groups')
get_queryset(request)[source]

Tweak queryset.

has_add_permission(request)[source]

Has add permissions.

We don’t want to allow to add form elements/handlers manually. It should happen using the management command fobi_sync_plugins instead.

list_display = ('plugin_uid_admin', 'users_list', 'groups_list')
property media
readonly_fields = ('plugin_uid', 'plugin_uid_admin')
class fobi.admin.FormElementAdmin(model, admin_site)[source]

Bases: fobi.admin.BasePluginModelAdmin

FormElement admin.

actions = (<function bulk_change_form_element_plugins>,)
get_urls()[source]

Get URLs.

property media
class fobi.admin.FormElementEntryAdmin(model, admin_site)[source]

Bases: django.contrib.admin.options.ModelAdmin

FormElementEntry admin.

class Meta[source]

Bases: object

Meta.

app_label = 'Fobi'
fieldsets = (('Plugin', {'fields': ('plugin_uid', 'plugin_data')}), ('Form', {'fields': ('form_entry', 'form_fieldset_entry', 'position')}))
get_queryset(request)[source]

Get queryset.

list_display = ('plugin_uid', 'plugin_uid_code', 'plugin_data', 'position', 'form_entry')
list_editable = ('position',)
list_filter = ('form_entry', 'plugin_uid')
property media
readonly_fields = ('plugin_uid_code',)
class fobi.admin.FormElementEntryInlineAdmin(parent_model, admin_site)[source]

Bases: django.contrib.admin.options.TabularInline

FormElementEntry inline admin.

extra = 0
fields = ('form_entry', 'plugin_uid', 'plugin_data', 'position')
form

alias of fobi.forms.FormElementEntryForm

property media
model

alias of fobi.models.FormElementEntry

class fobi.admin.FormEntryAdmin(model, admin_site)[source]

Bases: django.contrib.admin.options.ModelAdmin

FormEntry admin.

class Meta[source]

Bases: object

Meta.

app_label = 'Fobi'
fieldsets = (('Form', {'fields': ('name', 'is_public', 'is_cloneable', 'active_date_from', 'active_date_to', 'inactive_page_title', 'inactive_page_message')}), ('Custom', {'classes': ('collapse',), 'fields': ('success_page_title', 'success_page_message', 'action')}), ('User', {'classes': ('collapse',), 'fields': ('user',)}), ('Additional', {'classes': ('collapse',), 'fields': ('slug',)}))
inlines = [<class 'fobi.admin.FormElementEntryInlineAdmin'>, <class 'fobi.admin.FormHandlerEntryInlineAdmin'>]
list_display = ('name', 'slug', 'user', 'is_public', 'is_active', 'created', 'updated', 'is_cloneable')
list_editable = ('is_public', 'is_cloneable')
list_filter = ('is_public', 'is_cloneable')
property media
radio_fields = {'user': 2}
readonly_fields = ('slug',)
class fobi.admin.FormFieldsetEntryAdmin(model, admin_site)[source]

Bases: django.contrib.admin.options.ModelAdmin

FormEieldsetEntry admin.

class Meta[source]

Bases: object

Meta.

app_label = 'Fobi'
fieldsets = ((None, {'fields': ('form_entry', 'name', 'is_repeatable')}),)
list_display = ('form_entry', 'name', 'is_repeatable')
list_editable = ('is_repeatable',)
list_filter = ('is_repeatable',)
property media
class fobi.admin.FormHandlerAdmin(model, admin_site)[source]

Bases: fobi.admin.BasePluginModelAdmin

FormHandler admin.

actions = (<function bulk_change_form_handler_plugins>,)
get_urls()[source]

Get URLs.

property media
class fobi.admin.FormHandlerEntryAdmin(model, admin_site)[source]

Bases: django.contrib.admin.options.ModelAdmin

FormHandlerEntry admin.

class Meta[source]

Bases: object

Meta.

app_label = 'Form handler entry'
fieldsets = (('Plugin', {'fields': ('plugin_uid', 'plugin_data')}), ('Form', {'fields': ('form_entry',)}))
get_queryset(request)[source]

Tweak the queryset.

list_display = ('plugin_uid', 'plugin_uid_code', 'plugin_data', 'form_entry')
list_filter = ('form_entry', 'plugin_uid')
property media
readonly_fields = ('plugin_uid_code',)
class fobi.admin.FormHandlerEntryInlineAdmin(parent_model, admin_site)[source]

Bases: django.contrib.admin.options.TabularInline

FormHandlerEntry inline admin.

extra = 0
fields = ('form_entry', 'plugin_uid', 'plugin_data')
form

alias of fobi.forms.FormHandlerEntryForm

property media
model

alias of fobi.models.FormHandlerEntry

class fobi.admin.FormWizardEntryAdmin(model, admin_site)[source]

Bases: django.contrib.admin.options.ModelAdmin

FormWizardEntry admin.

class Meta[source]

Bases: object

Meta.

app_label = 'Fobi'
fieldsets = (('Form', {'fields': ('name', 'is_public', 'is_cloneable')}), ('Custom', {'classes': ('collapse',), 'fields': ('success_page_title', 'success_page_message')}), ('User', {'classes': ('collapse',), 'fields': ('user',)}), ('Additional', {'classes': ('collapse',), 'fields': ('slug',)}))
inlines = [<class 'fobi.admin.FormWizardFormEntryInlineAdmin'>, <class 'fobi.admin.FormWizardHandlerEntryInlineAdmin'>]
list_display = ('name', 'slug', 'user', 'is_public', 'created', 'updated', 'is_cloneable')
list_editable = ('is_public', 'is_cloneable')
list_filter = ('is_public', 'is_cloneable')
property media
radio_fields = {'user': 2}
readonly_fields = ('slug',)
class fobi.admin.FormWizardFormEntryInlineAdmin(parent_model, admin_site)[source]

Bases: django.contrib.admin.options.TabularInline

FormWizardFormEntry inline admin.

extra = 0
fields = ('form_entry', 'position')
property media
model

alias of fobi.models.FormWizardFormEntry

class fobi.admin.FormWizardHandlerAdmin(model, admin_site)[source]

Bases: fobi.admin.BasePluginModelAdmin

FormHandler admin.

actions = (<function bulk_change_form_wizard_handler_plugins>,)
get_urls()[source]

Get URLs.

property media
class fobi.admin.FormWizardHandlerEntryInlineAdmin(parent_model, admin_site)[source]

Bases: django.contrib.admin.options.TabularInline

FormWizardHandlerEntry inline admin.

extra = 0
fields = ('plugin_uid', 'plugin_data')
form

alias of fobi.forms.FormWizardHandlerEntryForm

property media
model

alias of fobi.models.FormWizardHandlerEntry

fobi.admin.base_bulk_change_plugins(PluginForm, named_url, modeladmin, request, queryset)[source]

Bulk change of plugins action additional view.

fobi.admin.bulk_change_form_element_plugins(modeladmin, request, queryset)[source]

Bulk change FormElement plugins.

fobi.admin.bulk_change_form_handler_plugins(modeladmin, request, queryset)[source]

Bulk change FormHandler plugins.

fobi.admin.bulk_change_form_wizard_handler_plugins(modeladmin, request, queryset)[source]

Bulk change FormWizardHandler plugins.

fobi.app module

fobi.app.app_config(path, config_app_path='apps.Config')[source]

App config.

Parameters
  • path (str) – Absolute app path (from project root).

  • config_app_path (str) – Relative config path (from app root)

Return str

fobi.app.app_name(path, reduce_depth_by=1)[source]

Return another path by reducing the depth by one.

Parameters
  • path (str) – Absolute app path (from project root).

  • reduce_depth_by (int) –

Return str

fobi.apps module

class fobi.apps.Config(app_name, app_module)[source]

Bases: django.apps.config.AppConfig

Config.

label = 'fobi'
name = 'fobi'

fobi.base module

Base module. All uids are supposed to be pythonic function names (see PEP http://www.python.org/dev/peps/pep-0008/#function-names).

class fobi.base.BaseDataStorage[source]

Bases: object

Base storage data.

class fobi.base.BaseFormFieldPluginForm[source]

Bases: fobi.base.BasePluginForm

Base form for form field plugins.

help_text = <django.forms.fields.CharField object>
label = <django.forms.fields.CharField object>
name = <django.forms.fields.CharField object>
plugin_data_fields = [('name', ''), ('label', ''), ('help_text', ''), ('required', False)]
required = <django.forms.fields.BooleanField object>
validate_plugin_data(form_element_entries, request=None)[source]

Validate plugin data.

Parameters
  • form_element_entries (iterable) – Iterable of fobi.models.FormElementEntry.

  • request (django.http.HttpRequest) –

Return bool

class fobi.base.BasePlugin(user=None)[source]

Bases: object

Base plugin.

Base form field from which every form field should inherit.

Properties
  • uid (string): Plugin uid (obligatory). Example value: ‘dummy’,

    ‘wysiwyg’, ‘news’.

  • name (string): Plugin name (obligatory). Example value:

    ‘Dummy plugin’, ‘WYSIWYG’, ‘Latest news’.

  • description (string): Plugin decription (optional). Example

    value: ‘Dummy plugin used just for testing’.

  • help_text (string): Plugin help text (optional). This text would

    be shown in fobi.views.add_form_plugin_entry and fobi.views.edit_form_plugin_entry views.

  • form: Plugin form (optional). A subclass of django.forms.Form.

    Should be given in case plugin is configurable.

  • add_form_template (str) (optional): Add form template (optional).

    If given, overrides the

    fobi.views.add_form_handler_entry default template.

  • edit_form_template (string): Edit form template (optional). If

    given, overrides the fobi.views.edit_form_handler_entry default template.

  • html_classes (list): List of extra HTML classes for the plugin.

  • group (string): Plugin are grouped under the specified group.

    Override in your plugin if necessary.

add_form_template = None
clone_plugin_data(entry)[source]

Clone plugin data.

Used when copying entries. If any objects or files are created by plugin, they should be cloned.

Parameters

fobi.models.AbstractPluginEntry – Instance of fobi.models.AbstractPluginEntry.

Return string

JSON dumped string of the cloned plugin data. The returned value would be inserted as is into the fobi.models.AbstractPluginEntry.plugin_data field.

delete_plugin_data()[source]

Delete plugin data (internal method).

Used in fobi.views.delete_form_entry and fobi.views.delete_form_handler_entry. Fired automatically, when fobi.models.FormEntry object is about to be deleted. Make use of it if your plugin creates database records or files that are not monitored externally but by fobi only.

description = None
edit_form_template = None
form = None
get_cloned_plugin_data(update={})[source]

Get cloned plugin data.

Get the cloned plugin data and returns it in a JSON dumped format.

Parameters

update (dict) –

Return string

JSON dumped string of the cloned plugin data.

Example

In the get_cloned_plugin_data method of your plugin, do as

follows:

>>> def clone_plugin_data(self, dashboard_entry):
>>>     cloned_image = clone_file(self.data.image, relative_path=True)
>>>     return self.get_cloned_plugin_data(
>>>         update={'image': cloned_image}
>>>     )
get_form()[source]

Get the plugin form class.

Override this method in your subclassed fobi.base.BasePlugin class when you need your plugin setup to vary depending on the placeholder, workspace, user or request given. By default returns the value of the form attribute defined in your plugin.

Return django.forms.Form|django.forms.ModelForm

Subclass of django.forms.Form or django.forms.ModelForm.

get_initialised_create_form(data=None, files=None, initial_data=None)[source]

Get initialized create form.

Used fobi.views.add_form_element_entry and fobi.views.add_form_handler_entry view to gets initialised form for object to be created.

get_initialised_create_form_or_404(data=None, files=None)[source]

Get initialized create form or page 404.

Same as get_initialised_create_form but raises django.http.Http404 on errors.

get_initialised_edit_form(data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=<class 'django.forms.utils.ErrorList'>, label_suffix=':', empty_permitted=False, instance=None)[source]

Get initialized edit form.

Used in fobi.views.edit_form_element_entry and fobi.views.edit_form_handler_entry views.

get_initialised_edit_form_or_404(data=None, files=None, auto_id='id_%s', prefix=None, error_class=<class 'django.forms.utils.ErrorList'>, label_suffix=':', empty_permitted=False)[source]

Get initialized edit form or page 404.

Same as get_initialised_edit_form but raises django.http.Http404 on errors.

get_instance()[source]

Get instance.

get_plugin_form_data()[source]

Get plugin form data.

Fed as initial argument to the plugin form when initialising the instance for adding or editing the plugin. Override in your plugin class if you need customisations.

get_updated_plugin_data(update={})[source]

Get updated plugin data.

Returns it in a JSON dumped format.

Parameters

update (dict) –

Return string

JSON dumped string of the cloned plugin data.

get_widget(request=None, as_instance=False)[source]

Get the plugin widget.

Parameters
  • request (django.http.HttpRequest) –

  • as_instance (bool) –

Return mixed

Subclass of fobi.base.BasePluginWidget or instance of subclassed fobi.base.BasePluginWidget object.

group = 'General'
help_text = None
property html_class

HTML class.

A massive work on positioning the plugin and having it to be displayed in a given width is done here. We should be getting the plugin widget for the plugin given and based on its’ properties (static!) as well as on plugin position (which we have from model), we can show the plugin with the exact class.

html_classes = []
property html_id

HTML id.

load_plugin_data(plugin_data)[source]

Load plugin data.

Load the plugin data saved in fobi.models.FormElementEntry or fobi.models.FormHandlerEntry. Plugin data is saved in JSON string.

Parameters

plugin_data (string) – JSON string with plugin data.

media_css = []
media_js = []
name = None
plugin_data_repr()[source]

Plugin data repr.

Human readable representation of plugin data. A very basic way would be just:

>>> return self.data.__dict__
Return string

post_processor()[source]

Post-processor (self).

Redefine in your subclassed plugin when necessary.

Post process plugin data here (before rendering). This method is being called after the data has been loaded into the plugin.

Note, that request (django.http.HttpRequest) is available (self.request).

pre_processor()[source]

Pre-processor (callback).

Redefine in your subclassed plugin when necessary.

Pre process plugin data (before rendering). This method is being called before the data has been loaded into the plugin.

Note, that request (django.http.HttpRequest) is available ( self.request).

process(plugin_data=None, fetch_related_data=False)[source]

Process.

Init plugin with data.

process_plugin_data(fetch_related_data=False)[source]

Processes plugin data.

render(request=None)[source]

Renders the plugin HTML.

Parameters

request (django.http.HttpRequest) –

Return string

storage = None
uid = None
update_plugin_data(entry)[source]

Update plugin data.

Used in fobi.management.commands.fobi_update_plugin_data.

Some plugins would contain data fetched from various sources (models, remote data). Since form entries are by definition loaded extremely much, you are advised to store as much data as possible in plugin_data field of fobi.models.FormElementEntry or fobi.models.FormHandlerEntry. Some externally fetched data becomes invalid after some time and needs updating. For that purpose, in case if your plugin needs that, redefine this method in your plugin. If you need your data to be periodically updated, add a cron-job which would run fobi_update_plugin_data management command (see fobi.management.commands.fobi_update_plugin_data module).

Parameters

or fobi.models.FormHandlerEntry (fobi.models.FormElementEntry) – Instance of fobi.models.FormeHandlerEntry.

Return dict

Should return a dictionary containing data of fields to be updated.

widget = None
class fobi.base.BasePluginForm[source]

Bases: object

Not a form actually; defined for magic only.

Property iterable plugin_data_fields

Fields to get when calling the get_plugin_data method. These field will be JSON serialized. All other fields, even if they are part of the form, won’t be. Make sure all fields are serializable. If some of them aren’t, override the save_plugin_data method and make them serializable there. See fobi.contrib.plugins.form_elements.fields.select.forms as a good example.

Example
>>> plugin_data_fields = (
>>>    ('name', ''),
>>>    ('active': False)
>>> )
get_plugin_data(request=None, json_format=True)[source]

Get plugin data.

Data that would be saved in the plugin_data field of the fobi.models.FormElementEntry or ``fobi.models.FormHandlerEntry`.` subclassed model.

Parameters

request (django.http.HttpRequest) –

plugin_data_fields = None
save_plugin_data(request=None)[source]

Save plugin data.

Dummy, but necessary.

validate_plugin_data(form_element_entries, request=None)[source]

Validate plugin data.

Parameters
  • form_element_entries (iterable) – Iterable of fobi.models.FormElementEntry.

  • request (django.http.HttpRequest) –

Return bool

class fobi.base.BaseRegistry[source]

Bases: object

Base registry.

Registry of plugins. It’s essential, that class registered has the uid property.

If fail_on_missing_plugin is set to True, an appropriate exception (plugin_not_found_exception_cls) is raised in cases if plugin could’t be found in the registry.

Property mixed type

Property bool fail_on_missing_plugin

Property fobi.exceptions.DoesNotExist plugin_not_found_exception_cls

Property str plugin_not_found_error_message

fail_on_missing_plugin = False
get(uid, default=None)[source]

Get the given entry from the registry.

Parameters
  • uid (string) –

  • default (mixed) –

:return mixed.

items()[source]

Shortcut to self._registry.items().

plugin_not_found_error_message = "Can't find plugin with uid `{0}` in `{1}` registry."
plugin_not_found_exception_cls

alias of fobi.exceptions.DoesNotExist

register(cls, force=False)[source]

Registers the plugin in the registry.

Parameters
  • cls (mixed) –

  • force (bool) –

property registry

Shortcut to self._registry.

type = None
unregister(cls)[source]

Un-register.

class fobi.base.ClassProperty(fget=None, fset=None, fdel=None, doc=None)[source]

Bases: property

ClassProperty.

class fobi.base.FormCallback[source]

Bases: fobi.base.BaseFormCallback

Form callback.

callback(form_entry, request, form)[source]

Callback.

Custom callback code should be implemented here.

Parameters
  • form_entry (fobi.models.FormEntry) – Instance of fobi.models.FormEntry.

  • request (django.http.HttpRequest) –

  • form (django.forms.Form) –

class fobi.base.FormCallbackRegistry[source]

Bases: object

Registry of callbacks.

Holds callbacks for stages listed in the fobi.constants.CALLBACK_STAGES.

get_callbacks(stage=None)[source]

Get callbacks for the stage given.

Parameters

stage (string) –

Return list

register(cls)[source]

Registers the plugin in the registry.

Parameters

cls (mixed) –

uidfy(cls)[source]

Makes a UID string from the class given.

Parameters

cls (mixed) –

Return string

class fobi.base.FormElementPlugin(user=None)[source]

Bases: fobi.base.BasePlugin

Base form element plugin.

Property fobi.base.FormElementPluginDataStorage storage

Property bool has_value

If set to False, ignored (removed) from the POST when processing the form.

get_custom_field_instances(integrate_with, request=None, form_entry=None, form_element_entries=None, has_value=None, **kwargs)[source]

Get custom field instances.

Parameters
  • integrate_with (str) –

  • request (django.http.HttpRequest) –

  • form_entry

  • form_element_entries

  • has_value (bool) – If not None, used for filtering out.

Return list

get_form_field_instances(request=None, form_entry=None, form_element_entries=None, **kwargs)[source]

Get the instances of form fields, that plugin contains.

Parameters
Return list

List of Django form field instances.

Example

>>> from django.forms.fields import CharField, IntegerField, TextField
>>> [CharField(max_length=100), IntegerField(), TextField()]
get_origin_kwargs_update_func_results(kwargs_update_func, form_element_entry, origin, extra={}, widget_cls=None)[source]

Get origin kwargs update func results.

If kwargs_update_func is given, is callable and returns results without failures, return the result. Otherwise - return None.

get_origin_return_func_results(return_func, form_element_entry, origin)[source]

Get origin return func results.

If return_func is given, is callable and returns results without failures, return the result. Otherwise - return None.

has_value = False
is_hidden = False
storage

alias of fobi.base.FormElementPluginDataStorage

submit_plugin_form_data(form_entry, request, form, form_element_entries=None, **kwargs)[source]

Submit plugin form data.

Called on form submission (when user actually posts the data to assembled form).

Parameters
  • form_entry (fobi.models.FormEntry) – Instance of fobi.models.FormEntry.

  • request (django.http.HttpRequest) –

  • form (django.forms.Form) –

  • form_element_entries (iterable) –

class fobi.base.FormElementPluginDataStorage[source]

Bases: fobi.base.BaseDataStorage

Storage for FormElementPlugin data.

class fobi.base.FormElementPluginRegistry[source]

Bases: fobi.base.BaseRegistry

Form element plugins registry.

fail_on_missing_plugin = True
plugin_not_found_exception_cls

alias of fobi.exceptions.FormElementPluginDoesNotExist

type = (<class 'fobi.base.FormElementPlugin'>, <class 'fobi.base.FormFieldPlugin'>)
class fobi.base.FormElementPluginWidget(plugin)[source]

Bases: fobi.base.BasePluginWidget

Form element plugin widget.

storage

alias of fobi.base.FormElementPluginWidgetDataStorage

class fobi.base.FormElementPluginWidgetRegistry[source]

Bases: fobi.base.BasePluginWidgetRegistry

Registry of form element plugins.

type

alias of fobi.base.FormElementPluginWidget

class fobi.base.FormFieldPlugin(user=None)[source]

Bases: fobi.base.FormElementPlugin

Form field plugin.

has_value = True
class fobi.base.FormHandlerPlugin(user=None)[source]

Bases: fobi.base.BasePlugin

Form handler plugin.

Property fobi.base.FormHandlerPluginDataStorage storage

Property bool allow_multiple

If set to True, plugin can be used multiple times within (per form). Otherwise - just once.

allow_multiple = True
custom_actions(form_entry, request=None)[source]

Custom actions.

Override this method in your form handler if you want to specify custom actions. Note, that expected return value of this method is an iterable with a triple, where the first item is the URL of the action and the second item is the action title and the third item is the icon class of the action.

Example

>>>  return (
>>>      ('/add-to-favorites/',
>>>       'Add to favourites',
>>>       'glyphicon glyphicon-favourties'),
>>>  )
get_custom_actions(form_entry, request=None)[source]

Internal method to for obtaining the get_custom_actions.

run(form_entry, request, form, form_element_entries=None)[source]

Run.

Custom code should be implemented here.

Parameters
  • form_entry (fobi.models.FormEntry) – Instance of fobi.models.FormEntry.

  • request (django.http.HttpRequest) –

  • form (django.forms.Form) –

  • form_element_entries (iterable) – Iterable of fobi.models.FormElementEntry objects.

Return mixed

May be a tuple (bool, mixed) or None

run_integration_handler(integrate_with, form_entry, request, form_element_entries=None, **kwargs)[source]

Run integration handler.

storage

alias of fobi.base.FormHandlerPluginDataStorage

class fobi.base.FormHandlerPluginDataStorage[source]

Bases: fobi.base.BaseDataStorage

Storage for FormHandlerPlugin data.

class fobi.base.FormHandlerPluginRegistry[source]

Bases: fobi.base.BaseRegistry

Form handler plugins registry.

fail_on_missing_plugin = True
plugin_not_found_exception_cls

alias of fobi.exceptions.FormHandlerPluginDoesNotExist

type

alias of fobi.base.FormHandlerPlugin

class fobi.base.FormHandlerPluginWidget(plugin)[source]

Bases: fobi.base.BasePluginWidget

Form handler plugin widget.

storage

alias of fobi.base.FormHandlerPluginWidgetDataStorage

class fobi.base.FormHandlerPluginWidgetRegistry[source]

Bases: fobi.base.BasePluginWidgetRegistry

Registry of form handler plugins.

type

alias of fobi.base.FormHandlerPluginWidget

class fobi.base.FormWizardHandlerPlugin(user=None)[source]

Bases: fobi.base.BasePlugin

Form wizard handler plugin.

Property fobi.base.FormWizardHandlerPluginDataStorage storage

Property bool allow_multiple

If set to True, plugin can be used multiple times within (per form). Otherwise - just once.

DONE

allow_multiple = True
custom_actions(form_wizard_entry, request=None)[source]

Custom actions.

Override this method in your form handler if you want to specify custom actions. Note, that expected return value of this method is an iterable with a triple, where the first item is the URL of the action and the second item is the action title and the third item is the icon class of the action.

Example

>>>  return (
>>>      ('/add-to-favorites/',
>>>       'Add to favourites',
>>>       'glyphicon glyphicon-favourties'),
>>>  )
get_custom_actions(form_wizard_entry, request=None)[source]

Internal method to for obtaining the get_custom_actions.

run(form_wizard_entry, request, form_list, form_wizard, form_element_entries=None)[source]

Run.

Custom code should be implemented here.

Parameters
  • form_wizard_entry (fobi.models.FormEntry) – Instance of fobi.models.FormEntry.

  • request (django.http.HttpRequest) –

  • form (django.forms.Form) –

  • form_element_entries (iterable) – Iterable of fobi.models.FormElementEntry objects.

Return mixed

May be a tuple (bool, mixed) or None

storage

alias of fobi.base.FormWizardHandlerPluginDataStorage

class fobi.base.FormWizardHandlerPluginDataStorage[source]

Bases: fobi.base.BaseDataStorage

Storage for FormWizardHandlerPlugin handler data.

class fobi.base.FormWizardHandlerPluginRegistry[source]

Bases: fobi.base.BaseRegistry

Form wizard handler plugins registry.

fail_on_missing_plugin = True
plugin_not_found_exception_cls

alias of fobi.exceptions.FormWizardHandlerPluginDoesNotExist

type

alias of fobi.base.FormWizardHandlerPlugin

class fobi.base.FormWizardHandlerPluginWidget(plugin)[source]

Bases: fobi.base.BasePluginWidget

Form wizard handler plugin widget.

storage

alias of fobi.base.FormWizardHandlerPluginWidgetDataStorage

class fobi.base.FormWizardHandlerPluginWidgetRegistry[source]

Bases: fobi.base.BasePluginWidgetRegistry

Registry of form wizard handler plugins.

type

alias of fobi.base.FormWizardHandlerPluginWidget

class fobi.base.IntegrationFormCallback[source]

Bases: object

Integration form callback.

callback(form_entry, request, **kwargs)[source]

Callback.

Custom callback code should be implemented here.

Parameters
  • form_entry (fobi.models.FormEntry) – Instance of fobi.models.FormEntry.

  • request (django.http.HttpRequest) –

  • form (django.forms.Form) –

integrate_with = None
class fobi.base.IntegrationFormCallbackRegistry[source]

Bases: object

Registry of callbacks for integration plugins.

Holds callbacks for stages listed in the fobi.constants.CALLBACK_STAGES.

get_callbacks(integrate_with, stage=None)[source]

Get callbacks for the stage given.

Parameters
  • integrate_with (str) –

  • stage (string) –

Return list

register(cls)[source]

Registers the plugin in the registry.

Parameters

cls (mixed) –

property registry
uidfy(cls)[source]

Makes a UID string from the class given.

Parameters

cls (mixed) –

Return string

class fobi.base.IntegrationFormElementPlugin(user=None)[source]

Bases: fobi.base.BasePlugin

Base custom field instance plugin for integration.

has_value = False
is_hidden = False
storage

alias of fobi.base.IntegrationFormElementPluginDataStorage

class fobi.base.IntegrationFormElementPluginDataStorage[source]

Bases: fobi.base.BaseDataStorage

Storage for IntegrationFormElementPlugin.

class fobi.base.IntegrationFormElementPluginProcessor(*args, **kwargs)[source]

Bases: object

Custom form field instance processor.

Supposed to have implemented a single method called process_custom_form_field_instance.

process_custom_form_field_instance(form_element_entry, form_entry, request, form_element_plugin)[source]

You should implement this method in your implementation.

class fobi.base.IntegrationFormElementPluginRegistry[source]

Bases: fobi.base.BaseIntegrationPluginRegistry

Integration form element plugin registry.

fail_on_missing_plugin = True
plugin_not_found_exception_cls

alias of fobi.exceptions.IntegrationFormElementPluginDoesNotExist

type = (<class 'fobi.base.IntegrationFormElementPlugin'>,)
class fobi.base.IntegrationFormFieldPlugin(user=None)[source]

Bases: fobi.base.IntegrationFormElementPlugin

Integration form field plugin for custom field instances.

has_value = True
class fobi.base.IntegrationFormHandlerPlugin(user=None)[source]

Bases: fobi.base.BasePlugin

Base integration form handler plugin for integration.

has_value = True
is_hidden = False
storage

alias of fobi.base.IntegrationFormHandlerPluginDataStorage

class fobi.base.IntegrationFormHandlerPluginDataStorage[source]

Bases: fobi.base.BaseDataStorage

Storage for IntegrationFormHandlerPlugin.

class fobi.base.IntegrationFormHandlerPluginRegistry[source]

Bases: fobi.base.BaseIntegrationPluginRegistry

Integration form handler plugin registry.

fail_on_missing_plugin = True
plugin_not_found_exception_cls

alias of fobi.exceptions.IntegrationFormHandlerPluginDoesNotExist

type = (<class 'fobi.base.IntegrationFormHandlerPlugin'>,)
fobi.base.assemble_form_field_widget_class(base_class, plugin)[source]

Assemble form field widget class.

Finish this or remove.

#TODO

fobi.base.classproperty

alias of fobi.base.ClassProperty

fobi.base.collect_plugin_media(form_element_entries, request=None)[source]

Collect the plugin media for form element entries given.

Parameters
  • form_element_entries (iterable) – Iterable of fobi.models.FormElementEntry instances.

  • request (django.http.HttpRequest) –

Return dict

Returns a dict containing the ‘js’ and ‘css’ keys. Correspondent values of those keys are lists containing paths to the CSS and JS media files.

fobi.base.ensure_autodiscover()[source]

Ensure that plugins are auto-discovered.

The form callbacks registry is intentionally left out, since they will be auto-discovered in any case if other modules are discovered.

fobi.base.fire_form_callbacks(form_entry, request, form, stage=None)[source]

Fire form callbacks.

Parameters
  • form_entry (fobi.models.FormEntry) –

  • request (django.http.HttpRequest) –

  • form (django.forms.Form) –

  • stage (string) –

Return django.forms.Form form

fobi.base.get_form_element_plugin_widget(plugin_uid, request=None, as_instance=False, theme=None)[source]

Get the form element plugin widget for the plugin_uid given.

Parameters
  • plugin_uid (str) – UID of the plugin to get the widget for.

  • request (django.http.HttpRequest) –

  • as_instance (bool) –

  • theme (fobi.base.BaseTheme) – Subclass of.

Return BasePluginWidget

Subclass of.

fobi.base.get_form_handler_plugin_widget(plugin_uid, request=None, as_instance=False, theme=None)[source]

Get the form handler plugin widget for the plugin_uid given.

Parameters
  • plugin_uid (str) – UID of the plugin to get the widget for.

  • request (django.http.HttpRequest) –

  • as_instance (bool) –

  • theme (fobi.base.BaseTheme) – Subclass of.

Return BasePluginWidget

Subclass of.

fobi.base.get_form_wizard_handler_plugin_widget(plugin_uid, request=None, as_instance=False, theme=None)[source]

Get the form wizard handler plugin widget for the plugin_uid given.

Parameters
  • plugin_uid (str) – UID of the plugin to get the widget for.

  • request (django.http.HttpRequest) –

  • as_instance (bool) –

  • theme (fobi.base.BaseTheme) – Subclass of.

Return BasePluginWidget

Subclass of.

fobi.base.get_ordered_form_handlers()

Get ordered form handler plugins.

Gets form handler plugins in the execution order as a sortable dictionary, which can be later on used to add real plugins to be executed.

Return fobi.data_structures.SortableDict

fobi.base.get_ordered_form_wizard_handlers()

Get ordered form wizard_handler plugins.

Gets form wizard handler plugins in the execution order as a sortable dictionary, which can be later on used to add real plugins to be executed.

Return fobi.data_structures.SortableDict

fobi.base.get_plugin_widget(registry, plugin_uid, request=None, as_instance=False, theme=None)[source]

Get the plugin widget for the plugin_uid given.

Looks up in the registry provided.

Parameters
  • registry (fobi.base.BasePluginWidgetRegistry) – Subclass of.

  • plugin_uid (str) – UID of the plugin to get the widget for.

  • request (django.http.HttpRequest) –

  • as_instance (bool) –

  • theme (fobi.base.BaseTheme) – Subclass of.

Return BasePluginWidget

Subclass of.

fobi.base.get_processed_form_data(form, form_element_entries)[source]

Gets processed form data.

Simply fires both fobi.base.get_cleaned_data and fobi.base.get_field_name_to_label_map functions and returns the result.

Parameters
  • form (django.forms.Form) –

  • form_element_entries (iterable) – Iterable of form element entries.

Return tuple

fobi.base.get_processed_form_wizard_data(form_wizard, form_list, form_element_entries)[source]

Get processed form wizard data.

fobi.base.get_registered_form_callbacks(stage=None)[source]

Get registered form callbacks for the stage given.

fobi.base.get_registered_form_element_plugin_uids(flattern=True)[source]

Get registered form element plugin uids.

Gets a list of registered plugins in a form of tuple (plugin name, plugin description). If not yet auto-discovered, auto-discovers them.

Return list

fobi.base.get_registered_form_element_plugins()[source]

Get registered form element plugins.

Gets a list of registered plugins in a form of tuple (plugin name, plugin description). If not yet auto-discovered, auto-discovers them.

Return list

fobi.base.get_registered_form_element_plugins_grouped(sort_by_value=False)[source]

Get registered form element plugins grouped.

Gets a list of registered plugins in a form of tuple (plugin name, plugin description). If not yet auto-discovered, auto-discovers them.

Return dict

fobi.base.get_registered_form_handler_plugin_uids(flattern=True)[source]

Get registered form handler plugin uids.

Gets a list of UIDs of registered form handler plugins. If not yet auto-discovered, auto-discovers them.

Return list

fobi.base.get_registered_form_handler_plugins(as_instances=False)[source]

Get registered form handler plugins.

Gets a list of registered plugins in a form of tuple (plugin name, plugin description). If not yet auto-discovered, auto-discovers them.

Return list

fobi.base.get_registered_form_wizard_handler_plugin_uids(flattern=True)[source]

Get registered form handler plugin uids.

Gets a list of UIDs of registered form wizard handler plugins. If not yet auto-discovered, auto-discovers them.

Return list

fobi.base.get_registered_form_wizard_handler_plugins(as_instances=False)[source]

Get registered form handler wizard plugins.

Gets a list of registered plugins in a form of tuple (plugin name, plugin description). If not yet auto-discovered, auto-discovers them.

Return list

fobi.base.get_registered_integration_form_element_plugin_uids(flattern=True)[source]

Get registered custom field instance plugin uids.

Gets a list of registered plugins in a form if tuple (plugin name, plugin description). If not yet auto-discovered, auto-discovers them.

Return list

fobi.base.get_registered_integration_form_element_plugins()[source]

Get registered custom field instance plugins.

Gets a list of registered plugins in a form if tuple (plugin name, plugin description). If not yet auto-discovered, auto-discovers them.

Return list

fobi.base.get_registered_integration_form_element_plugins_grouped()[source]

Get registered custom field instance plugins grouped.

Gets a list of registered plugins in a form if tuple (plugin name, plugin description). If not yet auto-discovered, auto-discovers them.

Return dict

fobi.base.get_registered_integration_form_handler_plugin_uids(flattern=True)[source]

Get registered integration form handler plugin uids.

Gets a list of registered plugins in a form if tuple (plugin name, plugin description). If not yet auto-discovered, auto-discovers them.

Return list

fobi.base.get_registered_integration_form_handler_plugins()[source]

Get registered integration form handler plugins.

Gets a list of registered plugins in a form if tuple (plugin name, plugin description). If not yet auto-discovered, auto-discovers them.

Return list

fobi.base.get_registered_integration_form_handler_plugins_grouped()[source]

Get registered integration form handler plugins grouped.

Gets a list of registered plugins in a form if tuple (plugin name, plugin description). If not yet auto-discovered, auto-discovers them.

Return dict

fobi.base.get_registered_plugin_uids(registry, flattern=True, sort_items=True)[source]

Get a list of registered plugin uids as a list .

If not yet auto-discovered, auto-discovers them.

The sort_items is applied only if flattern is True.

Parameters
  • registry

  • flattern (bool) –

  • sort_items (bool) –

Return list

fobi.base.get_registered_plugins(registry, as_instances=False, sort_items=True)[source]

Get registered plugins.

Get a list of registered plugins in a form of tuple (plugin name, plugin description). If not yet auto-discovered, auto-discovers them.

Parameters
  • registry

  • as_instances (bool) –

  • sort_items (bool) –

Return list

fobi.base.get_registered_theme_uids(flattern=True)[source]

Get registered theme uids.

Gets a list of registered themes in a form of tuple (plugin name, plugin description). If not yet auto-discovered, auto-discovers them.

Return list

fobi.base.get_registered_themes()[source]

Get registered themes.

Gets a list of registered themes in form of tuple (plugin name, plugin description). If not yet auto-discovered, auto-discovers them.

Return list

fobi.base.get_theme(request=None, theme_uid=None, as_instance=False)[source]

Get theme.

Gets the theme by theme_uid given. If left empty, takes the default one chosen in settings module.

Raises a fobi.exceptions.ThemeDoesNotExist when no default layout could be found.

Parameters
  • request (django.http.HttpRequest) –

  • theme_uid (int) –

  • as_instance (bool) –

Return fobi.base.BaseTheme

Subclcass of fobi.base.BaseTheme.

fobi.base.run_form_handlers(form_entry, request, form, form_element_entries=None)[source]

Run form handlers.

Parameters
  • form_entry (fobi.models.FormEntry) –

  • request (django.http.HttpRequest) –

  • form (django.forms.Form) –

  • form_element_entries (iterable) –

Return tuple

List of success responses, list of error responses

fobi.base.run_form_wizard_handlers(form_wizard_entry, request, form_list, form_wizard, form_element_entries=None)[source]

Run form wizard handlers.

Parameters
Return tuple

List of success responses, list of error responses

fobi.base.submit_plugin_form_data(form_entry, request, form, form_element_entries=None, **kwargs)[source]

Submit plugin form data for all plugins.

Parameters
  • form_entry (fobi.models.FormEntry) – Instance of fobi.models.FormEntry.

  • request (django.http.HttpRequest) –

  • form (django.forms.Form) –

  • form_element_entries (iterable) –

fobi.base.validate_form_element_plugin_uid(plugin_uid)[source]

Validate the form element plugin uid.

Parameters

plugin_uid (string) –

Return bool

fobi.base.validate_form_handler_plugin_uid(plugin_uid)[source]

Validate the plugin uid.

Parameters

plugin_uid (string) –

Return bool

fobi.base.validate_form_wizard_handler_plugin_uid(plugin_uid)[source]

Validate the plugin uid.

Parameters

plugin_uid (string) –

Return bool

fobi.base.validate_integration_form_element_plugin_uid(plugin_uid)[source]

Validate the custom field instance plugin uid.

Parameters

plugin_uid (string) –

Return bool

fobi.base.validate_integration_form_handler_plugin_uid(plugin_uid)[source]

Validate the integration form handler plugin uid.

Parameters

plugin_uid (string) –

Return bool

fobi.base.validate_theme_uid(plugin_uid)[source]

Validate the theme uid.

Parameters

plugin_uid (string) –

Return bool

fobi.conf module

fobi.conf.get_setting(setting, override=None)[source]

Get setting.

Get a setting from fobi conf module, falling back to the default.

If override is not None, it will be used instead of the setting.

Parameters
  • setting – String with setting name

  • override – Value to use when no setting is available. Defaults to None.

Returns

Setting value.

fobi.constants module

fobi.context_processors module

fobi.context_processors.dynamic_values(request)[source]

Dynamic values exposed to public forms.

fobi.context_processors.form_importers(request)[source]

Form importers.

fobi.context_processors.theme(request)[source]

Get active theme.

Parameters

request (django.http.HttpRequest) –

Return fobi.base.BaseTheme

Instance of fobi.base.BaseTheme.

fobi.data_structures module

class fobi.data_structures.SortableDict(*args, **kwargs)[source]

Bases: dict

SortableDict.

A dictionary that keeps its keys in the order in which they’re inserted. Very similar to (and partly based on) SortedDict of the Django, but has several additional methods implemented, such as: insert_before_key and insert_after_key.

clear()[source]

Clear.

copy()[source]

Returns a copy of this object.

insert(index, key, value)[source]

Inserts the key, value pair before the item with the given index.

insert_after_key(target_key, key, value, fail_silently=True)[source]

Insert the {key: value} after the target_key.

Parameters
  • target_key (immutable) –

  • key (immutable) –

  • value (mutable) –

  • fail_silently (boolean) –

  • offset (int) –

Return bool

insert_before_key(target_key, key, value, fail_silently=True, offset=0)[source]

Insert the {key: value} before the target_key.

Parameters
  • target_key (immutable) –

  • key (immutable) –

  • value (mutable) –

  • fail_silently (boolean) –

  • offset (int) –

Return bool

items()[source]

Iter items (internal method).

keys()a set-like object providing a view on D’s keys[source]
move_after_key(source_key, target_key, fail_silently=True)[source]

Move the {key: value} after the given source_key.

Parameters
  • source_key (immutable) –

  • target_key (immutable) –

  • fail_silently (boolean) –

Return bool

move_before_key(source_key, target_key, fail_silently=True, offset=0)[source]

Move the {key: value} before the given source_key.

Parameters
  • source_key (immutable) –

  • target_key (immutable) –

  • fail_silently (boolean) –

  • offset (int) –

Return bool

pop(key, *args)[source]

Pop.

popitem()[source]

Pop item.

setdefault(key, default)[source]

Set default.

update(dict_)[source]

Update.

value_for_index(index)[source]

Returns the value of the item at the given zero-based index.

values()[source]

Iter values (internal method).

fobi.decorators module

fobi.decorators.all_permissions_required(perms, login_url=None, raise_exception=False)[source]

Check for the permissions given based on SATISFY_ALL strategy chosen.

Example

>>> @login_required
>>> @all_permissions_required([
>>>     'fobi.add_formentry',
>>>     'fobi.change_formentry',
>>>     'fobi.delete_formentry',
>>>     'fobi.add_formelemententry',
>>>     'fobi.change_formelemententry',
>>>     'fobi.delete_formelemententry',
>>> ])
>>> def edit_dashboard(request):
>>>     # your code
fobi.decorators.any_permission_required(perms, login_url=None, raise_exception=False)[source]

Check for the permissions given based on SATISFY_ANY strategy chosen.

Example

>>> @login_required
>>> @any_permission_required([
>>>     'fobi.add_formentry',
>>>     'fobi.change_formentry',
>>>     'fobi.delete_formentry',
>>>     'fobi.add_formelemententry',
>>>     'fobi.change_formelemententry',
>>>     'fobi.delete_formelemententry',
>>> ])
>>> def edit_dashboard(request):
>>>     # your code
fobi.decorators.permissions_required(perms, satisfy='all', login_url=None, raise_exception=False)[source]

Check for the permissions given based on the strategy chosen.

Parameters
  • perms (iterable) –

  • satisfy (string) – Allowed values are “all” and “any”.

  • login_url (string) –

  • raise_exception (bool) – If set to True, the PermissionDenied exception is raised on failures.

Return bool

Example

>>> @login_required
>>> @permissions_required(satisfy='any', perms=[
>>>     'fobi.add_formentry',
>>>     'fobi.change_formentry',
>>>     'fobi.delete_formentry',
>>>     'fobi.add_formelemententry',
>>>     'fobi.change_formelemententry',
>>>     'fobi.delete_formelemententry',
>>> ])
>>> def edit_dashboard(request):
>>>     # your code

fobi.defaults module

fobi.discover module

fobi.discover.autodiscover()[source]

Auto-discovers files that should be found by fobi.

fobi.dynamic module

fobi.dynamic.assemble_form_class(form_entry, base_class=<class 'django.forms.forms.BaseForm'>, request=None, origin=None, origin_kwargs_update_func=None, origin_return_func=None, form_element_entries=None, get_form_field_instances_kwargs={})[source]

Assemble a form class by given entry.

Parameters
  • form_entry

  • base_class

  • request (django.http.HttpRequest) –

  • origin (string) –

  • origin_kwargs_update_func (callable) –

  • origin_return_func (callable) –

  • form_element_entries (iterable) – If given, used instead of form_entry.formelemententry_set.all (no additional database hit).

  • get_form_field_instances_kwargs (dict) – To be passed as **kwargs to the :method:`get_form_field_instances_kwargs`.

fobi.dynamic.assemble_form_wizard_class(form_wizard_entry, base_class=<class 'formtools.wizard.views.SessionWizardView'>, request=None, origin=None, origin_kwargs_update_func=None, origin_return_func=None, form_wizard_form_entries=None, template_name=None)[source]

Assemble form wizard class.

Parameters
  • form_wizard_entry

  • base_class

  • request

  • origin

  • origin_kwargs_update_func

  • origin_return_func

  • form_wizard_form_entries

  • template_name

Returns

fobi.exceptions module

exception fobi.exceptions.BaseException[source]

Bases: Exception

Base exception.

exception fobi.exceptions.DoesNotExist[source]

Bases: fobi.exceptions.BaseException

Raised when something does not exist.

exception fobi.exceptions.FormCallbackError[source]

Bases: fobi.exceptions.FormPluginError

Raised when form callback error occurs.

exception fobi.exceptions.FormElementPluginDoesNotExist[source]

Bases: fobi.exceptions.PluginDoesNotExist

Raised when no form element plugin with given uid can be found.

exception fobi.exceptions.FormElementPluginError[source]

Bases: fobi.exceptions.FormPluginError

Raised when form element plugin error occurs.

exception fobi.exceptions.FormHandlerPluginDoesNotExist[source]

Bases: fobi.exceptions.PluginDoesNotExist

Raised when no form handler plugin with given uid can be found.

exception fobi.exceptions.FormHandlerPluginError[source]

Bases: fobi.exceptions.FormPluginError

Raised when form handler plugin error occurs.

exception fobi.exceptions.FormPluginError[source]

Bases: fobi.exceptions.BaseException

Base error for form elements and handlers.

exception fobi.exceptions.FormWizardHandlerPluginDoesNotExist[source]

Bases: fobi.exceptions.PluginDoesNotExist

FormWizardHandlerPlugin does not exist.

Raised when no form wizard handler plugin with given uid can be found.

exception fobi.exceptions.ImproperlyConfigured[source]

Bases: fobi.exceptions.BaseException

Improperly configured.

Exception raised when developer didn’t configure/write the code properly.

exception fobi.exceptions.IntegrationFormElementPluginDoesNotExist[source]

Bases: fobi.exceptions.PluginDoesNotExist

If integration form element plugin with given uid can’t be found.

exception fobi.exceptions.IntegrationFormHandlerPluginDoesNotExist[source]

Bases: fobi.exceptions.PluginDoesNotExist

If integration form handler plugin with given uid can’t be found.

exception fobi.exceptions.InvalidRegistryItemType[source]

Bases: ValueError, fobi.exceptions.BaseException

Invalid registry item type.

Raised when an attempt is made to register an item in the registry which does not have a proper type.

exception fobi.exceptions.NoDefaultThemeSet[source]

Bases: fobi.exceptions.ImproperlyConfigured

Raised when no active theme is chosen.

exception fobi.exceptions.PluginDoesNotExist[source]

Bases: fobi.exceptions.DoesNotExist

Raised when no plugin with given uid can be found.

exception fobi.exceptions.ThemeDoesNotExist[source]

Bases: fobi.exceptions.DoesNotExist

Raised when no theme with given uid can be found.

fobi.form_importers module

class fobi.form_importers.BaseFormImporter(form_entry_cls, form_element_entry_cls, form_properties=None, form_data=None)[source]

Bases: object

Base importer.

description = None
extract_field_properties(field_data)[source]

Extract field properties.

field_properties_mapping = None
field_type_prop_name = None
fields_mapping = None
get_form_data()[source]

Get form data.

get_template_names()[source]

Get template names.

get_wizard(request, *args, **kwargs)[source]

Get wizard.

import_data(form_properties, form_data)[source]

Import data.

name = None
position_prop_name = None
templates = None
uid = None
wizard = None
class fobi.form_importers.FormImporterPluginRegistry[source]

Bases: fobi.base.BaseRegistry

Form importer plugins registry.

type

alias of fobi.form_importers.BaseFormImporter

fobi.form_importers.ensure_autodiscover()[source]

Ensure that form importer plugins are auto-discovered.

fobi.form_importers.get_form_importer_plugin_uids()[source]

Get form importer plugin uids.

fobi.form_importers.get_form_importer_plugin_urls()[source]

Gets the form importer plugin URLs as a list of tuples.

fobi.form_utils module

class fobi.form_utils.ErrorDict[source]

Bases: django.forms.utils.ErrorDict

A better ErrorDict.

as_text()[source]

As text.

class fobi.form_utils.ErrorList(initlist=None, error_class=None)[source]

Bases: django.forms.utils.ErrorList

A better ErrorList.

as_text()[source]

As text.

fobi.forms module

class fobi.forms.BulkChangeFormElementPluginsForm(*args, **kwargs)[source]

Bases: fobi.forms.BaseBulkChangePluginsForm

Bulk change form element plugins form.

class Meta[source]

Bases: object

Meta class.

fields = ['groups', 'groups_action', 'users', 'users_action']
model

alias of fobi.models.FormElement

base_fields = {'groups': <django.forms.models.ModelMultipleChoiceField object>, 'groups_action': <django.forms.fields.ChoiceField object>, 'selected_plugins': <django.forms.fields.CharField object>, 'users': <django.forms.models.ModelMultipleChoiceField object>, 'users_action': <django.forms.fields.ChoiceField object>}
declared_fields = {'groups_action': <django.forms.fields.ChoiceField object>, 'selected_plugins': <django.forms.fields.CharField object>, 'users_action': <django.forms.fields.ChoiceField object>}
property media

Return all media required to render the widgets on this form.

class fobi.forms.BulkChangeFormHandlerPluginsForm(*args, **kwargs)[source]

Bases: fobi.forms.BaseBulkChangePluginsForm

Bulk change form handler plugins form.

class Meta[source]

Bases: object

Meta class.

fields = ['groups', 'groups_action', 'users', 'users_action']
model

alias of fobi.models.FormHandler

base_fields = {'groups': <django.forms.models.ModelMultipleChoiceField object>, 'groups_action': <django.forms.fields.ChoiceField object>, 'selected_plugins': <django.forms.fields.CharField object>, 'users': <django.forms.models.ModelMultipleChoiceField object>, 'users_action': <django.forms.fields.ChoiceField object>}
declared_fields = {'groups_action': <django.forms.fields.ChoiceField object>, 'selected_plugins': <django.forms.fields.CharField object>, 'users_action': <django.forms.fields.ChoiceField object>}
property media

Return all media required to render the widgets on this form.

class fobi.forms.BulkChangeFormWizardHandlerPluginsForm(*args, **kwargs)[source]

Bases: fobi.forms.BaseBulkChangePluginsForm

Bulk change form wizard handler plugins form.

class Meta[source]

Bases: object

Meta class.

fields = ['groups', 'groups_action', 'users', 'users_action']
model

alias of fobi.models.FormWizardHandler

base_fields = {'groups': <django.forms.models.ModelMultipleChoiceField object>, 'groups_action': <django.forms.fields.ChoiceField object>, 'selected_plugins': <django.forms.fields.CharField object>, 'users': <django.forms.models.ModelMultipleChoiceField object>, 'users_action': <django.forms.fields.ChoiceField object>}
declared_fields = {'groups_action': <django.forms.fields.ChoiceField object>, 'selected_plugins': <django.forms.fields.CharField object>, 'users_action': <django.forms.fields.ChoiceField object>}
property media

Return all media required to render the widgets on this form.

class fobi.forms.FormElementEntryForm(data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=<class 'django.forms.utils.ErrorList'>, label_suffix=None, empty_permitted=False, instance=None, use_required_attribute=None, renderer=None)[source]

Bases: django.forms.models.ModelForm

FormElementEntry form.

class Meta[source]

Bases: object

Meta class.

fields = ('form_entry', 'plugin_data', 'plugin_uid', 'position')
model

alias of fobi.models.FormElementEntry

base_fields = {'form_entry': <django.forms.models.ModelChoiceField object>, 'plugin_data': <django.forms.fields.CharField object>, 'plugin_uid': <django.forms.fields.ChoiceField object>, 'position': <django.forms.fields.IntegerField object>}
declared_fields = {'plugin_uid': <django.forms.fields.ChoiceField object>}
property media

Return all media required to render the widgets on this form.

fobi.forms.FormElementEntryFormSet

alias of django.forms.formsets.FormElementEntryFormFormSet

class fobi.forms.FormEntryForm(*args, **kwargs)[source]

Bases: django.forms.models.ModelForm

Form for fobi.models.FormEntry model.

class Meta[source]

Bases: object

Meta class.

fields = ('name', 'title', 'is_public', 'active_date_from', 'active_date_to', 'inactive_page_title', 'inactive_page_message', 'success_page_title', 'success_page_message', 'action')
model

alias of fobi.models.FormEntry

base_fields = {'action': <django.forms.fields.CharField object>, 'active_date_from': <django.forms.fields.DateTimeField object>, 'active_date_to': <django.forms.fields.DateTimeField object>, 'inactive_page_message': <django.forms.fields.CharField object>, 'inactive_page_title': <django.forms.fields.CharField object>, 'is_public': <django.forms.fields.BooleanField object>, 'name': <django.forms.fields.CharField object>, 'success_page_message': <django.forms.fields.CharField object>, 'success_page_title': <django.forms.fields.CharField object>, 'title': <django.forms.fields.CharField object>}
clean_action()[source]

Validate the action (URL).

Checks if URL exists.

declared_fields = {}
property media

Return all media required to render the widgets on this form.

class fobi.forms.FormFieldsetEntryForm(*args, **kwargs)[source]

Bases: django.forms.models.ModelForm

Form for fobi.models.FormFieldsetEntry model.

class Meta[source]

Bases: object

Meta class.

fields = ('name',)
model

alias of fobi.models.FormFieldsetEntry

base_fields = {'name': <django.forms.fields.CharField object>}
declared_fields = {}
property media

Return all media required to render the widgets on this form.

class fobi.forms.FormHandlerEntryForm(data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=<class 'django.forms.utils.ErrorList'>, label_suffix=None, empty_permitted=False, instance=None, use_required_attribute=None, renderer=None)[source]

Bases: django.forms.models.ModelForm

FormHandlerEntry form.

class Meta[source]

Bases: object

Meta class.

fields = ('form_entry', 'plugin_data', 'plugin_uid')
model

alias of fobi.models.FormHandlerEntry

base_fields = {'form_entry': <django.forms.models.ModelChoiceField object>, 'plugin_data': <django.forms.fields.CharField object>, 'plugin_uid': <django.forms.fields.ChoiceField object>}
declared_fields = {'plugin_uid': <django.forms.fields.ChoiceField object>}
property media

Return all media required to render the widgets on this form.

class fobi.forms.FormHandlerForm(data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=<class 'django.forms.utils.ErrorList'>, label_suffix=None, empty_permitted=False, instance=None, use_required_attribute=None, renderer=None)[source]

Bases: django.forms.models.ModelForm

FormHandler form.

class Meta[source]

Bases: object

Meta class.

fields = ('users', 'groups')
model

alias of fobi.models.FormHandler

base_fields = {'groups': <django.forms.models.ModelMultipleChoiceField object>, 'users': <django.forms.models.ModelMultipleChoiceField object>}
declared_fields = {}
property media

Return all media required to render the widgets on this form.

class fobi.forms.FormWizardEntryForm(*args, **kwargs)[source]

Bases: django.forms.models.ModelForm

Form for fobi.models.FormWizardEntry model.

class Meta[source]

Bases: object

Meta class.

fields = ('name', 'title', 'is_public', 'success_page_title', 'success_page_message', 'show_all_navigation_buttons')
model

alias of fobi.models.FormWizardEntry

base_fields = {'is_public': <django.forms.fields.BooleanField object>, 'name': <django.forms.fields.CharField object>, 'show_all_navigation_buttons': <django.forms.fields.BooleanField object>, 'success_page_message': <django.forms.fields.CharField object>, 'success_page_title': <django.forms.fields.CharField object>, 'title': <django.forms.fields.CharField object>}
declared_fields = {}
property media

Return all media required to render the widgets on this form.

class fobi.forms.FormWizardFormEntryForm(data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=<class 'django.forms.utils.ErrorList'>, label_suffix=None, empty_permitted=False, instance=None, use_required_attribute=None, renderer=None)[source]

Bases: django.forms.models.ModelForm

FormWizardFormEntryForm form.

class Meta[source]

Bases: object

Meta class.

fields = ('form_wizard_entry', 'form_entry')
model

alias of fobi.models.FormWizardFormEntry

base_fields = {'form_entry': <django.forms.models.ModelChoiceField object>, 'form_wizard_entry': <django.forms.models.ModelChoiceField object>}
declared_fields = {}
property media

Return all media required to render the widgets on this form.

fobi.forms.FormWizardFormEntryFormSet

alias of django.forms.formsets.FormWizardFormEntryFormFormSet

class fobi.forms.FormWizardHandlerEntryForm(data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=<class 'django.forms.utils.ErrorList'>, label_suffix=None, empty_permitted=False, instance=None, use_required_attribute=None, renderer=None)[source]

Bases: django.forms.models.ModelForm

FormWizardHandlerEntry form.

class Meta[source]

Bases: object

Meta class.

fields = ('form_wizard_entry', 'plugin_data', 'plugin_uid')
model

alias of fobi.models.FormWizardHandlerEntry

base_fields = {'form_wizard_entry': <django.forms.models.ModelChoiceField object>, 'plugin_data': <django.forms.fields.CharField object>, 'plugin_uid': <django.forms.fields.ChoiceField object>}
declared_fields = {'plugin_uid': <django.forms.fields.ChoiceField object>}
property media

Return all media required to render the widgets on this form.

class fobi.forms.ImportFormEntryForm(data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=<class 'django.forms.utils.ErrorList'>, label_suffix=None, empty_permitted=False, field_order=None, use_required_attribute=None, renderer=None)[source]

Bases: django.forms.forms.Form

Import form entry form.

base_fields = {'file': <django.forms.fields.FileField object>}
declared_fields = {'file': <django.forms.fields.FileField object>}
property media

Return all media required to render the widgets on this form.

class fobi.forms.ImportFormWizardEntryForm(data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=<class 'django.forms.utils.ErrorList'>, label_suffix=None, empty_permitted=False, field_order=None, use_required_attribute=None, renderer=None)[source]

Bases: fobi.forms.ImportFormEntryForm

Import form entry wizard form.

base_fields = {'file': <django.forms.fields.FileField object>}
declared_fields = {'file': <django.forms.fields.FileField object>}
property media

Return all media required to render the widgets on this form.

fobi.helpers module

Helpers module. This module can be safely imported from any fobi (sub)module, since it never imports from any of the fobi (sub)modules (except for the fobi.constants and fobi.exceptions modules).

class fobi.helpers.JSONDataExporter(data, filename)[source]

Bases: object

Exporting the data into JSON.

export()[source]

Export.

export_to_json()[source]

Export data to JSON.

class fobi.helpers.StrippedRequest(request)[source]

Bases: object

Stripped request object.

property META

Request meta stripped down.

A standard Python dictionary containing all available HTTP headers. Available headers depend on the client and server, but here are some examples:

  • HTTP_ACCEPT_ENCODING: Acceptable encodings for the response.

  • HTTP_ACCEPT_LANGUAGE: Acceptable languages for the response.

  • HTTP_HOST: The HTTP Host header sent by the client.

  • HTTP_REFERER: The referring page, if any.

  • HTTP_USER_AGENT: The clients user-agent string.

  • QUERY_STRING: The query string, as a single (unparsed) string.

  • REMOTE_ADDR: The IP address of the client.

get_full_path()[source]

Returns the path, plus an appended query string, if applicable.

is_ajax()[source]

Is ajax?

Returns True if the request was made via an XMLHttpRequest, by checking the HTTP_X_REQUESTED_WITH header for the string ‘XMLHttpRequest’.

is_secure()[source]

Is secure.

Returns True if the request is secure; that is, if it was made with HTTPS.

property path

Path.

A string representing the full path to the requested page, not including the scheme or domain.

class fobi.helpers.StrippedUser(user)[source]

Bases: object

Stripped user object.

property email

Email.

get_full_name()[source]

Get full name.

get_short_name()[source]

Get short name.

get_username()[source]

Get username.

is_anonymous()[source]

Is anonymous.

fobi.helpers.admin_change_url(app_label, module_name, object_id, extra_path='', url_title=None)[source]

Gets an admin change URL for the object given.

Parameters
  • app_label (str) –

  • module_name (str) –

  • object_id (int) –

  • extra_path (str) –

  • url_title (str) – If given, an HTML a tag is returned with url_title as the tag title. If left to None just the URL string is returned.

Return str

fobi.helpers.clean_dict(source, keys=[], values=[])[source]

Removes given keys and values from dictionary.

Parameters
  • source (dict) –

  • keys (iterable) –

  • values (iterable) –

Return dict

fobi.helpers.clone_file(upload_dir, source_filename, relative_path=True)[source]

Clones the file.

Parameters

source_filename (string) – Source filename.

Return string

Filename of the cloned file.

fobi.helpers.combine_dicts(headers, data)[source]

Combine dicts.

Takes two dictionaries, assuming one contains a mapping keys to titles and another keys to data. Joins as string and returns a result dict.

fobi.helpers.delete_file(image_file)[source]

Delete file from disc.

fobi.helpers.do_slugify(val)[source]

Slugify.

fobi.helpers.ensure_unique_filename(destination)[source]

Makes sure filenames are never overwritten.

Parameters

destination (string) –

Return string

fobi.helpers.extract_file_path(name)[source]

Extracts the file path.

Parameters

name (string) –

Return string

fobi.helpers.flatatt_inverse_quotes(attrs)[source]

Convert a dictionary of attributes to a single string.

The returned string will contain a leading space followed by key=”value”, XML-style pairs. In the case of a boolean value, the key will appear without a value. It is assumed that the keys do not need to be XML-escaped. If the passed dictionary is empty, then return an empty string.

The result is passed through ‘mark_safe’ (by way of ‘format_html_join’).

fobi.helpers.get_app_label_and_model_name(path)[source]

Gets app_label and model_name from the path given.

Parameters

path (str) – Dotted path to the model (without “.model”, as stored in the Django ContentType model.

Return tuple

app_label, model_name

fobi.helpers.get_form_element_entries_for_form_wizard_entry(form_wizard_entry)[source]

Get form element entries for the form wizard entry.

fobi.helpers.get_ignorable_form_values()[source]

Get ignorable for form values.

Gets an iterable of form values to ignore.

Return iterable

fobi.helpers.get_model_name_for_object(obj)[source]

Get model name for object.

Django version agnostic.

fobi.helpers.get_registered_models(ignore=[])[source]

Gets registered models as list.

Parameters

ignore (iterable) – Ignore the following content types (should be in app_label.model format (example auth.User).

Return list

fobi.helpers.get_select_field_choices(raw_choices_data, key_type=None, value_type=None, fail_silently=True)[source]

Get select field choices.

Used in radio, select and other choice based fields.

Parameters
  • raw_choices_data (str) –

  • key_type (type) –

  • value_type (type) –

  • fail_silently (bool) –

Return list

fobi.helpers.get_wizard_form_field_value_from_post(request, wizard_view_name, form_key, field_name, fail_silently=True)[source]

Get wizard form field value from POST.

This is what we could have:

>>> request.POST
>>> {
>>>     'csrfmiddlewaretoken': ['kEprTL218a8HNcC02QefNNnF'],
>>>     'slider-form-test_slider': ['14'],
>>>     'form_wizard_view-current_step': ['slider-form'],
>>>     'slider-form-test_email': ['user@example.com']
>>> }

Note, that we know nothing about the types here, type conversion should be done manually. The values returned are strings always.

Parameters
  • request (django.http.HttpRequest) –

  • wizard_view_name (str) –

  • form_key (str) – Typically, this would be the step name (form slug).

  • field_name (str) – Field name.

  • fail_silently (bool) – If set to True, no errors raised.

Return str

Since everything in session is stored as string.

fobi.helpers.get_wizard_form_field_value_from_request(request, wizard_view_name, form_key, field_name, fail_silently=True, session_priority=False)[source]

Get wizard form field value from request.

Note, that we know nothing about the types here, type conversion should be done manually. The values returned are strings always.

Parameters
  • request (django.http.HttpRequest) –

  • wizard_view_name (str) –

  • form_key (str) – Typically, this would be the step name (form slug).

  • field_name (str) – Field name.

  • fail_silently (bool) – If set to True, no errors raised.

  • session_priority (bool) – If set to True, first try to read from session.

Return str

Since everything in session is stored as string.

fobi.helpers.get_wizard_form_field_value_from_session(request, wizard_view_name, form_key, field_name, fail_silently=True)[source]

Get wizard form field value from session.

This is what we could have:

>>> request.session['wizard_form_wizard_view']['step_data']
>>> {
>>>     'slider-form': {
>>>         'csrfmiddlewaretoken': ['DhINThGTgQ50e2lDnGG4nYrG0a'],
>>>         'slider-form-test_slider': ['14'],
>>>         'form_wizard_view-current_step': ['slider-form'],
>>>         'slider-form-test_email': ['user@example.com']
>>>     }
>>> }

Note, that we know nothing about the types here, type conversion should be done manually. The values returned are strings always.

Parameters
  • request (django.http.HttpRequest) –

  • wizard_view_name (str) –

  • form_key (str) – Typically, this would be the step name (form slug).

  • field_name (str) – Field name.

  • fail_silently (bool) – If set to True, no errors raised.

Return str

Since everything in session is stored as string.

fobi.helpers.handle_uploaded_file(upload_dir, image_file)[source]

Handle uploaded files.

Parameters

image_file (django.core.files.uploadedfile.InMemoryUploadedFile) –

Return string

Path to the image (relative).

fobi.helpers.iterable_to_dict(items, key_attr_name)[source]

Converts iterable of certain objects to dict.

Parameters
  • items (iterable) –

  • key_attr_name (string) – Attribute to use as a dictionary key.

Return dict

fobi.helpers.lists_overlap(sub, main)[source]

Check whether lists overlap.

fobi.helpers.map_field_name_to_label(form)[source]

Takes a form and creates label to field name map.

Parameters

form (django.forms.Form) – Instance of django.forms.Form.

Return dict

fobi.helpers.safe_text(text)[source]

Safe text (encode).

Return str

fobi.helpers.two_dicts_to_string(headers, data, html_element='p')[source]

Two dicts to string.

Takes two dictionaries, assuming one contains a mapping keys to titles and another keys to data. Joins as string and returns wrapped into HTML “p” tag.

fobi.helpers.uniquify_sequence(sequence)[source]

Uniqify sequence.

Makes sure items in the given sequence are unique, having the original order preserved.

Parameters

sequence (iterable) –

Return list

fobi.helpers.update_plugin_data(entry, request=None)[source]

Update plugin data.

Update plugin data of a given entry.

fobi.helpers.validate_initial_for_choices(plugin_form, field_name_choices='choices', field_name_initial='initial')[source]

Validate init for choices. Validates the initial value for the choices given.

Parameters
Return str

fobi.helpers.validate_initial_for_multiple_choices(plugin_form, field_name_choices='choices', field_name_initial='initial')[source]

Validates the initial value for the multiple choices given.

Parameters
Return str

fobi.helpers.validate_submit_value_as(value)[source]

Validates the SUBMIT_AS_VALUE.

Parameters

value (str) –

fobi.models module

class fobi.models.AbstractFormWizardPluginEntry(*args, **kwargs)[source]

Bases: fobi.models.BaseAbstractPluginEntry

Abstract form wizard plugin entry.

Properties
  • form_entry (fobi.models.FormWizardEntry): FormWizard to which the plugin belongs to.

  • plugin_uid (str): Plugin UID.

  • plugin_data (str): JSON formatted string with plugin data.

class Meta[source]

Bases: object

Meta class.

abstract = False
property entry_user

Get user.

form_wizard_entry

Accessor to the related object on the forward side of a many-to-one or one-to-one (via ForwardOneToOneDescriptor subclass) relation.

In the example:

class Child(Model):
    parent = ForeignKey(Parent, related_name='children')

Child.parent is a ForwardManyToOneDescriptor instance.

form_wizard_entry_id

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

class fobi.models.AbstractPluginEntry(*args, **kwargs)[source]

Bases: fobi.models.BaseAbstractPluginEntry

Abstract plugin entry.

Properties

  • form_entry (fobi.models.FormEntry): Form to which the field plugin belongs to.

  • plugin_uid (str): Plugin UID.

  • plugin_data (str): JSON formatted string with plugin data.

class Meta[source]

Bases: object

Meta class.

abstract = False
property entry_user

Get user.

form_entry

Accessor to the related object on the forward side of a many-to-one or one-to-one (via ForwardOneToOneDescriptor subclass) relation.

In the example:

class Child(Model):
    parent = ForeignKey(Parent, related_name='children')

Child.parent is a ForwardManyToOneDescriptor instance.

form_entry_id

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

class fobi.models.AbstractPluginModel(*args, **kwargs)[source]

Bases: django.db.models.base.Model

Abstract plugin model.

Used when fobi.settings.RESTRICT_PLUGIN_ACCESS is set to True.

Properties
  • plugin_uid (str): Plugin UID.

  • users (django.contrib.auth.models.User): White list of the users allowed to use the plugin.

  • groups (django.contrib.auth.models.Group): White list of the user groups allowed to use the plugin.

class Meta[source]

Bases: object

Meta class.

abstract = False
get_registered_plugins()[source]

Get registered plugins.

groups

Accessor to the related objects manager on the forward and reverse sides of a many-to-many relation.

In the example:

class Pizza(Model):
    toppings = ManyToManyField(Topping, related_name='pizzas')

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor instances.

Most of the implementation is delegated to a dynamically defined manager class built by create_forward_many_to_many_manager() defined below.

groups_list()[source]

Groups list.

Flat list (comma separated string) of groups allowed to use the plugin. Used in Django admin.

Return string

plugin_uid_admin()[source]

Plugin uid admin.

Mainly used in admin.

plugin_uid_code()[source]

Plugin uid code.

Mainly used in admin.

users

Accessor to the related objects manager on the forward and reverse sides of a many-to-many relation.

In the example:

class Pizza(Model):
    toppings = ManyToManyField(Topping, related_name='pizzas')

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor instances.

Most of the implementation is delegated to a dynamically defined manager class built by create_forward_many_to_many_manager() defined below.

users_list()[source]

Users list.

Flat list (comma separated string) of users allowed to use the plugin. Used in Django admin.

Return string

class fobi.models.BaseAbstractPluginEntry(*args, **kwargs)[source]

Bases: django.db.models.base.Model

Base for AbstractPluginEntry.

Properties
  • plugin_data (str): JSON formatted string with plugin data.

class Meta[source]

Bases: object

Meta class.

abstract = False
property entry_user

Get user from the parent container.

get_plugin(fetch_related_data=False, request=None)[source]

Get plugin.

Gets the plugin class (by plugin_uid property), makes an instance of it, serves the data stored in plugin_data field (if available). Once all is done, plugin is ready to be rendered.

Parameters

fetch_related_data (bool) – When set to True, plugin is told to re-fetch all related data (stored in models or other sources).

Return fobi.base.BasePlugin

Subclass of fobi.base.BasePlugin.

get_registered_plugins()[source]

Get registered plugins.

get_registry()[source]

Get registry.

plugin_data

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

plugin_name()[source]

Plugin name.

plugin_uid_code()[source]

Plugin uid code.

Mainly used in admin.

class fobi.models.FormElement(*args, **kwargs)[source]

Bases: fobi.models.AbstractPluginModel

Form element.

Form field plugin. Used when fobi.settings.RESTRICT_PLUGIN_ACCESS is set to True.

Properties
  • plugin_uid (str): Plugin UID.

  • users (django.contrib.auth.models.User): White list of the users allowed to use the form element plugin.

  • groups (django.contrib.auth.models.Group): White list of the user groups allowed to use the form element plugin.

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

get_registered_plugins()[source]

Add choices.

groups

Accessor to the related objects manager on the forward and reverse sides of a many-to-many relation.

In the example:

class Pizza(Model):
    toppings = ManyToManyField(Topping, related_name='pizzas')

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor instances.

Most of the implementation is delegated to a dynamically defined manager class built by create_forward_many_to_many_manager() defined below.

id

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

objects = <django.db.models.manager.Manager object>
plugin_uid

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

users

Accessor to the related objects manager on the forward and reverse sides of a many-to-many relation.

In the example:

class Pizza(Model):
    toppings = ManyToManyField(Topping, related_name='pizzas')

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor instances.

Most of the implementation is delegated to a dynamically defined manager class built by create_forward_many_to_many_manager() defined below.

class fobi.models.FormElementEntry(*args, **kwargs)[source]

Bases: fobi.models.AbstractPluginEntry

Form field entry.

Properties

  • form (fobi.models.FormEntry): Form to which the field plugin belongs to.

  • plugin_uid (str): Plugin UID.

  • plugin_data (str): JSON formatted string with plugin data.

  • form_fieldset_entry: Fieldset.

  • position (int): Entry position.

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

form_entry

Accessor to the related object on the forward side of a many-to-one or one-to-one (via ForwardOneToOneDescriptor subclass) relation.

In the example:

class Child(Model):
    parent = ForeignKey(Parent, related_name='children')

Child.parent is a ForwardManyToOneDescriptor instance.

form_fieldset_entry

Accessor to the related object on the forward side of a many-to-one or one-to-one (via ForwardOneToOneDescriptor subclass) relation.

In the example:

class Child(Model):
    parent = ForeignKey(Parent, related_name='children')

Child.parent is a ForwardManyToOneDescriptor instance.

form_fieldset_entry_id

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

get_registered_plugins()[source]

Gets registered plugins.

get_registry()[source]

Get registry.

id

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

objects = <django.db.models.manager.Manager object>
plugin_uid

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

position

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

class fobi.models.FormEntry(*args, **kwargs)[source]

Bases: django.db.models.base.Model

Form entry.

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

action

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

active_date_from

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

active_date_to

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

created

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

formelemententry_set

Accessor to the related objects manager on the reverse side of a many-to-one relation.

In the example:

class Child(Model):
    parent = ForeignKey(Parent, related_name='children')

Parent.children is a ReverseManyToOneDescriptor instance.

Most of the implementation is delegated to a dynamically defined manager class built by create_forward_many_to_many_manager() defined below.

formfieldsetentry_set

Accessor to the related objects manager on the reverse side of a many-to-one relation.

In the example:

class Child(Model):
    parent = ForeignKey(Parent, related_name='children')

Parent.children is a ReverseManyToOneDescriptor instance.

Most of the implementation is delegated to a dynamically defined manager class built by create_forward_many_to_many_manager() defined below.

formhandlerentry_set

Accessor to the related objects manager on the reverse side of a many-to-one relation.

In the example:

class Child(Model):
    parent = ForeignKey(Parent, related_name='children')

Parent.children is a ReverseManyToOneDescriptor instance.

Most of the implementation is delegated to a dynamically defined manager class built by create_forward_many_to_many_manager() defined below.

formwizardformentry_set

Accessor to the related objects manager on the reverse side of a many-to-one relation.

In the example:

class Child(Model):
    parent = ForeignKey(Parent, related_name='children')

Parent.children is a ReverseManyToOneDescriptor instance.

Most of the implementation is delegated to a dynamically defined manager class built by create_forward_many_to_many_manager() defined below.

get_absolute_url()[source]

Get absolute URL.

Absolute URL, which goes to the form-entry view view page.

Return string

id

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

inactive_page_message

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

inactive_page_title

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

property is_active
is_cloneable

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

is_public

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

name

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

objects = <django.db.models.manager.Manager object>
savedformdataentry_set

Accessor to the related objects manager on the reverse side of a many-to-one relation.

In the example:

class Child(Model):
    parent = ForeignKey(Parent, related_name='children')

Parent.children is a ReverseManyToOneDescriptor instance.

Most of the implementation is delegated to a dynamically defined manager class built by create_forward_many_to_many_manager() defined below.

slug

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

success_page_message

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

success_page_title

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

title

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

updated

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

user

Accessor to the related object on the forward side of a many-to-one or one-to-one (via ForwardOneToOneDescriptor subclass) relation.

In the example:

class Child(Model):
    parent = ForeignKey(Parent, related_name='children')

Child.parent is a ForwardManyToOneDescriptor instance.

user_id

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

class fobi.models.FormFieldsetEntry(*args, **kwargs)[source]

Bases: django.db.models.base.Model

Form fieldset entry.

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

form_entry

Accessor to the related object on the forward side of a many-to-one or one-to-one (via ForwardOneToOneDescriptor subclass) relation.

In the example:

class Child(Model):
    parent = ForeignKey(Parent, related_name='children')

Child.parent is a ForwardManyToOneDescriptor instance.

form_entry_id

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

formelemententry_set

Accessor to the related objects manager on the reverse side of a many-to-one relation.

In the example:

class Child(Model):
    parent = ForeignKey(Parent, related_name='children')

Parent.children is a ReverseManyToOneDescriptor instance.

Most of the implementation is delegated to a dynamically defined manager class built by create_forward_many_to_many_manager() defined below.

id

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

is_repeatable

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

name

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

objects = <django.db.models.manager.Manager object>
class fobi.models.FormHandler(*args, **kwargs)[source]

Bases: fobi.models.AbstractPluginModel

Form handler plugin. Used when fobi.settings.RESTRICT_PLUGIN_ACCESS is set to True.

Properties
  • plugin_uid (str): Plugin UID.

  • users (django.contrib.auth.models.User): White list of the users allowed to use the form handler plugin.

  • groups (django.contrib.auth.models.Group): White list of the user groups allowed to use the form handler plugin.

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

get_registered_plugins()[source]

Add choices.

groups

Accessor to the related objects manager on the forward and reverse sides of a many-to-many relation.

In the example:

class Pizza(Model):
    toppings = ManyToManyField(Topping, related_name='pizzas')

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor instances.

Most of the implementation is delegated to a dynamically defined manager class built by create_forward_many_to_many_manager() defined below.

id

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

objects = <django.db.models.manager.Manager object>
plugin_uid

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

users

Accessor to the related objects manager on the forward and reverse sides of a many-to-many relation.

In the example:

class Pizza(Model):
    toppings = ManyToManyField(Topping, related_name='pizzas')

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor instances.

Most of the implementation is delegated to a dynamically defined manager class built by create_forward_many_to_many_manager() defined below.

class fobi.models.FormHandlerEntry(*args, **kwargs)[source]

Bases: fobi.models.AbstractPluginEntry

Form handler entry.

Properties
  • form_entry (fobi.models.FormEntry): Form to which the handler plugin belongs to.

  • plugin_uid (str): Plugin UID.

  • plugin_data (str): JSON formatted string with plugin data.

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

form_entry

Accessor to the related object on the forward side of a many-to-one or one-to-one (via ForwardOneToOneDescriptor subclass) relation.

In the example:

class Child(Model):
    parent = ForeignKey(Parent, related_name='children')

Child.parent is a ForwardManyToOneDescriptor instance.

get_registered_plugins()[source]

Gets registered plugins.

get_registry()[source]

Get registry.

id

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

objects = <django.db.models.manager.Manager object>
plugin_uid

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

class fobi.models.FormWizardEntry(*args, **kwargs)[source]

Bases: django.db.models.base.Model

Form wizard entry.

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

created

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

formwizardformentry_set

Accessor to the related objects manager on the reverse side of a many-to-one relation.

In the example:

class Child(Model):
    parent = ForeignKey(Parent, related_name='children')

Parent.children is a ReverseManyToOneDescriptor instance.

Most of the implementation is delegated to a dynamically defined manager class built by create_forward_many_to_many_manager() defined below.

formwizardhandlerentry_set

Accessor to the related objects manager on the reverse side of a many-to-one relation.

In the example:

class Child(Model):
    parent = ForeignKey(Parent, related_name='children')

Parent.children is a ReverseManyToOneDescriptor instance.

Most of the implementation is delegated to a dynamically defined manager class built by create_forward_many_to_many_manager() defined below.

get_absolute_url()[source]

Get absolute URL.

Absolute URL, which goes to the form-wizard view view.

Return string

get_wizard_type_display(*, field=<django.db.models.fields.CharField: wizard_type>)
id

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

is_cloneable

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

is_public

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

name

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

objects = <django.db.models.manager.Manager object>
savedformwizarddataentry_set

Accessor to the related objects manager on the reverse side of a many-to-one relation.

In the example:

class Child(Model):
    parent = ForeignKey(Parent, related_name='children')

Parent.children is a ReverseManyToOneDescriptor instance.

Most of the implementation is delegated to a dynamically defined manager class built by create_forward_many_to_many_manager() defined below.

show_all_navigation_buttons

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

slug

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

success_page_message

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

success_page_title

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

title

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

updated

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

user

Accessor to the related object on the forward side of a many-to-one or one-to-one (via ForwardOneToOneDescriptor subclass) relation.

In the example:

class Child(Model):
    parent = ForeignKey(Parent, related_name='children')

Child.parent is a ForwardManyToOneDescriptor instance.

user_id

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

wizard_type

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

class fobi.models.FormWizardFormEntry(*args, **kwargs)[source]

Bases: django.db.models.base.Model

Form wizard form entry.

A coupling point between FormWizardEntry and FormEntry.

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

form_entry

Accessor to the related object on the forward side of a many-to-one or one-to-one (via ForwardOneToOneDescriptor subclass) relation.

In the example:

class Child(Model):
    parent = ForeignKey(Parent, related_name='children')

Child.parent is a ForwardManyToOneDescriptor instance.

form_entry_id

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

form_wizard_entry

Accessor to the related object on the forward side of a many-to-one or one-to-one (via ForwardOneToOneDescriptor subclass) relation.

In the example:

class Child(Model):
    parent = ForeignKey(Parent, related_name='children')

Child.parent is a ForwardManyToOneDescriptor instance.

form_wizard_entry_id

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

id

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

objects = <django.db.models.manager.Manager object>
position

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

class fobi.models.FormWizardHandler(*args, **kwargs)[source]

Bases: fobi.models.AbstractPluginModel

Form wizard handler plugin. Used when fobi.settings.RESTRICT_PLUGIN_ACCESS is set to True.

Properties
  • plugin_uid (str): Plugin UID.

  • users (django.contrib.auth.models.User): White list of the users allowed to use the form handler plugin.

  • groups (django.contrib.auth.models.Group): White list of the user groups allowed to use the form handler plugin.

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

get_registered_plugins()[source]

Add choices.

groups

Accessor to the related objects manager on the forward and reverse sides of a many-to-many relation.

In the example:

class Pizza(Model):
    toppings = ManyToManyField(Topping, related_name='pizzas')

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor instances.

Most of the implementation is delegated to a dynamically defined manager class built by create_forward_many_to_many_manager() defined below.

id

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

objects = <django.db.models.manager.Manager object>
plugin_uid

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

users

Accessor to the related objects manager on the forward and reverse sides of a many-to-many relation.

In the example:

class Pizza(Model):
    toppings = ManyToManyField(Topping, related_name='pizzas')

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor instances.

Most of the implementation is delegated to a dynamically defined manager class built by create_forward_many_to_many_manager() defined below.

class fobi.models.FormWizardHandlerEntry(*args, **kwargs)[source]

Bases: fobi.models.AbstractFormWizardPluginEntry

Form wizard handler entry.

Properties
  • form_wizard_entry (fobi.models.FormWizardEntry): FormWizard to which the handler plugin belongs to.

  • plugin_uid (str): Plugin UID.

  • plugin_data (str): JSON formatted string with plugin data.

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

form_wizard_entry

Accessor to the related object on the forward side of a many-to-one or one-to-one (via ForwardOneToOneDescriptor subclass) relation.

In the example:

class Child(Model):
    parent = ForeignKey(Parent, related_name='children')

Child.parent is a ForwardManyToOneDescriptor instance.

get_registered_plugins()[source]

Gets registered plugins.

get_registry()[source]

Get registry.

id

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

objects = <django.db.models.manager.Manager object>
plugin_uid

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

fobi.settings module

  • RESTRICT_PLUGIN_ACCESS (bool): If set to True, (Django) permission system for fobi plugins is enabled.

  • FORM_ELEMENT_PLUGINS_MODULE_NAME (str): Name of the module to placed in the (external) apps in which the fobi form element plugin code should be implemented and registered.

  • FORM_HANDLER_PLUGINS_MODULE_NAME (str): Name of the module to placed in the (external) apps in which the fobi form handler plugin code should be implemented and registered.

  • FORM_CALLBACKS_MODULE_NAME (str): Name of the module to placed in the (external) apps in which the fobi form callback code should be implemented and registered.

  • FORM_HANDLER_PLUGINS_EXECUTION_ORDER (tuple): Order in which the form handler plugins are to be executed.

  • FORM_WIZARD_HANDLER_PLUGINS_EXECUTION_ORDER (tuple): Order in which the form handler plugins are to be executed.

  • DEBUG

fobi.test module

fobi.utils module

Another helper module. This module can NOT be safely imported from any fobi (sub)module - thus should be imported carefully.

Append edit and delete links to the field.

Should return dictionary, which would be used to update default kwargs of form fields.

The hidden inputs form-{counter}-position and form-{counter}-id are for saving the ordering of the elements (position field).

Return dict

fobi.utils.get_allowed_form_element_plugin_uids(user)[source]

Get allowed form element plugin uids.

fobi.utils.get_allowed_form_handler_plugin_uids(user)[source]

Get allowed form handler plugin uids.

fobi.utils.get_allowed_form_wizard_handler_plugin_uids(user)[source]

Get allowed form wizard handler plugin uids.

fobi.utils.get_allowed_plugin_uids(plugin_model_cls, user)[source]

Get allowed plugins uids for user given.

Parameters
Return list

fobi.utils.get_user_form_element_plugin_uids(user)[source]

Get user form element plugin uids.

fobi.utils.get_user_form_element_plugins(user)[source]

Get user form element plugins.

fobi.utils.get_user_form_element_plugins_grouped(user, sort_by_value=False)[source]

Get user form element plugins grouped.

fobi.utils.get_user_form_field_plugin_uids(user)

Get user form element plugin uids.

fobi.utils.get_user_form_handler_plugin_uids(user)[source]

Get user form handler plugin uids.

fobi.utils.get_user_form_handler_plugins(user, exclude_used_singles=False, used_form_handler_plugin_uids=[])[source]

Get list of plugins allowed for user.

Parameters
  • user (django.contrib.auth.models.User) –

  • exclude_used_singles (bool) –

  • used_form_handler_plugin_uids (list) –

Return list

fobi.utils.get_user_form_handler_plugins_grouped(user, sort_by_value=False)[source]

Get user form handler plugins grouped.

fobi.utils.get_user_form_wizard_handler_plugin_uids(user)[source]

Get user form handler plugin uids.

fobi.utils.get_user_form_wizard_handler_plugins(user, exclude_used_singles=False, used_form_wizard_handler_plugin_uids=[])[source]

Get list of plugins allowed for user.

Parameters
  • user (django.contrib.auth.models.User) –

  • exclude_used_singles (bool) –

  • used_form_wizard_handler_plugin_uids (list) –

Return list

fobi.utils.get_user_form_wizard_handler_plugins_grouped(user)[source]

Get user form wizard handler plugins grouped.

fobi.utils.get_user_plugin_uids(get_allowed_plugin_uids_func, get_registered_plugin_uids_func, registry, user)[source]

Gets a list of user plugin uids as a list.

If not yet auto-discovered, auto-discovers them.

Parameters
  • get_allowed_plugin_uids_func (callable) –

  • get_registered_plugin_uids_func (callable) –

  • registry (fobi.base.BaseRegistry) – Subclass of fobi.base.BaseRegistry instance.

  • user (django.contrib.auth.models.User) –

Return list

fobi.utils.get_user_plugins(get_allowed_plugin_uids_func, get_registered_plugins_func, registry, user)[source]

Get user plugins.

Gets a list of user plugins in a form if tuple (plugin name, plugin description). If not yet autodiscovered, autodiscovers them.

Parameters
  • get_allowed_plugin_uids_func (callable) –

  • get_registered_plugins_func (callable) –

  • registry (fobi.base.BaseRegistry) – Subclass of fobi.base.BaseRegistry instance.

  • user (django.contrib.auth.models.User) –

Return list

fobi.utils.get_user_plugins_grouped(get_allowed_plugin_uids_func, get_registered_plugins_grouped_func, registry, user, sort_items=True, sort_by_value=False)[source]

Get user plugins grouped.

Parameters
  • get_allowed_plugin_uids_func (callable) –

  • get_registered_plugins_grouped_func (callable) –

  • registry (fobi.base.BaseRegistry) – Subclass of fobi.base.BaseRegistry instance.

  • user (django.contrib.auth.models.User) –

  • sort_items (bool) –

  • sort_by_value (bool) –

Return dict

fobi.utils.get_wizard_files_upload_dir()[source]

Get absolute path to the upload directory of fobi form wizard files.

If WIZARD_FILES_UPLOAD_DIR path is absolute, return as is. Otherwise, prepend BASE_PATH.

Return str

Absolute path.

fobi.utils.perform_form_entry_import(request, form_data)[source]

Perform form entry import.

Parameters
  • request (django.http.HttpRequest) –

  • form_data (dict) –

:return :class:`fobi.modes.FormEntry: Instance of.

fobi.utils.prepare_form_entry_export_data(form_entry, form_element_entries=None, form_handler_entries=None)[source]

Prepare form entry export data.

Parameters
  • form_entry (fobi.modes.FormEntry) – Instance of.

  • form_element_entries (django.db.models.QuerySet) – QuerySet of FormElementEntry instances.

  • form_handler_entries (django.db.models.QuerySet) – QuerySet of FormHandlerEntry instances.

Return str

fobi.utils.sync_plugins()[source]

Sync registered plugins.

Syncs the registered plugin list with data in fobi.models.FormFieldPluginModel, fobi.models.FormHandlerPluginModel and fobi.models.FormWizardHandlerPluginModel.

fobi.validators module

fobi.validators.url_exists(url, local=False)[source]

Check if URL exists.

Parameters
  • url (str) –

  • local (bool) –

Return bool

fobi.views module

fobi.widgets module

class fobi.widgets.BooleanRadioSelect(*args, **kwargs)[source]

Bases: django.forms.widgets.RadioSelect

Boolean radio select for Django.

Example

>>> class DummyForm(forms.Form):
>>>     agree = forms.BooleanField(label=_("Agree?"),
>>>                                required=False,
>>>                                widget=BooleanRadioSelect)
property media
class fobi.widgets.NumberInput(attrs=None)[source]

Bases: django.forms.widgets.Input

input_type = 'number'
property media
template_name = 'django/forms/widgets/number.html'
class fobi.widgets.RichSelect(attrs=None, choices=(), prepend_html=None, append_html=None, override_name=None)[source]

Bases: django.forms.widgets.Select

Rich select widget with some rich enhancements.

Based on original Select widget and intended to be a drop-off replacement.

property media
render(name, value, attrs=None, **kwargs)[source]

Renders the element, having prepended and appended extra parts.

class fobi.widgets.RichSelectInverseQuotes(attrs=None, choices=(), prepend_html=None, append_html=None, override_name=None)[source]

Bases: fobi.widgets.RichSelect

Almost same as original, but uses alternative flatatt function.

Uses inverse quotes.

property media
option_template_name = 'fobi/django/forms/widgets/rich_select_inverse_option.html'
template_name = 'fobi/django/forms/widgets/rich_select_inverse.html'

Module contents