Skip to content

Commit 24c8c2f

Browse files
committed
♻️ [#502] Make data more readable
1 parent 4b5bf3e commit 24c8c2f

File tree

5 files changed

+63
-27
lines changed

5 files changed

+63
-27
lines changed

backend/src/openarchiefbeheer/accounts/models.py

+2-6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from django.utils.translation import gettext_lazy as _
66

77
from .managers import UserManager
8+
from .utils import format_user
89

910

1011
class User(AbstractBaseUser, PermissionsMixin):
@@ -68,9 +69,4 @@ def get_short_name(self):
6869
return self.first_name
6970

7071
def get_name_with_username(self):
71-
username = self.get_username()
72-
if self.first_name or self.last_name:
73-
full_name = self.get_full_name()
74-
return f"{full_name} ({username})"
75-
76-
return username
72+
return format_user(self)

backend/src/openarchiefbeheer/accounts/utils.py

+35-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1+
from dataclasses import dataclass
2+
from typing import TYPE_CHECKING, Union
3+
14
from django.core.exceptions import ValidationError
25
from django.utils.translation import gettext_lazy as _
36

4-
from .models import User
7+
if TYPE_CHECKING:
8+
from .models import User
59

610

711
def validate_max_permissions(
8-
current_user: User, permissions=None, groups=None, is_superuser=None
12+
current_user: "User", permissions=None, groups=None, is_superuser=None
913
):
1014
"""
1115
Validate that the ``permissions``, ``groups`` and ``superuser``-flag are
@@ -45,7 +49,7 @@ def validate_max_permissions(
4549
)
4650

4751

48-
def validate_max_user_permissions(current_user: User, target_user: User):
52+
def validate_max_user_permissions(current_user: "User", target_user: "User") -> None:
4953
"""
5054
Validate that the ``target_user`` permissions are never more than the
5155
permissions of the ``current_user``.
@@ -56,3 +60,31 @@ def validate_max_user_permissions(current_user: User, target_user: User):
5660
target_user.groups,
5761
target_user.is_superuser,
5862
)
63+
64+
65+
@dataclass
66+
class UserData:
67+
username: str
68+
first_name: str = ""
69+
last_name: str = ""
70+
71+
72+
def format_user(user: Union[dict, "User"]) -> str:
73+
if isinstance(user, dict):
74+
user = UserData(
75+
**{
76+
"username": user["username"],
77+
"first_name": user.get("first_name"),
78+
"last_name": user.get("last_name"),
79+
}
80+
)
81+
82+
if user.first_name or user.last_name:
83+
full_name = "%s %s" % (user.first_name, user.last_name)
84+
return f"{full_name.strip()} ({user.username})"
85+
86+
return user.username
87+
88+
89+
def format_user_groups(groups: list[str]) -> str:
90+
return ", ".join(groups)

backend/src/openarchiefbeheer/destruction/destruction_report.py

+7-13
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
from dataclasses import dataclass
22
from typing import IO
33

4-
from django.utils import timezone
54
from django.utils.translation import gettext as _
65

76
import xlsxwriter
87
from glom import glom
98
from timeline_logger.models import TimelineLog
109
from xlsxwriter.worksheet import Worksheet
1110

12-
from openarchiefbeheer.logging.logevent import (
13-
destruction_list_reviewed,
14-
get_event_template,
15-
)
11+
from openarchiefbeheer.accounts.utils import format_user, format_user_groups
12+
from openarchiefbeheer.logging.logevent import destruction_list_reviewed
13+
from openarchiefbeheer.logging.utils import get_event_template, get_readable_timestamp
1614
from openarchiefbeheer.zaken.api.constants import ZAAK_METADATA_FIELDS_MAPPINGS
1715

1816
from .constants import InternalStatus
@@ -34,20 +32,16 @@ def add_review_process_table(
3432
]
3533
worksheet.write_row(start_row, 0, column_names)
3634

37-
logs = TimelineLog.objects.for_object(self).filter(
35+
logs = TimelineLog.objects.for_object(self.destruction_list).filter(
3836
template=get_event_template(destruction_list_reviewed),
3937
extra_data__approved=True,
4038
)
4139
for row_count, log in enumerate(logs):
42-
user_data = log.extra_data["user"]
4340
# Not using the FK because the user might have been deleted in the mean time
44-
formatted_user = f"{user_data["first_name"]} {user_data["last_name"]} ({user_data["username"]})"
4541
data = [
46-
", ".join(log.extra_data["user_groups"]),
47-
formatted_user,
48-
log.timestamp.astimezone(tz=timezone.get_default_timezone()).isoformat(
49-
sep=" ", timespec="minutes"
50-
),
42+
format_user_groups(log.extra_data["user_groups"]),
43+
format_user(log.extra_data["user"]),
44+
get_readable_timestamp(log),
5145
# This column is not useful, since we are filtering on approved reviews.
5246
# But it was specifically requested.
5347
_("Has approved"),

backend/src/openarchiefbeheer/logging/logevent.py

-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import traceback
2-
from typing import Callable
32

43
from django.db.models import Max, Min, Model
54

@@ -260,7 +259,3 @@ def resync_failed(exc: Exception) -> None:
260259
return TimelineLog.objects.create(
261260
template="logging/resync_failed.txt", extra_data={"error": error}
262261
)
263-
264-
265-
def get_event_template(logging_func: Callable) -> str:
266-
return TEMPLATE_FORMAT % {"event": logging_func.__name__}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from typing import Callable
2+
3+
from django.utils import timezone
4+
5+
from timeline_logger.models import TimelineLog
6+
7+
from .logevent import TEMPLATE_FORMAT
8+
9+
10+
def get_event_template(logging_func: Callable) -> str:
11+
return TEMPLATE_FORMAT % {"event": logging_func.__name__}
12+
13+
14+
def get_readable_timestamp(
15+
log: TimelineLog, separator: str = " ", timespec: str = "minutes"
16+
) -> str:
17+
return log.timestamp.astimezone(tz=timezone.get_default_timezone()).isoformat(
18+
sep=separator, timespec=timespec
19+
)

0 commit comments

Comments
 (0)