diff --git a/conntrackt/forms.py b/conntrackt/forms.py --- a/conntrackt/forms.py +++ b/conntrackt/forms.py @@ -1,12 +1,72 @@ # Django imports. from django.forms import ModelForm -from django.forms.models import inlineformset_factory # Application imports. from .models import Entity, Interface, Communication -class EntityForm(ModelForm): +class WidgetCSSClassFormMixin(object): + """ + Helper form mixin that can be used for applying additional custom CSS + classes to form field widgets. + + The mixin accepts the following class options: + + widget_css_classes - Dictionary describing which additional CSS classes + should be applied to which form widget. Dictinoary keys should be equal + to form widget names, while the value should be a string containing the + extra CSS classes that should be applied to it. In order to apply the + CSS classes to every widget of the form, use the key "ALL" + """ + + def __init__(self, *args, **kwargs): + """ + Assigns the custom CSS classes form widgets, as configured by the + widget_css_classes property. + """ + + super(WidgetCSSClassFormMixin, self).__init__(*args, **kwargs) + + for field_name, css_class in self.widget_css_classes.iteritems(): + if field_name == "ALL": + for field in self.fields.values(): + if "class" in field.widget.attrs: + field.widget.attrs["class"] += " " + css_class + else: + field.widget.attrs["class"] = css_class + else: + field = self.fields[field_name] + if "class" in field.widget.attrs: + field.widget.attrs["class"] += " " + css_class + else: + field.widget.attrs["class"] = css_class + + +class PlaceholderFormMixin(object): + """ + Helper form mixin that can be used to set-up placeholders for text widgets. + + The mixin accepts the following class options: + + widget_placeholders - Dictionary describing which placeholders should be + applied to which widgets. Keys should be equal to form widget names, + while the values should be the strings that should be set as + placeholders. + """ + + def __init__(self, *args, **kwargs): + """ + Assigns the placeholders to text form widgets, as configured by the + widget_placeholders property. + """ + + super(PlaceholderFormMixin, self).__init__(*args, **kwargs) + + for field_name, placeholder in self.widget_placeholders.iteritems(): + self.fields[field_name].widget.attrs["placeholder"] = placeholder + + +class EntityForm(WidgetCSSClassFormMixin, PlaceholderFormMixin, ModelForm): """ Implements a custom model form for entities with some styling changes. """ @@ -14,24 +74,12 @@ class EntityForm(ModelForm): class Meta: model = Entity - def __init__(self, *args, **kwargs): - """ - Initialises the form instance. Sets-up some bootstrap CSS classes for - widgets. - """ - - super(EntityForm, self).__init__(*args, **kwargs) - - # Update the widgets to be wider. - for field_name, field in self.fields.iteritems(): - field.widget.attrs["class"] = "span6" - - # Set-up some placeholders. - self.fields["name"].widget.attrs["placeholder"] = "Entity name" - self.fields["description"].widget.attrs["placeholder"] = "Entity description" + widget_placeholders = {"name": "Entity name", + "description": "Entity description"} + widget_css_classes = {"ALL": "span6"} -class InterfaceForm(ModelForm): +class InterfaceForm(WidgetCSSClassFormMixin, PlaceholderFormMixin, ModelForm): """ Implements a custom model form for interfaces with some styling changes. """ @@ -39,26 +87,15 @@ class InterfaceForm(ModelForm): class Meta: model = Interface - def __init__(self, *args, **kwargs): - """ - Initialises the form instance. Sets-up some bootstrap CSS classes for - widgets. - """ - - super(InterfaceForm, self).__init__(*args, **kwargs) + widget_placeholders = {"name": "Interface name", + "description": "Interface description", + "address": "IP address of interface", + "netmask": "IP address netmask"} - # Update the widgets to be wider. - for field_name, field in self.fields.iteritems(): - field.widget.attrs["class"] = "span6" - - # Set-up some placeholders. - self.fields["name"].widget.attrs["placeholder"] = "Interface name" - self.fields["description"].widget.attrs["placeholder"] = "Interface description" - self.fields["address"].widget.attrs["placeholder"] = "IP address of interface" - self.fields["netmask"].widget.attrs["placeholder"] = "IP address netmask" + widget_css_classes = {"ALL": "span6"} -class CommunicationForm(ModelForm): +class CommunicationForm(WidgetCSSClassFormMixin, PlaceholderFormMixin, ModelForm): """ Implements a custom model form for communications with some styling changes. """ @@ -66,18 +103,7 @@ class CommunicationForm(ModelForm): class Meta: model = Communication - def __init__(self, *args, **kwargs): - """ - Initialises the form instance. Sets-up some bootstrap CSS classes for - widgets. - """ - - super(CommunicationForm, self).__init__(*args, **kwargs) + widget_placeholders = {"port": "Port used for communication", + "description": "Communication description"} - # Update the widgets to be wider. - for field_name, field in self.fields.iteritems(): - field.widget.attrs["class"] = "span6" - - # Set-up some placeholders. - self.fields["port"].widget.attrs["placeholder"] = "Port used for communication" - self.fields["description"].widget.attrs["placeholder"] = "Communication description" + widget_css_classes = {"ALL": "span6"}