Skip to content

Commit

Permalink
Merge pull request #41 from Amsterdam/WON-86-Voeg-extra-taak-toe-bij-…
Browse files Browse the repository at this point in the history
…afwijzing-extra-controle-andere-gebruiker

add reviewer to bpmn
  • Loading branch information
NvdLaan authored Feb 3, 2025
2 parents 0a679d9 + 4cd8150 commit 8399771
Show file tree
Hide file tree
Showing 8 changed files with 1,142 additions and 7 deletions.
9 changes: 6 additions & 3 deletions app/apps/cases/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,13 @@ def create(self, request):
contacts_data = validated_data.pop("contacts", [])
case = Case.objects.create(**validated_data)
Contact.process_contacts(case, contacts_data)
self.start_workflow(case)
self.start_workflow(case, request.user.id)
return Response(CaseSerializer(case).data, status=201)

def start_workflow(self, case):
task = task_create_main_worflow_for_case.delay(case_id=case.id)
def start_workflow(self, case, user_id):
task = task_create_main_worflow_for_case.delay(
case_id=case.id, data={"initiated_by": user_id}
)
task.wait(timeout=None, interval=0.5)
start_workflow_task = task_start_worflow.delay(
CaseWorkflow.objects.get(case=case).id
Expand Down Expand Up @@ -136,6 +138,7 @@ def start_process(self, request, pk):
case=case,
workflow_type=workflow_type,
workflow_message_name=instance.message_name,
data={"initiated_by": request.user.id},
)
task = task_start_worflow.delay(case_workflow.id)
task.wait(timeout=None, interval=0.5)
Expand Down
1,029 changes: 1,029 additions & 0 deletions app/apps/workflow/bpmn_files/default/process_vve_ok/1.9.0/process_vve_ok.bpmn

Large diffs are not rendered by default.

34 changes: 34 additions & 0 deletions app/apps/workflow/migrations/0008_caseusertask_author.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Generated by Django 5.0.8 on 2025-01-30 09:17

import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("workflow", "0007_workflowoption"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.AddField(
model_name="caseusertask",
name="initiated_by",
field=models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.PROTECT,
related_name="case_user_tasks",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AddField(
model_name="caseusertask",
name="requires_review",
field=models.BooleanField(
default=False,
help_text="Indicates whether this task requires review by another user.",
),
),
]
19 changes: 18 additions & 1 deletion app/apps/workflow/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import os


from apps.users import auth
from apps.events.models import CaseEvent, TaskModelEventEmitter
from apps.cases.models import Case, CaseStateType
from django.conf import settings
Expand Down Expand Up @@ -199,6 +200,13 @@ def _create_user_tasks(self, wf):
due_date=make_aware(datetime.datetime.today()),
case=self.case,
workflow=self,
initiated_by=(
auth.get_user_model().objects.get(id=self.data.get("initiated_by"))
if self.data.get("initiated_by")
else None
),
requires_review=task.task_spec.extensions.get("requires_review", False)
or False,
)
for task in ready_tasks
if not CaseUserTask.objects.filter(
Expand Down Expand Up @@ -392,8 +400,17 @@ class CaseUserTask(models.Model):
related_name="tasks",
on_delete=models.CASCADE,
)

initiated_by = models.ForeignKey(
to=settings.AUTH_USER_MODEL,
related_name="case_user_tasks",
on_delete=models.PROTECT,
null=True,
)
objects = BulkCreateSignalsManager()
requires_review = models.BooleanField(
default=False,
help_text="Indicates whether this task requires review by another user.",
)

@property
def get_form_variables(self):
Expand Down
6 changes: 6 additions & 0 deletions app/apps/workflow/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@
class CaseUserTaskSerializer(serializers.ModelSerializer):
case = serializers.PrimaryKeyRelatedField(queryset=Case.objects.all())
homeowner_association = serializers.SerializerMethodField()
initiated_by = serializers.SerializerMethodField()

def get_initiated_by(self, obj):
return obj.initiated_by.email if obj.initiated_by else None

def get_homeowner_association(self, obj):
return (
Expand All @@ -35,6 +39,8 @@ class Meta:
"completed",
"case",
"homeowner_association",
"initiated_by",
"requires_review",
)


Expand Down
42 changes: 40 additions & 2 deletions app/apps/workflow/tests/tests_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@
from apps.homeownerassociation.models import HomeownerAssociation
from apps.cases.models import Case, CaseDocument
from apps.workflow.models import CaseUserTask, CaseWorkflow, GenericCompletedTask
from utils.test_utils import get_authenticated_client, get_unauthenticated_client
from utils.test_utils import (
get_authenticated_client,
get_test_user,
get_unauthenticated_client,
)
import uuid
from django.core.files.uploadedfile import SimpleUploadedFile

Expand Down Expand Up @@ -85,7 +89,7 @@ def test_complete_task(self, complete_generic_user_task_and_create_new_user_task
)

def test_get_case_user_tasks(self):
case, case_user_task = self._create_case_and_task()
_, _ = self._create_case_and_task()
url = reverse("tasks-list")
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
Expand All @@ -108,6 +112,38 @@ def test_complete_task_invalid_id(self):
response = self.client.post(url, data, format="json")
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

@patch("apps.workflow.views.complete_generic_user_task_and_create_new_user_tasks")
def test_complete_task_with_requires_review(
self, complete_generic_user_task_and_create_new_user_tasks
):
complete_generic_user_task_and_create_new_user_tasks.return_value = (
"task completed"
)
case = self._create_case()
case = Case.objects.get(id=case)
case_wf = CaseWorkflow.objects.create(
case=case, completed=False, workflow_type="process_vve_ok"
)
user = get_test_user()
case_user_task = CaseUserTask.objects.create(
task_name="task1",
completed=False,
case=case,
task_id=uuid.uuid4(),
due_date="2021-01-01",
workflow_id=case_wf.id,
initiated_by=user,
requires_review=True,
)
url = reverse("generictasks-complete-task")
data = {
"case_user_task_id": case_user_task.id,
"case": case.id,
"variables": {"test": "test"},
}
response = self.client.post(url, data, format="json")
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)

def test_complete_file_task_missing_file(self):
case, case_user_task = self._create_case_and_task()
url = reverse("generictasks-complete-file-task")
Expand All @@ -132,6 +168,8 @@ def _create_case_and_task(self):
task_id=uuid.uuid4(),
due_date="2021-01-01",
workflow_id=case_wf.id,
initiated_by=get_test_user(),
requires_review=False,
)
return case, case_user_task

Expand Down
9 changes: 8 additions & 1 deletion app/apps/workflow/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,13 @@ def _complete_task_common(self, serializer, save_document=False):
author = data.pop("author")
variables = data.get("variables", {})
task = CaseUserTask.objects.get(id=case_user_task_id, completed=False)

if task.requires_review and author.id == task.initiated_by.id:
return Response(
{"detail": "You are not authorized to complete this task"},
status=status.HTTP_403_FORBIDDEN,
)

from apps.workflow.user_tasks import get_task_by_name

user_task_type = get_task_by_name(task.task_name)
Expand All @@ -96,7 +103,7 @@ def _complete_task_common(self, serializer, save_document=False):
"value": serializer.validated_data.get("name"),
}
serializer.save()

variables["initiated_by"] = author.id
task_data = {
"case_user_task_id": case_user_task_id,
"description": task.name,
Expand Down
1 change: 1 addition & 0 deletions app/config/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,7 @@ def get_redis_url():
"1.6.0": {},
"1.7.0": {},
"1.8.0": {},
"1.9.0": {},
},
},
"sub_workflow": {
Expand Down

0 comments on commit 8399771

Please sign in to comment.