Skip to content

Error when updating entry attributes: class object has no attribute 'dump' #2

@ivanov17

Description

@ivanov17

Hello,

I need to change the values ​​of some attributes of an LDAP entry. When I use update() method, I get the error 'UserEntry' object has no attribute 'dump'.

Here is a code example :

class MyView(FormView):

    ...
    
    def form_valid(self, form):
        user_entry = form.instance
        username = self.request.user.username
        user_entry.objects.filter(pk=username).update(**form.cleaned_data)
        return super().form_valid(form)

Here is the traceback:

[11/Jan/2024 01:32:43] "GET /accounts/profile/update/ HTTP/1.1" 200 971
Internal Server Error: /accounts/profile/update/
Traceback (most recent call last):
  File "/home/user/Projects/portal/env/lib64/python3.9/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
  File "/home/user/Projects/portal/env/lib64/python3.9/site-packages/django/core/handlers/base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/user/Projects/portal/env/lib64/python3.9/site-packages/django/views/generic/base.py", line 104, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/user/Projects/portal/env/lib64/python3.9/site-packages/django/utils/decorators.py", line 46, in _wrapper
    return bound_method(*args, **kwargs)
  File "/home/user/Projects/portal/env/lib64/python3.9/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapper_view
    return view_func(request, *args, **kwargs)
  File "/home/user/Projects/portal/accounts/views.py", line 98, in dispatch
    return super().dispatch(request, *args, **kwargs)
  File "/home/user/Projects/portal/env/lib64/python3.9/site-packages/django/views/generic/base.py", line 143, in dispatch
    return handler(request, *args, **kwargs)
  File "/home/user/Projects/portal/env/lib64/python3.9/site-packages/django/views/generic/edit.py", line 153, in post
    return self.form_valid(form)
  File "/home/user/Projects/portal/accounts/views.py", line 106, in form_valid
    user_entry.objects.filter(pk=username).update(**form.cleaned_data)
  File "/home/user/Projects/portal/env/lib64/python3.9/site-packages/ldaporm/managers.py", line 100, in wrapper
    return func(self, *args, **kwargs)
  File "/home/user/Projects/portal/env/lib64/python3.9/site-packages/ldaporm/managers.py", line 478, in update
    new = self.model.from_db(self._attributes, obj.dump())
AttributeError: 'UserEntry' object has no attribute 'dump'

When I set the attribute values directly, it works for me:

class MyView(FormView):

    ...
    
    def form_valid(self, form):
        instance = form.instance
        username = self.request.user.username
        user_entry = instance.objects.get(pk=username)
        for key, value in form.cleaned_data.items():
            setattr(user_entry, key, value)
        user_entry.save()
        return super().form_valid(form)

You seem to be aware of this issue:

@needs_pk
def update(self, **kwargs) -> None:
obj = self.get()
# FIXME: obj.dump() does not exist;
new = self.model.from_db(self._attributes, obj.dump())
for key, value in kwargs.items():
if key in self.attributes:
setattr(new, key, value)
self.manager.modify(new, old=obj)

Maybe this report will help resolve it.

Also, it seems it would be useful if Model.save() had an update_fields argument, like in Django Model: https://docs.djangoproject.com/en/4.2/ref/models/instances/#ref-models-update-fields

$ django-admin --version
4.2.8

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions