Compare commits

..

1 Commits

Author SHA1 Message Date
Frédéric Péters 95b34eb9d7 general: add journal app (#86632)
gitea/chrono/pipeline/head This commit looks good Details
2024-04-23 17:03:08 +02:00
3 changed files with 93 additions and 4 deletions

View File

@ -2277,7 +2277,7 @@ class Event(WithInspectMixin, models.Model):
return self.label
return date_format(localtime(self.start_datetime), format='DATETIME_FORMAT')
def get_time_label(self):
def get_journal_label(self):
date_str = date_format(localtime(self.start_datetime), format='SHORT_DATETIME_FORMAT')
if self.label:
return f'{self.label} ({date_str})'
@ -3117,9 +3117,34 @@ class Booking(models.Model):
start_time = models.TimeField(null=True)
end_time = models.TimeField(null=True)
def get_journal_label(self):
parts = [_('ID: %s') % self.id]
if self.user_name:
parts.append(_('user: %s') % self.user_name)
if self.in_waiting_list:
parts.append(_('in waiting list'))
if self.cancellation_datetime:
parts.append(
_('cancelled at %s')
% date_format(localtime(self.cancellation_datetime), format='SHORT_DATETIME_FORMAT')
)
if self.start_time and self.end_time:
parts.append(
'%s%s'
% (
date_format(self.start_time, 'TIME_FORMAT'),
date_format(self.end_time, 'TIME_FORMAT'),
)
)
elif self.start_time:
parts.append('%s → ?' % date_format(self.start_time, 'TIME_FORMAT'))
elif self.end_time:
parts.append('? → %s' % date_format(self.end_time, 'TIME_FORMAT'))
return ' / '.join([str(x) for x in parts])
@property
def user_name(self):
return ('%s %s' % (self.user_first_name, self.user_last_name)).strip()
return ('%s %s' % (self.user_first_name or '', self.user_last_name or '')).strip()
@cached_property
def user_check(self): # pylint: disable=method-hidden

View File

@ -22,10 +22,10 @@ def audit(action, request=None, user=None, agenda=None, extra_data=None):
extra_data = extra_data or {}
if 'event' in extra_data:
extra_data['event_id'] = extra_data['event'].id
extra_data['event'] = extra_data['event'].get_time_label()
extra_data['event'] = extra_data['event'].get_journal_label()
if 'booking' in extra_data:
extra_data['booking_id'] = extra_data['booking'].id
del extra_data['booking']
extra_data['booking'] = extra_data['booking'].get_journal_label()
return AuditEntry.objects.create(
user=request.user if request else user,
action_type=action_type,

View File

@ -293,6 +293,70 @@ def test_journal_browse(app, admin_user, manager_user, settings):
]
def test_journal_audit_booking():
agenda = Agenda.objects.create(label='Bar', kind='events')
event = Event.objects.create(
start_datetime=make_aware(datetime.datetime(2024, 1, 2, 3, 4)), places=20, agenda=agenda
)
booking = Booking.objects.create(
event=event,
in_waiting_list=True,
cancellation_datetime=make_aware(datetime.datetime(2024, 1, 2, 3, 4)),
)
entry = audit(
'booking:cancel',
agenda=agenda,
extra_data={'booking': booking, 'event': event},
)
assert (
entry.extra_data['booking']
== f'ID: {booking.id} / in waiting list / cancelled at 01/02/2024 3:04 a.m.'
)
booking.user_first_name = 'first'
booking.user_last_name = 'last'
booking.in_waiting_list = False
booking.save()
entry = audit(
'booking:cancel',
agenda=agenda,
extra_data={'booking': booking, 'event': event},
)
assert (
entry.extra_data['booking']
== f'ID: {booking.id} / user: first last / cancelled at 01/02/2024 3:04 a.m.'
)
booking.cancellation_datetime = None
booking.start_time = datetime.time(10, 0)
booking.save()
entry = audit(
'booking:cancel',
agenda=agenda,
extra_data={'booking': booking, 'event': event},
)
assert entry.extra_data['booking'] == f'ID: {booking.id} / user: first last / 10 a.m. → ?'
booking.end_time = datetime.time(11, 0)
booking.save()
entry = audit(
'booking:cancel',
agenda=agenda,
extra_data={'booking': booking, 'event': event},
)
assert entry.extra_data['booking'] == f'ID: {booking.id} / user: first last / 10 a.m. → 11 a.m.'
booking.start_time = None
booking.save()
entry = audit(
'booking:cancel',
agenda=agenda,
extra_data={'booking': booking, 'event': event},
)
assert entry.extra_data['booking'] == f'ID: {booking.id} / user: first last / ? → 11 a.m.'
def test_journal_browse_invalid_or_unknown_event(app, admin_user, settings):
settings.AUDIT_JOURNAL_ENABLED = True
admin_user.first_name = 'Admin'