Example #1
0
 def get_create_form_class(self):
     """
     To be called after dispatch(); returns the form class for creating a new task
     """
     self.create_model = self.get_create_model()
     if self.create_model:
         return get_task_form_class(self.create_model)
     else:
         return None
Example #2
0
 def get_form_class(self):
     return get_task_form_class(self.model)
Example #3
0
 def get_form_class(self):
     return get_task_form_class(self.model, for_edit=True)
Example #4
0
def task_chooser(request):
    task_models = get_task_types()
    create_model = None
    can_create = False

    if task_permission_policy.user_has_permission(request.user, 'add'):
        can_create = len(task_models) != 0

        if len(task_models) == 1:
            create_model = task_models[0]

        elif 'create_model' in request.GET:
            create_model = resolve_model_string(request.GET['create_model'])

            if create_model not in task_models:
                raise Http404

    # Build task types list for "select task type" view
    task_types = [
        (model.get_verbose_name(), model._meta.app_label, model._meta.model_name, model.get_description())
        for model in task_models
    ]
    # sort by lower-cased version of verbose name
    task_types.sort(key=lambda task_type: task_type[0].lower())

    # Build task type choices for filter on "existing task" tab
    task_type_choices = [
        (model, model.get_verbose_name())
        for model in task_models
    ]
    task_type_choices.sort(key=lambda task_type: task_type[1].lower())

    if create_model:
        createform_class = get_task_form_class(create_model)
    else:
        createform_class = None

    q = None
    if 'q' in request.GET or 'p' in request.GET or 'task_type' in request.GET:
        searchform = TaskChooserSearchForm(request.GET, task_type_choices=task_type_choices)
        tasks = all_tasks = searchform.task_model.objects.order_by(Lower('name'))
        q = ''

        if searchform.is_searching():
            # Note: I decided not to use wagtailsearch here. This is because
            # wagtailsearch creates a new index for each model you make
            # searchable and this might affect someone's quota. I doubt there
            # would ever be enough tasks to require using anything more than
            # an icontains anyway.
            q = searchform.cleaned_data['q']
            tasks = tasks.filter(name__icontains=q)

        # Pagination
        paginator = Paginator(tasks, per_page=10)
        tasks = paginator.get_page(request.GET.get('p'))

        return TemplateResponse(request, "wagtailadmin/workflows/task_chooser/includes/results.html", {
            'task_types': task_types,
            'searchform': searchform,
            'tasks': tasks,
            'all_tasks': all_tasks,
            'query_string': q,
        })
    else:
        if createform_class:
            if request.method == 'POST':
                createform = createform_class(request.POST, request.FILES, prefix='create-task')

                if createform.is_valid():
                    task = createform.save()

                    response = render_modal_workflow(
                        request, None, None,
                        None, json_data={'step': 'task_chosen', 'result': get_task_result_data(task)}
                    )

                    # Use a different status code so we can tell the difference between validation errors and successful creations
                    response.status_code = 201

                    return response
            else:
                createform = createform_class(prefix='create-task')
        else:
            if request.method == 'POST':
                return HttpResponseBadRequest()

            createform = None

        searchform = TaskChooserSearchForm(task_type_choices=task_type_choices)
        tasks = searchform.task_model.objects.order_by(Lower('name'))

        paginator = Paginator(tasks, per_page=10)
        tasks = paginator.get_page(request.GET.get('p'))

        return render_modal_workflow(request, 'wagtailadmin/workflows/task_chooser/chooser.html', None, {
            'task_types': task_types,
            'tasks': tasks,
            'searchform': searchform,
            'createform': createform,
            'can_create': can_create,
            'add_url': reverse('wagtailadmin_workflows:task_chooser') + '?' + request.GET.urlencode() if create_model else None
        }, json_data=get_chooser_context())