Source code for fobi.contrib.plugins.form_elements.fields.slider.base

from __future__ import absolute_import

from django.forms.fields import ChoiceField
from django.forms.utils import flatatt
from django.utils.html import format_html
from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy as _
from six import PY3, text_type

from fobi.base import FormFieldPlugin, get_theme
from fobi.helpers import get_select_field_choices
from fobi.widgets import RichSelectInverseQuotes

from . import UID
from .constants import (
    SLIDER_DEFAULT_HANDLE,
    SLIDER_DEFAULT_SHOW_ENDPOINTS_AS,
    SLIDER_DEFAULT_TOOLTIP,
    SLIDER_SHOW_ENDPOINTS_AS_LABELED_TICKS,
    SLIDER_SHOW_ENDPOINTS_AS_TICKS,
)
from .forms import SliderInputForm
from .helpers import generate_ticks
from .settings import (  # MAX_VALUE,; MIN_VALUE,
    INITIAL,
    INITIAL_MAX_VALUE,
    INITIAL_MIN_VALUE,
    STEP,
)

__title__ = "fobi.contrib.plugins.form_elements.fields.slider.base"
__author__ = "Artur Barseghyan <artur.barseghyan@gmail.com>"
__copyright__ = "2014-2019 Artur Barseghyan"
__license__ = "GPL 2.0/LGPL 2.1"
__all__ = ("SliderInputPlugin",)

theme = get_theme(request=None, as_instance=True)


[docs]class SliderInputPlugin(FormFieldPlugin): """Slider field plugin.""" uid = UID name = _("Slider") group = _("Fields") form = SliderInputForm html_classes = ["slider"]
[docs] def get_initial(self): """Get initial value. Might be used in integration plugins. """ return int(self.data.initial) if self.data.initial else INITIAL
[docs] def get_choices(self): """Get choices. Might be used in integration plugins. """ max_value = ( int(self.data.max_value) if self.data.max_value is not None else INITIAL_MAX_VALUE ) min_value = ( int(self.data.min_value) if self.data.min_value is not None else INITIAL_MIN_VALUE ) step = int(self.data.step) if self.data.step is not None else STEP if PY3: _choices = [__r for __r in range(min_value, max_value + 1, step)] choices = [(__k, __v) for __k, __v in zip(_choices, _choices)] else: _choices = range(min_value, max_value + 1, step) choices = zip(_choices, _choices) return choices
[docs] def get_form_field_instances( self, request=None, form_entry=None, form_element_entries=None, **kwargs ): """Get form field instances.""" initial = self.get_initial() max_value = ( int(self.data.max_value) if self.data.max_value is not None else INITIAL_MAX_VALUE ) min_value = ( int(self.data.min_value) if self.data.min_value is not None else INITIAL_MIN_VALUE ) step = int(self.data.step) if self.data.step is not None else STEP tooltip = ( self.data.tooltip if self.data.tooltip is not None else SLIDER_DEFAULT_TOOLTIP ) handle = ( self.data.handle if self.data.handle is not None else SLIDER_DEFAULT_HANDLE ) custom_ticks = ( get_select_field_choices( self.data.custom_ticks, key_type=int, value_type=text_type ) if self.data.custom_ticks else [] ) choices = self.get_choices() # slider_html_class = "slider-no-background" \ # if self.data.disable_slider_background \ # else "slider" slider_html_class = "slider" widget_attrs = { "class": "{0} {1}".format( slider_html_class, theme.form_element_html_class ), "data-slider-min": min_value, "data-slider-max": max_value, "data-slider-step": step, "data-slider-value": initial, "data-slider-tooltip": tooltip, "data-slider-handle": handle, } show_endpoints_as = ( self.data.show_endpoints_as if self.data.show_endpoints_as else SLIDER_DEFAULT_SHOW_ENDPOINTS_AS ) prepend_html_list = [] append_html_list = [] # Show endpoints as labeled ticks if SLIDER_SHOW_ENDPOINTS_AS_LABELED_TICKS == show_endpoints_as: if custom_ticks: ticks_data = generate_ticks(custom_ticks) else: ticks_data = generate_ticks( [ (min_value, self.data.label_start), (max_value, self.data.label_end), ] ) # label_start = self.data.label_start \ # if self.data.label_start \ # else text_type(min_value) # # label_end = self.data.label_end \ # if self.data.label_end \ # else text_type(max_value) # widget_attrs.update({ # 'data-slider-ticks': "[{0}, {1}]".format( # min_value, max_value # ), # 'data-slider-ticks-labels': '["{0!s}", "{1!s}"]'.format( # label_start.encode('utf8'), label_end.encode('utf8') # ), # }) widget_attrs.update(ticks_data) # Show endpoints as ticks elif SLIDER_SHOW_ENDPOINTS_AS_TICKS == show_endpoints_as: if custom_ticks: ticks_data = generate_ticks(custom_ticks, empty_labels=True) else: ticks_data = generate_ticks( [ (min_value, ""), (max_value, ""), ] ) # widget_attrs.update({ # 'data-slider-ticks': "[{0}, {1}]".format( # min_value, max_value # ), # 'data-slider-ticks-labels': '["{0}", "{1}"]'.format( # "", "" # ), # }) widget_attrs.update(ticks_data) # Show endpoints as labels else: if self.data.label_start: prepend_html_list.append( format_html( " <span {}>", flatatt({"class": "slider-endpoint-label-start"}), ) ) prepend_html_list.append(format_html(self.data.label_start)) prepend_html_list.append(format_html(" </span>")) if self.data.label_end: append_html_list.append( format_html( " <span {}>", flatatt({"class": "slider-endpoint-label-end"}), ) ) append_html_list.append(format_html(self.data.label_end)) append_html_list.append(format_html(" </span>")) widget_kwargs = {"attrs": widget_attrs} # For showing endpoints as labels if prepend_html_list: widget_kwargs.update( { "prepend_html": mark_safe("".join(prepend_html_list)), } ) if append_html_list: widget_kwargs.update( { "append_html": mark_safe("".join(append_html_list)), } ) field_kwargs = { "label": self.data.label, "help_text": self.data.help_text, "initial": initial, "required": self.data.required, "choices": choices, "widget": RichSelectInverseQuotes(**widget_kwargs), } return [(self.data.name, ChoiceField, field_kwargs)]