text: # -*- coding: utf-8 -*-
  """
  Tencent is pleased to support the open source community by making 蓝鲸智云PaaS平台社区版 (BlueKing PaaS Community Edition) available.
  Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved.
  Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
  http://opensource.org/licenses/MIT
  Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
  """ # noqa
  
  from django import forms, VERSION as DJANGO_VERSION
  from django.template import Context
  from django.template.loader import get_template
  from django import template
  
  from bootstrapform import config
  
  register = template.Library()
  
  
  @register.filter
  def bootstrap(element):
      markup_classes = {'label': '', 'value': '', 'single_value': ''}
      return render(element, markup_classes)
  
  
  @register.filter
  def bootstrap_inline(element):
      markup_classes = {'label': 'sr-only', 'value': '', 'single_value': ''}
      return render(element, markup_classes)
  
  
  @register.filter
  def bootstrap_horizontal(element, label_cols='col-sm-2 col-lg-2'):
  
      markup_classes = {'label': label_cols, 'value': '', 'single_value': ''}
  
      for cl in label_cols.split(' '):
          splitted_class = cl.split('-')
  
          try:
              value_nb_cols = int(splitted_class[-1])
          except ValueError:
              value_nb_cols = config.BOOTSTRAP_COLUMN_COUNT
  
          if value_nb_cols >= config.BOOTSTRAP_COLUMN_COUNT:
              splitted_class[-1] = config.BOOTSTRAP_COLUMN_COUNT
          else:
              offset_class = cl.split('-')
              offset_class[-1] = 'offset-' + str(value_nb_cols)
              splitted_class[-1] = str(config.BOOTSTRAP_COLUMN_COUNT - value_nb_cols)
              markup_classes['single_value'] += ' ' + '-'.join(offset_class)
              markup_classes['single_value'] += ' ' + '-'.join(splitted_class)
  
          markup_classes['value'] += ' ' + '-'.join(splitted_class)
  
      return render(element, markup_classes)
  
  
  @register.filter
  def add_input_classes(field):
      if not is_checkbox(field) and not is_multiple_checkbox(field) \
         and not is_radio(field) and not is_file(field):
          field_classes = field.field.widget.attrs.get('class', '')
          field_classes += ' form-control'
          field.field.widget.attrs['class'] = field_classes
  
  
  def render(element, markup_classes):
      element_type = element.__class__.__name__.lower()
  
      if element_type == 'boundfield':
          add_input_classes(element)
          template = get_template("bootstrapform/field.html")
          context = Context({'field': element, 'classes': markup_classes, 'form': element.form})
      else:
          has_management = getattr(element, 'management_form', None)
          if has_management:
              for form in element.forms:
                  for field in form.visible_fields():
                      add_input_classes(field)
  
              template = get_template("bootstrapform/formset.html")
              context = Context({'formset': element, 'classes': markup_classes})
          else:
              for field in element.visible_fields():
                  add_input_classes(field)
  
              template = get_template("bootstrapform/form.html")
              context = Context({'form': element, 'classes': markup_classes})
  
          if DJANGO_VERSION >= (1, 8):
              context = context.flatten()
  
      return template.render(context)
  
  
  @register.filter
  def is_checkbox(field):
      return isinstance(field.field.widget, forms.CheckboxInput)
  
  
  @register.filter
  def is_multiple_checkbox(field):
      return isinstance(field.field.widget, forms.CheckboxSelectMultiple)
  
  
  @register.filter
  def is_radio(field):
      return isinstance(field.field.widget, forms.RadioSelect)
  
  
  @register.filter
  def is_file(field):
      return isinstance(field.field.widget, forms.FileInput)
  