forked from 42CTF/website
added disabled attribute for challenge + fixed recomputescoreboard
This commit is contained in:
parent
985f440ede
commit
0fbf7b77c3
|
@ -125,16 +125,17 @@ def profile(request, user_name):
|
||||||
else:
|
else:
|
||||||
member = False
|
member = False
|
||||||
all_cats = Category.objects.all()
|
all_cats = Category.objects.all()
|
||||||
cats = [cat for cat in all_cats if CTF.objects.filter(category__name=cat.name, event=None)]
|
cats = [cat for cat in all_cats if CTF.objects.filter(category__name=cat.name, event=None, disabled=False)]
|
||||||
pointDatas = {}
|
pointDatas = {}
|
||||||
|
|
||||||
for cat in cats:
|
for cat in cats:
|
||||||
# prepare categories
|
# prepare categories
|
||||||
solved_count = CTF_flags.objects.filter(user=user_obj, ctf__event=None , ctf__category__name=cat.name).count()
|
solved = CTF_flags.objects.filter(user=user_obj, ctf__category__name=cat.name, ctf__event=None, ctf__disabled=False).order_by('flag_date')
|
||||||
max_count = CTF.objects.filter(category__name=cat.name, event=None).count()
|
max_count = CTF.objects.filter(category__name=cat.name, event=None, disabled=False).count()
|
||||||
# get datas
|
# get datas
|
||||||
somme = 0
|
somme = 0
|
||||||
solved = CTF_flags.objects.filter(user=user_obj, ctf__category__name=cat.name, ctf__event=None).order_by('flag_date')
|
solved_count = len(solved)
|
||||||
|
|
||||||
pointDatas[cat.name] = []
|
pointDatas[cat.name] = []
|
||||||
pointDatas[cat.name].append([user_obj.date_joined.timestamp() * 1000, 0])
|
pointDatas[cat.name].append([user_obj.date_joined.timestamp() * 1000, 0])
|
||||||
percent = (solved_count / max_count) * 100
|
percent = (solved_count / max_count) * 100
|
||||||
|
@ -143,7 +144,7 @@ def profile(request, user_name):
|
||||||
somme += flag.ctf.points
|
somme += flag.ctf.points
|
||||||
pointDatas[cat.name].append([flag.flag_date.timestamp() * 1000, somme])
|
pointDatas[cat.name].append([flag.flag_date.timestamp() * 1000, somme])
|
||||||
|
|
||||||
solves = CTF_flags.objects.filter(user=user_obj, ctf__event=None).order_by('-flag_date')
|
solves = CTF_flags.objects.filter(user=user_obj, ctf__event=None, ctf__disabled=False).order_by('-flag_date')
|
||||||
solved = []
|
solved = []
|
||||||
somme = 0
|
somme = 0
|
||||||
solved.append([user_obj.date_joined.timestamp() * 1000, 0])
|
solved.append([user_obj.date_joined.timestamp() * 1000, 0])
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
# Generated by Django 3.1.5 on 2022-02-03 17:19
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('ctfs', '0006_alter_ctf_event'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='ctf',
|
||||||
|
name='disabled',
|
||||||
|
field=models.BooleanField(default=False),
|
||||||
|
),
|
||||||
|
]
|
|
@ -12,6 +12,7 @@ class Category(models.Model):
|
||||||
class CTF(models.Model):
|
class CTF(models.Model):
|
||||||
name = models.CharField(max_length=200)
|
name = models.CharField(max_length=200)
|
||||||
flag = models.CharField(max_length=100)
|
flag = models.CharField(max_length=100)
|
||||||
|
disabled = models.BooleanField(default=False)
|
||||||
description = models.TextField(blank=True)
|
description = models.TextField(blank=True)
|
||||||
description_en = models.TextField(blank=True)
|
description_en = models.TextField(blank=True)
|
||||||
description_ru = models.TextField(blank=True)
|
description_ru = models.TextField(blank=True)
|
||||||
|
|
|
@ -21,14 +21,14 @@ def get_description_by_lang(ctf):
|
||||||
|
|
||||||
def category(request, cat_slug):
|
def category(request, cat_slug):
|
||||||
cat = get_object_or_404(Category, slug=cat_slug)
|
cat = get_object_or_404(Category, slug=cat_slug)
|
||||||
ctfs = CTF.objects.filter(category=cat, event=None).order_by('points')
|
ctfs = CTF.objects.filter(category=cat, event=None, disabled=False).order_by('points')
|
||||||
for ex in ctfs:
|
for ex in ctfs:
|
||||||
ex.solved_num = CTF_flags.objects.filter(ctf=ex).count()
|
ex.solved_num = CTF_flags.objects.filter(ctf=ex).count()
|
||||||
ex.solved = ex.solved_by(request.user)
|
ex.solved = ex.solved_by(request.user)
|
||||||
return render(request, 'ctfs/ctfs_list.html', {'ctfs' : ctfs, 'cat' : cat})
|
return render(request, 'ctfs/ctfs_list.html', {'ctfs' : ctfs, 'cat' : cat})
|
||||||
|
|
||||||
def ctf(request, cat_slug, ctf_slug):
|
def ctf(request, cat_slug, ctf_slug):
|
||||||
ctf_info = get_object_or_404(CTF, slug=ctf_slug)
|
ctf_info = get_object_or_404(CTF, slug=ctf_slug, event=None)
|
||||||
flagged = False
|
flagged = False
|
||||||
solved_list = CTF_flags.objects.filter(ctf=ctf_info).order_by('flag_date')
|
solved_list = CTF_flags.objects.filter(ctf=ctf_info).order_by('flag_date')
|
||||||
description = get_description_by_lang(ctf_info)
|
description = get_description_by_lang(ctf_info)
|
||||||
|
@ -39,7 +39,7 @@ def ctf(request, cat_slug, ctf_slug):
|
||||||
if request.user.is_authenticated:
|
if request.user.is_authenticated:
|
||||||
form = submit_flag(data=request.POST)
|
form = submit_flag(data=request.POST)
|
||||||
if flagged == False and form.is_valid():
|
if flagged == False and form.is_valid():
|
||||||
if CTF.objects.filter(flag=request.POST.get('flag'), slug=ctf_slug):
|
if CTF.objects.filter(flag=request.POST.get('flag'), slug=ctf_slug, event=None):
|
||||||
new = CTF_flags(user = request.user, ctf = ctf_info, flag_date = timezone.now())
|
new = CTF_flags(user = request.user, ctf = ctf_info, flag_date = timezone.now())
|
||||||
new.save()
|
new.save()
|
||||||
profil = UserProfileInfo.objects.get(user=request.user)
|
profil = UserProfileInfo.objects.get(user=request.user)
|
||||||
|
|
|
@ -27,7 +27,7 @@ def get_content_by_lang(news):
|
||||||
|
|
||||||
def get_weekly_top():
|
def get_weekly_top():
|
||||||
week_ago = datetime.datetime.now() - datetime.timedelta(days=7)
|
week_ago = datetime.datetime.now() - datetime.timedelta(days=7)
|
||||||
weekly_flags = CTF_flags.objects.filter(flag_date__gt=week_ago)
|
weekly_flags = CTF_flags.objects.filter(flag_date__gt=week_ago, ctf__disabled=False, ctf__event=None)
|
||||||
scores = defaultdict(int)
|
scores = defaultdict(int)
|
||||||
|
|
||||||
for sol in weekly_flags:
|
for sol in weekly_flags:
|
||||||
|
@ -48,7 +48,7 @@ def home(request):
|
||||||
response = HttpResponseRedirect(url_translated)
|
response = HttpResponseRedirect(url_translated)
|
||||||
return response
|
return response
|
||||||
news = new.objects.order_by('-pub_date')[:5]
|
news = new.objects.order_by('-pub_date')[:5]
|
||||||
latest_ctfs = CTF.objects.filter(event=None).order_by('-pub_date')[:5]
|
latest_ctfs = CTF.objects.filter(event=None, disabled=False).order_by('-pub_date')[:5]
|
||||||
top10 = UserProfileInfo.objects.select_related().order_by('-score', 'last_submission_date', 'user__username')[:10]
|
top10 = UserProfileInfo.objects.select_related().order_by('-score', 'last_submission_date', 'user__username')[:10]
|
||||||
nb_flags = CTF_flags.objects.count()
|
nb_flags = CTF_flags.objects.count()
|
||||||
nb_users = UserProfileInfo.objects.count()
|
nb_users = UserProfileInfo.objects.count()
|
||||||
|
|
|
@ -1,31 +1,26 @@
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from django.core.management.base import BaseCommand, CommandError
|
from django.core.management.base import BaseCommand, CommandError
|
||||||
from accounts import models as acc_models
|
from accounts.models import UserProfileInfo
|
||||||
from ctfs import models as ex_models
|
from ctfs import models as ex_models
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
help = 'Recomputes the score and ranking caches from the solutions'
|
help = 'Recomputes the score cache from the solutions'
|
||||||
|
|
||||||
def handle(self, *args, **options):
|
def handle(self, *args, **options):
|
||||||
all_sols = ex_models.CTF_flags.objects.select_related().filter(ctf__event=None)
|
all_sols = ex_models.CTF_flags.objects.select_related().filter(ctf__event=None, ctf__disabled=False)
|
||||||
|
all_users = UserProfileInfo.objects.all()
|
||||||
|
|
||||||
scores = defaultdict(int)
|
scores = defaultdict(int)
|
||||||
for sol in all_sols:
|
for sol in all_sols:
|
||||||
scores[sol.user] += sol.ctf.points
|
scores[sol.user] += sol.ctf.points
|
||||||
|
|
||||||
|
for u in all_users:
|
||||||
|
if u.user not in scores.keys():
|
||||||
|
u.score = 0
|
||||||
|
u.save()
|
||||||
|
|
||||||
li = [(s, u) for (u, s) in scores.items()]
|
li = [(s, u) for (u, s) in scores.items()]
|
||||||
|
|
||||||
li2 = []
|
for (u, s) in li:
|
||||||
old_rank = None
|
|
||||||
old_score = None
|
|
||||||
rank = 0
|
|
||||||
for (s, u) in li:
|
|
||||||
rank += 1
|
|
||||||
if s == old_score:
|
|
||||||
li2.append((u, s, old_rank))
|
|
||||||
else:
|
|
||||||
old_score = s
|
|
||||||
old_rank = rank
|
|
||||||
li2.append((u, s, rank))
|
|
||||||
|
|
||||||
for (u, s, r) in li2:
|
|
||||||
u.userprofileinfo.score = s
|
u.userprofileinfo.score = s
|
||||||
u.userprofileinfo.save()
|
u.userprofileinfo.save()
|
||||||
|
|
Loading…
Reference in New Issue