Source code for oioioi.filetracker.client
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from django.dispatch import receiver
from django.test.signals import setting_changed
from django.utils.module_loading import import_string
from filetracker.client import Client as FiletrackerClient
from oioioi.base.utils import memoized, reset_memoized
@memoized
[docs]def get_client():
"""Constructs a Filetracker client.
Needs a ``FILETRACKER_CLIENT_FACTORY`` entry in ``settings.py``, which
should contain a :term:`dotted name` of a function which returns a
:class:`filetracker.client.Client` instance. A good candidate is
:func:`~oioioi.filetracker.client.remote_storage_factory`.
The constructed client is cached.
"""
factory = settings.FILETRACKER_CLIENT_FACTORY
if isinstance(factory, str):
factory = import_string(factory)
if not callable(factory):
raise ImproperlyConfigured(
'The FILETRACKER_CLIENT_FACTORY setting '
'refers to non-callable: %r' % (factory,)
)
client = factory()
if not isinstance(client, FiletrackerClient):
raise ImproperlyConfigured(
'The factory pointed by '
'FILETRACKER_CLIENT_FACTORY returned non-FiletrackerClient: '
'%r' % (client,)
)
# Needed for oioioi.sioworkers.backends.LocalBackend so that both Django
# and sioworkers use the same Filetracker client
import sio.workers.ft
sio.workers.ft.set_instance(client)
return client
@receiver(setting_changed)
[docs]def _on_setting_changed(sender, setting, **kwargs):
if setting == 'FILETRACKER_CLIENT_FACTORY':
reset_memoized(get_client)
[docs]def remote_storage_factory():
"""A filetracker factory which creates a client that uses the
remote server at ``settings.FILETRACKER_URL`` and a folder
``settings.FILETRACKER_CACHE_ROOT`` as a cache directory.
"""
return FiletrackerClient(
remote_url=settings.FILETRACKER_URL, cache_dir=settings.FILETRACKER_CACHE_ROOT
)