Coverage for dibbler / queries / adjust_penalty.py: 100%
21 statements
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-13 08:11 +0000
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-13 08:11 +0000
1from datetime import datetime
3from sqlalchemy.orm import Session
5from dibbler.models import Transaction, User
6from dibbler.queries.current_penalty import current_penalty
8# TODO: this type of transaction should be password protected.
9# the password can be set as a string literal in the config file.
12def adjust_penalty(
13 sql_session: Session,
14 user: User,
15 new_penalty: int | None = None,
16 new_penalty_multiplier: int | None = None,
17 time: datetime | None = None,
18 message: str | None = None,
19) -> Transaction:
20 if new_penalty is None and new_penalty_multiplier is None:
21 raise ValueError("At least one of new_penalty or new_penalty_multiplier must be provided")
23 if new_penalty_multiplier is not None and new_penalty_multiplier < 100:
24 raise ValueError("Penalty multiplier cannot be less than 100%")
26 if user.id is None:
27 raise ValueError("User must be persisted in the database.")
29 if new_penalty is None or new_penalty_multiplier is None:
30 existing_penalty, existing_penalty_multiplier = current_penalty(sql_session)
31 if new_penalty is None:
32 new_penalty = existing_penalty
33 if new_penalty_multiplier is None:
34 new_penalty_multiplier = existing_penalty_multiplier
36 # TODO: verify time is not behind last transaction's time
38 transaction = Transaction.adjust_penalty(
39 user_id=user.id,
40 penalty_threshold=new_penalty,
41 penalty_multiplier_percent=new_penalty_multiplier,
42 time=time,
43 message=message,
44 )
46 sql_session.add(transaction)
47 sql_session.commit()
49 return transaction