Permalink
Branch: master
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
121 lines (79 sloc) 3.26 KB

Forms

SelfHandlingModelForm

forms.py

from horizon_contrib.forms import SelfHandlingModelForm

class IssueCreateForm(SelfHandlingModelForm):

    class Meta:
        model = Issue
        fields = ['project', 'priority', 'description', 'due_date']
        widgets = {
            'description': Textarea,
            'due_date': DateTimeWidget(attrs={'id': "due_date"}, options=settings.DATE_PAST_OPTIONS)
        }

    # handle it or leave blank or call super where is implemented basic logic for saving models
    # but in many cases is not sufficient and we must override this
    def handle(self, request, data, model_class):

        model_instance = model_class.objects.get(id=data.pop("object_id"))

views.py

from horizon_contrib.forms import ModalFormView

class CreateView(ModalFormView):

    form_class = IssueCreateForm
    success_url = "horizon:redmine:..."

    template_name = 'redmine/issue/create.html'

or simple use our CreateView which is based on SelfHandlingForm but use Django ModelForm

here we can specified fields array which be used for modelform factory or our form_class.

CreateView

from horizon_contrib.forms import CreateView

class CreateView(CreateView):

    name = _('Create Whatever') # your "action" name

    form_class = None # your form
    template_name = 'horizon_contrib/forms/create.html' # your template

    success_url = ...

UpdateView

Nothing special here. This view is same as CreateView, but tries getting initial data

Modal Tabs

You can use standard Horizon Workflows, but for many scenarios we need custom tabs with simply describe.

from horizon_contrib.tabs import ModelFormTab, TableTab
from horizon_contrib.forms import SHMForm # shortcat for SelfHandlingModelForm

from .tables import NoteFormSetTable, DocumentTable

class IssueUpdateForm(SHMForm):

    class Meta:
        model = Issue

    def __init__(self, *args, **kwargs):

        request = kwargs.pop("request", None)
        issue = kwargs.pop("issue", None)

        super(IssueUpdateForm, self).__init__(*args, **kwargs)

        # CRISPY layout
        self.helper.layout = TabHolder(
            Tab(
                u"Issue",
                Div(
                    'project', 'priority', 'status',
                                'tracker', 'assigned_to', 'subject',
                    css_class="col-lg-6 field-wrapper"
                ),
                Div(
                    'start_date', 'due_date', 'description',
                    css_class="col-lg-6 field-wrapper"
                )
            ),
        )
        TableTab(
            u"Notes",
            table=NoteFormSetTable(request, data=journal_set.filter(notes__regex = r'.{1}.*')), # only with notes
        ),

        documents = [..]

        self.helper.layout.extend([TableTab(
                u"Files",
                table=DocumentTable(request, data=documents),
            )])