87 lines
2.1 KiB
Python
87 lines
2.1 KiB
Python
import datetime
|
|
import io
|
|
from random import choice
|
|
from time import sleep
|
|
|
|
from django.core.management import BaseCommand
|
|
from minio import Minio
|
|
|
|
from Sprint import settings
|
|
from SprintLib.queue import send_to_queue
|
|
from SprintLib.redis import lock
|
|
|
|
BUCKET_NAME = 'dev'
|
|
|
|
|
|
client = Minio(
|
|
settings.MINIO_HOST,
|
|
access_key=settings.MINIO_ACCESS_KEY,
|
|
secret_key=settings.MINIO_SECRET_KEY,
|
|
secure=False
|
|
)
|
|
|
|
|
|
@lock('write_bytes')
|
|
def write_bytes(data: bytes):
|
|
obj = client.get_object(BUCKET_NAME, 'meta.txt')
|
|
num = int(obj.data.decode('utf-8')) + 1
|
|
b_num = str(num).encode('utf-8')
|
|
client.put_object(BUCKET_NAME, str(num), io.BytesIO(data), len(data))
|
|
client.put_object(BUCKET_NAME, 'meta.txt', io.BytesIO(b_num), len(b_num))
|
|
return num
|
|
|
|
|
|
def get_bytes(num: int) -> bytes:
|
|
try:
|
|
return client.get_object(BUCKET_NAME, str(num)).data
|
|
except Exception as e:
|
|
print(e.with_traceback())
|
|
return b''
|
|
|
|
|
|
def delete_file(num: int):
|
|
try:
|
|
client.remove_object(BUCKET_NAME, str(num))
|
|
except:
|
|
...
|
|
|
|
|
|
def generate_token():
|
|
letters = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
|
|
return ''.join([choice(letters) for _ in range(30)])
|
|
|
|
|
|
class Timer:
|
|
start_time = None
|
|
end_time = None
|
|
|
|
def __init__(self, solution, test):
|
|
self.solution = solution
|
|
self.test = test
|
|
|
|
def __enter__(self):
|
|
assert self.start_time is None
|
|
self.start_time = datetime.datetime.now()
|
|
|
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
self.end_time = datetime.datetime.now()
|
|
self.solution.extras[self.test]['time_spent'] = (self.end_time - self.start_time).total_seconds() * 1000
|
|
|
|
|
|
class LoopWorker(BaseCommand):
|
|
sleep_period = 5
|
|
|
|
def go(self):
|
|
raise NotImplementedError("Method go should be implemented")
|
|
|
|
def handle(self, *args, **options):
|
|
while True:
|
|
self.go()
|
|
sleep(self.sleep_period)
|
|
|
|
|
|
def send_testing(solution):
|
|
if solution.set is not None and len(solution.set.checkers.all()) != 0:
|
|
return
|
|
send_to_queue("test", {"id": solution.id})
|