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

1from datetime import datetime 

2 

3from sqlalchemy.orm import Session 

4 

5from dibbler.models import Transaction, User 

6from dibbler.queries.current_penalty import current_penalty 

7 

8# TODO: this type of transaction should be password protected. 

9# the password can be set as a string literal in the config file. 

10 

11 

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") 

22 

23 if new_penalty_multiplier is not None and new_penalty_multiplier < 100: 

24 raise ValueError("Penalty multiplier cannot be less than 100%") 

25 

26 if user.id is None: 

27 raise ValueError("User must be persisted in the database.") 

28 

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 

35 

36 # TODO: verify time is not behind last transaction's time 

37 

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 ) 

45 

46 sql_session.add(transaction) 

47 sql_session.commit() 

48 

49 return transaction