def select_task_type(request): if not task_permission_policy.user_has_permission(request.user, "add"): raise PermissionDenied task_types = [( model.get_verbose_name(), model._meta.app_label, model._meta.model_name, model.get_description(), ) for model in get_task_types()] # sort by lower-cased version of verbose name task_types.sort(key=lambda task_type: task_type[0].lower()) if len(task_types) == 1: # Only one task type is available - redirect straight to the create form rather than # making the user choose verbose_name, app_label, model_name, description = task_types[0] return redirect("wagtailadmin_workflows:add_task", app_label, model_name) return render( request, "wagtailadmin/workflows/select_task_type.html", { "task_types": task_types, "icon": "thumbtack", "title": _("Workflows"), }, )
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())
def dispatch(self, request): self.task_models = get_task_types() self.can_create = (task_permission_policy.user_has_permission( request.user, 'add') and len(self.task_models) != 0) return super().dispatch(request)