refactor(backend): quota.measured helper, consistent admin gating, messageable predicate
- quota.measured() context manager folds the before/after units diff that the manual sync routes each re-spelled (also makes quota_remaining_today consistent). - sync pause/resume now use Depends(admin_user) instead of inline role checks. - is_messageable_user() unifies the 'real, active, non-suspended human' rule that was encoded three ways (WS auth, send recipient, and the SQL _messageable()).
This commit is contained in:
parent
63701f5344
commit
5b81e22677
3 changed files with 38 additions and 27 deletions
|
|
@ -66,6 +66,26 @@ def attribute(actor_id: int | None, action: str):
|
|||
_action.reset(t2)
|
||||
|
||||
|
||||
class Measure:
|
||||
"""Result handle from `measured()` — read .used / .remaining after the block exits."""
|
||||
|
||||
used = 0
|
||||
remaining = 0
|
||||
|
||||
|
||||
@contextlib.contextmanager
|
||||
def measured(db: Session, actor_id: int | None, action: str):
|
||||
"""Like `attribute()`, but also reports how much quota the block spent. Yields a `Measure`
|
||||
whose `.used` (units charged inside the block) and `.remaining` (today's remaining after)
|
||||
are populated on exit — so manual sync routes don't each re-spell the before/after diff."""
|
||||
m = Measure()
|
||||
before = units_used_today(db)
|
||||
with attribute(actor_id, action):
|
||||
yield m
|
||||
m.used = units_used_today(db) - before
|
||||
m.remaining = remaining_today(db)
|
||||
|
||||
|
||||
def pacific_today():
|
||||
return datetime.now(_PACIFIC).date()
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue