feat: add name_manually_edited field to User model and update related functionality
All checks were successful
CI / lint-and-test (push) Successful in 15s

- Introduced a new boolean column `name_manually_edited` in the `users` table to control whether user names are overwritten during synchronization with Telegram.
- Updated the `get_or_create_user` function to respect the `name_manually_edited` flag, ensuring names are only updated when the flag is false.
- Implemented a new function `update_user_display_name` to allow manual updates of user names while setting the `name_manually_edited` flag to true.
- Enhanced unit tests to cover the new functionality and ensure correct behavior of name handling based on the `name_manually_edited` flag.
This commit is contained in:
2026-02-20 09:30:58 +03:00
parent dc116270b7
commit b61e1ca8a5
5 changed files with 169 additions and 6 deletions

View File

@@ -1,4 +1,4 @@
"""Tests for delete_duties_in_range and get_or_create_user_by_full_name."""
"""Tests for delete_duties_in_range, get_or_create_user_by_full_name, name_manually_edited."""
import pytest
from sqlalchemy import create_engine
@@ -7,9 +7,11 @@ from sqlalchemy.orm import sessionmaker
from duty_teller.db.models import Base, User
from duty_teller.db.repository import (
delete_duties_in_range,
get_or_create_user,
get_or_create_user_by_full_name,
get_duties,
insert_duty,
update_user_display_name,
)
@@ -47,6 +49,7 @@ def test_get_or_create_user_by_full_name_creates(session):
assert u.id is not None
assert u.full_name == "Новый Пользователь"
assert u.telegram_user_id is None
assert u.name_manually_edited is True
def test_get_or_create_user_by_full_name_returns_existing(session, user_a):
@@ -107,3 +110,88 @@ def test_get_duties_includes_duty_starting_on_last_day_of_range(session, user_a)
assert len(rows) == 1
assert rows[0][0].start_at == "2026-01-31T09:00:00Z"
assert rows[0][1] == "User A"
def test_get_or_create_user_overwrites_name_when_flag_false(session):
"""When name_manually_edited is False, second get_or_create_user overwrites name."""
u1 = get_or_create_user(
session,
telegram_user_id=100,
full_name="First Name",
username="user1",
first_name="First",
last_name="Name",
)
assert u1.full_name == "First Name"
assert u1.name_manually_edited is False
u2 = get_or_create_user(
session,
telegram_user_id=100,
full_name="Second Name",
username="user2",
first_name="Second",
last_name="Name",
)
assert u2.id == u1.id
assert u2.full_name == "Second Name"
assert u2.first_name == "Second"
assert u2.last_name == "Name"
assert u2.username == "user2"
def test_get_or_create_user_keeps_name_when_flag_true_updates_username(session):
"""When name_manually_edited is True, get_or_create_user keeps name but updates username."""
u1 = get_or_create_user(
session,
telegram_user_id=200,
full_name="Custom Name",
username="old_username",
first_name="Custom",
last_name="Name",
)
u1.name_manually_edited = True
session.commit()
session.refresh(u1)
u2 = get_or_create_user(
session,
telegram_user_id=200,
full_name="Telegram Name",
username="new_username",
first_name="Telegram",
last_name="Name",
)
assert u2.id == u1.id
assert u2.full_name == "Custom Name"
assert u2.first_name == "Custom"
assert u2.last_name == "Name"
assert u2.username == "new_username"
def test_update_user_display_name_sets_flag_then_get_or_create_user_keeps_name(session):
"""update_user_display_name sets name and flag; get_or_create_user then does not overwrite name."""
get_or_create_user(
session,
telegram_user_id=300,
full_name="Original",
username="u3",
first_name="Original",
last_name=None,
)
updated = update_user_display_name(
session, 300, "Manual Name", first_name="Manual", last_name="Name"
)
assert updated is not None
assert updated.full_name == "Manual Name"
assert updated.name_manually_edited is True
u_after_sync = get_or_create_user(
session,
telegram_user_id=300,
full_name="From Telegram",
username="new_u3",
first_name="From",
last_name="Telegram",
)
assert u_after_sync.full_name == "Manual Name"
assert u_after_sync.first_name == "Manual"
assert u_after_sync.last_name == "Name"
assert u_after_sync.username == "new_u3"