File size: 2,321 Bytes
1bc3f18
 
 
4bafff4
1bc3f18
 
1153571
 
4bafff4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27b7895
4bafff4
1153571
 
 
27b7895
4f96034
1153571
27b7895
4f96034
1153571
1bc3f18
 
1153571
 
 
1bc3f18
 
 
 
 
 
 
1153571
 
 
1bc3f18
 
1153571
 
 
 
1bc3f18
1153571
 
 
 
 
 
 
4f96034
1153571
 
4f96034
1153571
1bc3f18
 
1153571
1bc3f18
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# celery_app.py
from celery import Celery
import redis
from urllib.parse import urlparse
from config import get_settings

settings = get_settings()

def parse_redis_host(raw: str, default_port: int) -> tuple[str, int]:
    """
    Accept any of these formats for REDIS_HOST:
      - "my-host.upstash.io"
      - "my-host.upstash.io:6379"
      - "https://my-host.upstash.io"
      - "rediss://my-host.upstash.io:6379"
    Always returns (hostname, port).
    """
    raw = raw.strip()
    # If there's a scheme, use urlparse
    if "://" in raw:
        parsed = urlparse(raw)
        host = parsed.hostname or raw
        port = parsed.port or default_port
    elif ":" in raw:
        host, port_str = raw.rsplit(":", 1)
        port = int(port_str)
    else:
        host = raw
        port = default_port
    return host, port

REDIS_HOST, REDIS_PORT = parse_redis_host(settings.REDIS_HOST, settings.REDIS_PORT)
REDIS_PASSWORD = settings.REDIS_PASSWORD

if REDIS_PASSWORD:
    BROKER_URL  = f"rediss://:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/0?ssl_cert_reqs=CERT_NONE"
    BACKEND_URL = f"rediss://:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/0?ssl_cert_reqs=CERT_NONE"
else:
    BROKER_URL  = f"redis://{REDIS_HOST}:{REDIS_PORT}/0"
    BACKEND_URL = f"redis://{REDIS_HOST}:{REDIS_PORT}/0"

celery_app = Celery(
    "assistant_worker",
    broker=BROKER_URL,
    backend=BACKEND_URL,
    include=["generation.ExamAnswer"]
)

celery_app.conf.update(
    task_serializer="json",
    accept_content=["json"],
    result_serializer="json",
    task_track_started=True,
    task_time_limit=60 * 60,
    broker_use_ssl={"ssl_cert_reqs": "CERT_NONE"} if REDIS_PASSWORD else None,
    redis_backend_use_ssl={"ssl_cert_reqs": "CERT_NONE"} if REDIS_PASSWORD else None,
)

import worker.tasks
from generation.ExamAnswer import grade_exam_task


def clear_redis_backend():
    if REDIS_PASSWORD:
        r = redis.Redis(
            host=REDIS_HOST,
            port=REDIS_PORT,
            password=REDIS_PASSWORD,
            ssl=True,
            ssl_cert_reqs=None,
            db=0,
        )
    else:
        r = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, db=0)
    r.flushdb()
    print("Redis result backend cleared!")


@celery_app.on_after_configure.connect
def setup(sender, **kwargs):
    clear_redis_backend()