Source code for oioioi.problems.unpackmgr
import logging
from celery.task import task
from django.utils.module_loading import import_string
from oioioi.problems.models import Problem, ProblemPackage
@task
[docs]def unpackmgr_job(env):
"""Creates (or modifies) a :class:`~oioioi.problems.models.Problem`
instance using a package file represented by a
:class:`~oioioi.problems.models.ProblemPackage`.
Used ``env`` keys:
``package_id``: id of the
:class:`~oioioi.problems.models.ProblemPackage` instance to process
``backend_name``:
problem package backend (dotted name) to be used for unpacking
``post_upload_handlers``: a list of handler functions to be called
after the new problem is created
Before the handlers are called, the following ``env`` keys are produced:
``job_id``: the ``Celery`` task id
``problem_id``: id of the
:class:`~oioioi.problems.models.ProblemPackage` instance,
which was created or modified
"""
try:
package = ProblemPackage.objects.get(id=env['package_id'])
with package.save_operation_status():
env['job_id'] = unpackmgr_job.request.id
backend = import_string(env['backend_name'])()
env = backend.unpack(env)
ProblemPackage.objects.get(id=env['package_id'])
problem = Problem.objects.get(id=env['problem_id'])
package.celery_task_id = unpackmgr_job.request.id
package.problem = problem
package.save()
for h in env['post_upload_handlers']:
handler = import_string(h)
env = handler(env)
except ProblemPackage.DoesNotExist:
logger.warning(
"Problem package %s got deleted before it was processed.",
env['package_id'],
)