from django.forms import BoundField, CharField


class PrefixedBoundField(BoundField):
    """
    A bound field that passes the form's prefix into the widget's attrs
    """

    def as_widget(self, widget=None, attrs=None, only_initial=False):
        attrs = {} if attrs is None else attrs.copy()
        if self.form.prefix:
            attrs.update({"prefix": self.form.prefix})
        return super(PrefixedBoundField, self).as_widget(widget, attrs, only_initial)


class PrefixedFormFieldMixin(object):
    """
    A form field that binds to a custom bound field class, so we can pass the
    form's prefix into the widget's attrs
    """

    def get_bound_field(self, form, field_name):
        """
        For Django 1.9+

        Return a BoundField instance that will be used when accessing the form
        field in a template.
        """
        return PrefixedBoundField(form, self, field_name)


class OSMFormField(PrefixedFormFieldMixin, CharField):
    pass