hmpf / easydmp

MIT License
7 stars 2 forks source link

Fix conversion of admin.LogEntry for drf.authtoken.Token #254

Closed hmpf closed 2 years ago

hmpf commented 2 years ago

drf.authtoken.Token is sufficiently magic that it is necessary to special case the conversion from LogEntry to Eventlog. The admin operates on a "TokenProxy" that sets user id as pk and presents itself as a normal Token.

Currently, attempting to create a token via admin (and thereby triggering the creation of a LogEntry) leads to a 500 Server Error:

Internal Server Error: /admin/authtoken/tokenproxy/add/
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/usr/local/lib/python3.10/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/contrib/admin/options.py", line 616, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/utils/decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/views/decorators/cache.py", line 44, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/contrib/admin/sites.py", line 232, in inner
    return view(request, *args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/contrib/admin/options.py", line 1657, in add_view
    return self.changeform_view(request, None, form_url, extra_context)
  File "/usr/local/lib/python3.10/site-packages/django/utils/decorators.py", line 43, in _wrapper
    return bound_method(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/utils/decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/contrib/admin/options.py", line 1540, in changeform_view
    return self._changeform_view(request, object_id, form_url, extra_context)
  File "/usr/local/lib/python3.10/site-packages/django/contrib/admin/options.py", line 1590, in _changeform_view
    self.log_addition(request, new_object, change_message)
  File "/usr/local/lib/python3.10/site-packages/django/contrib/admin/options.py", line 811, in log_addition
    return LogEntry.objects.log_action(
  File "/usr/local/lib/python3.10/site-packages/django/contrib/admin/models.py", line 29, in log_action
    return self.model.objects.create(
  File "/usr/local/lib/python3.10/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/db/models/query.py", line 453, in create
    obj.save(force_insert=True, using=self.db)
  File "/usr/local/lib/python3.10/site-packages/django/db/models/base.py", line 739, in save
    self.save_base(using=using, force_insert=force_insert,
  File "/usr/local/lib/python3.10/site-packages/django/db/models/base.py", line 787, in save_base
    post_save.send(
  File "/usr/local/lib/python3.10/site-packages/django/dispatch/dispatcher.py", line 180, in send
    return [
  File "/usr/local/lib/python3.10/site-packages/django/dispatch/dispatcher.py", line 181, in <listcomp>
    (receiver, receiver(signal=self, sender=sender, **named))
  File "/app/src/easydmp/eventlog/signals.py", line 34, in add_admin_log_entry_to_eventlog
    log_event(instance.user, verb, target=target, template=template)
  File "/app/src/easydmp/eventlog/utils.py", line 6, in log_event
    EventLog.objects.log_event(actor, verb, target, object, template,
  File "/app/src/easydmp/eventlog/models.py", line 169, in log_event
    return self.create(
  File "/usr/local/lib/python3.10/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/db/models/query.py", line 451, in create
    obj = self.model(**kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/db/models/base.py", line 503, in __init__
    raise TypeError("%s() got an unexpected keyword argument '%s'" % (cls.__name__, kwarg))
TypeError: EventLog() got an unexpected keyword argument 'target'

This is caused by the method LogEntry.get_edited_object() failing on the TokenProxy leading to a non-working fallback.

hmpf commented 2 years ago

Closed by 4b00581