rafalp/Misago

Create utility for updating user name

Open

#2.039 geöffnet am 6. März 2026

Auf GitHub ansehen
 (1 Kommentar) (0 Reaktionen) (1 zugewiesene Person)Python (509 Forks)batch import
area: backendfeature: adminhelp wanted

Repository-Metriken

Stars
 (2.409 Stars)
PR-Merge-Metriken
 (Durchschn. Merge 2T) (33 gemergte PRs in 30 T)

Beschreibung

Currently, Misago uses User.set_username to update username. This util also sends the username_changed signal

Instead, I would like to:

  1. Change User.set_username to:
class User(models.Model):
    ...

    def set_username(self, new_username: str, commit: bool = True) -> bool:
        new_username = self.normalize_username(new_username)
        if new_username == self.username:
            return False

        self.username = new_username
        self.slug = slugify(new_username)

        if commit:
           self.save()

        return True
  1. Rename misago.users.namechanges to misago.users.usernames

  2. In that module, create new util named update_username_references:

def update_username_references(user: User):
    ...

Within that function gather username changing logic from all username_changed. Also, wrap it in a plugin.

Create a test module, test_update_username_references and in it write a test case for every updated username, eg. test_update_username_references_updates_post_poster:

def test_update_username_references_updates_post_poster(user, user_post):
    user.set_username("Alice")
    user.save()

    update_username_references(user)

    user_post.refresh_from_db()
    assert user_post.poster_name == user.username
  1. Move User.record_name_change util to misago.users.usernames, add optional commit and request args (look up how other functions in misago use them), wrap it in plugin hook and write two tests:
record_user_name_change(user: User, changed_by: User | str, new_username: str, old_username: str, commit: bool = True, request: HttpRequest | None = None) -> UsernameChange:
    username_change = UsernameChange.objects.create(
        user=user,
        new_username=new_username,
        old_username=old_username,
        changed_by=changed_by,
        changed_by_username=changed_by.username,
    )

    if commit:
        username_change.save()

    return username_change
  1. Move UsernameChange from misago.users.models.user to misago.users.models.usernamechange.

  2. Add plugin_data field to UsernameChange model (inherit from PluginDataModel)

  3. Create new update_username task in misago.users.tasks:

@shared_task(name="users.update_user_name", serializer="json")
def update_user_name(user_id: int):
    user = User.objects.get(id=user_id)
    update_username_references(user)

Also in scope:

Update username change logic in misago.account and misago.users.admin.

Contributor Guide