Skip to content

Commit

Permalink
Add batch form for setting status of project foirequests
Browse files Browse the repository at this point in the history
  • Loading branch information
stefanw committed May 13, 2024
1 parent b043b37 commit 2510205
Show file tree
Hide file tree
Showing 8 changed files with 265 additions and 157 deletions.
2 changes: 2 additions & 0 deletions froide/foirequest/forms/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
MakeProjectPublicForm,
PublishRequestsForm,
SendMessageProjectForm,
SetStatusProjectForm,
)
from .request import (
ApplyModerationForm,
Expand Down Expand Up @@ -55,6 +56,7 @@
"PublicBodyUploader",
"PostalUploadForm",
"FoiRequestBulkForm",
"SetStatusProjectForm",
"MakeProjectPublicForm",
"PublishRequestsForm",
"ApplyModerationForm",
Expand Down
45 changes: 42 additions & 3 deletions froide/foirequest/forms/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,15 @@
from django.utils.translation import gettext_lazy as _

from froide.foirequest.forms.message import get_default_initial_message
from froide.foirequest.tasks import create_project_messages
from froide.foirequest.tasks import (
create_project_messages,
set_project_request_status_bulk,
)
from froide.helper.widgets import BootstrapCheckboxInput, BootstrapSelect

from ..auth import get_write_foirequest_queryset
from ..forms import SendMessageForm
from ..forms.message import SendMessageForm
from ..forms.request import FoiRequestStatusForm
from ..models import FoiProject


Expand Down Expand Up @@ -97,7 +101,42 @@ def save(self, user):
create_project_messages.delay,
[f.id for f in self.foirequests],
user.id,
**self.cleaned_data
**self.cleaned_data,
)
)
return self.foiproject


class SetStatusProjectForm(FoiRequestStatusForm):
def __init__(self, *args, **kwargs):
self.foiproject: FoiProject = kwargs.pop("foiproject")
self.foirequests = kwargs.pop("foirequests")
# Skip super class
super(FoiRequestStatusForm, self).__init__(*args, **kwargs)
refusal_choices = []
same_law = len(set(f.law_id for f in self.foirequests)) == 1
# Get prototypical requests
foirequest = self.foirequests[0]
if same_law and foirequest.law:
refusal_choices = foirequest.law.get_refusal_reason_choices()
self.fields["refusal_reason"] = forms.ChoiceField(
label=_("Refusal Reason"),
choices=[("", _("No or other reason given"))] + refusal_choices,
required=False,
widget=BootstrapSelect,
help_text=_(
"When you are (partially) denied access to information, "
"the Public Body should always state the reason."
),
)

def save(self, user):
transaction.on_commit(
partial(
set_project_request_status_bulk.delay,
[f.id for f in self.foirequests],
user.id,
**self.cleaned_data,
)
)
return self.foiproject
32 changes: 32 additions & 0 deletions froide/foirequest/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,38 @@ def create_project_message(foirequest_id, user_id, **form_data):
form.save(user=user, bulk=True)


@celery_app.task
def set_project_request_status_bulk(foirequest_ids, user_id, **form_data):
for req_id in foirequest_ids:
set_project_request_status.delay(req_id, user_id, **form_data)


@celery_app.task
def set_project_request_status(foirequest_id, user_id, **form_data):
from django.contrib.auth import get_user_model

from froide.foirequest.forms.request import FoiRequestStatusForm

User = get_user_model()

try:
foirequest = FoiRequest.objects.get(id=foirequest_id)
except FoiRequest.DoesNotExist:
# request does not exist anymore?
return
assert foirequest.project

try:
user = User.objects.get(id=user_id)
except User.DoesNotExist:
return

# Set foirequest status via form
form = FoiRequestStatusForm(foirequest=foirequest, data=form_data)
if form.is_valid():
form.save(user=user)


@celery_app.task(name="froide.foirequest.tasks.convert_attachment_task", time_limit=60)
def convert_attachment_task(instance_id):
try:
Expand Down
16 changes: 12 additions & 4 deletions froide/foirequest/templates/foirequest/foiproject_action.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
{% extends 'foirequest/base.html' %}
{% extends "foirequest/base.html" %}
{% load i18n %}
{% load form_helper %}
{% block title %}{{ object.title }}{% endblock %}
{% load frontendbuild %}
{% block title %}
{{ object.title }}
{% endblock title %}
{% block app_body %}
<h1>{{ object.title }}</h1>
<a href="{{ object.get_absolute_url }}"
Expand All @@ -11,7 +14,9 @@ <h1>{{ object.title }}</h1>
action="{% url 'foirequest-project_execute_action' slug=object.slug %}">
{% csrf_token %}
<input type="hidden" name="action" value="{{ action.action }}" />
{# djlint:off H021 #}
<div style="max-height: 20vh" class="border my-2 overflow-auto">
{# djlint:on H021 #}
<ul class="mb-0">
{% for foirequest in foirequests %}
<li>
Expand All @@ -23,7 +28,10 @@ <h1>{{ object.title }}</h1>
{% endfor %}
</ul>
</div>
{% render_form form %}
{% block app_form %}
{% render_form form %}
{% endblock app_form %}
<button type="submit" class="btn btn-primary">{{ action.button }}</button>
</form>
{% endblock %}
{% addfrontendbuild "request.js" %}
{% endblock app_body %}
Loading

0 comments on commit 2510205

Please sign in to comment.