1import asyncio
2import logging
3from datetime import datetime, timedelta
4from typing import TYPE_CHECKING
5
6from app import marznode
7from app.db import (
8 GetDB,
9 get_users,
10)
11from app.models.user import (
12 UserResponse,
13 UserExpireStrategy,
14)
15from app.utils import report
16
17if TYPE_CHECKING:
18 pass
19
20
21logger = logging.getLogger(__name__)
22
23
24async def review_users():
25 now = datetime.utcnow()
26 with GetDB() as db:
27 for user in get_users(db, activated=True, is_active=False):
28 """looking for expired/to be limited users who are still active"""
29
30 marznode.operations.update_user(user, remove=True)
31 user.activated = False
32 db.commit()
33 db.refresh(user)
34 asyncio.ensure_future(
35 report.status_change(
36 user.username,
37 user.status,
38 UserResponse.model_validate(user),
39 )
40 )
41
42 logger.info(
43 "User `%s` activation state changed to `%s`",
44 user.username,
45 str(user.activated),
46 )
47
48 for user in get_users(
49 db,
50 expire_strategy=UserExpireStrategy.START_ON_FIRST_USE,
51 is_active=True,
52 ):
53 """looking for to be activated, on hold users"""
54 base_time = user.edit_at or user.created_at
55
56 # Check if the user is online After or at 'base_time' or...
57 # If the user didn't connect until activation_deadline; change status to "Active"
58 if not (
59 (user.online_at and base_time <= user.online_at)
60 or (
61 user.activation_deadline
62 and (user.activation_deadline <= now)
63 )
64 ):
65 continue
66
67 user.expire_date = datetime.utcnow() + timedelta(
68 seconds=user.usage_duration
69 )
70 user.expire_strategy = UserExpireStrategy.FIXED_DATE
71 db.commit()
72 db.refresh(user)
73 asyncio.ensure_future(
74 report.status_change(
75 user.username,
76 user.status,
77 UserResponse.model_validate(user),
78 )
79 )
80 logger.info("on hold user `%s` has been activated", user.username)