NDOJ/judge/signals.py
2020-01-21 15:35:58 +09:00

132 lines
4.8 KiB
Python

import errno
import os
from django.conf import settings
from django.contrib.sites.models import Site
from django.core.cache import cache
from django.core.cache.utils import make_template_fragment_key
from django.db.models.signals import post_delete, post_save
from django.dispatch import receiver
from .caching import finished_submission
from .models import BlogPost, Comment, Contest, ContestSubmission, EFFECTIVE_MATH_ENGINES, Judge, Language, License, \
MiscConfig, Organization, Problem, Profile, Submission
def get_pdf_path(basename):
return os.path.join(settings.DMOJ_PDF_PROBLEM_CACHE, basename)
def unlink_if_exists(file):
try:
os.unlink(file)
except OSError as e:
if e.errno != errno.ENOENT:
raise
@receiver(post_save, sender=Problem)
def problem_update(sender, instance, **kwargs):
if hasattr(instance, '_updating_stats_only'):
return
cache.delete_many([
make_template_fragment_key('submission_problem', (instance.id,)),
make_template_fragment_key('problem_feed', (instance.id,)),
'problem_tls:%s' % instance.id, 'problem_mls:%s' % instance.id,
])
cache.delete_many([make_template_fragment_key('problem_html', (instance.id, engine, lang))
for lang, _ in settings.LANGUAGES for engine in EFFECTIVE_MATH_ENGINES])
cache.delete_many([make_template_fragment_key('problem_authors', (instance.id, lang))
for lang, _ in settings.LANGUAGES])
cache.delete_many(['generated-meta-problem:%s:%d' % (lang, instance.id) for lang, _ in settings.LANGUAGES])
for lang, _ in settings.LANGUAGES:
unlink_if_exists(get_pdf_path('%s.%s.pdf' % (instance.code, lang)))
@receiver(post_save, sender=Profile)
def profile_update(sender, instance, **kwargs):
if hasattr(instance, '_updating_stats_only'):
return
cache.delete_many([make_template_fragment_key('user_about', (instance.id, engine))
for engine in EFFECTIVE_MATH_ENGINES] +
[make_template_fragment_key('org_member_count', (org_id,))
for org_id in instance.organizations.values_list('id', flat=True)])
@receiver(post_save, sender=Contest)
def contest_update(sender, instance, **kwargs):
if hasattr(instance, '_updating_stats_only'):
return
cache.delete_many(['generated-meta-contest:%d' % instance.id] +
[make_template_fragment_key('contest_html', (instance.id, engine))
for engine in EFFECTIVE_MATH_ENGINES])
@receiver(post_save, sender=License)
def license_update(sender, instance, **kwargs):
cache.delete(make_template_fragment_key('license_html', (instance.id,)))
@receiver(post_save, sender=Language)
def language_update(sender, instance, **kwargs):
cache.delete_many([make_template_fragment_key('language_html', (instance.id,)),
'lang:cn_map'])
@receiver(post_save, sender=Judge)
def judge_update(sender, instance, **kwargs):
cache.delete(make_template_fragment_key('judge_html', (instance.id,)))
@receiver(post_save, sender=Comment)
def comment_update(sender, instance, **kwargs):
cache.delete('comment_feed:%d' % instance.id)
@receiver(post_save, sender=BlogPost)
def post_update(sender, instance, **kwargs):
cache.delete_many([
make_template_fragment_key('post_summary', (instance.id,)),
'blog_slug:%d' % instance.id,
'blog_feed:%d' % instance.id,
])
cache.delete_many([make_template_fragment_key('post_content', (instance.id, engine))
for engine in EFFECTIVE_MATH_ENGINES])
@receiver(post_delete, sender=Submission)
def submission_delete(sender, instance, **kwargs):
finished_submission(instance)
instance.user.calculate_points()
@receiver(post_delete, sender=ContestSubmission)
def contest_submission_delete(sender, instance, **kwargs):
participation = instance.participation
participation.recompute_results()
@receiver(post_save, sender=Organization)
def organization_update(sender, instance, **kwargs):
cache.delete_many([make_template_fragment_key('organization_html', (instance.id, engine))
for engine in EFFECTIVE_MATH_ENGINES])
_misc_config_i18n = [code for code, _ in settings.LANGUAGES]
_misc_config_i18n.append('')
@receiver(post_save, sender=MiscConfig)
def misc_config_update(sender, instance, **kwargs):
cache.delete_many(['misc_config:%s:%s:%s' % (domain, lang, instance.key.split('.')[0])
for lang in _misc_config_i18n
for domain in Site.objects.values_list('domain', flat=True)])
@receiver(post_save, sender=ContestSubmission)
def contest_submission_update(sender, instance, **kwargs):
Submission.objects.filter(id=instance.submission_id).update(contest_object_id=instance.participation.contest_id)