|
1 | 1 | from datetime import date, datetime
|
2 | 2 | from unittest.mock import patch
|
3 | 3 |
|
| 4 | +from django.contrib.auth.models import Group |
4 | 5 | from django.core.exceptions import ObjectDoesNotExist
|
5 | 6 | from django.test import TestCase
|
6 | 7 | from django.utils import timezone
|
|
15 | 16 | from zgw_consumers.test.factories import ServiceFactory
|
16 | 17 |
|
17 | 18 | from openarchiefbeheer.config.models import ArchiveConfig
|
| 19 | +from openarchiefbeheer.logging import logevent |
18 | 20 | from openarchiefbeheer.utils.results_store import ResultStore
|
19 | 21 | from openarchiefbeheer.zaken.models import Zaak
|
20 | 22 | from openarchiefbeheer.zaken.tests.factories import ZaakFactory
|
21 | 23 |
|
22 | 24 | from ...accounts.tests.factories import UserFactory
|
23 |
| -from ..constants import InternalStatus, ListItemStatus, ListStatus |
| 25 | +from ..constants import ( |
| 26 | + InternalStatus, |
| 27 | + ListItemStatus, |
| 28 | + ListStatus, |
| 29 | + ReviewDecisionChoices, |
| 30 | +) |
24 | 31 | from .factories import (
|
25 | 32 | DestructionListCoReviewFactory,
|
26 | 33 | DestructionListFactory,
|
27 | 34 | DestructionListItemFactory,
|
| 35 | + DestructionListReviewFactory, |
28 | 36 | ReviewResponseFactory,
|
29 | 37 | )
|
30 | 38 |
|
@@ -408,6 +416,82 @@ def test_generate_destruction_report(self):
|
408 | 416 | ),
|
409 | 417 | )
|
410 | 418 |
|
| 419 | + def test_generate_destruction_report_review_process(self): |
| 420 | + author = UserFactory.create(post__can_start_destruction=True) |
| 421 | + reviewer = UserFactory.create( |
| 422 | + first_name="John", |
| 423 | + last_name="Doe", |
| 424 | + username="jdoe1", |
| 425 | + post__can_review_destruction=True, |
| 426 | + ) |
| 427 | + reviewer_group, created = Group.objects.get_or_create(name="Reviewer") |
| 428 | + reviewer.groups.add(reviewer_group) |
| 429 | + archivist = UserFactory.create( |
| 430 | + first_name="Alice", |
| 431 | + last_name="Wonderland", |
| 432 | + username="awonderland1", |
| 433 | + post__can_review_final_list=True, |
| 434 | + ) |
| 435 | + archivist_group, created = Group.objects.get_or_create(name="Archivist") |
| 436 | + archivist.groups.add(archivist_group) |
| 437 | + |
| 438 | + destruction_list = DestructionListFactory.create( |
| 439 | + status=ListStatus.deleted, author=author |
| 440 | + ) |
| 441 | + |
| 442 | + review_reviewer_rejected = DestructionListReviewFactory.create( |
| 443 | + author=reviewer, decision=ReviewDecisionChoices.rejected |
| 444 | + ) |
| 445 | + review_reviewer_accepted = DestructionListReviewFactory.create( |
| 446 | + author=reviewer, decision=ReviewDecisionChoices.accepted |
| 447 | + ) |
| 448 | + review_archivist_accepted = DestructionListReviewFactory.create( |
| 449 | + author=archivist, decision=ReviewDecisionChoices.accepted |
| 450 | + ) |
| 451 | + |
| 452 | + logevent.destruction_list_created( |
| 453 | + destruction_list, author, reviewer |
| 454 | + ) # A log with a different template (should NOT be present in the report) |
| 455 | + |
| 456 | + logevent.destruction_list_reviewed( |
| 457 | + destruction_list, review_reviewer_rejected, reviewer |
| 458 | + ) # A rejection (should NOT be present in the report) |
| 459 | + with freeze_time("2024-05-02T16:00:00+02:00"): |
| 460 | + logevent.destruction_list_reviewed( |
| 461 | + destruction_list, review_reviewer_accepted, reviewer |
| 462 | + ) |
| 463 | + with freeze_time("2024-05-08T09:45:00+02:00"): |
| 464 | + logevent.destruction_list_reviewed( |
| 465 | + destruction_list, review_archivist_accepted, archivist |
| 466 | + ) |
| 467 | + |
| 468 | + destruction_list.generate_destruction_report() |
| 469 | + |
| 470 | + wb = load_workbook(filename=destruction_list.destruction_report.path) |
| 471 | + sheet_deleted_zaken = wb[gettext("Review process")] |
| 472 | + rows = list(sheet_deleted_zaken.iter_rows(values_only=True)) |
| 473 | + |
| 474 | + self.assertEqual(len(rows), 3) |
| 475 | + |
| 476 | + self.assertEqual( |
| 477 | + rows[1], |
| 478 | + ( |
| 479 | + "Reviewer", |
| 480 | + "John Doe (jdoe1)", |
| 481 | + "2024-05-02 16:00+02:00", |
| 482 | + gettext("Has approved"), |
| 483 | + ), |
| 484 | + ) |
| 485 | + self.assertEqual( |
| 486 | + rows[2], |
| 487 | + ( |
| 488 | + "Archivist", |
| 489 | + "Alice Wonderland (awonderland1)", |
| 490 | + "2024-05-08 09:45+02:00", |
| 491 | + gettext("Has approved"), |
| 492 | + ), |
| 493 | + ) |
| 494 | + |
411 | 495 | def test_zaak_creation_skipped_if_internal_status_succeeded(self):
|
412 | 496 | destruction_list = DestructionListFactory.create(
|
413 | 497 | processing_status=InternalStatus.succeeded
|
|
0 commit comments