Compare commits
1 Commits
22eae6fb48
...
be08d26223
Author | SHA1 | Date |
---|---|---|
Frédéric Péters | be08d26223 |
|
@ -3147,11 +3147,12 @@ class Booking(models.Model):
|
|||
timestamp = now()
|
||||
with transaction.atomic():
|
||||
audit(
|
||||
'booking',
|
||||
'booking:cancel',
|
||||
_('cancellation of booking (%(booking_id)s) in event "%(event)s"')
|
||||
% {'booking_id': self.id, 'event': self.event},
|
||||
request=request,
|
||||
agenda=self.event.agenda,
|
||||
extra_data={'booking_id': self.id, 'event_id': self.event.id},
|
||||
)
|
||||
self.secondary_booking_set.update(cancellation_datetime=timestamp)
|
||||
self.cancellation_datetime = timestamp
|
||||
|
@ -3175,10 +3176,14 @@ class Booking(models.Model):
|
|||
def reset_user_was_present(self, request=None):
|
||||
with transaction.atomic():
|
||||
audit(
|
||||
'check',
|
||||
'check:reset',
|
||||
_('reset check of %(user)s in %(event)s') % {'user': self.user_name, 'event': self.event},
|
||||
request=request,
|
||||
agenda=self.event.agenda,
|
||||
extra_data={
|
||||
'event_id': self.event.id,
|
||||
'user_name': self.user_name,
|
||||
},
|
||||
)
|
||||
if self.user_check:
|
||||
self.user_check.delete()
|
||||
|
@ -3200,10 +3205,14 @@ class Booking(models.Model):
|
|||
self.cancellation_datetime = None
|
||||
with transaction.atomic():
|
||||
audit(
|
||||
'check',
|
||||
'check:absence',
|
||||
_('marked absence of %(user)s in %(event)s') % {'user': self.user_name, 'event': self.event},
|
||||
request=request,
|
||||
agenda=self.event.agenda,
|
||||
extra_data={
|
||||
'event_id': self.event.id,
|
||||
'user_name': self.user_name,
|
||||
},
|
||||
)
|
||||
self.user_check.save()
|
||||
self.secondary_booking_set.update(cancellation_datetime=None)
|
||||
|
@ -3224,10 +3233,14 @@ class Booking(models.Model):
|
|||
self.cancellation_datetime = None
|
||||
with transaction.atomic():
|
||||
audit(
|
||||
'check',
|
||||
'check:presence',
|
||||
_('marked presence of %(user)s in %(event)s') % {'user': self.user_name, 'event': self.event},
|
||||
request=request,
|
||||
agenda=self.event.agenda,
|
||||
extra_data={
|
||||
'event_id': self.event.id,
|
||||
'user_name': self.user_name,
|
||||
},
|
||||
)
|
||||
self.user_check.save()
|
||||
self.secondary_booking_set.update(cancellation_datetime=None)
|
||||
|
|
|
@ -1333,11 +1333,16 @@ class EventsAgendaFillslot(APIView):
|
|||
)
|
||||
new_booking.save()
|
||||
audit(
|
||||
'booking',
|
||||
'booking:create',
|
||||
_('created a booking (%(booking_id)s) for event %(event)s')
|
||||
% {'booking_id': new_booking.id, 'event': event},
|
||||
request=request,
|
||||
agenda=event.agenda,
|
||||
extra_data={
|
||||
'booking_id': new_booking.id,
|
||||
'event_id': event.id,
|
||||
'primary_booking_id': primary_booking.id if primary_booking else None,
|
||||
},
|
||||
)
|
||||
|
||||
if lock_code and not confirm_after_lock:
|
||||
|
@ -1578,11 +1583,15 @@ class MeetingsAgendaFillslot(APIView):
|
|||
)
|
||||
booking.save()
|
||||
audit(
|
||||
'booking',
|
||||
'booking:create',
|
||||
_('created a booking (%(booking_id)s) for event %(event)s')
|
||||
% {'booking_id': booking.id, 'event': event},
|
||||
request=request,
|
||||
agenda=event.agenda,
|
||||
extra_data={
|
||||
'booking_id': booking.id,
|
||||
'event_id': event.id,
|
||||
},
|
||||
)
|
||||
|
||||
if lock_code and not confirm_after_lock:
|
||||
|
@ -2490,10 +2499,13 @@ class MultipleAgendasEventsCheckLock(APIView):
|
|||
)
|
||||
for event in events:
|
||||
audit(
|
||||
'check',
|
||||
'check:%s' % 'lock' if check_locked else 'unlock',
|
||||
message % {'event': event},
|
||||
request=request,
|
||||
agenda=event.agenda,
|
||||
extra_data={
|
||||
'event_id': event.id,
|
||||
},
|
||||
)
|
||||
|
||||
return Response({'err': 0})
|
||||
|
@ -2530,10 +2542,13 @@ class MultipleAgendasEventsInvoiced(APIView):
|
|||
)
|
||||
for event in events:
|
||||
audit(
|
||||
'invoice',
|
||||
'invoice:%s' % ('mark' if invoiced else 'unmark'),
|
||||
message % {'event': event},
|
||||
request=request,
|
||||
agenda=event.agenda,
|
||||
extra_data={
|
||||
'event_id': event.id,
|
||||
},
|
||||
)
|
||||
|
||||
return Response({'err': 0})
|
||||
|
@ -3027,11 +3042,15 @@ class AcceptBooking(APIView):
|
|||
booking.accept()
|
||||
event = booking.event
|
||||
audit(
|
||||
'booking',
|
||||
'booking:accept',
|
||||
_('acceptation of booking (%(booking_id)s) in event "%(event)s"')
|
||||
% {'booking_id': booking.id, 'event': event},
|
||||
request=request,
|
||||
agenda=event.agenda,
|
||||
extra_data={
|
||||
'booking_id': booking.id,
|
||||
'event_id': event.id,
|
||||
},
|
||||
)
|
||||
|
||||
response = {
|
||||
|
@ -3067,7 +3086,7 @@ class SuspendBooking(APIView):
|
|||
booking.suspend()
|
||||
event = booking.event
|
||||
audit(
|
||||
'booking',
|
||||
'booking:suspend',
|
||||
_('suspension of booking (%(booking_id)s) in event "%(event)s"')
|
||||
% {'booking_id': booking.id, 'event': event},
|
||||
request=request,
|
||||
|
@ -3413,7 +3432,7 @@ class EventCheck(APIView):
|
|||
event.checked = True
|
||||
event.save(update_fields=['checked'])
|
||||
audit(
|
||||
'check',
|
||||
'check:mark',
|
||||
_('marked event %(event)s as checked') % {'event': event},
|
||||
request=request,
|
||||
agenda=event.agenda,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Generated by Django 3.2.16 on 2024-04-15 13:59
|
||||
# Generated by Django 3.2.16 on 2024-04-22 10:59
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.conf import settings
|
||||
|
@ -24,7 +24,9 @@ class Migration(migrations.Migration):
|
|||
),
|
||||
('timestamp', models.DateTimeField(auto_now_add=True, verbose_name='Date')),
|
||||
('action_type', models.CharField(max_length=100, verbose_name='Action type')),
|
||||
('action_code', models.CharField(max_length=100, verbose_name='Action code')),
|
||||
('action_text', models.TextField()),
|
||||
('extra_data', models.JSONField(blank=True, default=dict)),
|
||||
(
|
||||
'agenda',
|
||||
models.ForeignKey(
|
||||
|
|
|
@ -25,10 +25,12 @@ class AuditEntry(models.Model):
|
|||
settings.AUTH_USER_MODEL, verbose_name=_('User'), on_delete=models.SET_NULL, null=True
|
||||
)
|
||||
action_type = models.CharField(verbose_name=_('Action type'), max_length=100)
|
||||
action_code = models.CharField(verbose_name=_('Action code'), max_length=100)
|
||||
action_text = models.TextField()
|
||||
agenda = models.ForeignKey(
|
||||
'agendas.Agenda', on_delete=models.SET_NULL, null=True, related_name='audit_entries'
|
||||
)
|
||||
extra_data = models.JSONField(blank=True, default=dict)
|
||||
|
||||
class Meta:
|
||||
ordering = ('-timestamp',)
|
||||
|
|
|
@ -17,10 +17,13 @@
|
|||
from .models import AuditEntry
|
||||
|
||||
|
||||
def audit(action_type, action_text, request=None, user=None, agenda=None):
|
||||
def audit(action, action_text, request=None, user=None, agenda=None, extra_data=None):
|
||||
action_type, action_code = action.split(':', 1)
|
||||
return AuditEntry.objects.create(
|
||||
user=request.user if request else user,
|
||||
action_type=action_type,
|
||||
action_code=action_code,
|
||||
action_text=action_text,
|
||||
agenda=agenda,
|
||||
extra_data=extra_data or {},
|
||||
)
|
||||
|
|
|
@ -3338,10 +3338,14 @@ class EventPresenceView(EventCheckMixin, ViewableAgendaMixin, FormView):
|
|||
|
||||
with transaction.atomic():
|
||||
audit(
|
||||
'check',
|
||||
'check:mark-unchecked-present',
|
||||
_('marked unchecked users as present in %(event)s') % {'event': self.event},
|
||||
request=request,
|
||||
agenda=self.event.agenda,
|
||||
extra_data={
|
||||
'event_id': self.event.id,
|
||||
'check_type_slug': qs_kwargs['type_slug'],
|
||||
},
|
||||
)
|
||||
BookingCheck.objects.filter(booking__in=bookings).update(presence=True, **qs_kwargs)
|
||||
BookingCheck.objects.bulk_create(booking_checks_to_create)
|
||||
|
@ -3376,10 +3380,14 @@ class EventAbsenceView(EventCheckMixin, ViewableAgendaMixin, FormView):
|
|||
|
||||
with transaction.atomic():
|
||||
audit(
|
||||
'check',
|
||||
'check:mark-unchecked-absent',
|
||||
_('marked unchecked users as absent in %(event)s') % {'event': self.event},
|
||||
request=request,
|
||||
agenda=self.event.agenda,
|
||||
extra_data={
|
||||
'event_id': self.event.id,
|
||||
'check_type_slug': qs_kwargs['type_slug'],
|
||||
},
|
||||
)
|
||||
|
||||
BookingCheck.objects.filter(booking__in=bookings).update(presence=False, **qs_kwargs)
|
||||
|
@ -3397,10 +3405,13 @@ class EventCheckedView(EventCheckMixin, ViewableAgendaMixin, View):
|
|||
self.event.checked = True
|
||||
self.event.save(update_fields=['checked'])
|
||||
audit(
|
||||
'check',
|
||||
'check:mark',
|
||||
_('marked %(event)s as checked') % {'event': self.event},
|
||||
request=request,
|
||||
agenda=self.agenda,
|
||||
extra_data={
|
||||
'event_id': self.event.id,
|
||||
},
|
||||
)
|
||||
self.event.async_notify_checked()
|
||||
return self.response(request)
|
||||
|
|
|
@ -47,7 +47,7 @@ def test_journal_browse(app, admin_user, manager_user, settings):
|
|||
user = admin_user if i % 3 else manager_user
|
||||
agenda = agendas[i % 3]
|
||||
|
||||
entry = audit('booking', 'cancellation of booking (%s)' % i, user=user, agenda=agenda)
|
||||
entry = audit('booking:cancel', 'cancellation of booking (%s)' % i, user=user, agenda=agenda)
|
||||
entry.timestamp = make_aware(
|
||||
datetime.datetime(
|
||||
2024,
|
||||
|
@ -60,7 +60,7 @@ def test_journal_browse(app, admin_user, manager_user, settings):
|
|||
)
|
||||
entry.save()
|
||||
|
||||
entry = audit('check', 'marked absence (%s)' % i, user=user, agenda=agenda)
|
||||
entry = audit('check:absence', 'marked absence (%s)' % i, user=user, agenda=agenda)
|
||||
entry.timestamp = make_aware(
|
||||
datetime.datetime(
|
||||
2024,
|
||||
|
|
Loading…
Reference in New Issue