Source code for oioioi.portals.handlers

from django.db.models.signals import post_migrate, post_save
from django.dispatch import receiver

from oioioi.portals.models import Node
from oioioi.portals.widgets import REGISTERED_WIDGETS
from oioioi.problems.models import Problem


[docs]def parse_node_for_problems(node): """Parses node's content in search for links to problems and returns a queryset of problems accessible from the node. """ widgets_with_links = filter( lambda w: hasattr(w, 'get_problem_ids'), REGISTERED_WIDGETS ) ids = [] for widget in widgets_with_links: regex = widget.compiled_tag_regex for node_version in node.language_versions.all(): for m in regex.finditer(node_version.panel_code): ids += widget.get_problem_ids(m) return Problem.objects.filter(id__in=ids).distinct()
[docs]def update_task_information_cache(node): node.problems_in_content.set(parse_node_for_problems(node))
@receiver(post_migrate)
[docs]def rebuild_handler(sender, **kwargs): # post_migrate is called after each app's migrations if sender.name == 'oioioi.portals': Node.objects.rebuild()