Merge pull request 'Podium added and working, logo and website of campuses added in campus model' (#76) from ix/website:main into main

Reviewed-on: 42CTF/website#76
Reviewed-by: Danhia <danhia@protonmail.com>
This commit is contained in:
Danhia 2022-08-27 10:47:46 +02:00
commit 9ac003ea3c
9 changed files with 154 additions and 55 deletions

View File

@ -0,0 +1,25 @@
# Generated by Django 3.2.11 on 2022-08-18 15:41
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('accounts', '0012_auto_20220801_2212'),
]
operations = [
migrations.AddField(
model_name='campus',
name='logo',
field=models.URLField(default='https://42.fr'),
preserve_default=False,
),
migrations.AddField(
model_name='campus',
name='url',
field=models.URLField(default='https://42.fr', max_length=100),
preserve_default=False,
),
]

View File

@ -0,0 +1,23 @@
# Generated by Django 3.2.11 on 2022-08-18 15:44
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('accounts', '0013_auto_20220818_1741'),
]
operations = [
migrations.AlterField(
model_name='campus',
name='logo',
field=models.URLField(blank=True),
),
migrations.AlterField(
model_name='campus',
name='url',
field=models.URLField(blank=True, max_length=100),
),
]

View File

@ -28,6 +28,8 @@ class UserProfileInfo(models.Model):
class Campus(models.Model): class Campus(models.Model):
id = models.IntegerField(primary_key=True, unique=True) id = models.IntegerField(primary_key=True, unique=True)
name = models.CharField(max_length=50) name = models.CharField(max_length=50)
url = models.URLField(max_length=100,blank=True)
logo = models.URLField(max_length=200,blank=True)
def __str__(self): def __str__(self):
return self.name return self.name
class Meta: class Meta:

View File

@ -4,9 +4,7 @@ register = template.Library()
@register.simple_tag @register.simple_tag
def get_chall_by_lang(chall, lang): def get_chall_by_lang(chall, lang):
print(chall.slug)
filepath = "ctfs/templates/challenges/"+ lang + "/" + chall.slug + ".html" filepath = "ctfs/templates/challenges/"+ lang + "/" + chall.slug + ".html"
print(filepath)
try: try:
with open(filepath) as fp: with open(filepath) as fp:
return fp.read() return fp.read()

View File

@ -2,9 +2,41 @@
{% load i18n %} {% load i18n %}
{% block content %} {% block content %}
<div class="row"> <div class="row">
<div class="col-12 ctf-head">
<h1>{% trans "42Network Scoreboard" %}</h1>
</div>
<div class="col-12">
<div class="row justify-content-md-center justify-content-sm-center">
<div class="col-4 col-sm-3 col-md-2 podium podium-two text-center">
<img src="{{ top3.1.0.logo }}" alt="{{ top3.1.0 }}" width="100%"/>
<h3>#2 :</h3>
<p>
Score : {{ top3.1.1 }}
<br>
{{ top3.1.0 }}
</p>
</div>
<div class="col-4 col-sm-3 col-md-2 podium podium-one text-center">
<img src="{{ top3.0.0.logo }}" alt="{{ top3.0.0 }}" width="100%"/>
<h3>#1 : </h3>
<p>
Score : {{ top3.0.1 }}
<br>
{{ top3.0.0 }}
</p>
</div>
<div class="col-4 col-sm-3 col-md-2 podium podium-three text-center">
<img src="{{ top3.2.0.logo }}" alt="{{ top3.2.0 }}" width="100%"/>
<h3>#3 : </h3>
<p>
Score : {{ top3.2.1 }}
<br>
{{ top3.2.0 }}
</p>
</div>
</div>
</div>
<div class="col-12"> <div class="col-12">
<div>
<h4>Scoreboard</h4>
<table class="table table-dark"> <table class="table table-dark">
<thead> <thead>
<tr> <tr>
@ -15,15 +47,16 @@
</thead> </thead>
<tbody> <tbody>
{% for name, score in scores.items %} {% for name, score in scores.items %}
{% if forloop.counter0 > 2 %}
<tr> <tr>
<th scope="row"># {{ forloop.counter0|add:1 }}</th> <th scope="row"># {{ forloop.counter0|add:1 }}</th>
<th><a href="{% url 'scoreboard:campus' campus=name %}"> {{ name }}</a></th> <th><a href="{% url 'scoreboard:campus' campus=name %}"> {{ name }}</a></th>
<td>{{ score}}</td> <td>{{ score}}</td>
</tr> </tr>
{% endif %}
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
</div> </div>
</div> </div>
</div>
{% endblock %} {% endblock %}

View File

@ -4,10 +4,8 @@
{% load is_member %} {% load is_member %}
<div class="row"> <div class="row">
<div class="col-12 ctf-head"> <div class="col-12 ctf-head">
<h1>{% trans "Scoreboard" %}</h1> <h1>{% trans "Global Scoreboard" %}</h1>
</div> </div>
<div class="col-12">
<div>
<table class="table table-dark"> <table class="table table-dark">
<thead> <thead>
<tr> <tr>
@ -41,6 +39,8 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
<div class="col-12">
<div>
<div class="pagination"> <div class="pagination">
<span class="step-links"> <span class="step-links">

View File

@ -1,6 +1,7 @@
from django.shortcuts import render from django.shortcuts import render
from django.core.paginator import Paginator from django.core.paginator import Paginator
from accounts.models import UserProfileInfo, Campus from accounts.models import UserProfileInfo, Campus
import itertools
def scoreboard(request): def scoreboard(request):
scores = UserProfileInfo.objects.filter(score__gt=0).select_related().order_by('-score', 'last_submission_date', 'user__username') scores = UserProfileInfo.objects.filter(score__gt=0).select_related().order_by('-score', 'last_submission_date', 'user__username')
@ -19,12 +20,12 @@ def campus(request, campus):
def network(request): def network(request):
campuses = Campus.objects.all() campuses = Campus.objects.all()
scores = {} scores = {}
for campus in campuses: for campus in campuses:
users = UserProfileInfo.objects.filter(score__gt=0, campus__name__exact=campus).select_related().order_by('-score', 'last_submission_date', 'user__username')[:10] users = UserProfileInfo.objects.filter(score__gt=0, campus__name__exact=campus).select_related().order_by('-score', 'last_submission_date', 'user__username')[:10]
scores[campus] = sum([u.score for u in users]) scores[campus] = sum([u.score for u in users])
sorted_scores = {k: v for k, v in sorted(scores.items(), key=lambda item: item[1], reverse=True)} sorted_scores = {k: v for k, v in sorted(scores.items(), key=lambda item: item[1], reverse=True)}
return render(request, 'scoreboard/network.html', {'scores':sorted_scores}) top3 = list(itertools.islice(sorted_scores.items(), 3))
return render(request, 'scoreboard/network.html', {'scores':sorted_scores, 'top3': top3})
# Create your views here. # Create your views here.

View File

@ -313,3 +313,20 @@ footer {
color: #a9a9a9; color: #a9a9a9;
text-decoration: none; text-decoration: none;
} }
.podium{
margin-top:80px;
margin-bottom:30px;
vertical-align: bottom;
}
.podium h3 {margin-top:-5%;}
.podium img{position:relative;top: -55px}
.podium-one{
background-color: #313131;
height: 25vh;}
.podium-two{
background-color: #252525;
height: 20vh;margin-top:auto;}
.podium-three{
background-color: #1a1a1a;
height: 15vh;margin-top:auto;}

View File

@ -65,7 +65,7 @@
{% trans "Scoreboard" %} {% trans "Scoreboard" %}
</a> </a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown"> <div class="dropdown-menu" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="{% url 'scoreboard:main' %}">{% trans "Main" %}</a> <a class="dropdown-item" href="{% url 'scoreboard:main' %}">{% trans "Global" %}</a>
<a class="dropdown-item" href="{% url 'scoreboard:network' %}">{% trans "42 Network" %}</a> <a class="dropdown-item" href="{% url 'scoreboard:network' %}">{% trans "42 Network" %}</a>
</div> </div>
</li> </li>