Source code for flaskbb.core.user.update

# -*- coding: utf-8 -*-
"""
    flaskbb.core.user.update
    ~~~~~~~~~~~~~~~~~~~~~~~~

    This modules provides services used in updating user details
    across FlaskBB.

    :copyright: (c) 2014-2018 by the FlaskBB Team.
    :license: BSD, see LICENSE for more details.
"""

from abc import ABC, abstractmethod

import attr

from ..changesets import empty, is_empty


def _should_assign(current, new):
    return not is_empty(new) and current != new


[docs]@attr.s(hash=True, eq=True, order=True, repr=True, frozen=True) class UserDetailsChange(object): """ Object representing a change user details. """ birthday = attr.ib(default=empty) gender = attr.ib(default=empty) location = attr.ib(default=empty) website = attr.ib(default=empty) avatar = attr.ib(default=empty) signature = attr.ib(default=empty) notes = attr.ib(default=empty) def assign_to_user(self, user): for (name, value) in attr.asdict(self).items(): if _should_assign(getattr(user, name), value): setattr(user, name, value)
[docs]@attr.s(hash=True, eq=True, order=True, repr=False, frozen=True) class PasswordUpdate(object): """ Object representing an update to a user's password. """ old_password = attr.ib() new_password = attr.ib()
[docs]@attr.s(hash=True, eq=True, order=True, repr=True, frozen=True) class EmailUpdate(object): """ Object representing a change to a user's email address. """ # TODO(anr): Change to str.lower once Python2 is dropped old_email = attr.ib(converter=lambda x: x.lower()) new_email = attr.ib(converter=lambda x: x.lower())
[docs]@attr.s(hash=True, eq=True, order=True, repr=True, frozen=True) class SettingsUpdate(object): """ Object representing an update to a user's settings. """ language = attr.ib() theme = attr.ib() def assign_to_user(self, user): for (name, value) in attr.asdict(self).items(): if _should_assign(getattr(user, name), value): setattr(user, name, value)
class UserSettingsUpdatePostProcessor(ABC): """ Used to react to a user updating their settings. This post processor recieves the user that updated their settings and the change set that was applied to the user. This post processor is called after the update has been persisted so further changes must be persisted separately. """ @abstractmethod def post_process_settings_update(self, user, settings_update): """ This method is abstract """ pass