Compare commits
139 Commits
28d8874272
...
377607239e
Author | SHA1 | Date |
---|---|---|
Starthur | 377607239e | |
Starthur | 3829ad11ef | |
Danhia | c7ddf8a435 | |
Danhia | 8cada5b6d2 | |
Danhia | e69a18922c | |
Danhia | b3583196e8 | |
ysaito | 49a66e9565 | |
ysaito | 7b2ab40378 | |
ysaito | 715db01981 | |
ysaito | 837c625d8e | |
ysaito | 4eceb91f60 | |
Danhia | 2f308f75b7 | |
Danhia | b3a37445a2 | |
Danhia | f417ff59f4 | |
Clément Hamada | 76533f42b7 | |
Clément Hamada | 8ed0fb1d64 | |
Danhia | 6d68192f2a | |
Danhia | 1fb9f410ac | |
Danhia | bdcfa253b9 | |
Danhia | cf4860b8ff | |
Danhia | b36c38fd60 | |
Miliviu | 91ec913b8e | |
Danhia | d86d5f4e92 | |
Danhia | 01edb75cc6 | |
Miliviu | 40fcf1e07a | |
Danhia | d77d9386f0 | |
Danhia | 947650f07d | |
Danhia | 2dec4de04f | |
Miliviu | 5e75e9f411 | |
Miliviu | 973af232b5 | |
Miliviu | 41377a56c5 | |
Danhia | c8a171fa76 | |
Danhia | dae0a87548 | |
Danhia | aedbdf57ca | |
Danhia | 9b938c7f67 | |
Danhia | f9ae6edc13 | |
Danhia | ef1242af46 | |
ix | 09cfc722c7 | |
Danhia | 5010213a13 | |
ix | ae9a28fc80 | |
Danhia | a5c97c4e38 | |
Danhia | 559c39c4f9 | |
Clément Hamada | 54226b8904 | |
Clément Hamada | ca41f8f924 | |
Clément Hamada | cb0c2ee639 | |
Clément Hamada | d8e5236bac | |
Clément Hamada | de249cab9c | |
Danhia | 358de109db | |
ix | 74cb657501 | |
Danhia | d5e2554602 | |
ix | c6bbc2a9a1 | |
ix | 65214b46d4 | |
ix | 0ebf804976 | |
ix | 0d9057eac4 | |
Danhia | 2f6362360b | |
Danhia | a639904ee2 | |
Danhia | 63d22cdf6d | |
Danhia | 911c9f6732 | |
Danhia | 6337a0dcdb | |
Danhia | c25f58341d | |
Danhia | 2ab42b20c7 | |
Danhia | c38cc8dc94 | |
Danhia | 396d8ee99b | |
Danhia | da6e51bdcd | |
Danhia | 0beafc39fa | |
Danhia | b352a2341a | |
Danhia | 0c08fdda96 | |
Danhia | 314a7e17b4 | |
Danhia | 3c4478dddb | |
Danhia | 6455a8ddc6 | |
Danhia | 4802218005 | |
Danhia | 5242150b92 | |
Danhia | c06c94e807 | |
Danhia | 5219778d5b | |
Danhia | a1bda8a7cc | |
Danhia | aea1ecda15 | |
Danhia | 79c74e1946 | |
Danhia | 94a24376d4 | |
Danhia | bd4dadeaf1 | |
Danhia | 827068f113 | |
Danhia | 818be801b2 | |
Danhia | 6a16e0fdbd | |
Danhia | 40a7d4ebdd | |
Danhia | a6095cc5c4 | |
Danhia | 66a9bd6b09 | |
Danhia | ceede3cfa0 | |
Danhia | ef1673dbd4 | |
Danhia | e4f68edeff | |
Danhia | 2ab410efdf | |
Danhia | dfa5c3830d | |
Danhia | 6ec1a20e74 | |
Danhia | 7ae36e2cee | |
Danhia | 411896bf01 | |
Danhia | 9405fcabde | |
Danhia | 727e11a29e | |
Danhia | be0fc5dd67 | |
Danhia | d20b3f75d9 | |
Danhia | 3d456ea26b | |
ix | e5c4a2856e | |
Danhia | 7cf7fd82d4 | |
Maxime ROTH | ca34f76465 | |
Danhia | 0123edd87a | |
Maxime ROTH | a295321f19 | |
ix | 2dcea7cd74 | |
Danhia | ecd7ca69db | |
ix | e6e50fcd05 | |
ix | 4dcc953baf | |
ix | a7620eec77 | |
ix | baa598f1aa | |
ix | ddccb96586 | |
ix | 9f0273a85b | |
ix | 63349df20f | |
Ix | 1274a6b7fe | |
ix | f5b54e3ed6 | |
ix | 0a42af4a9b | |
Ix | 87b1a5f6f8 | |
ix | a379f4934d | |
ix | 86cc6070e1 | |
ix | c98e89b5ca | |
Ix | 8d3cd60ae4 | |
ix | e956082385 | |
ix | 071ba34792 | |
ix | 81e283ea69 | |
ix | ed928f6f33 | |
ix | ce31ce30ee | |
ix | 500d6fe228 | |
Danhia | 0c0506505b | |
ix | 62b3b7e5cd | |
ix | acbf38a6a7 | |
ix | dbdd6b06f8 | |
Danhia | 428edadb31 | |
Danhia | 768e62f369 | |
ix | 52c2dcdec3 | |
ix | 42441e7854 | |
ix | b0cea92ea8 | |
ix | 0c285cc486 | |
ix | 5e0da0e8b3 | |
Ix | faec388ad5 | |
Ix | afb572d091 |
|
@ -1,3 +1,4 @@
|
|||
local_settings.py
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
|
@ -108,7 +109,7 @@ media/
|
|||
*.pid
|
||||
*.json
|
||||
|
||||
settings.py
|
||||
local-settings.py
|
||||
/data
|
||||
/config
|
||||
|
||||
|
|
56
README.md
56
README.md
|
@ -1,28 +1,34 @@
|
|||
# 42ctf
|
||||
CTF by 42 students
|
||||
# 42CTF
|
||||
|
||||
[42CTF](https://www.42ctf.org) is a CTF platform created by School 42 students and open to anyone.
|
||||
|
||||
|
||||
### Todo
|
||||
|
||||
- [x] Serveur SMTP & reset password
|
||||
- [x] Clean le repo
|
||||
- [x] Accès au chall après validation
|
||||
- [x] Section "Intro"
|
||||
- [x] Section Treasure Hunt
|
||||
- [x] Edition de profil
|
||||
- [ ] Ajouter de la Doc
|
||||
- [x] Infrastructure de pwn
|
||||
- [x] Organiser une session découverte
|
||||
- [x] Compteur de flags
|
||||
- [ ] Graphiques statistiques
|
||||
- [x] Création d'un discord linkable
|
||||
- [ ] Refonte du linkage discord -> 42ctf
|
||||
- [ ] Traduction du site
|
||||
- [x] Anglais
|
||||
- [ ] Français
|
||||
- [ ] Russe
|
||||
- [ ] Espagnol
|
||||
- [ ] Italien
|
||||
- [ ] OAuth 42
|
||||
- [ ] Feature proposer une solution à un challenge
|
||||
- [ ] Système de badge/succès
|
||||
- [ ] Génération d'une page résumant le profil d'un utilisateur (ex: show resume sur intra.42.fr)
|
||||
TODO has been migrated to [issues](https://gitea.42ctf.org/42CTF/website/issues) !
|
||||
And hopefully, it is not redirected anymore to `/dev/null`.
|
||||
|
||||
### How to contribute ?
|
||||
|
||||
First, you need to contact a 42CTF admin to get an account on the 42CTF gitea.
|
||||
You can contact us on [discord](https://discord.gg/3KDvt6hbWW) or by [email](mailto:42ctf@protonmail.com).
|
||||
You can also fill this [form](https://forms.42l.fr/apps/forms/bpmyGR37AR4yHGnC) and we'll contact you.
|
||||
Then, once you have a gitea account, you can fork this repository, do some stuff, and open a pull request.
|
||||
|
||||
If you want to translate the platform, then have a look at the [wiki](https://gitea.42ctf.org/42CTF/website/wiki).
|
||||
|
||||
If you want to help with bot development, it has now its own [repository](https://gitea.42ctf.org/42CTF/bot)
|
||||
|
||||
### How to set up my dev environment ?
|
||||
|
||||
There is only one file missing on this repository for you to run the server: `local_settings.py`.
|
||||
You should create one in the `src` directory, with the following content:
|
||||
```
|
||||
DEBUG = True
|
||||
SECRET_KEY = 'what you want'
|
||||
```
|
||||
|
||||
When you'll run `python manage.py migrate` then `python manage.py runserver`, an empty database will be automatically created.
|
||||
The `local_settings.py` is in the `.gitignore` and should stay that way, so we don't accidentally overwrite the production file when we deploy.
|
||||
|
||||
To obtain administrator rights you can run `python manage.py createsuperuser`.
|
|
@ -0,0 +1,3 @@
|
|||
Django==3.2.11
|
||||
requests==2.27.1
|
||||
authlib==0.15.5
|
|
@ -0,0 +1,23 @@
|
|||
[X] make relation between user and events
|
||||
[X] make scoreboard for events
|
||||
[X] make access mod for events :
|
||||
[X] Sub button for public events
|
||||
[X] Access by password
|
||||
[X] Begin date for display challenges
|
||||
[X] Ending date for stop flag submission
|
||||
|
||||
[X] Admin rights
|
||||
[X] Admin can access to events pages without password
|
||||
[X] Admin can subscribe to event without password
|
||||
|
||||
[X] process flag submission
|
||||
[X] increment user score in Scores model
|
||||
|
||||
[X] add filters for admin dashboard
|
||||
[X] add search in fields in admin dashboard
|
||||
[X] display more information in admin dashboard
|
||||
|
||||
Front End :
|
||||
[X] Smooth display of events listing
|
||||
[X] Nice page with background, logo etc for event detail
|
||||
|
|
@ -1,5 +1,12 @@
|
|||
from .models import UserProfileInfo
|
||||
from django.contrib import admin
|
||||
|
||||
admin.site.register(UserProfileInfo)
|
||||
#admin.site.register(UserProfileInfo)
|
||||
# Register your models here.
|
||||
|
||||
@admin.register(UserProfileInfo)
|
||||
class userprofile(admin.ModelAdmin):
|
||||
#list display
|
||||
list_display = ['user', 'score', 'last_submission_date']
|
||||
# search list
|
||||
search_fields = ['score', 'user__username']
|
|
@ -0,0 +1,29 @@
|
|||
# Generated by Django 3.1.5 on 2022-01-23 17:04
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.utils.timezone
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('accounts', '0006_auto_20210608_2229'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='userprofileinfo',
|
||||
name='member',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='userprofileinfo',
|
||||
name='member_since',
|
||||
field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='Member since'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='userprofileinfo',
|
||||
name='member_until',
|
||||
field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='Member until'),
|
||||
),
|
||||
]
|
|
@ -12,6 +12,9 @@ class UserProfileInfo(models.Model):
|
|||
last_submission_date = models.DateTimeField('Last Submission Date', default=timezone.now)
|
||||
token = models.CharField(max_length=200, blank=True)
|
||||
discord_id = models.CharField(max_length=20, null=True, blank=True, unique=True)
|
||||
member = models.BooleanField(default=False)
|
||||
member_since = models.DateTimeField('Member since', default=timezone.now)
|
||||
member_until = models.DateTimeField('Member until', default=timezone.now)
|
||||
def __str__(self):
|
||||
return self.user.username
|
||||
class Meta:
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
{% extends 'base.html' %}
|
||||
{% block content %}
|
||||
{% load i18n %}
|
||||
<div class="row">
|
||||
<div class="col-sm-12 col-md-9">
|
||||
<div class="ctf-block">
|
||||
<div class="ctf-head">
|
||||
<h3>{% trans "Delete account" %}</h3>
|
||||
</div>
|
||||
<div class="ctf-body">
|
||||
{% trans "Please confirm your password to delete your account." %}<br>
|
||||
{% trans "Deleted accounts cannot be recovered." %}<br><br>
|
||||
<div class="col-sm-8 col-md-6 mx-auto">
|
||||
{% if bad_password %}
|
||||
<span class="message error-msg">{% trans "Password inccorect." %}</span>
|
||||
{% elif deleted %}
|
||||
<span class="message success-msg">{% trans "Your account has been deleted." %}</span>
|
||||
{% endif %}
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<div class="form-group">
|
||||
<input class="form-control" type="password" name="password" placeholder="{% trans "Password" %}"></br>
|
||||
<input class="form-control" type="submit" value="Delete">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -39,26 +39,7 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ctf-block">
|
||||
<div class="ctf-head">
|
||||
<h3>{% trans "Connected accounts" %}</h3>
|
||||
</div>
|
||||
<div class="bloc-body">
|
||||
<div class="d-flex">
|
||||
{% if user.userprofileinfo.discord_id|length > 0 %}
|
||||
<form action="{% url 'accounts:connections-disconnect-discord' %}" method='POST' class="form-inline p-2">
|
||||
{%csrf_token%}
|
||||
<button class="btn btn-dark" type="submit">{% trans "Disconnect Discord" %}</button>
|
||||
</form>
|
||||
{% else %}
|
||||
<form action="{% url 'accounts:connections-connect-discord' %}" method='POST' class="form-inline p-2">
|
||||
{%csrf_token%}
|
||||
<button class="btn btn-dark" type="submit">{% trans "Connect Discord" %}</button>
|
||||
</form>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
|
||||
<ul class="list-group">
|
||||
|
@ -71,8 +52,16 @@
|
|||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
<li class="list-group-item">{% trans "Member since" %} {{ user.date_joined|date:"Y-m-d" }}</li>
|
||||
<li class="list-group-item">{% trans "Registered since" %} {{ user.date_joined|date:"Y-m-d" }}</li>
|
||||
</ul>
|
||||
<ul class="list-group">
|
||||
<form method='GET' action="{% url 'accounts:delete_account' %}">
|
||||
{%csrf_token%}
|
||||
<li class="list-group-item">
|
||||
<input class="form-control" type="submit" value="{% trans "Delete my account" %}">
|
||||
</li>
|
||||
</form>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
|
@ -8,28 +8,28 @@
|
|||
<h3>Login</h3>
|
||||
</div>
|
||||
<div class="ctf-body">
|
||||
<div class="col-sm-8 col-md-6 mx-auto">
|
||||
{% if error %}
|
||||
<span class="message error-msg">{% trans "Please, verify your infos." %}</span>
|
||||
{% endif %}
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<div class="form-group">
|
||||
<input class="form-control" type="text" name="username" placeholder="{% trans "Username" %}"></br>
|
||||
<input class="form-control" type="password" name="password" placeholder="{% trans "Password" %}"></br>
|
||||
<input class="form-control" type="submit" value="login">
|
||||
</div>
|
||||
<a href="{% url 'password_reset' %}">{% trans "Reset password" %}</a>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-sm-8 col-md-6 mx-auto">
|
||||
{% if error %}
|
||||
<span class="message error-msg">{% trans "Please, verify your infos." %}</span>
|
||||
{% endif %}
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<div class="form-group">
|
||||
<input class="form-control" type="text" name="username" placeholder="{% trans "Username" %}"></br>
|
||||
<input class="form-control" type="password" name="password" placeholder="{% trans "Password" %}"></br>
|
||||
<input class="form-control" type="submit" value="login">
|
||||
</div>
|
||||
<a href="{% url 'password_reset' %}">{% trans "Reset password" %}</a>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="col-sm-12 col-md-3 right-sidebar">
|
||||
<ul class="list-group">
|
||||
<a href="/accounts/signin" class="list-group-item">{% trans "Login" %}</a>
|
||||
<a href="/accounts/signup" class="list-group-item">{% trans "Sign up" %}</a>
|
||||
<a href="/accounts/signin" class="list-group-item">{% trans "Login" %}</a>
|
||||
<a href="/accounts/signup" class="list-group-item">{% trans "Sign up" %}</a>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,13 +1,22 @@
|
|||
{% extends 'base.html' %}
|
||||
{% block content %}
|
||||
{% load i18n %}
|
||||
{% load key_value %}
|
||||
{% load is_member %}
|
||||
{% ismember user.userprofileinfo as is_member %}
|
||||
<div class="row">
|
||||
<div class="col-sm-12 col-md-9">
|
||||
<div>
|
||||
<h4>Challenges Solved by {{ user.username }}</h4>
|
||||
{% if solves%}
|
||||
<table class="table table-dark">
|
||||
<thead>
|
||||
<h4>{% trans "Challenges Solved by" %} <span class="{{ is_member }}">{{ user.username }}</span></h4>
|
||||
{% if solves%}
|
||||
|
||||
<div class="table table-dark">
|
||||
<div class="card-body">
|
||||
<div id="time-chart"></div>
|
||||
</div>
|
||||
</div>
|
||||
<table class="table table-dark">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">{% trans "Challenge Name" %}</th>
|
||||
<th scope="col">{% trans "Category" %}</th>
|
||||
|
@ -18,7 +27,7 @@
|
|||
<tbody>
|
||||
{% for s in solves %}
|
||||
<tr>
|
||||
<th scope="row"><a href="/ctfs/{{ s.ctf.category.slug }}/{{ s.ctf.slug }}">{{ s.ctf.name }}</a></th>
|
||||
<th scope="row"><a href="{% url 'ctf' cat_slug=s.ctf.category.slug ctf_slug=s.ctf.slug %}">{{ s.ctf.name }}</a></th>
|
||||
<td>{{ s.ctf.category.name}}</td>
|
||||
<td>{{ s.ctf.points }}</td>
|
||||
<td>{{ s.flag_date|date:"Y-m-d H:i:s" }}</td>
|
||||
|
@ -27,14 +36,15 @@
|
|||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p>{% trans "It's seem {{ user.username }} have never solved any CTF yet..." %}</p>
|
||||
<p>{% trans "It seems that this user has not solved any challenge yet..." %}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item">{{ user.username }}</li>
|
||||
<li class="list-group-item">{% trans "Score" %} : {{ user.userprofileinfo.score }}</li>
|
||||
<li class="list-group-item {{ is_member }}">{{ user.username }}</li>
|
||||
<li class="list-group-item">{% trans "Score" %} : {{ score }}</li>
|
||||
<li class="list-group-item">{% trans "Rank" %} : {{ rank }}</li>
|
||||
{% if user.userprofileinfo.portfolio_site %}
|
||||
<li class="list-group-item">
|
||||
<a href="{{ user.userprofileinfo.portfolio_site }}" target="_blank">
|
||||
|
@ -42,9 +52,101 @@
|
|||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
<li class="list-group-item">{% trans "Member since" %} {{ user.date_joined|date:"Y-m-d" }}</li>
|
||||
{% if member %}
|
||||
<li class="list-group-item is-member">{% trans "Status: Member" %}</li>
|
||||
{% else %}
|
||||
<li class="list-group-item">{% trans "Status: Visitor" %}</li>
|
||||
{% endif %}
|
||||
<li class="list-group-item">{% trans "Registered since" %} {{ user.date_joined|date:"d-m-Y" }}</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item">{% trans "Categories stats" %}</li>
|
||||
{% for cat in catsDatas %}
|
||||
<li class="list-group-item" style="padding-bottom: 3;padding-top: 0;">
|
||||
<span>{{ cat.0 }}</span>
|
||||
<div class="progress">
|
||||
{% if cat.3 == '0' %}
|
||||
<div class="progress-bar bg-success" role="progressbar" style="width: 0%;color:#d9d9d9;" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">0 %</div>
|
||||
{% else %}
|
||||
<div class="progress-bar bg-success" role="progressbar" style="width: {{ cat.3 }}%" aria-valuenow="{{ cat.3 }}" aria-valuemin="0" aria-valuemax="100">{{ cat.3 }} %</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="https://code.highcharts.com/highcharts.src.js"></script>
|
||||
<script>
|
||||
Highcharts.theme={colors:["#2b908f","#90ee7e","#f45b5b","#7798BF","#aaeeee","#ff0066","#eeaaee","#55BF3B","#DF5353","#7798BF","#aaeeee"],chart:{backgroundColor:{linearGradient:{x1:0,y1:0,x2:1,y2:1},stops:[[0,"#1D1D1D"],[1,"#1D1D1D"]]},style:{fontFamily:"'Unica One', sans-serif"},plotBorderColor:"#606063"},title:{style:{color:"#E0E0E3",textTransform:"uppercase",fontSize:"20px"}},subtitle:{style:{color:"#E0E0E3",textTransform:"uppercase"}},xAxis:{gridLineColor:"#707073",labels:{style:{color:"#E0E0E3"}},lineColor:"#707073",minorGridLineColor:"#505053",tickColor:"#707073",title:{style:{color:"#A0A0A3"}}},yAxis:{gridLineColor:"#707073",labels:{style:{color:"#E0E0E3"}},lineColor:"#707073",minorGridLineColor:"#505053",tickColor:"#707073",tickWidth:1,title:{style:{color:"#A0A0A3"}}},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.85)",style:{color:"#F0F0F0"}},plotOptions:{series:{dataLabels:{color:"#F0F0F3",style:{fontSize:"13px"}},marker:{lineColor:"#333"}},boxplot:{fillColor:"#505053"},candlestick:{lineColor:"white"},errorbar:{color:"white"}},legend:{backgroundColor:"#1D1D1D",itemStyle:{color:"#E0E0E3"},itemHoverStyle:{color:"#FFF"},itemHiddenStyle:{color:"#606063"},title:{style:{color:"#C0C0C0"}}},credits:{style:{color:"#666"}},labels:{style:{color:"#707073"}},drilldown:{activeAxisLabelStyle:{color:"#F0F0F3"},activeDataLabelStyle:{color:"#F0F0F3"}},navigation:{buttonOptions:{symbolStroke:"#DDDDDD",theme:{fill:"#505053"}}},rangeSelector:{buttonTheme:{fill:"#505053",stroke:"#000000",style:{color:"#CCC"},states:{hover:{fill:"#707073",stroke:"#000000",style:{color:"white"}},select:{fill:"#000003",stroke:"#000000",style:{color:"white"}}}},inputBoxBorderColor:"#505053",inputStyle:{backgroundColor:"#333",color:"silver"},labelStyle:{color:"silver"}},navigator:{handles:{backgroundColor:"#666",borderColor:"#AAA"},outlineColor:"#CCC",maskFill:"rgba(255,255,255,0.1)",series:{color:"#7798BF",lineColor:"#A6C7ED"},xAxis:{gridLineColor:"#505053"}},scrollbar:{barBackgroundColor:"#808083",barBorderColor:"#808083",buttonArrowColor:"#CCC",buttonBackgroundColor:"#606063",buttonBorderColor:"#606063",rifleColor:"#FFF",trackBackgroundColor:"#404043",trackBorderColor:"#404043"}};
|
||||
|
||||
Highcharts.setOptions(Highcharts.theme);
|
||||
|
||||
Highcharts.chart('time-chart', {
|
||||
title: {
|
||||
text: 'Points earned for each category'
|
||||
},
|
||||
yAxis: {
|
||||
title: {
|
||||
text: 'Points earned'
|
||||
}
|
||||
},
|
||||
xAxis: {
|
||||
type: 'datetime',
|
||||
labels: {
|
||||
formatter: function() {
|
||||
return Highcharts.dateFormat('%d.%b %Y',
|
||||
this.value);
|
||||
}
|
||||
}
|
||||
},
|
||||
legend: {
|
||||
layout: 'vertical',
|
||||
align: 'right',
|
||||
verticalAlign: 'middle'
|
||||
},
|
||||
plotOptions: {
|
||||
pointStart: {{ user.date_joined|timestamp_fromdate }},
|
||||
series: {
|
||||
label: {
|
||||
connectorAllowed: false
|
||||
},
|
||||
allowPointSelect: true,
|
||||
marker: {
|
||||
enabled: true
|
||||
}
|
||||
}
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: 'Total',
|
||||
data: {{ solved|safe }}
|
||||
},
|
||||
{% for cat in cats %}
|
||||
{
|
||||
name: '{{ cat.name }}',
|
||||
data: {{ pointDatas|keyvalue:cat.name|safe }},
|
||||
visible: false,
|
||||
},
|
||||
{% endfor %}
|
||||
],
|
||||
responsive: {
|
||||
rules: [{
|
||||
condition: {
|
||||
maxWidth: 500
|
||||
},
|
||||
chartOptions: {
|
||||
legend: {
|
||||
layout: 'horizontal',
|
||||
align: 'center',
|
||||
verticalAlign: 'bottom'
|
||||
}
|
||||
}
|
||||
}]
|
||||
}
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
from django import template
|
||||
|
||||
register = template.Library()
|
||||
|
||||
@register.filter
|
||||
def keyvalue(dict, key):
|
||||
return dict[key]
|
||||
|
||||
@register.filter
|
||||
def timestamp_fromdate(date):
|
||||
return str(date.timestamp() * 1000).replace(',','.')
|
|
@ -12,5 +12,6 @@ urlpatterns = [
|
|||
path('rank/<str:token>', views.rank, name='rank'),
|
||||
path('connections/connect/discord', views.connection.connect, name='connections-connect-discord'),
|
||||
path('connections/connect/discord/authorize', views.connection.authorize, name='connections-connect-discord-authorize'),
|
||||
path('connections/disconnect/discord', views.connection.disconnect, name='connections-disconnect-discord')
|
||||
path('connections/disconnect/discord', views.connection.disconnect, name='connections-disconnect-discord'),
|
||||
path('delete_account/', views.delete_account, name='delete_account'),
|
||||
]
|
||||
|
|
|
@ -2,7 +2,7 @@ from django.shortcuts import render, redirect, get_object_or_404
|
|||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from django import forms
|
||||
from ctfs.models import CTF_flags
|
||||
from ctfs.models import Category, CTF_flags, CTF
|
||||
from ..forms import UserForm,UserProfileInfoForm, UserInfosUpdateForm, UserUpdateForm
|
||||
from django.contrib.auth import authenticate, login, logout
|
||||
from django.contrib.auth.models import User
|
||||
|
@ -15,116 +15,170 @@ from django.urls import reverse
|
|||
from secrets import token_hex
|
||||
from accounts.models import UserProfileInfo
|
||||
|
||||
from django.contrib.auth.models import timezone
|
||||
|
||||
from . import connection
|
||||
|
||||
def signin(request):
|
||||
if not request.user.is_authenticated:
|
||||
if request.method == 'POST':
|
||||
username = request.POST.get('username')
|
||||
password = request.POST.get('password')
|
||||
user = authenticate(username=username, password=password)
|
||||
if user:
|
||||
if user.is_active:
|
||||
login(request,user)
|
||||
return HttpResponseRedirect(reverse('home'))
|
||||
else:
|
||||
return HttpResponse(_("Your account was inactive."))
|
||||
else:
|
||||
return render(request, 'accounts/login.html', {'error': True})
|
||||
else:
|
||||
return render(request, 'accounts/login.html', {})
|
||||
else:
|
||||
return HttpResponseRedirect(reverse('home'))
|
||||
if not request.user.is_authenticated:
|
||||
if request.method == 'POST':
|
||||
username = request.POST.get('username')
|
||||
password = request.POST.get('password')
|
||||
user = authenticate(username=username, password=password)
|
||||
if user:
|
||||
if user.is_active:
|
||||
login(request,user)
|
||||
return HttpResponseRedirect(reverse('home'))
|
||||
else:
|
||||
return HttpResponse(_("Your account was inactive."))
|
||||
else:
|
||||
return render(request, 'accounts/login.html', {'error': True})
|
||||
else:
|
||||
return render(request, 'accounts/login.html', {})
|
||||
else:
|
||||
return HttpResponseRedirect(reverse('home'))
|
||||
|
||||
def signup(request):
|
||||
if not request.user.is_authenticated:
|
||||
user_form = UserForm()
|
||||
profile_form = UserProfileInfoForm()
|
||||
registered = False
|
||||
if request.method == 'POST':
|
||||
pass1 = request.POST.get('password')
|
||||
if len(pass1) < 8:
|
||||
return render(request,'accounts/register.html', {'user_form':user_form, 'profile_form':profile_form, 'registered_failed':"The new password must be at least %d characters long." % 8})
|
||||
first_isalpha = pass1[0].isalpha()
|
||||
if not any(c.isdigit() for c in pass1) or not any(c.isalpha() for c in pass1):
|
||||
return render(request,'accounts/register.html', {'user_form':user_form, 'profile_form':profile_form, 'registered_failed':_("The password must contain at least one letter and at least one digit or punctuation character.")})
|
||||
if User.objects.filter(email=request.POST.get('email')).exists():
|
||||
return render(request,'accounts/register.html', {'user_form':user_form, 'profile_form':profile_form, 'registered_failed':_("A user with that email already exists.")})
|
||||
user_form = UserForm(data=request.POST)
|
||||
profile_form = UserProfileInfoForm(data=request.POST)
|
||||
if user_form.is_valid() and profile_form.is_valid():
|
||||
user = user_form.save()
|
||||
user.set_password(user.password)
|
||||
user.save()
|
||||
profile = profile_form.save(commit=False)
|
||||
profile.user = user
|
||||
profile.token = token_hex(16)
|
||||
profile.save()
|
||||
registered = True
|
||||
else:
|
||||
return render(request,'accounts/register.html', {'user_form':user_form, 'profile_form':profile_form, 'registered_failed':_("A user with that username already exists.")})
|
||||
return render(request,'accounts/register.html',
|
||||
{'user_form':user_form,
|
||||
'profile_form':profile_form,
|
||||
'registered':registered})
|
||||
else:
|
||||
return HttpResponseRedirect(reverse('home'))
|
||||
if not request.user.is_authenticated:
|
||||
user_form = UserForm()
|
||||
profile_form = UserProfileInfoForm()
|
||||
registered = False
|
||||
if request.method == 'POST':
|
||||
pass1 = request.POST.get('password')
|
||||
if len(pass1) < 8:
|
||||
return render(request,'accounts/register.html', {'user_form':user_form, 'profile_form':profile_form, 'registered_failed':"The new password must be at least %d characters long." % 8})
|
||||
first_isalpha = pass1[0].isalpha()
|
||||
if not any(c.isdigit() for c in pass1) or not any(c.isalpha() for c in pass1):
|
||||
return render(request,'accounts/register.html', {'user_form':user_form, 'profile_form':profile_form, 'registered_failed':_("The password must contain at least one letter and at least one digit or punctuation character.")})
|
||||
if User.objects.filter(email=request.POST.get('email')).exists():
|
||||
return render(request,'accounts/register.html', {'user_form':user_form, 'profile_form':profile_form, 'registered_failed':_("A user with that email already exists.")})
|
||||
user_form = UserForm(data=request.POST)
|
||||
profile_form = UserProfileInfoForm(data=request.POST)
|
||||
if user_form.is_valid() and profile_form.is_valid():
|
||||
user = user_form.save()
|
||||
user.set_password(user.password)
|
||||
user.save()
|
||||
profile = profile_form.save(commit=False)
|
||||
profile.user = user
|
||||
profile.token = token_hex(16)
|
||||
profile.save()
|
||||
registered = True
|
||||
else:
|
||||
return render(request,'accounts/register.html', {'user_form':user_form, 'profile_form':profile_form, 'registered_failed':_("A user with that username already exists.")})
|
||||
return render(request,'accounts/register.html',
|
||||
{'user_form':user_form,
|
||||
'profile_form':profile_form,
|
||||
'registered':registered})
|
||||
else:
|
||||
return HttpResponseRedirect(reverse('home'))
|
||||
|
||||
@login_required
|
||||
def out(request):
|
||||
logout(request)
|
||||
return HttpResponseRedirect(reverse('home'))
|
||||
logout(request)
|
||||
return HttpResponseRedirect(reverse('home'))
|
||||
|
||||
@login_required
|
||||
def edit(request):
|
||||
if request.method == 'POST':
|
||||
umail = request.user.email
|
||||
uuser = request.user.username
|
||||
p_form = UserInfosUpdateForm(request.POST, instance=request.user.userprofileinfo)
|
||||
u_form = UserUpdateForm(request.POST, instance=request.user)
|
||||
error = None
|
||||
success = None
|
||||
if p_form.is_valid() and u_form.is_valid():
|
||||
pmail = u_form.cleaned_data['email']
|
||||
if pmail == umail:
|
||||
pass
|
||||
else:
|
||||
if User.objects.filter(email=pmail).exists():
|
||||
error = _("Email already taken.")
|
||||
puser = u_form.cleaned_data['username']
|
||||
if puser == uuser:
|
||||
pass
|
||||
else:
|
||||
if User.objects.filter(username=puser).exists():
|
||||
error = _("Username already taken.")
|
||||
if error is None:
|
||||
u_form.save()
|
||||
p_form.save()
|
||||
success = _("Updated.")
|
||||
request.user.username = uuser
|
||||
if request.method == 'POST':
|
||||
umail = request.user.email
|
||||
uuser = request.user.username
|
||||
p_form = UserInfosUpdateForm(request.POST, instance=request.user.userprofileinfo)
|
||||
u_form = UserUpdateForm(request.POST, instance=request.user)
|
||||
error = None
|
||||
success = None
|
||||
if p_form.is_valid() and u_form.is_valid():
|
||||
pmail = u_form.cleaned_data['email']
|
||||
if pmail == umail:
|
||||
pass
|
||||
else:
|
||||
if User.objects.filter(email=pmail).exists():
|
||||
error = _("Email already taken.")
|
||||
puser = u_form.cleaned_data['username']
|
||||
if puser == uuser:
|
||||
pass
|
||||
else:
|
||||
if User.objects.filter(username=puser).exists():
|
||||
error = _("Username already taken.")
|
||||
if error is None:
|
||||
u_form.save()
|
||||
p_form.save()
|
||||
success = _("Updated.")
|
||||
request.user.username = uuser
|
||||
|
||||
context={'p_form': p_form, 'u_form': u_form, 'error':error, 'success' : success}
|
||||
return render(request, 'accounts/edit.html', context)
|
||||
else:
|
||||
p_form = UserInfosUpdateForm(instance=request.user.userprofileinfo)
|
||||
u_form = UserUpdateForm(instance=request.user)
|
||||
context={'p_form': p_form, 'u_form': u_form, 'token': request.user.userprofileinfo.token}
|
||||
return render(request, 'accounts/edit.html',context )
|
||||
context={'p_form': p_form, 'u_form': u_form, 'error':error, 'success' : success}
|
||||
return render(request, 'accounts/edit.html', context)
|
||||
else:
|
||||
p_form = UserInfosUpdateForm(instance=request.user.userprofileinfo)
|
||||
u_form = UserUpdateForm(instance=request.user)
|
||||
context={'p_form': p_form, 'u_form': u_form, 'token': request.user.userprofileinfo.token}
|
||||
return render(request, 'accounts/edit.html',context )
|
||||
|
||||
@login_required
|
||||
def profile(request, user_name):
|
||||
user_obj = get_object_or_404(User, username=user_name)
|
||||
solves = CTF_flags.objects.filter(user=user_obj).order_by('-flag_date')
|
||||
return render(request,'accounts/profile.html', {'user':user_obj, 'solves':solves})
|
||||
# Create your views here.
|
||||
catsDatas = []
|
||||
|
||||
user_obj = get_object_or_404(User, username=user_name)
|
||||
all_users = list(UserProfileInfo.objects.select_related().order_by('-score', 'last_submission_date', 'user__username'))
|
||||
rank = all_users.index(get_object_or_404(UserProfileInfo, user=user_obj)) + 1
|
||||
if (user_obj.userprofileinfo.member and user_obj.userprofileinfo.member_until > timezone.now()):
|
||||
member = True
|
||||
else:
|
||||
member = False
|
||||
all_cats = Category.objects.all()
|
||||
cats = [cat for cat in all_cats if CTF.objects.filter(category__name=cat.name, event=None, disabled=False)]
|
||||
pointDatas = {}
|
||||
|
||||
for cat in cats:
|
||||
# prepare categories
|
||||
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, disabled=False).count()
|
||||
# get datas
|
||||
somme = 0
|
||||
solved_count = len(solved)
|
||||
|
||||
pointDatas[cat.name] = []
|
||||
pointDatas[cat.name].append([user_obj.date_joined.timestamp() * 1000, 0])
|
||||
percent = (solved_count / max_count) * 100
|
||||
catsDatas.append([cat.name, solved_count, max_count, '{:.0f}'.format(percent)])
|
||||
for flag in solved:
|
||||
somme += flag.ctf.points
|
||||
pointDatas[cat.name].append([flag.flag_date.timestamp() * 1000, somme])
|
||||
|
||||
solves = CTF_flags.objects.filter(user=user_obj, ctf__event=None, ctf__disabled=False).order_by('-flag_date')
|
||||
solved = []
|
||||
somme = 0
|
||||
solved.append([user_obj.date_joined.timestamp() * 1000, 0])
|
||||
for s in solves.reverse():
|
||||
somme += s.ctf.points
|
||||
solved.append([s.flag_date.timestamp() * 1000,somme])
|
||||
|
||||
return render(request,'accounts/profile.html', {'user':user_obj, 'solves':solves,'solved':solved,'catsDatas': catsDatas, 'pointDatas': pointDatas,
|
||||
'rank': rank, 'score' : somme, 'member' : member, 'cats':cats})
|
||||
|
||||
def rank(request, token):
|
||||
all_users = UserProfileInfo.objects.filter(score__gt=0).select_related().order_by('-score', 'last_submission_date', 'user__username')
|
||||
all_users = UserProfileInfo.objects.filter(score__gt=0).select_related().order_by('-score', 'last_submission_date', 'user__username')
|
||||
|
||||
rank = 1
|
||||
for elem in all_users:
|
||||
if elem.token == token:
|
||||
break
|
||||
rank += 1
|
||||
data = {"rank": rank}
|
||||
return JsonResponse(data)
|
||||
rank = 1
|
||||
for elem in all_users:
|
||||
if elem.token == token:
|
||||
break
|
||||
rank += 1
|
||||
data = {"rank": rank}
|
||||
return JsonResponse(data)
|
||||
|
||||
@login_required
|
||||
def delete_account(request):
|
||||
if request.method == 'POST':
|
||||
user = request.user
|
||||
|
||||
password = request.POST.get('password')
|
||||
if user.check_password(password):
|
||||
logout(request)
|
||||
user.delete()
|
||||
return render(request, 'accounts/delete.html', {'deleted': True, 'bad_password': False})
|
||||
|
||||
else:
|
||||
return render(request, 'accounts/delete.html', {'deleted': False, 'bad_password': True})
|
||||
|
||||
else:
|
||||
return render(request, 'accounts/delete.html', {'deleted': False, 'bad_password': False} )
|
|
@ -0,0 +1,26 @@
|
|||
from django.template import Library
|
||||
from django.core.urlresolvers import resolve, reverse
|
||||
from django.utils.translation import activate, get_language
|
||||
|
||||
register = Library()
|
||||
|
||||
@register.simple_tag(takes_context=True)
|
||||
def change_lang(context, lang=None, *args, **kwargs):
|
||||
"""
|
||||
Get active page's url by a specified language
|
||||
Usage: {% change_lang 'en' %}
|
||||
"""
|
||||
|
||||
path = context['request'].path
|
||||
url_parts = resolve( path )
|
||||
|
||||
url = path
|
||||
cur_language = get_language()
|
||||
try:
|
||||
activate(lang)
|
||||
url = reverse( url_parts.view_name, kwargs=url_parts.kwargs )
|
||||
finally:
|
||||
activate(cur_language)
|
||||
|
||||
|
||||
return "%s" % url
|
|
@ -2,7 +2,24 @@ from django.contrib import admin
|
|||
from .models import Category, CTF, CTF_flags
|
||||
|
||||
admin.site.register(Category)
|
||||
admin.site.register(CTF)
|
||||
admin.site.register(CTF_flags)
|
||||
#admin.site.register(CTF)
|
||||
#admin.site.register(CTF_flags)
|
||||
|
||||
@admin.register(CTF_flags)
|
||||
class ctf_flags(admin.ModelAdmin):
|
||||
#list display
|
||||
list_display = ['user', 'ctf', 'flag_date']
|
||||
#list Filter
|
||||
list_filter = ('ctf__category', 'ctf', 'user','flag_date')
|
||||
# search list
|
||||
search_fields = ['ctf__category__name', 'ctf__name', 'user__username']
|
||||
|
||||
@admin.register(CTF)
|
||||
class ctf(admin.ModelAdmin):
|
||||
#list display
|
||||
list_display = ['name', 'event', 'category']
|
||||
#list Filter
|
||||
list_filter = ('category', 'event')
|
||||
# search list
|
||||
search_fields = ['category__name', 'name', 'author__username']
|
||||
# Register your models here.
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
from collections import defaultdict
|
||||
from django.core.management.base import BaseCommand, CommandError
|
||||
from accounts.models import UserProfileInfo
|
||||
from ctfs.models import CTF_flags, CTF
|
||||
from math import log
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = 'Actualize challenges points based on number of solves'
|
||||
|
||||
def handle(self, *args, **options):
|
||||
challenges = CTF.objects.filter(event=None, disabled=False).exclude(category__name="-Intro-")
|
||||
|
||||
for ctf in challenges:
|
||||
solves = CTF_flags.objects.filter(ctf=ctf)
|
||||
nb_solves = len(solves)
|
||||
|
||||
if nb_solves > 0:
|
||||
new_points = max(200 - int(log(nb_solves)*8.5)*5, 5)
|
||||
else:
|
||||
new_points = 200
|
||||
|
||||
if new_points != ctf.points:
|
||||
diff = ctf.points - new_points
|
||||
ctf.points = new_points
|
||||
ctf.save()
|
||||
for s in solves:
|
||||
s.user.userprofileinfo.score -= diff
|
||||
s.user.userprofileinfo.save()
|
|
@ -0,0 +1,28 @@
|
|||
# Generated by Django 3.2.7 on 2021-09-07 14:07
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('ctfs', '0003_auto_20191003_1947'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='ctf',
|
||||
name='description_de',
|
||||
field=models.TextField(blank=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='ctf',
|
||||
name='description_en',
|
||||
field=models.TextField(blank=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='ctf',
|
||||
name='description_ru',
|
||||
field=models.TextField(blank=True),
|
||||
),
|
||||
]
|
|
@ -0,0 +1,20 @@
|
|||
# Generated by Django 3.2.7 on 2021-10-18 14:23
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('events', '0001_initial'),
|
||||
('ctfs', '0004_auto_20210907_1407'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='ctf',
|
||||
name='event',
|
||||
field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='events.event'),
|
||||
),
|
||||
]
|
|
@ -0,0 +1,20 @@
|
|||
# Generated by Django 3.2.7 on 2021-10-19 15:03
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('events', '0002_alter_event_password'),
|
||||
('ctfs', '0005_ctf_event'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='ctf',
|
||||
name='event',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='events.event'),
|
||||
),
|
||||
]
|
|
@ -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),
|
||||
),
|
||||
]
|
|
@ -1,5 +1,6 @@
|
|||
from django.db import models
|
||||
from django.contrib.auth.models import User
|
||||
from events.models import Event
|
||||
|
||||
class Category(models.Model):
|
||||
name = models.CharField(max_length=200)
|
||||
|
@ -11,9 +12,14 @@ class Category(models.Model):
|
|||
class CTF(models.Model):
|
||||
name = models.CharField(max_length=200)
|
||||
flag = models.CharField(max_length=100)
|
||||
disabled = models.BooleanField(default=False)
|
||||
description = models.TextField(blank=True)
|
||||
description_en = models.TextField(blank=True)
|
||||
description_ru = models.TextField(blank=True)
|
||||
description_de = models.TextField(blank=True)
|
||||
file = models.FileField(blank=True, upload_to='challenges')
|
||||
ctf_url = models.URLField(blank=True)
|
||||
event = models.ForeignKey(Event, null=True, blank=True, on_delete=models.CASCADE)
|
||||
points = models.PositiveSmallIntegerField()
|
||||
slug = models.SlugField(max_length=55)
|
||||
pub_date = models.DateTimeField('Date published')
|
||||
|
|
Binary file not shown.
|
@ -1,80 +1,93 @@
|
|||
{% extends 'base.html' %}
|
||||
{% block content %}
|
||||
{% load i18n %}
|
||||
{% load is_member %}
|
||||
<div class="row">
|
||||
<div class="col-sm-12 col-md-9">
|
||||
<div class="ctf-block">
|
||||
<div class="ctf-head">
|
||||
<h3>{{ ctf.name }}</h3>
|
||||
<small>{% trans "Published date" %} : {{ ctf.pub_date }}</small>
|
||||
<small>{% trans "Published date" %} : {{ ctf.pub_date }}</small>
|
||||
</div>
|
||||
{% if date < ctf.pub_date %}
|
||||
<div class="ctf-body">
|
||||
{{ ctf.description|safe }}
|
||||
{% trans "Challenge is not yet available." %}
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="ctf-body">
|
||||
{% if description %}
|
||||
{{ description|safe }}
|
||||
{% else %}
|
||||
{% trans "No translation available. Please try another language (English or French)." %}
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="ctf-footer">
|
||||
{% if request.user.is_authenticated %}
|
||||
{% if valitated == True %}
|
||||
<p>{% trans "Congratulation !" %}</p>
|
||||
{% elif alvalitated == True %}
|
||||
<p>{% trans "Already flagged" %}</p>
|
||||
{% if ctf.ctf_url %}
|
||||
<a class="begin-ctf-link" target="_blank" href="{{ ctf.ctf_url }}">{% trans "Start the challenge" %}</a></br>
|
||||
{% elif ctf.file %}
|
||||
<a class="begin-ctf-link" target="_blank" href="{{ ctf.file.url }}">{% trans "Download" %}</a></br>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% if failed %}
|
||||
<p>{% trans "Wrong flag ! You can do it !" %}</p>
|
||||
{% endif %}
|
||||
{% if ctf.ctf_url %}
|
||||
<a class="begin-ctf-link" target="_blank" href="{{ ctf.ctf_url }}">{% trans "Start the challenge" %}</a></br>
|
||||
{% elif ctf.file %}
|
||||
<a class="begin-ctf-link" target="_blank" href="{{ ctf.file.url }}">{% trans "Download" %}</a></br>
|
||||
{% endif %}
|
||||
<form method="post" class="submitflag-form">
|
||||
{% csrf_token %}
|
||||
<input type="text" name="flag" maxlength="48" required="" id="id_flag">
|
||||
<input class="form-control" type="submit" value=">">
|
||||
</form>
|
||||
{% if request.user.is_authenticated %}
|
||||
{% if valitated == True %}
|
||||
<p>{% trans "Congratulation !" %}</p>
|
||||
{% elif alvalitated == True %}
|
||||
<p>{% trans "Already flagged" %}</p>
|
||||
{% if ctf.ctf_url %}
|
||||
<a class="begin-ctf-link" target="_blank" href="{{ ctf.ctf_url }}">{% trans "Start the challenge" %}</a></br>
|
||||
{% elif ctf.file %}
|
||||
<a class="begin-ctf-link" target="_blank" href="{{ ctf.file.url }}">{% trans "Download" %}</a></br>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% if failed %}
|
||||
<p>{% trans "Wrong flag ! You can do it !" %}</p>
|
||||
{% endif %}
|
||||
{% if ctf.ctf_url %}
|
||||
<a class="begin-ctf-link" target="_blank" href="{{ ctf.ctf_url }}">{% trans "Start the challenge" %}</a></br>
|
||||
{% elif ctf.file %}
|
||||
<a class="begin-ctf-link" target="_blank" href="{{ ctf.file.url }}">{% trans "Download" %}</a></br>
|
||||
{% endif %}
|
||||
<form method="post" class="submitflag-form">
|
||||
{% csrf_token %}
|
||||
<input type="text" name="flag" maxlength="100" required="" id="id_flag">
|
||||
<input class="form-control" type="submit" value=">">
|
||||
</form>
|
||||
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div>
|
||||
<h4>{% trans "Solved by" %}</h4>
|
||||
{% if solved_list %}
|
||||
<table class="table table-dark">
|
||||
<h4>{% trans "Solved by" %}</h4>
|
||||
{% if solved_list %}
|
||||
<table class="table table-dark">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">{% trans "Username" %}</th>
|
||||
<th scope="col">{% trans "Website" %}</th>
|
||||
<th scope="col">{% trans "Score" %}</th>
|
||||
<th scope="col">{% trans "Date" %}</th>
|
||||
<th scope="col">{% trans "Username" %}</th>
|
||||
<th scope="col">{% trans "Website" %}</th>
|
||||
<th scope="col">{% trans "Score" %}</th>
|
||||
<th scope="col">{% trans "Date" %}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for s in solved_list %}
|
||||
<tr>
|
||||
<th scope="row"><a class="profile_link" href="/accounts/profile/{{ s.user.username }}"> {{ s.user.username }}</a></th>
|
||||
<td>{{ s.user.userprofileinfo.portfolio_site }}</td>
|
||||
<td>{{ s.user.userprofileinfo.score }}</td>
|
||||
<td>{{ s.flag_date }}</td>
|
||||
{% for s in solved_list %}
|
||||
<tr>
|
||||
{% ismember s.user.userprofileinfo as is_member %}
|
||||
<th scope="row"><a class="profile_link {{is_member}}" href="{% url 'accounts:profile' user_name=s.user.username %}"> {{ s.user.username }}</a></th>
|
||||
<td>{{ s.user.userprofileinfo.portfolio_site }}</td>
|
||||
<td>{{ s.user.userprofileinfo.score }}</td>
|
||||
<td>{{ s.flag_date }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p>{% trans "Nobody have solved this CTF." %}</p>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<p>{% trans "Nobody has solved this challenge yet." %}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item">{% trans "Author" %} : {{ ctf.author.username }}</li>
|
||||
<li class="list-group-item">{% trans "Point reward" %} : {{ ctf.points }}</li>
|
||||
{% ismember ctf.author.userprofileinfo as is_member %}
|
||||
<li class="list-group-item">{% trans "Author" %} : <a style="position:absolute;right: 15px;" class="profile_link {{is_member}}" href="{% url 'accounts:profile' user_name=ctf.author.username %}">{{ ctf.author.username }}</a></li>
|
||||
<li class="list-group-item">{% trans "Point reward" %} : <span style="position:absolute;right: 15px;">{{ ctf.points }}</span></li>
|
||||
|
||||
</ul>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
{% else %}
|
||||
<th scope="row"> </th>
|
||||
{% endif %}
|
||||
<td><a href="/ctfs/{{ cat.slug }}/{{ ctf.slug }}">{{ ctf.name }}</td>
|
||||
<td><a href="{% url 'ctf' cat_slug=ctf.category.slug ctf_slug=ctf.slug %}">{{ ctf.name }}</td>
|
||||
<td>{{ ctf.points }}</td>
|
||||
<td>{{ ctf.solved_num }}</td>
|
||||
</tr>
|
||||
|
@ -42,7 +42,7 @@
|
|||
<li class="list-group-item active">{% trans "Categories" %}</li>
|
||||
{% if cats %}
|
||||
{% for c in cats %}
|
||||
<a class="list-group-item" href="/ctfs/{{ c.slug }}">{{ c.name }}</a>
|
||||
<a class="list-group-item" href="{% url 'category' cat_slug=c.slug %}">{{ c.name }}</a>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<li class="list-group-item">{% trans "No category available." %}</li>
|
||||
|
|
|
@ -4,19 +4,53 @@ from django.contrib.auth.models import timezone
|
|||
from .models import Category, CTF, CTF_flags
|
||||
from .forms import submit_flag
|
||||
from accounts.models import UserProfileInfo
|
||||
from django.utils.translation import get_language
|
||||
from math import log
|
||||
from accounts.models import UserProfileInfo
|
||||
|
||||
def get_description_by_lang(ctf):
|
||||
lang = get_language()
|
||||
ret = None
|
||||
if lang == "fr":
|
||||
ret = ctf.description
|
||||
elif lang == "en":
|
||||
ret = ctf.description_en
|
||||
elif lang == "de":
|
||||
ret = ctf.description_de
|
||||
elif lang == "ru":
|
||||
ret = ctf.description_ru
|
||||
return ret
|
||||
|
||||
def actualize_points(ctf):
|
||||
if ctf.category.name == "-Intro-":
|
||||
return
|
||||
solves = CTF_flags.objects.filter(ctf=ctf)
|
||||
nb_solves = len(solves)
|
||||
|
||||
new_points = max(200 - int(log(nb_solves)*8.5)*5, 5)
|
||||
|
||||
if new_points != ctf.points:
|
||||
diff = ctf.points - new_points
|
||||
ctf.points = new_points
|
||||
ctf.save()
|
||||
for s in solves:
|
||||
s.user.userprofileinfo.score -= diff
|
||||
s.user.userprofileinfo.save()
|
||||
|
||||
|
||||
def category(request, cat_slug):
|
||||
cat = get_object_or_404(Category, slug=cat_slug)
|
||||
ctfs = CTF.objects.filter(category=cat).order_by('-points')
|
||||
ctfs = CTF.objects.filter(category=cat, event=None, disabled=False).order_by('points')
|
||||
for ex in ctfs:
|
||||
ex.solved_num = CTF_flags.objects.filter(ctf=ex).count()
|
||||
ex.solved = ex.solved_by(request.user)
|
||||
ex.solved_num = CTF_flags.objects.filter(ctf=ex).count()
|
||||
ex.solved = ex.solved_by(request.user)
|
||||
return render(request, 'ctfs/ctfs_list.html', {'ctfs' : ctfs, 'cat' : cat})
|
||||
|
||||
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
|
||||
solved_list = CTF_flags.objects.filter(ctf=ctf_info).order_by('flag_date')
|
||||
description = get_description_by_lang(ctf_info)
|
||||
if request.user.is_authenticated:
|
||||
if CTF_flags.objects.filter(user=request.user, ctf=ctf_info):
|
||||
flagged = True
|
||||
|
@ -24,25 +58,20 @@ def ctf(request, cat_slug, ctf_slug):
|
|||
if request.user.is_authenticated:
|
||||
form = submit_flag(data=request.POST)
|
||||
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.save()
|
||||
profil = UserProfileInfo.objects.get(user=request.user)
|
||||
profil.last_submission_date = timezone.now()
|
||||
profil.score += ctf_info.points
|
||||
profil.save()
|
||||
return render(request, 'ctfs/ctf_info.html', {'form' : form, 'ctf' : ctf_info, 'solved_list': solved_list, 'valitated': True})
|
||||
actualize_points(ctf_info)
|
||||
return render(request, 'ctfs/ctf_info.html', { 'ctf' : ctf_info, 'solved_list': solved_list, 'valitated': True, 'description': description, 'date': timezone.now()})
|
||||
else:
|
||||
return render(request, 'ctfs/ctf_info.html', {'form' : form, 'ctf' : ctf_info, 'solved_list': solved_list, 'failed': True})
|
||||
return render(request, 'ctfs/ctf_info.html', { 'ctf' : ctf_info, 'solved_list': solved_list, 'failed': True, 'description': description, 'date': timezone.now()})
|
||||
else:
|
||||
form = submit_flag()
|
||||
return render(request, 'ctfs/ctf_info.html', {'form' : form, 'ctf' : ctf_info, 'solved_list': solved_list, 'alvalitated': True})
|
||||
return render(request, 'ctfs/ctf_info.html', { 'ctf' : ctf_info, 'solved_list': solved_list, 'alvalitated': True, 'description': description, 'date': timezone.now()})
|
||||
else:
|
||||
form = submit_flag()
|
||||
return render(request, 'ctfs/ctf_info.html', {'form' : form, 'ctf' : ctf_info, 'solved_list': solved_list})
|
||||
return render(request, 'ctfs/ctf_info.html', { 'ctf' : ctf_info, 'solved_list': solved_list, 'description': description, 'date': timezone.now()})
|
||||
else:
|
||||
form = submit_flag()
|
||||
return render(request, 'ctfs/ctf_info.html', {'form' : form, 'ctf' : ctf_info, 'solved_list': solved_list, 'alvalitated': flagged})
|
||||
|
||||
|
||||
# Create your views here.
|
||||
return render(request, 'ctfs/ctf_info.html', { 'ctf' : ctf_info, 'solved_list': solved_list, 'alvalitated': flagged, 'description': description, 'date': timezone.now()})
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
from django.contrib import admin
|
||||
from .models import Event, EventPlayer, Team
|
||||
|
||||
@admin.register(Event)
|
||||
class event(admin.ModelAdmin):
|
||||
#list display
|
||||
list_display = ['name', 'start_date', 'end_date']
|
||||
# search list
|
||||
search_fields = ['name', 'slug', 'description', 'password']
|
||||
|
||||
@admin.register(EventPlayer)
|
||||
class score(admin.ModelAdmin):
|
||||
#list display
|
||||
list_display = ['user', 'event', 'score']
|
||||
#list Filter
|
||||
list_filter = ('event',)
|
||||
# search list
|
||||
search_fields = ['user__username', 'score', 'event__name']
|
||||
|
||||
# Register your models here.
|
||||
|
||||
@admin.register(Team)
|
||||
class team(admin.ModelAdmin):
|
||||
#list display
|
||||
list_display = ['name', 'event']
|
||||
#list Filter
|
||||
list_filter = ('event',)
|
||||
# search list
|
||||
search_fields = ['name']
|
|
@ -0,0 +1,6 @@
|
|||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class EventsConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'events'
|
|
@ -0,0 +1,20 @@
|
|||
from django import forms
|
||||
from .models import Team
|
||||
|
||||
class submit_flag(forms.Form):
|
||||
flag = forms.CharField(label="Flag", max_length=100)
|
||||
|
||||
class create_team(forms.ModelForm):
|
||||
password = forms.CharField(widget=forms.PasswordInput())
|
||||
class Meta():
|
||||
model = Team
|
||||
fields = ('name','password')
|
||||
|
||||
class TeamUpdateForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = Team
|
||||
fields=('name', 'password',)
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(TeamUpdateForm, self).__init__(*args, **kwargs)
|
||||
for key in self.fields:
|
||||
self.fields[key].required = True
|
|
@ -0,0 +1,46 @@
|
|||
# Generated by Django 3.2.7 on 2021-10-18 14:19
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import django.utils.timezone
|
||||
import uuid
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Event',
|
||||
fields=[
|
||||
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
||||
('name', models.CharField(max_length=200)),
|
||||
('logo', models.CharField(max_length=200)),
|
||||
('img', models.CharField(max_length=200)),
|
||||
('description', models.TextField()),
|
||||
('start_date', models.DateTimeField()),
|
||||
('end_date', models.DateTimeField()),
|
||||
('password', models.CharField(max_length=200)),
|
||||
('slug', models.SlugField(max_length=55)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Scores',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('score', models.PositiveIntegerField(db_index=True, default=0)),
|
||||
('last_submission_date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='Last Submission Date')),
|
||||
('event', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='events.event')),
|
||||
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
options={
|
||||
'ordering': ['-score', 'last_submission_date', 'user__username'],
|
||||
},
|
||||
),
|
||||
]
|
|
@ -0,0 +1,18 @@
|
|||
# Generated by Django 3.2.7 on 2021-10-18 14:43
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('events', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='event',
|
||||
name='password',
|
||||
field=models.CharField(blank=True, max_length=200),
|
||||
),
|
||||
]
|
|
@ -0,0 +1,26 @@
|
|||
# Generated by Django 3.2.7 on 2021-10-19 15:19
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
('events', '0002_alter_event_password'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='scores',
|
||||
name='event',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='events.event'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='scores',
|
||||
name='user',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
|
||||
),
|
||||
]
|
|
@ -0,0 +1,30 @@
|
|||
# Generated by Django 3.1.5 on 2021-12-27 15:40
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import django.utils.timezone
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
('events', '0003_auto_20211019_1519'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RenameModel('Scores', 'EventPlayer'),
|
||||
migrations.CreateModel(
|
||||
name='Team',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=200)),
|
||||
('password', models.CharField(max_length=200)),
|
||||
('size', models.PositiveIntegerField(default=1)),
|
||||
('score', models.PositiveIntegerField(db_index=True, default=0)),
|
||||
('last_submission_date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='Last Submission Date')),
|
||||
('event', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='events.event')),
|
||||
],
|
||||
),
|
||||
]
|
|
@ -0,0 +1,29 @@
|
|||
# Generated by Django 3.1.5 on 2021-12-27 15:56
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('events', '0004_auto_20211227_1540'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='event',
|
||||
name='team_size',
|
||||
field=models.PositiveIntegerField(default=1),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='eventplayer',
|
||||
name='team',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='events.team'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='eventplayer',
|
||||
name='id',
|
||||
field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
||||
),
|
||||
]
|
|
@ -0,0 +1,22 @@
|
|||
# Generated by Django 3.1.5 on 2022-01-14 23:19
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('events', '0005_auto_20211227_1556'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='team',
|
||||
name='size',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='team',
|
||||
name='auto',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
]
|
|
@ -0,0 +1,18 @@
|
|||
# Generated by Django 3.1.5 on 2022-01-16 21:09
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('events', '0006_auto_20220114_2319'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='event',
|
||||
name='auto_match',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
]
|
|
@ -0,0 +1,18 @@
|
|||
# Generated by Django 3.1.5 on 2022-02-12 18:27
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('events', '0007_event_auto_match'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='event',
|
||||
name='dynamic',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
]
|
|
@ -0,0 +1,42 @@
|
|||
from django.db import models
|
||||
from django.contrib.auth.models import User
|
||||
from django.contrib.auth.models import timezone
|
||||
import uuid
|
||||
|
||||
# Create your models here.
|
||||
class Event(models.Model):
|
||||
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
||||
name = models.CharField(max_length=200)
|
||||
logo = models.CharField(max_length=200)
|
||||
img = models.CharField(max_length=200)
|
||||
description = models.TextField()
|
||||
start_date = models.DateTimeField()
|
||||
end_date = models.DateTimeField()
|
||||
password = models.CharField(max_length=200, blank=True)
|
||||
slug = models.SlugField(max_length=55)
|
||||
team_size = models.PositiveIntegerField(default=1)
|
||||
auto_match = models.BooleanField(default=False)
|
||||
dynamic = models.BooleanField(default=False)
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
class Team(models.Model):
|
||||
name = models.CharField(max_length=200)
|
||||
password = models.CharField(max_length=200)
|
||||
event = models.ForeignKey(Event, on_delete=models.CASCADE, null=True)
|
||||
score = models.PositiveIntegerField(default=0, db_index=True)
|
||||
last_submission_date = models.DateTimeField('Last Submission Date', default=timezone.now)
|
||||
auto = models.BooleanField(default=False)
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
class EventPlayer(models.Model):
|
||||
user = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||
event = models.ForeignKey(Event, on_delete=models.CASCADE)
|
||||
score = models.PositiveIntegerField(default=0, db_index=True)
|
||||
last_submission_date = models.DateTimeField('Last Submission Date', default=timezone.now)
|
||||
team = models.ForeignKey(Team, on_delete=models.CASCADE, null=True)
|
||||
class Meta:
|
||||
ordering = ['-score', 'last_submission_date', 'user__username']
|
||||
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
{% extends 'base.html' %}
|
||||
{% block content %}
|
||||
{% load i18n %}
|
||||
<div class="row">
|
||||
<div class="col-sm-12 col-md-9">
|
||||
<div class="ctf-block">
|
||||
<a href="{% url 'events:event_info' event_slug=event.slug %}">< Back to event</a>
|
||||
<div class="ctf-head">
|
||||
<h3>{{ event.name }}</h3>
|
||||
<small>{% trans "This event starts at" %} : {{ event.start_date }}</small>
|
||||
</div>
|
||||
|
||||
<div class="ctf-footer">
|
||||
<div class="col-sm-8 col-md-6 mx-auto">
|
||||
{% if logged == True%}
|
||||
{% if registered == False %}
|
||||
<span class="message error-msg">{% trans "You need to be registered to the event." %}</span>
|
||||
{% else %}
|
||||
{% if exist == True %}
|
||||
<span class="message error-msg">{% trans "Name already taken." %}</span>
|
||||
{% endif %}
|
||||
<h2>Create Team</h2>
|
||||
<form method="post" action="{% url 'events:create_team' event_slug=event.slug %}" class="create-team-form">
|
||||
{% csrf_token %}
|
||||
<div class="form-group">
|
||||
<input class="form-control" type="text" name="teamname" placeholder="{% trans "Team name" %} *" maxlength="150" required="" id="id_teamname"></br>
|
||||
<input class="form-control" type="password" name="password" placeholder="{% trans "Password" %} *" required="" id="id_password"></br>
|
||||
<input type="submit" name="" class="form-control" value="{% trans "Create Team" %}">
|
||||
</div>
|
||||
</form>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<h4>{% trans "You need to be logged to access this event." %}</h4>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item">{{ event.name }}</li>
|
||||
<li class="list-group-item">{% trans "Starts at" %} : <span style="position:absolute;right: 15px;">{{ event.start_date | date:'H:i d-m-y'}}</span></li>
|
||||
<li class="list-group-item">{% trans "Ends at" %} : <span style="position:absolute;right: 15px;">{{ event.end_date | date:'H:i d-m-y'}}</span></li>
|
||||
|
||||
</ul>
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item">{% trans "Manage my team" %}</li>
|
||||
<a href="{% url 'events:join_team' event_slug=event.slug %}" class="list-group-item">→{% trans "Join Team" %}</a>
|
||||
<a href="{% url 'events:create_team' event_slug=event.slug %}" class="list-group-item">{% trans "Create Team" %}</a>
|
||||
</ul>
|
||||
{% if event.auto_match %}
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item">{% trans "Auto-matching" %}</li>
|
||||
<form method='GET' action="{% url 'events:find_team' event_slug=event.slug %}">
|
||||
{%csrf_token%}
|
||||
<li class="list-group-item">
|
||||
<input class="form-control" type="submit" value="{% trans "Find me a team !" %}">
|
||||
</li>
|
||||
</form>
|
||||
</ul>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -0,0 +1,104 @@
|
|||
{% extends 'base.html' %}
|
||||
{% block content %}
|
||||
{% load i18n %}
|
||||
{% load is_member %}
|
||||
<div class="row">
|
||||
<div class="col-sm-12 col-md-9">
|
||||
<div class="ctf-block">
|
||||
<a href="{% url 'events:event_info' event_slug=event.slug %}">< Back to event</a>
|
||||
<div class="ctf-head">
|
||||
<h2>{% trans "Event" %} - {{ event.name }}</h2>
|
||||
<h4>{{ ctf.name }}</h4>
|
||||
<small>{% trans "Published date" %} : {{ ctf.pub_date }}</small>
|
||||
</div>
|
||||
<div class="ctf-body">
|
||||
{% if description %}
|
||||
{{ description|safe }}
|
||||
{% else %}
|
||||
{% trans "No translation available. Please try another language (English or French)." %}
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="ctf-footer">
|
||||
{% if request.user.is_authenticated %}
|
||||
{% if congrat == True %}
|
||||
<p>{% trans "Congratulation !" %}</p>
|
||||
{% elif alreadyflag == True %}
|
||||
<p>{% trans "Already flagged" %}</p>
|
||||
{% elif eventisover == True %}
|
||||
<p>{% trans "This event is over." %}</p>
|
||||
{% elif errorform == True %}
|
||||
<p>{% trans "Error while processing your request. (Invalid Form)" %}</p>
|
||||
{% elif notsub == True %}
|
||||
<span class="message error-msg">{% trans "You must register to the event before submitting flags." %}</span>
|
||||
{% elif noteam == True %}
|
||||
<span class="message error-msg">{% trans "This is a team event, please create or join a team before submitting flags." %}</span>
|
||||
{% if ctf.ctf_url %}
|
||||
<a class="begin-ctf-link" target="_blank" href="{{ ctf.ctf_url }}">{% trans "Start the challenge" %}</a></br>
|
||||
{% elif ctf.file %}
|
||||
<a class="begin-ctf-link" target="_blank" href="{{ ctf.file.url }}">{% trans "Download" %}</a></br>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% if wrongflag == True %}
|
||||
<p>{% trans "Wrong flag ! You can do it !" %}</p>
|
||||
{% endif %}
|
||||
{% if ctf.ctf_url %}
|
||||
<a class="begin-ctf-link" target="_blank" href="{{ ctf.ctf_url }}">{% trans "Start the challenge" %}</a></br>
|
||||
{% elif ctf.file %}
|
||||
<a class="begin-ctf-link" target="_blank" href="{{ ctf.file.url }}">{% trans "Download" %}</a></br>
|
||||
{% endif %}
|
||||
<form method="post" action="{% url 'events:submit_event_flag' event_slug=event.slug chall_slug=ctf.slug %}" class="submitflag-form">
|
||||
{% csrf_token %}
|
||||
<input type="text" name="flag" maxlength="100" required="" id="id_flag">
|
||||
<input class="form-control" type="submit" value=">">
|
||||
</form>
|
||||
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h4>{% trans "Solved by" %}</h4>
|
||||
{% if solved_list %}
|
||||
<table class="table table-dark">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">{% trans "Username" %}</th>
|
||||
<th scope="col">{% trans "Website" %}</th>
|
||||
<th scope="col">{% trans "Date" %}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for s in solved_list %}
|
||||
{% if event.team_size == 1%}
|
||||
{% ismember s.0.userprofileinfo as is_member %}
|
||||
<tr>
|
||||
<th scope="row"><a class="profile_link {{is_member}}" href="{% url 'events:profile' user_name=s.0.username event_slug=event.slug %}"> {{ s.0.username }}</a></th>
|
||||
<td>{{ s.0.userprofileinfo.portfolio_site }}</td>
|
||||
<td>{{ s.1 }}</td>
|
||||
</tr>
|
||||
{% else %}
|
||||
<tr>
|
||||
<th scope="row"><a class="profile_link" href="{% url 'events:team_info' name=s.2 event_slug=event.slug %}"> {{ s.2 }}</a></th>
|
||||
<td></td>
|
||||
<td>{{ s.1 }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p>{% trans "Nobody has solved this challenge yet." %}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
|
||||
{% ismember ctf.author.userprofileinfo as is_member %}
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item">{% trans "Author" %} : <a style="position:absolute;right: 15px;" class="profile_link {{is_member}}" href="{% url 'accounts:profile' user_name=ctf.author.username %}">{{ ctf.author.username }}</a></li>
|
||||
<li class="list-group-item">{% trans "Point reward" %} : <span style="position:absolute;right: 15px;">{{ ctf.points }}</span></li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -0,0 +1,137 @@
|
|||
{% extends 'base.html' %}
|
||||
{% block content %}
|
||||
{% load i18n %}
|
||||
{% load is_flagged %}
|
||||
{% load is_member %}
|
||||
<div class="row">
|
||||
<div class="col-sm-12 col-md-9">
|
||||
{% if subisover == True %}
|
||||
<span class="message error-msg">{% trans "Subscriptions is over." %}</span>
|
||||
{% endif %}
|
||||
{% if alreadyregistered == True %}
|
||||
<span class="message error-msg">{% trans "You're already registered to this event." %}</span>
|
||||
{% endif %}
|
||||
<div class="event-block">
|
||||
<div class="event-head" style="background-image:linear-gradient(180deg, rgba(102,102,102,0.3) 100%, rgba(29,29,29,1) 100%),url('{{ event.img }}');">
|
||||
<h3>{{ event.name }}</h3>
|
||||
{% if ended == True %}
|
||||
<small>{% trans "This event is over." %}</small>
|
||||
{% else %}
|
||||
<small>{% trans "This event start at" %} : {{ event.start_date }}</small>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="event-body">
|
||||
{% if event.description %}
|
||||
{{ event.description|safe }}
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="event-footer">
|
||||
{% if begun == True %}
|
||||
<h4>{% trans "Challenges" %}</h4>
|
||||
|
||||
{% if ctfs %}
|
||||
<div class="row">
|
||||
{% for ctf in ctfs %}
|
||||
<div class="col-md-4">
|
||||
{% isflagged request.user ctf as flagged%}
|
||||
<a href="{% url 'events:event_chall_info' event_slug=event.slug chall_slug=ctf.slug %}">
|
||||
<div class="chall-card {{flagged}}">
|
||||
<p>{{ ctf.category }}</p>
|
||||
<p>{{ ctf.name }} - {{ ctf.points }}</p>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<small>{% trans "No challenges available." %}</small>
|
||||
{% endif %}
|
||||
|
||||
{% else %}
|
||||
<h4>{% trans "The event has not started yet." %}</h4>
|
||||
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h4>{% trans "ScoreBoard" %}</h4>
|
||||
{% if solved_list %}
|
||||
{% if event.team_size == 1 %}
|
||||
<table class="table table-dark">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">{% trans "Rank" %}</th>
|
||||
<th scope="col">{% trans "Username" %}</th>
|
||||
<th scope="col">{% trans "Website" %}</th>
|
||||
<th scope="col">{% trans "Score" %}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for s in solved_list %}
|
||||
<tr>
|
||||
{% ismember s.user.userprofileinfo as is_member %}
|
||||
<th scope="row"># {{ forloop.counter0|add:1 }}</th>
|
||||
<th scope="row">
|
||||
<a class="profile_link {{is_member}}" href="{% url 'events:profile' user_name=s.user.username event_slug=event.slug %}"> {{ s.user.username }}</a>
|
||||
</th>
|
||||
<td>{{ s.user.userprofileinfo.site }}</td>
|
||||
<td>{{ s.score }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<table class="table table-dark">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">{% trans "Rank" %}</th>
|
||||
<th scope="col">{% trans "Team" %}</th>
|
||||
<th scope="col">{% trans "Score" %}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for s in solved_list %}
|
||||
<tr>
|
||||
<th scope="row"># {{ forloop.counter0|add:1 }}</th>
|
||||
<th scope="row">
|
||||
<a class="profile_link" href="{% url 'events:team_info' name=s.name event_slug=event.slug %}"> {{ s.name }}</a>
|
||||
</th>
|
||||
<td>{{ s.score }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<p>{% trans "No one have earn point yet, you gonna be the first ?" %}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item">{{ event.name }}</li>
|
||||
<li class="list-group-item">{% trans "Starts at" %} : <span style="position:absolute;right: 15px;">{{ event.start_date | date:'H:i d-m-y'}}</span></li>
|
||||
<li class="list-group-item">{% trans "Ends at" %} : <span style="position:absolute;right: 15px;">{{ event.end_date | date:'H:i d-m-y'}}</span></li>
|
||||
{% if ended == False and IsRegistered == False %}
|
||||
<form method='POST' action="{% url 'events:register_event' event_slug=event.slug %}">
|
||||
{%csrf_token%}
|
||||
<li class="list-group-item">
|
||||
<input class="form-control" type="submit" value="{% trans "Register" %}">
|
||||
</li>
|
||||
</form>
|
||||
{% endif %}
|
||||
</ul>
|
||||
{% if event.team_size > 1 and IsRegistered == True and ended == False %}
|
||||
<ul class="list-group">
|
||||
<form method='GET' action="{% url 'events:manage_team' event_slug=event.slug %}">
|
||||
{%csrf_token%}
|
||||
<li class="list-group-item">
|
||||
<input class="form-control" type="submit" value="{% trans "Manage my team" %}">
|
||||
</li>
|
||||
</form>
|
||||
</ul>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
{% extends 'base.html' %}
|
||||
{% block content %}
|
||||
{% load i18n %}
|
||||
<div class="row">
|
||||
<div class="col-sm-12 col-md-9">
|
||||
<div class="ctf-block">
|
||||
<div class="ctf-head">
|
||||
<h3>{{ event.name }}</h3>
|
||||
<small>{% trans "This event start at" %} : {{ event.start_date }}</small>
|
||||
</div>
|
||||
|
||||
<div class="ctf-footer">
|
||||
{% if logged == True %}
|
||||
{% if wrongpwd == True %}
|
||||
<span class="message error-msg">{% trans "Wrong password submited." %}</span>
|
||||
{% endif %}
|
||||
{% if alreadyregistered == True %}
|
||||
<span class="message error-msg">{% trans "You're already registered to this event." %}</span>
|
||||
{% endif %}
|
||||
<h4>{% trans "This event is password protected" %}</h4>
|
||||
<small>{% trans "You need to submit the event password to gain access to this event." %}</small>
|
||||
<form method="post" action="{% url 'events:submit_pwd' event_slug=event.slug %}" class="submitflag-form">
|
||||
{% csrf_token %}
|
||||
<input type="text" name="password" maxlength="48" required="">
|
||||
<input class="form-control" type="submit" value=">">
|
||||
</form>
|
||||
{% else %}
|
||||
<h4>{% trans "You need to be logged to access this event." %}</h4>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item">{{ event.name }}</li>
|
||||
<li class="list-group-item">{% trans "Starts at" %} : {{ event.start_date | date:'H:i d-m-y'}}</li>
|
||||
<li class="list-group-item">{% trans "Ends at" %} : {{ event.end_date | date:'H:i d-m-y'}}</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
{% extends 'base.html' %}
|
||||
{% block content %}
|
||||
{% load i18n %}
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<h3>{% trans "Events" %}</h3>
|
||||
</div>
|
||||
{% if events %}
|
||||
{% for ev in events %}
|
||||
{% if curdate > ev.end_date %}
|
||||
<div class="col-md-3 is-over">
|
||||
{% else %}
|
||||
<div class="col-md-3">
|
||||
{% endif %}
|
||||
<div class="event-card">
|
||||
<img
|
||||
src="{{ev.logo}}"
|
||||
class="card-img-top"
|
||||
alt="{{ ev.name }}"
|
||||
/>
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">
|
||||
{{ ev.name }}
|
||||
</h5>
|
||||
</div>
|
||||
<ul class="list-group list-group-flush text-center">
|
||||
<li class="list-group-item">
|
||||
{{ ev.start_date }} <br> - <br> {{ ev.end_date }}
|
||||
<br>
|
||||
{% if curdate > ev.end_date %}
|
||||
<span class="badge badge-pill badge-secondary">Finished</span>
|
||||
{% else %}
|
||||
<span class="badge badge-pill badge-success">Open</span>
|
||||
{% endif %}
|
||||
</li>
|
||||
</ul>
|
||||
<div class="card-body text-center">
|
||||
<a href="{% url 'events:event_info' event_slug=ev.slug %}" class="card-link">{% trans "See more" %}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<p>{% trans "No events available." %}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -0,0 +1,69 @@
|
|||
{% extends 'base.html' %}
|
||||
{% block content %}
|
||||
{% load i18n %}
|
||||
<div class="row">
|
||||
<div class="col-sm-12 col-md-9">
|
||||
<div class="ctf-block">
|
||||
<a href="{% url 'events:event_info' event_slug=event.slug %}">< Back to event</a>
|
||||
<div class="ctf-head">
|
||||
<h3>{{ event.name }}</h3>
|
||||
<small>{% trans "This event starts at" %} : {{ event.start_date }}</small>
|
||||
</div>
|
||||
|
||||
<div class="ctf-footer">
|
||||
<div class="col-sm-8 col-md-6 mx-auto">
|
||||
{% if logged == True%}
|
||||
{% if registered == False %}
|
||||
<span class="message error-msg">{% trans "You need to be registered to the event." %}</span>
|
||||
{% else %}
|
||||
{% if notexist == True %}
|
||||
<span class="message error-msg">{% trans "Team does not exist." %}</span>
|
||||
{% elif wrongpwd == True %}
|
||||
<span class="message error-msg">{% trans "Wrong password submited." %}</span>
|
||||
{% elif max == True %}
|
||||
<span class="message error-msg">{% trans "Maximum size reached." %}</span>
|
||||
{% elif exist == True %}
|
||||
{% endif %}
|
||||
<h2>Join Team</h2>
|
||||
<form method="post" action="{% url 'events:join_team' event_slug=event.slug %}" class="join-team-form">
|
||||
{% csrf_token %}
|
||||
<div class="form-group">
|
||||
<input class="form-control" type="text" name="teamname" placeholder="{% trans "Team name" %} *" maxlength="150" required="" id="id_teamname"></br>
|
||||
<input class="form-control" type="password" name="password" placeholder="{% trans "Password" %} *" required="" id="id_password"></br>
|
||||
<input type="submit" name="" class="form-control" value="{% trans "Join Team" %}">
|
||||
</div>
|
||||
</form>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<h4>{% trans "You need to be logged to access this event." %}</h4>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item">{{ event.name }}</li>
|
||||
<li class="list-group-item">{% trans "Starts at" %} : <span style="position:absolute;right: 15px;">{{ event.start_date | date:'H:i d-m-y'}}</span></li>
|
||||
<li class="list-group-item">{% trans "Ends at" %} : <span style="position:absolute;right: 15px;">{{ event.end_date | date:'H:i d-m-y'}}</span></li>
|
||||
|
||||
</ul>
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item">{% trans "Manage my team" %}</li>
|
||||
<a href="{% url 'events:join_team' event_slug=event.slug %}" class="list-group-item">{% trans "Join Team" %}</a>
|
||||
<a href="{% url 'events:create_team' event_slug=event.slug %}" class="list-group-item">{% trans "Create Team" %}</a>
|
||||
</ul>
|
||||
{% if event.auto_match %}
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item">{% trans "Auto-matching" %}</li>
|
||||
<form method='GET' action="{% url 'events:find_team' event_slug=event.slug %}">
|
||||
{%csrf_token%}
|
||||
<li class="list-group-item">
|
||||
<input class="form-control" type="submit" value="{% trans "Find me a team !" %}">
|
||||
</li>
|
||||
</form>
|
||||
</ul>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -0,0 +1,73 @@
|
|||
{% extends 'base.html' %}
|
||||
{% block content %}
|
||||
{% load i18n %}
|
||||
<div class="row">
|
||||
<div class="col-sm-12 col-md-9">
|
||||
<div class="ctf-block">
|
||||
<a href="{% url 'events:event_info' event_slug=player.event.slug %}">< Back to event</a>
|
||||
<div class="ctf-head">
|
||||
<h3>Edit info</h3>
|
||||
</div>
|
||||
<div class="bloc-body">
|
||||
<div class="col-sm-12 col-md-12 mx-auto">
|
||||
<!-- {{ u_form.non_field_errors }} -->
|
||||
{% if error is not None %}
|
||||
<span class="message error-msg">{{ error }}</span>
|
||||
{% elif success is not None %}
|
||||
<span class="message success-msg">{{ success }}</span>
|
||||
{% endif %}
|
||||
<form method='POST'>
|
||||
<div class="edit-infos-grp">
|
||||
{%csrf_token%}
|
||||
<label for="{{ p_form.name.id_for_label }}">{% trans "Team name" %} *</label>
|
||||
{{ p_form.name.errors}}
|
||||
{{p_form.name}}
|
||||
</br>
|
||||
<label for="{{ p_form.password.id_for_label }}">{% trans "Team password" %} *</label>
|
||||
{{p_form.password}}
|
||||
</br>
|
||||
<input class="form-control" type="submit" value="{% trans "Apply" %}">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item">{{ player.team.name }}</li>
|
||||
<li class="list-group-item">{% trans "Score" %} : {{ player.team.score }}</li>
|
||||
<!-- <li class="list-group-item">{% trans "Rank" %} : {{ rank }}</li> -->
|
||||
</ul>
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item">{% trans "Members" %}</li>
|
||||
{% for p in members %}
|
||||
<li class="list-group-item"><a class="profile_link" href="{% url 'accounts:profile' user_name=p.user.username %}">{{ p.user.username }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<form method='POST' action="{% url 'events:leave_team' event_slug=player.event.slug %}">
|
||||
{%csrf_token%}
|
||||
<li class="list-group-item">
|
||||
<input class="form-control" type="submit" value="{% trans "Leave Team" %}">
|
||||
</li>
|
||||
</form>
|
||||
{% if player.team.auto == False and player.event.auto_match == True %}
|
||||
<form method='POST' action="{% url 'events:open_team' event_slug=player.event.slug %}">
|
||||
{%csrf_token%}
|
||||
<li class="list-group-item">
|
||||
<input class="form-control" type="submit" value="{% trans "Open to automatching" %}">
|
||||
</li>
|
||||
</form>
|
||||
{% elif player.event.auto_match == True %}
|
||||
<form method='POST' action="{% url 'events:close_team' event_slug=player.event.slug %}">
|
||||
{%csrf_token%}
|
||||
<li class="list-group-item">
|
||||
<input class="form-control" type="submit" value="{% trans "Close to automatching" %}">
|
||||
</li>
|
||||
</form>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -0,0 +1,145 @@
|
|||
{% extends 'base.html' %}
|
||||
{% block content %}
|
||||
{% load i18n %}
|
||||
{% load key_value %}
|
||||
<div class="row">
|
||||
<div class="col-sm-12 col-md-9">
|
||||
<a href="{% url 'events:event_info' event_slug=event.slug %}">< Back to event</a>
|
||||
<div>
|
||||
<h4>Challenges Solved by {{ team.name }} - {{ event.name }}</h4>
|
||||
{% if solves%}
|
||||
|
||||
<div class="table table-dark">
|
||||
<div class="card-body">
|
||||
<div id="time-chart"></div>
|
||||
</div>
|
||||
</div>
|
||||
<table class="table table-dark">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">{% trans "Challenge Name" %}</th>
|
||||
<th scope="col">{% trans "Category" %}</th>
|
||||
<th scope="col">{% trans "Points" %}</th>
|
||||
<th scope="col">{% trans "Date" %}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for s in solves %}
|
||||
<tr>
|
||||
<th scope="row"><a href="{% url 'events:event_chall_info' event_slug=event.slug chall_slug=s.ctf.slug %}">{{ s.ctf.name }}</a></th>
|
||||
<td>{{ s.ctf.category.name}}</td>
|
||||
<td>{{ s.ctf.points }}</td>
|
||||
<td>{{ s.flag_date|date:"Y-m-d H:i:s" }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p>{% trans "It seems that this team has not solved any challenge yet..." %}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-none d-md-block col-10 col-md-3 right-sidebar">
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item">{{ team.name }}</li>
|
||||
<li class="list-group-item">{% trans "Score" %} : {{ score }}</li>
|
||||
<li class="list-group-item">{% trans "Rank" %} : {{ rank }}</li>
|
||||
</ul>
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item">{% trans "Members" %}</li>
|
||||
{% for user in users %}
|
||||
<li class="list-group-item"><a class="profile_link" href="{% url 'accounts:profile' user_name=user.username %}">{{ user.username }}</a></li>
|
||||
{% endfor %}
|
||||
|
||||
</ul>
|
||||
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item">{% trans "Categories stats" %}</li>
|
||||
{% for cat in catsDatas %}
|
||||
<li class="list-group-item" style="padding-bottom: 3;padding-top: 0;">
|
||||
<span>{{ cat.0 }}</span>
|
||||
<div class="progress">
|
||||
{% if cat.3 == '0' %}
|
||||
<div class="progress-bar bg-success" role="progressbar" style="width: 0%;color:#d9d9d9;" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">0 %</div>
|
||||
{% else %}
|
||||
<div class="progress-bar bg-success" role="progressbar" style="width: {{ cat.3 }}%" aria-valuenow="{{ cat.3 }}" aria-valuemin="0" aria-valuemax="100">{{ cat.3 }} %</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="https://code.highcharts.com/highcharts.src.js"></script>
|
||||
<script>
|
||||
Highcharts.theme={colors:["#2b908f","#90ee7e","#f45b5b","#7798BF","#aaeeee","#ff0066","#eeaaee","#55BF3B","#DF5353","#7798BF","#aaeeee"],chart:{backgroundColor:{linearGradient:{x1:0,y1:0,x2:1,y2:1},stops:[[0,"#1D1D1D"],[1,"#1D1D1D"]]},style:{fontFamily:"'Unica One', sans-serif"},plotBorderColor:"#606063"},title:{style:{color:"#E0E0E3",textTransform:"uppercase",fontSize:"20px"}},subtitle:{style:{color:"#E0E0E3",textTransform:"uppercase"}},xAxis:{gridLineColor:"#707073",labels:{style:{color:"#E0E0E3"}},lineColor:"#707073",minorGridLineColor:"#505053",tickColor:"#707073",title:{style:{color:"#A0A0A3"}}},yAxis:{gridLineColor:"#707073",labels:{style:{color:"#E0E0E3"}},lineColor:"#707073",minorGridLineColor:"#505053",tickColor:"#707073",tickWidth:1,title:{style:{color:"#A0A0A3"}}},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.85)",style:{color:"#F0F0F0"}},plotOptions:{series:{dataLabels:{color:"#F0F0F3",style:{fontSize:"13px"}},marker:{lineColor:"#333"}},boxplot:{fillColor:"#505053"},candlestick:{lineColor:"white"},errorbar:{color:"white"}},legend:{backgroundColor:"#1D1D1D",itemStyle:{color:"#E0E0E3"},itemHoverStyle:{color:"#FFF"},itemHiddenStyle:{color:"#606063"},title:{style:{color:"#C0C0C0"}}},credits:{style:{color:"#666"}},labels:{style:{color:"#707073"}},drilldown:{activeAxisLabelStyle:{color:"#F0F0F3"},activeDataLabelStyle:{color:"#F0F0F3"}},navigation:{buttonOptions:{symbolStroke:"#DDDDDD",theme:{fill:"#505053"}}},rangeSelector:{buttonTheme:{fill:"#505053",stroke:"#000000",style:{color:"#CCC"},states:{hover:{fill:"#707073",stroke:"#000000",style:{color:"white"}},select:{fill:"#000003",stroke:"#000000",style:{color:"white"}}}},inputBoxBorderColor:"#505053",inputStyle:{backgroundColor:"#333",color:"silver"},labelStyle:{color:"silver"}},navigator:{handles:{backgroundColor:"#666",borderColor:"#AAA"},outlineColor:"#CCC",maskFill:"rgba(255,255,255,0.1)",series:{color:"#7798BF",lineColor:"#A6C7ED"},xAxis:{gridLineColor:"#505053"}},scrollbar:{barBackgroundColor:"#808083",barBorderColor:"#808083",buttonArrowColor:"#CCC",buttonBackgroundColor:"#606063",buttonBorderColor:"#606063",rifleColor:"#FFF",trackBackgroundColor:"#404043",trackBorderColor:"#404043"}};
|
||||
|
||||
Highcharts.setOptions(Highcharts.theme);
|
||||
|
||||
Highcharts.chart('time-chart', {
|
||||
title: {
|
||||
text: 'Points earned for each category'
|
||||
},
|
||||
yAxis: {
|
||||
title: {
|
||||
text: 'Points earned'
|
||||
}
|
||||
},
|
||||
xAxis: {
|
||||
type: 'datetime',
|
||||
labels: {
|
||||
formatter: function() {
|
||||
return Highcharts.dateFormat('%d.%b %Y',
|
||||
this.value);
|
||||
}
|
||||
}
|
||||
},
|
||||
legend: {
|
||||
layout: 'vertical',
|
||||
align: 'right',
|
||||
verticalAlign: 'middle'
|
||||
},
|
||||
plotOptions: {
|
||||
pointStart: {{ event.start_date|timestamp_fromdate }},
|
||||
series: {
|
||||
label: {
|
||||
connectorAllowed: false
|
||||
},
|
||||
allowPointSelect: true,
|
||||
marker: {
|
||||
enabled: true
|
||||
}
|
||||
}
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: 'Total',
|
||||
data: {{ solved|safe }}
|
||||
},
|
||||
{% for cat in cats %}
|
||||
{
|
||||
name: '{{ cat.name }}',
|
||||
data: {{ pointDatas|keyvalue:cat.name|safe }},
|
||||
visible: false,
|
||||
},
|
||||
{% endfor %}
|
||||
],
|
||||
responsive: {
|
||||
rules: [{
|
||||
condition: {
|
||||
maxWidth: 500
|
||||
},
|
||||
chartOptions: {
|
||||
legend: {
|
||||
layout: 'horizontal',
|
||||
align: 'center',
|
||||
verticalAlign: 'bottom'
|
||||
}
|
||||
}
|
||||
}]
|
||||
}
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
from django import template
|
||||
from ctfs.models import CTF_flags
|
||||
from events.models import EventPlayer
|
||||
|
||||
register = template.Library()
|
||||
|
||||
@register.simple_tag
|
||||
def isflagged(user, ctf):
|
||||
flagged = False
|
||||
event_info = ctf.event
|
||||
|
||||
if user.is_authenticated == False:
|
||||
return ""
|
||||
if event_info.team_size == 1:
|
||||
if CTF_flags.objects.filter(user=user, ctf=ctf):
|
||||
flagged = True
|
||||
elif EventPlayer.objects.filter(user=user, event=event_info):
|
||||
player = EventPlayer.objects.get(user=user, event=event_info)
|
||||
solved_list = CTF_flags.objects.filter(ctf=ctf)
|
||||
for s in solved_list:
|
||||
tmp = EventPlayer.objects.get(user=s.user, event=event_info)
|
||||
if tmp.team == player.team:
|
||||
flagged = True
|
||||
|
||||
if flagged:
|
||||
return "success-msg"
|
||||
return ""
|
|
@ -0,0 +1,3 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
|
@ -0,0 +1,22 @@
|
|||
from django.urls import path
|
||||
from . import views
|
||||
|
||||
app_name = "events"
|
||||
|
||||
urlpatterns = [
|
||||
path('', views.events, name='events'),
|
||||
path('<str:event_slug>', views.event, name='event_info'),
|
||||
path('<str:event_slug>/challenge/<str:chall_slug>', views.chall_event_info, name='event_chall_info'),
|
||||
path('pwd/<str:event_slug>', views.submit_pwd, name='submit_pwd'),
|
||||
path('submitEventFlag/<str:event_slug>/<str:chall_slug>', views.submit_event_flag, name='submit_event_flag'),
|
||||
path('register/<str:event_slug>', views.register_to_event, name='register_event'),
|
||||
path('create_team/<str:event_slug>', views.create_team, name='create_team'),
|
||||
path('join_team/<str:event_slug>', views.join_team, name='join_team'),
|
||||
path('<str:event_slug>/profile/<str:user_name>', views.profile, name='profile'),
|
||||
path('<str:event_slug>/team/<str:name>', views.team_info, name='team_info'),
|
||||
path('<str:event_slug>/manage_team', views.manage_team, name='manage_team'),
|
||||
path('<str:event_slug>/leave_team', views.leave_team, name='leave_team'),
|
||||
path('find_team/<str:event_slug>', views.find_team, name='find_team'),
|
||||
path('<str:event_slug>/open_team', views.open_team, name='open_team'),
|
||||
path('<str:event_slug>/close_team', views.close_team, name='close_team'),
|
||||
]
|
|
@ -0,0 +1,10 @@
|
|||
from random import choice, randint
|
||||
|
||||
colors = ['blue', 'red', 'yellow', 'green', 'black', 'white', 'purple', 'orange', 'brown', 'fuchsia', 'gold', 'pink', 'cyan',
|
||||
'magenta', 'pearl']
|
||||
|
||||
animals = ['tiger', 'bee', 'dog', 'cat', 'otter', 'lizard', 'horse', 'mouse', 'butterfly', 'dolphin', 'elephant', 'falcon', 'goat',
|
||||
'cow', 'lion', 'ostrich']
|
||||
|
||||
def get_random_name():
|
||||
return choice(colors) + choice(animals) + str(randint(0, 100))
|
|
@ -0,0 +1,2 @@
|
|||
from .events import *
|
||||
from .teams import *
|
|
@ -0,0 +1,283 @@
|
|||
from django.shortcuts import render, get_object_or_404, redirect
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.contrib.auth.models import timezone
|
||||
from ..forms import submit_flag
|
||||
from ..models import Event, EventPlayer, Team
|
||||
from ctfs.models import CTF, CTF_flags, Category
|
||||
from django.utils.translation import get_language
|
||||
from django.contrib.auth.models import User
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from math import log
|
||||
|
||||
def get_description_by_lang(ctf):
|
||||
lang = get_language()
|
||||
ret = None
|
||||
if lang == "fr":
|
||||
ret = ctf.description
|
||||
elif lang == "en":
|
||||
ret = ctf.description_en
|
||||
elif lang == "de":
|
||||
ret = ctf.description_de
|
||||
elif lang == "ru":
|
||||
ret = ctf.description_ru
|
||||
return ret
|
||||
|
||||
def actualize_points(ctf):
|
||||
solves = CTF_flags.objects.filter(ctf=ctf)
|
||||
nb_solves = len(solves)
|
||||
|
||||
new_points = max(50 - int(log(nb_solves)*2.5)*5, 5)
|
||||
|
||||
if new_points != ctf.points:
|
||||
diff = ctf.points - new_points
|
||||
ctf.points = new_points
|
||||
ctf.save()
|
||||
for s in solves:
|
||||
player = EventPlayer.objects.get(event=ctf.event, user=s.user)
|
||||
player.score -= diff
|
||||
player.save()
|
||||
if player.team:
|
||||
player.team.score -= diff
|
||||
player.team.save()
|
||||
|
||||
# Create your views here.
|
||||
def events(request):
|
||||
list_events = Event.objects.filter().order_by('-end_date', 'start_date')
|
||||
return render(request, 'events/events_list.html', {'events' : list_events, 'curdate': timezone.now()})
|
||||
|
||||
def chall_event_info(request, event_slug, chall_slug):
|
||||
event_info = get_object_or_404(Event, slug=event_slug)
|
||||
ctf_info = get_object_or_404(CTF, event__slug=event_info.slug, slug=chall_slug)
|
||||
|
||||
if timezone.now() < ctf_info.pub_date:
|
||||
return redirect('events:event_info', event_slug=event_slug)
|
||||
eventisover = False
|
||||
alreadyflag = False
|
||||
congrat = False
|
||||
wrongflag = False
|
||||
errorform = False
|
||||
notsub = False
|
||||
noteam = False
|
||||
player = None
|
||||
if request.user.is_authenticated and not request.user.is_staff:
|
||||
player = EventPlayer.objects.filter(event=event_info, user=request.user)
|
||||
if not player:
|
||||
return redirect('events:event_info', event_slug=event_slug)
|
||||
elif not request.user.is_authenticated:
|
||||
return redirect('accounts:signin')
|
||||
if request.GET.get('EventIsOver') or timezone.now() > event_info.end_date:
|
||||
eventisover = True
|
||||
if request.GET.get('AlreadyFlagged'):
|
||||
alreadyflag = True
|
||||
if request.GET.get('Congrat'):
|
||||
congrat = True
|
||||
if request.GET.get('WrongFlag'):
|
||||
wrongflag = True
|
||||
if request.GET.get('ErrorInForm'):
|
||||
errorform = True
|
||||
if request.GET.get('NotRegistered'):
|
||||
notsub = True
|
||||
if request.GET.get('NoTeam'):
|
||||
noteam = True
|
||||
solved_challs = CTF_flags.objects.filter(ctf=ctf_info).order_by('flag_date')
|
||||
solved_list = []
|
||||
for s in solved_challs:
|
||||
if event_info.team_size > 1:
|
||||
solved_list.append([s.user, s.flag_date, EventPlayer.objects.get(event=event_info, user=s.user).team.name])
|
||||
else:
|
||||
solved_list.append([s.user, s.flag_date])
|
||||
description = get_description_by_lang(ctf_info)
|
||||
return render(request, 'events/ctf_info.html', { 'ctf' : ctf_info, 'event':event_info, 'solved_list': solved_list, 'description': description, 'eventisover': eventisover, 'alreadyflag': alreadyflag,
|
||||
'congrat': congrat, 'wrongflag': wrongflag, 'errorform': errorform, 'notsub': notsub, 'noteam':noteam})
|
||||
|
||||
def event(request, event_slug):
|
||||
event_info = get_object_or_404(Event, slug=event_slug)
|
||||
IsRegistered = False
|
||||
wrongpwd = False
|
||||
alreadyregistered = False
|
||||
subisover = False
|
||||
if request.GET.get('WrongPassword'):
|
||||
wrongpwd = True
|
||||
if request.GET.get('AlreadyRegistered'):
|
||||
alreadyregistered = True
|
||||
if request.GET.get('SubscriptionIsOver'):
|
||||
subisover = True
|
||||
if request.user.is_authenticated:
|
||||
try:
|
||||
player = EventPlayer.objects.get(event=event_info, user=request.user)
|
||||
except:
|
||||
player = None
|
||||
if player:
|
||||
IsRegistered = True
|
||||
if event_info.password:
|
||||
if request.user.is_authenticated:
|
||||
if request.user.is_staff is False:
|
||||
if not player:
|
||||
return render(request, 'events/event_pwd.html', {'event' : event_info, 'logged': True, 'wrongpwd': wrongpwd, 'alreadyregistered': alreadyregistered})
|
||||
else:
|
||||
return render(request, 'events/event_pwd.html', {'event' : event_info, 'logged': False, 'wrongpwd': wrongpwd, 'alreadyregistered': alreadyregistered})
|
||||
ended = False
|
||||
if timezone.now() >= event_info.end_date:
|
||||
ended = True
|
||||
begun = False
|
||||
if timezone.now() >= event_info.start_date:
|
||||
begun = True
|
||||
challenges = CTF.objects.filter(event=event_info, pub_date__lte=timezone.now()).order_by('category', 'points')
|
||||
if event_info.team_size == 1:
|
||||
solved_list = EventPlayer.objects.filter(event=event_info).order_by('-score', 'last_submission_date', 'user__username')
|
||||
else:
|
||||
solved_list = Team.objects.filter(event=event_info).order_by('-score', 'last_submission_date', 'name')
|
||||
return render(request, 'events/event_info.html', {'event' : event_info, 'IsRegistered': IsRegistered, 'ctfs': challenges, 'solved_list':solved_list,
|
||||
'ended': ended, 'begun': begun, 'wrongpwd': wrongpwd, 'alreadyregistered': alreadyregistered, 'subisover': subisover})
|
||||
|
||||
@login_required
|
||||
def submit_event_flag(request, event_slug, chall_slug):
|
||||
ev = get_object_or_404(Event, slug=event_slug)
|
||||
response = redirect('events:event_chall_info', event_slug=event_slug, chall_slug=chall_slug)
|
||||
flagged = False
|
||||
|
||||
if timezone.now() >= ev.end_date:
|
||||
response['Location'] += '?EventIsOver=1'
|
||||
return response
|
||||
|
||||
if request.method == 'POST':
|
||||
ctf_info = CTF.objects.get(event=ev, slug=chall_slug)
|
||||
if not ctf_info:
|
||||
response['Location'] += '?ChallengeNotFound=1'
|
||||
return response
|
||||
|
||||
try:
|
||||
player = EventPlayer.objects.get(event=ev, user=request.user)
|
||||
except:
|
||||
player = None
|
||||
|
||||
if player:
|
||||
if ev.team_size > 1 and player.team is None:
|
||||
response['Location'] += '?NoTeam=1'
|
||||
return response
|
||||
if ev.team_size == 1 and CTF_flags.objects.filter(user=request.user, ctf=ctf_info):
|
||||
flagged = True
|
||||
else:
|
||||
solved_list = CTF_flags.objects.filter(ctf=ctf_info)
|
||||
for s in solved_list:
|
||||
tmp = EventPlayer.objects.get(user=s.user, event=ev)
|
||||
if tmp.team == player.team:
|
||||
flagged = True
|
||||
if flagged == True:
|
||||
response['Location'] += '?AlreadyFlagged=1'
|
||||
return response
|
||||
|
||||
form = submit_flag(data=request.POST)
|
||||
|
||||
if form.is_valid():
|
||||
if ctf_info.flag == request.POST.get('flag'):
|
||||
new = CTF_flags(user = request.user, ctf = ctf_info, flag_date = timezone.now())
|
||||
new.save()
|
||||
if ctf_info.points > 0:
|
||||
player.last_submission_date = timezone.now()
|
||||
player.score += ctf_info.points
|
||||
player.save()
|
||||
if player.team:
|
||||
if ctf_info.points > 0:
|
||||
player.team.last_submission_date = timezone.now()
|
||||
player.team.score += ctf_info.points
|
||||
player.team.save()
|
||||
if ev.dynamic:
|
||||
actualize_points(ctf_info)
|
||||
response['Location'] += '?Congrat=1'
|
||||
return response
|
||||
else:
|
||||
response['Location'] += '?WrongFlag=1'
|
||||
return response
|
||||
else:
|
||||
response['Location'] += '?ErrorInForm=1'
|
||||
return response
|
||||
else:
|
||||
response['Location'] += '?NotRegistered=1'
|
||||
return response
|
||||
return response
|
||||
|
||||
@login_required
|
||||
def submit_pwd(request, event_slug):
|
||||
response = redirect('events:event_info', event_slug=event_slug)
|
||||
event_info = get_object_or_404(Event, slug=event_slug)
|
||||
if request.method == 'POST':
|
||||
if request.user.is_authenticated:
|
||||
ev = get_object_or_404(Event, slug=event_slug)
|
||||
if ev == False:
|
||||
response['Location'] += '?NoEventFound=1'
|
||||
return response
|
||||
|
||||
if request.POST.get('password') != ev.password:
|
||||
response['Location'] += '?WrongPassword=1'
|
||||
return response
|
||||
|
||||
if EventPlayer.objects.filter(user=request.user, event=ev).exists() or EventPlayer.objects.filter(user=request.user, event=ev).exists():
|
||||
response['Location'] += '?AlreadyRegistered=1'
|
||||
return response
|
||||
else:
|
||||
new = EventPlayer(user=request.user, event=ev)
|
||||
new.save()
|
||||
return redirect('events:event_info', event_slug=event_slug)
|
||||
|
||||
|
||||
@login_required
|
||||
def register_to_event(request, event_slug):
|
||||
response = redirect('events:event_info', event_slug=event_slug)
|
||||
if request.method == 'POST':
|
||||
if request.user.is_authenticated:
|
||||
ev = get_object_or_404(Event, slug=event_slug)
|
||||
if ev == False:
|
||||
response['Location'] += '?NoEventFound=1'
|
||||
return response
|
||||
if timezone.now() >= ev.end_date:
|
||||
response['Location'] += '?SubscriptionIsOver=1'
|
||||
return response
|
||||
if EventPlayer.objects.filter(user=request.user, event=ev).exists():
|
||||
response['Location'] += '?AlreadyRegistered=1'
|
||||
return response
|
||||
else:
|
||||
new = EventPlayer(user=request.user, event=ev, score=0)
|
||||
new.save()
|
||||
return redirect('events:event_info', event_slug=event_slug)
|
||||
|
||||
@login_required
|
||||
def profile(request, user_name, event_slug):
|
||||
catsDatas = []
|
||||
|
||||
event_info = get_object_or_404(Event, slug=event_slug)
|
||||
user_obj = get_object_or_404(User, username=user_name)
|
||||
player = EventPlayer.objects.get(user=user_obj, event=event_info)
|
||||
all_players = list(EventPlayer.objects.filter(event=event_info).order_by('-score', 'last_submission_date', 'user__username'))
|
||||
rank = all_players.index(get_object_or_404(EventPlayer, user=user_obj, event=event_info)) + 1
|
||||
all_cats = Category.objects.all()
|
||||
cats = [cat for cat in all_cats if CTF.objects.filter(category__name=cat.name, event=event_info)]
|
||||
pointDatas = {}
|
||||
|
||||
for cat in cats:
|
||||
# prepare categories
|
||||
solved_count = CTF_flags.objects.filter(user=user_obj, ctf__event=event_info , ctf__category__name=cat.name).count()
|
||||
max_count = CTF.objects.filter(category__name=cat.name, event=event_info).count()
|
||||
# get datas
|
||||
somme = 0
|
||||
solved = CTF_flags.objects.filter(user=user_obj, ctf__category__name=cat.name, ctf__event=event_info).order_by('flag_date')
|
||||
pointDatas[cat.name] = []
|
||||
pointDatas[cat.name].append([event_info.start_date.timestamp() * 1000, 0])
|
||||
percent = (solved_count / max_count) * 100
|
||||
catsDatas.append([cat.name, solved_count, max_count, '{:.0f}'.format(percent)])
|
||||
for flag in solved:
|
||||
somme += flag.ctf.points
|
||||
pointDatas[cat.name].append([flag.flag_date.timestamp() * 1000, somme])
|
||||
|
||||
solves = CTF_flags.objects.filter(user=user_obj, ctf__event=event_info).order_by('-flag_date')
|
||||
solved = []
|
||||
somme = 0
|
||||
solved.append([event_info.start_date.timestamp() * 1000, 0])
|
||||
for s in solves.reverse():
|
||||
somme += s.ctf.points
|
||||
solved.append([s.flag_date.timestamp() * 1000,somme])
|
||||
|
||||
return render(request,'accounts/profile.html', {'user':user_obj, 'solves':solves,'solved':solved,'catsDatas': catsDatas, 'pointDatas': pointDatas,
|
||||
'rank': rank, 'score' : somme, 'cats':cats})
|
||||
|
||||
|
|
@ -0,0 +1,202 @@
|
|||
from django.shortcuts import render, get_object_or_404, redirect
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from ..forms import TeamUpdateForm
|
||||
from ..models import Event, EventPlayer, Team
|
||||
from ctfs.models import CTF, CTF_flags, Category
|
||||
from django.contrib.auth.models import User
|
||||
from django.db.models import Q
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from ..utils import get_random_name
|
||||
from random import randint
|
||||
|
||||
@login_required
|
||||
def create_team(request, event_slug):
|
||||
ev = get_object_or_404(Event, slug=event_slug)
|
||||
if request.method == 'POST':
|
||||
if request.user.is_authenticated and ev.team_size > 1:
|
||||
if Team.objects.filter(name=request.POST.get('teamname'), event=ev).exists():
|
||||
return render(request, 'events/create_team.html', {'event' : ev, 'logged': True, 'wrongpwd': False, 'registered' : True, 'exist' : True})
|
||||
new = Team(name=request.POST.get('teamname'), password=request.POST.get('password'), event=ev)
|
||||
new.save()
|
||||
player = EventPlayer.objects.get(user=request.user, event=ev)
|
||||
player.team = new
|
||||
player.save()
|
||||
return redirect('events:event_info', event_slug=event_slug)
|
||||
else:
|
||||
return render(request, 'events/create_team.html', {'event' : ev, 'logged': True, 'wrongpwd': False, 'registered' : True, 'exist' : False})
|
||||
|
||||
@login_required
|
||||
def join_team(request, event_slug):
|
||||
ev = get_object_or_404(Event, slug=event_slug)
|
||||
if request.method == 'POST':
|
||||
if request.user.is_authenticated and ev.team_size > 1:
|
||||
try:
|
||||
team = Team.objects.get(name=request.POST.get('teamname'), event=ev)
|
||||
except:
|
||||
team = None
|
||||
if team is None:
|
||||
return render(request, 'events/join_team.html', {'event' : ev, 'logged': True, 'wrongpwd': True, 'registered' : True, 'notexist' : True})
|
||||
else:
|
||||
members = EventPlayer.objects.filter(team=team)
|
||||
if request.POST.get('password') != team.password:
|
||||
return render(request, 'events/join_team.html', {'event' : ev, 'logged': True, 'wrongpwd': True, 'registered' : True, 'notexist' : False})
|
||||
if members.count() >= ev.team_size:
|
||||
return render(request, 'events/join_team.html', {'event' : ev, 'logged': True, 'wrongpwd': False, 'registered' : True, 'notexist' : False, 'max' : True})
|
||||
else:
|
||||
player = EventPlayer.objects.get(user=request.user, event=ev)
|
||||
player.team = team
|
||||
player.save()
|
||||
return redirect('events:event_info', event_slug=event_slug)
|
||||
else:
|
||||
return render(request, 'events/join_team.html', {'event' : ev, 'logged': True, 'wrongpwd': False, 'registered' : True, 'notexist' : False})
|
||||
|
||||
@login_required
|
||||
def team_info(request, name, event_slug):
|
||||
event_info = get_object_or_404(Event, slug=event_slug)
|
||||
team = Team.objects.get(name=name, event=event_info)
|
||||
|
||||
catsDatas = []
|
||||
|
||||
players = EventPlayer.objects.filter(team=team, event=event_info)
|
||||
users = [p.user for p in players]
|
||||
all_teams = list(Team.objects.filter(event=event_info).order_by('-score', 'last_submission_date', 'name'))
|
||||
rank = all_teams.index(get_object_or_404(Team, id=team.id, event=event_info)) + 1
|
||||
all_cats = Category.objects.all()
|
||||
cats = [cat for cat in all_cats if CTF.objects.filter(category__name=cat.name, event=event_info)]
|
||||
pointDatas = {}
|
||||
|
||||
for cat in cats:
|
||||
# prepare categories
|
||||
solved_count = 0
|
||||
solved = []
|
||||
max_count = CTF.objects.filter(category__name=cat.name, event=event_info).count()
|
||||
somme = 0
|
||||
pointDatas[cat.name] = [[event_info.start_date.timestamp()*1000, 0]]
|
||||
for user_obj in users:
|
||||
# get datas
|
||||
solved_count += CTF_flags.objects.filter(user=user_obj, ctf__event=event_info , ctf__category__name=cat.name).count()
|
||||
solved += CTF_flags.objects.filter(user=user_obj, ctf__category__name=cat.name, ctf__event=event_info).order_by('flag_date')
|
||||
percent = (solved_count / max_count) * 100
|
||||
catsDatas.append([cat.name, solved_count, max_count, '{:.0f}'.format(percent)])
|
||||
for flag in solved:
|
||||
somme += flag.ctf.points
|
||||
pointDatas[cat.name].append([flag.flag_date.timestamp() * 1000, somme])
|
||||
|
||||
query = Q()
|
||||
for user_obj in users:
|
||||
query |= Q(user=user_obj)
|
||||
query &= Q(ctf__event=event_info)
|
||||
|
||||
solves = CTF_flags.objects.filter(query).order_by('-flag_date')
|
||||
solved = []
|
||||
somme = 0
|
||||
solved.append([event_info.start_date.timestamp() * 1000, 0])
|
||||
for s in solves.reverse():
|
||||
somme += s.ctf.points
|
||||
solved.append([s.flag_date.timestamp() * 1000,somme])
|
||||
|
||||
return render(request,'events/team.html', {'users':users, 'solves':solves,'solved':solved,'catsDatas': catsDatas, 'pointDatas': pointDatas,
|
||||
'rank': rank, 'team':team, 'score':somme, 'event':event_info, 'cats':cats})
|
||||
|
||||
@login_required
|
||||
def manage_team(request, event_slug):
|
||||
event_info = get_object_or_404(Event, slug=event_slug)
|
||||
player = EventPlayer.objects.get(user=request.user, event=event_info)
|
||||
if not player.team:
|
||||
return render(request, 'events/create_team.html', {'event' : event_info, 'logged': True, 'wrongpwd': False, 'registered' : True, 'notexist' : False})
|
||||
members = EventPlayer.objects.filter(team=player.team, event=event_info)
|
||||
|
||||
if request.method == 'POST':
|
||||
tname = player.team.name
|
||||
p_form = TeamUpdateForm(request.POST, instance=player.team)
|
||||
error = None
|
||||
success = None
|
||||
if p_form.is_valid():
|
||||
pname = p_form.cleaned_data['name']
|
||||
if pname == tname:
|
||||
pass
|
||||
else:
|
||||
if Team.objects.filter(name=pname, event=event_info).exists():
|
||||
error = _("Name already taken.")
|
||||
ppassword = p_form.cleaned_data['password']
|
||||
if error is None:
|
||||
p_form.save()
|
||||
success = _("Updated.")
|
||||
|
||||
context={'p_form': p_form, 'error':error, 'success' : success, 'player':player, 'members':members}
|
||||
return render(request, 'events/manage_team.html', context)
|
||||
else:
|
||||
p_form = TeamUpdateForm(instance=player.team)
|
||||
context={'p_form': p_form, 'player':player, 'members':members}
|
||||
return render(request, 'events/manage_team.html',context)
|
||||
|
||||
|
||||
@login_required
|
||||
def leave_team(request, event_slug):
|
||||
event_info = get_object_or_404(Event, slug=event_slug)
|
||||
player = EventPlayer.objects.get(user=request.user, event=event_info)
|
||||
team = Team.objects.get(event=event_info, name=player.team.name)
|
||||
|
||||
team.score -= player.score
|
||||
team.save()
|
||||
player.team = None
|
||||
solved = CTF_flags.objects.filter(user=player.user, ctf__event=event_info)
|
||||
player.score = 0
|
||||
solved.delete()
|
||||
player.save()
|
||||
|
||||
members = EventPlayer.objects.filter(team=team, event=event_info)
|
||||
if members.count() == 0:
|
||||
team.delete()
|
||||
|
||||
return redirect('events:event_info', event_slug=event_slug)
|
||||
|
||||
@login_required
|
||||
def find_team(request, event_slug):
|
||||
event_info = get_object_or_404(Event, slug=event_slug)
|
||||
teams = Team.objects.filter(event=event_info, auto=True)
|
||||
team = None
|
||||
player = EventPlayer.objects.get(user=request.user, event=event_info)
|
||||
|
||||
if event_info.auto_match == False:
|
||||
return redirect('events:event_info', event_slug=event_slug)
|
||||
for t in teams:
|
||||
if EventPlayer.objects.filter(team=t, event=event_info).count() < event_info.team_size:
|
||||
team = t
|
||||
break
|
||||
|
||||
if team is None:
|
||||
teamname = get_random_name()
|
||||
while Team.objects.filter(name=teamname, event=event_info).exists():
|
||||
teamname = get_random_name()
|
||||
team = Team(name=teamname, password="".join([str(randint(0,10)) for _ in range(16)]), event=event_info, auto=True)
|
||||
team.save()
|
||||
|
||||
player.team = team
|
||||
player.save()
|
||||
|
||||
return redirect('events:event_info', event_slug=event_slug)
|
||||
|
||||
@login_required
|
||||
def open_team(request, event_slug):
|
||||
event_info = get_object_or_404(Event, slug=event_slug)
|
||||
player = EventPlayer.objects.get(user=request.user, event=event_info)
|
||||
|
||||
if not player.team:
|
||||
return render(request, 'events/create_team.html', {'event' : event_info, 'logged': True, 'wrongpwd': False, 'registered' : True, 'notexist' : False})
|
||||
|
||||
player.team.auto = True
|
||||
player.team.save()
|
||||
return redirect('events:manage_team', event_slug=event_slug)
|
||||
|
||||
@login_required
|
||||
def close_team(request, event_slug):
|
||||
event_info = get_object_or_404(Event, slug=event_slug)
|
||||
player = EventPlayer.objects.get(user=request.user, event=event_info)
|
||||
|
||||
if not player.team:
|
||||
return render(request, 'events/create_team.html', {'event' : event_info, 'logged': True, 'wrongpwd': False, 'registered' : True, 'notexist' : False})
|
||||
|
||||
player.team.auto = False
|
||||
player.team.save()
|
||||
return redirect('events:manage_team', event_slug=event_slug)
|
|
@ -0,0 +1,33 @@
|
|||
# Generated by Django 3.2.7 on 2021-09-07 19:12
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('home', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='new',
|
||||
name='content_de',
|
||||
field=models.TextField(blank=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='new',
|
||||
name='content_en',
|
||||
field=models.TextField(blank=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='new',
|
||||
name='content_ru',
|
||||
field=models.TextField(blank=True),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='new',
|
||||
name='content',
|
||||
field=models.TextField(blank=True),
|
||||
),
|
||||
]
|
|
@ -2,7 +2,10 @@ from django.db import models
|
|||
|
||||
class new(models.Model):
|
||||
name = models.CharField(max_length=100)
|
||||
content = models.TextField()
|
||||
content = models.TextField(blank=True)
|
||||
content_en = models.TextField(blank=True)
|
||||
content_ru = models.TextField(blank=True)
|
||||
content_de = models.TextField(blank=True)
|
||||
slug = models.SlugField(max_length=55)
|
||||
pub_date = models.DateTimeField('Date published')
|
||||
def __str__(self):
|
||||
|
|
|
@ -0,0 +1,68 @@
|
|||
{% extends 'base.html' %}
|
||||
{% block content %}
|
||||
{% load i18n %}
|
||||
{% get_current_language as lang %}
|
||||
<div class="row">
|
||||
<div class="col-12 news-card">
|
||||
<h2>Conditions générales d'utilisation du site 42CTF</h2>
|
||||
|
||||
<h5>Article 1 : Objet</h5>
|
||||
|
||||
Les présentes CGU ou Conditions Générales d’Utilisation encadrent juridiquement l’utilisation des services du site 42CTF (ci-après dénommé « le site »). <br><br>
|
||||
|
||||
Constituant le contrat entre les éditeurs de 42CTF et l’Utilisateur, l’accès au site doit être précédé de l’acceptation de ces CGU. L’accès à cette plateforme signifie l’acceptation des présentes CGU. <br><br>
|
||||
|
||||
<h5>Article 2 : Mentions légales</h5>
|
||||
|
||||
L’hébergeur du site 42ctf.org est la société Google LLC, sise au 1600 Amphitheatre Parkway à Mountain View, États Unis.<br><br>
|
||||
|
||||
<h5>Article 3 : Accès au site</h5>
|
||||
|
||||
Le site 42CTF permet d’accéder gratuitement aux services suivants : <br>
|
||||
- challenges en sécurité informatique disponibles de manière permanente<br>
|
||||
- compétitions en sécurité informatique à durée limitée<br><br>
|
||||
|
||||
Le site est accessible gratuitement depuis n’importe où par tout utilisateur disposant d’un accès à Internet. Tous les frais nécessaires pour l’accès aux services (matériel informatique, connexion Internet…) sont à la charge de l’utilisateur.<br>
|
||||
L’accès aux services dédiés aux membres s’effectue à l’aide d’un identifiant et d’un mot de passe.<br>
|
||||
Pour des raisons de maintenance ou autres, l’accès au site peut être interrompu ou suspendu par l’éditeur sans préavis ni justification.<br><br>
|
||||
|
||||
|
||||
<h5>Article 4 : Collecte des données</h5>
|
||||
|
||||
Pour la création du compte de l’Utilisateur, la collecte des informations au moment de l’inscription sur le site est nécessaire et obligatoire. Conformément à la loi n°78-17 du 6 janvier relative à l’informatique, aux fichiers et aux libertés, la collecte et le traitement d’informations personnelles s’effectuent dans le respect de la vie privée.<br>
|
||||
Suivant la loi Informatique et Libertés en date du 6 janvier 1978, articles 39 et 40, l’Utilisateur dispose du droit d’accéder, de rectifier, de supprimer et d’opposer ses données personnelles. L’exercice de ce droit s’effectue par :<br>
|
||||
- Son espace utilisateur ;<br>
|
||||
- Demande écrite par mail à 42ctf@protonmail.com .<br><br>
|
||||
|
||||
<h5>Article 5 : Propriété intellectuelle</h5>
|
||||
|
||||
Les marques, logos ainsi que les contenus du site 42CTF (illustrations graphiques, textes…) sont protégés par le Code de la propriété intellectuelle et par le droit d’auteur.<br>
|
||||
La reproduction et la copie des contenus par l’Utilisateur requièrent une autorisation préalable du site. Dans ce cas, toute utilisation à des usages commerciaux ou à des fins publicitaires est proscrite.<br><br>
|
||||
|
||||
<h5>Article 6 : Responsabilité</h5>
|
||||
|
||||
Bien que les informations publiées sur le site soient réputées fiables, le site se réserve la faculté d’une non-garantie de la fiabilité des sources.<br>
|
||||
Les informations diffusées sur le site 42CTF sont présentées à titre purement informatif et sont sans valeur contractuelle. En dépit des mises à jour régulières, la responsabilité du site ne peut être engagée en cas de modification des dispositions administratives et juridiques apparaissant après la publication. Il en est de même pour l’utilisation et l’interprétation des informations communiquées sur la plateforme.<br><br>
|
||||
|
||||
Le site décline toute responsabilité concernant les éventuels virus pouvant infecter le matériel informatique de l’Utilisateur après l’utilisation ou l’accès à ce site.
|
||||
Le site ne peut être tenu pour responsable en cas de force majeure ou du fait imprévisible et insurmontable d’un tiers.<br>
|
||||
La garantie totale de la sécurité et la confidentialité des données n’est pas assurée par le site. Cependant, le site s’engage à mettre en œuvre toutes les méthodes requises pour le faire au mieux.<br><br>
|
||||
|
||||
<h5>Article 7 : Liens hypertextes</h5>
|
||||
Le site peut être constitué de liens hypertextes. En cliquant sur ces derniers, l’Utilisateur sortira de la plateforme. Cette dernière n’a pas de contrôle et ne peut pas être tenue responsable du contenu des pages web relatives à ces liens.<br><br>
|
||||
|
||||
<h5>Article 8 : Cookies</h5>
|
||||
|
||||
En naviguant sur le site, l’Utilisateur accepte les cookies. <br><br>
|
||||
|
||||
<h5>Article 9 : Durée du contrat</h5>
|
||||
|
||||
Le présent contrat est valable pour une durée indéterminée. Le début de l’utilisation des services du site marque l’application du contrat à l’égard de l’Utilisateur.<br><br>
|
||||
|
||||
<h5>Article 10 : Droit applicable et juridiction compétente</h5>
|
||||
|
||||
Le présent contrat est soumis à la législation française. L’absence de résolution à l’amiable des cas de litige entre les parties implique le recours aux tribunaux français compétents pour régler le contentieux.
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -1,14 +1,43 @@
|
|||
{% extends 'base.html' %}
|
||||
{% block content %}
|
||||
{% load i18n %}
|
||||
{% get_current_language as lang %}
|
||||
{% load is_member %}
|
||||
{% load get_news %}
|
||||
<div class="row">
|
||||
<div class="col-lg-9 col-sm-12 news-card">
|
||||
<div class="col-lg-3 col-sm-12 right-sidebar middle-sm">
|
||||
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item">Top 10</li>
|
||||
{% for t in top %}
|
||||
{% ismember t.user.userprofileinfo as is_member %}
|
||||
<li class="list-group-item text-truncate"># {{ forloop.counter }}
|
||||
<a class="profile_link {{is_member}}" href="{% url 'accounts:profile' user_name=t.user.username %}"> {{ t.user.username }}</a>
|
||||
<span style="position:absolute;right: 15px;">{{ t.score }}</span></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item">{% trans "Weekly Top 5" %}</li>
|
||||
{% for user, score in top_weekly %}
|
||||
{% ismember user as is_member %}
|
||||
<li class="list-group-item text-truncate"># {{ forloop.counter }}
|
||||
<a class="profile_link {{is_member}}" href="{% url 'accounts:profile' user_name=user %}"> {{ user }}</a>
|
||||
<span style="position:absolute;right: 15px;">{{ score }}</span></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<div class="col-lg-6 col-sm-12 news-card top-sm">
|
||||
{% if news %}
|
||||
{% for n in news %}
|
||||
<div class="card text-center news-card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">{{ n.name|safe }}</h5>
|
||||
<p class="card-text">{{ n.content|safe }}</p>
|
||||
<p class="card-text">
|
||||
{% get_news_by_lang n lang as content %}
|
||||
{{ content | safe }}
|
||||
</p>
|
||||
</div>
|
||||
<div class="card-footer text-muted">
|
||||
{{ n.pub_date }}
|
||||
|
@ -19,27 +48,46 @@
|
|||
<p class="text-center">{% trans "No article available." %}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="col-lg-3 col-sm-12 right-sidebar">
|
||||
<div class="col-lg-3 col-sm-12 right-sidebar bottom-sm">
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item active">{% trans "Latest challenges added" %}</li>
|
||||
{% if ctfs %}
|
||||
{% for ctf in ctfs %}
|
||||
<a class="list-group-item" href="/ctfs/{{ ctf.category.slug }}/{{ ctf.slug }}">{{ ctf.name }}</a>
|
||||
<li class="list-group-item">
|
||||
<a class="ctf-link" href="{% url 'ctf' cat_slug=ctf.category.slug ctf_slug=ctf.slug %}">{{ ctf.name }}</a>
|
||||
<span style="position:absolute;right: 15px;">{{ctf.points}} {% trans "points" %}</span>
|
||||
</li>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<li class="list-group-item">{% trans "No ctf available." %}</li>
|
||||
<li class="list-group-item">{% trans "No ctf available." %}</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item active">Top 10</li>
|
||||
{% for t in top %}
|
||||
<li class="list-group-item"># {{ forloop.counter }} <a class="profile_link" href="/accounts/profile/{{ t.user.username }}"> {{ t.user.username }}</a> <span style="position:absolute;right: 15px;">{{ t.score }}</span></li>
|
||||
<li class="list-group-item">{% trans "Latest Flags" %}</li>
|
||||
{% for f in latest_flags %}
|
||||
{% ismember f.user.userprofileinfo as is_member %}
|
||||
<li class="list-group-item text-truncate">
|
||||
<a class="ctf-link" href="{% url 'ctf' cat_slug=f.ctf.category.slug ctf_slug=f.ctf.slug %}"> {{f.ctf}}</a>
|
||||
<span style="position:absolute;right: 15px;">
|
||||
<a class="profile_link {{is_member}}" href="{% url 'accounts:profile' user_name=f.user.username %}">{{ f.user.username }}</a>
|
||||
</span>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<div class="row flex-nowrap">
|
||||
<div class="col-lg-6 col-md-6">
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item active">{% trans "Flags counter" %}</li>
|
||||
<li class="list-group-item active">{% trans "Flags" %}</li>
|
||||
<li class="list-group-item"><span>{{ flags }}</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-lg-6 col-md-6">
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item active">{% trans "Users" %}</li>
|
||||
<li class="list-group-item"><span>{{ nb_users }}</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
Wie Sie es vielleicht schon wissen, braucht man um CTF Herausforderungen zu lösen viele Werkzeuge und es ist manchmal schwierig zu wissen welche benötigt werden.</br>
|
||||
Wir haben eine VM erstellt, mit vorinstallierten Werkzeugen, damit Sie sich auf das wesentliche konzentrieren können: Flaggen!</br>
|
||||
Alles was Sie tun müssen ist diese <b><a href="/media/xubuntu-42ctf.ova">OVA</a></b> herunterzuladen und auf <b><a href="https://www.virtualbox.org/wiki/Downloads">Virtual Box</a></b> zu importieren.<br>
|
||||
Also, worauf warten Sie?
|
|
@ -0,0 +1,7 @@
|
|||
Haben Sie eine Änderung am Punktestand bemerkt?<br><br>
|
||||
|
||||
Keine Panik, alle Ihre Flaggen sind in Sicherheit. Wir haben bloß zu dynamischen Belohnungen gewächselt. Das heißt, dass die Punktzahl der Herausforderungen nicht mehr festgelegt ist: sie sinken nun jedes Mal, dass die Herausforderung gelöst wird.
|
||||
|
||||
Belohnungspunkte beginnen bei 200 und können nicht unter 5 fallen.<br><br>
|
||||
|
||||
Wir erhoffen, dass dadurch die echte Schwierigkeit der Herausforderungen besser gespiegelt werden kann. Zeitgebundene Ereignisse sind von dieser Änderung nicht beinträchtigt.
|
|
@ -0,0 +1,9 @@
|
|||
Suchen Sie Ihren Seelenverwandten, einen neuen Freund oder bloß einen dezenten CTF-Partner?<br><br>
|
||||
|
||||
Wir bei 42CTF haben was Sie brauchen: den <a href="/events/speed_dating_2022">Speed Dating CTF</a>!<br><br>
|
||||
|
||||
Kommen Sie alleine oder gut begleitet zu diesem sehr kurzen Wettbewerb, der nur 4 Studen dauern wird.<br>
|
||||
Für dieses Team-CTF können Sie nur auf einen anderen Spieler zählen.<br>
|
||||
Sie können entweder Ihren Partner aussuchen oder das Schicksal für sie entscheiden lassen.<br><br>
|
||||
|
||||
Viel Glück!
|
|
@ -0,0 +1,8 @@
|
|||
Schon immer lust gehabt etwas über SQL-Einbrüche zu lernen?<br>
|
||||
<br>
|
||||
Wir bieten Ihnen drei brandneue Herausvorderungen erstellt von <b><a class=profile_link href=https://www.42ctf.org/accounts/profile/aldubar>aldubar</a></b>:<br>
|
||||
- <b><a href='https://www.42ctf.org/ctfs/web/simple_question_1'>Simple Question of Logic 1</a></b> (10 Punkte)<br>
|
||||
- <b><a href='https://www.42ctf.org/ctfs/web/simple_question_2'>Simple Question of Logic 2</a></b> (30 Punkte)<br>
|
||||
- <b><a href='https://www.42ctf.org/ctfs/web/simple_question_3'>Simple Question of Logic 3</a></b> (40 Punkte)<br>
|
||||
<br>
|
||||
Vergessen Sie nicht, dass Sie uns jederzeit auf <a class="footer_imgs" href="https://discord.gg/DwZqPpA" target="_blank"><img src="/static/img/discord.png" width="30"></a> erreichen können, um uns neue Herausforderungen vorzuschalgen!
|
|
@ -0,0 +1,9 @@
|
|||
Neues zeitgebundenes Ereignis: <b>Welcome CTF 2021</b>!<br><br>
|
||||
|
||||
Datum: vom 10.12.2021 20 Uhr biz zum 12.12.2021 20 Uhr (Pariser Zeit).<br>
|
||||
Es ist ein CTF um die Studenten die neulich 42 beigetreten haben zu begrüßen.<br>
|
||||
Es wird nur für die Personen die ihren Kursus <b>nach</b> dem 01.09.2021 begonnen haben zugänglich sein.<br><br>
|
||||
|
||||
Ansonsten können Sie trotzdem die auf der Webseite bereits verfügbaren Herausforderungen lösen und versuchen das Top 10 zu erreichen!<br><br>
|
||||
|
||||
Registrieren Sie sich <a href=https://forms.42l.fr/apps/forms/SooTbnT4PCs9na7C>hier</a>.
|
|
@ -0,0 +1,4 @@
|
|||
As you may already be aware, solving CTF challenges require a lot of tools and it may be difficult to find out which ones you need to install. </br>
|
||||
We've made a VM with everything you need for 42CTF challenges so that you can focus on what is really important: flag ! </br>
|
||||
All you need to do is download this <b><a href="/media/xubuntu-42ctf.ova">OVA</a></b> and import it in <b><a href="https://www.virtualbox.org/wiki/Downloads">Virtual Box</a>.<br></b>
|
||||
So, what are you waiting for ?
|
|
@ -0,0 +1,7 @@
|
|||
You noticed a little change in the 42CTF scoreboard ?<br><br>
|
||||
|
||||
Don't panic, all your flags are safe and sound. We just switched to dynamic scoring. It means that challenges points are not fixed anymore: they will now decrease with each solve.<br>
|
||||
|
||||
Challenges points start at 200, and cannot go below than 5.<br><br>
|
||||
|
||||
We hope that this will allow better reflecting of the actual difficulty of the challenges. Limited-time events are not affected by this change.
|
|
@ -0,0 +1,9 @@
|
|||
Looking for your soul mate, a new friend, or just a decent CTF companion ?<br><br>
|
||||
|
||||
We at 42CTF have what you need: the <a href="/events/speed_dating_2022">Speed Dating CTF</a> !<br><br>
|
||||
|
||||
Come alone or in good company for this very short competition, which will last only 4 hours.<br>
|
||||
You will be able to count on only one other player for this team CTF.<br>
|
||||
You can either choose your partner or you can let the fate decide for you.<br><br>
|
||||
|
||||
Good luck !
|
|
@ -0,0 +1,8 @@
|
|||
Always wanted to learn about SQL injections ? <br>
|
||||
<br>
|
||||
We offer you three brand new challenges created by <b><a class=profile_link href=https://www.42ctf.org/accounts/profile/aldubar>aldubar</a></b>:<br>
|
||||
- <b><a href='https://www.42ctf.org/ctfs/web/simple_question_1'>Simple Question of Logic 1</a></b> (10 points)<br>
|
||||
- <b><a href='https://www.42ctf.org/ctfs/web/simple_question_2'>Simple Question of Logic 2</a></b> (30 points)<br>
|
||||
- <b><a href='https://www.42ctf.org/ctfs/web/simple_question_3'>Simple Question of Logic 3</a></b> (40 points)<br>
|
||||
<br>
|
||||
Don't forget that you can always reach out on <a class="footer_imgs" href="https://discord.gg/DwZqPpA" target="_blank"><img src="/static/img/discord.png" width="30"></a> to propose new challenges !
|
|
@ -0,0 +1,9 @@
|
|||
New limited-time event : <b>Welcome CTF 2021</b> !<br><br>
|
||||
|
||||
Dates: from 10/12/2021 8pm to 12/12/2021 8pm (Paris time).<br>
|
||||
This is a CTF to welcome the new students who join us at 42.<br>
|
||||
It will be accessible only for the persons who started their cursus <b>after</b> the 01/09/2021.<br><br>
|
||||
|
||||
For the others, you can still solve the challenges already available on the website and try to reach the top 10 ! <br><br>
|
||||
|
||||
Registration <a href=https://forms.42l.fr/apps/forms/SooTbnT4PCs9na7C>here</a>
|
|
@ -0,0 +1,4 @@
|
|||
Como ya sabrás, resolver retos CTF requiere un montón de herramientas y puede ser dificil encontrar cuales tienes que instalar. </br>
|
||||
Hemos hecho una máquina virtual con todo lo que necesitas para resolver para resolver retos de 42CTF, para que te puedas concentrar en lo importante: Flags! </br>
|
||||
Todo lo que necesitas es descargar esto <b><a href="/media/xubuntu-42ctf.ova">OVA</a></b> e importarlo en <b><a href="https://www.virtualbox.org/wiki/Downloads">Virtual Box</a>.<br></b>
|
||||
¿A qué estás esperando?
|
|
@ -0,0 +1,7 @@
|
|||
¿ Has notado un pequeño cambio en la Tabla de Puntos de 42CTF ?<br><br>
|
||||
|
||||
No entres en pánico, todas tus flags estan a salvo. Solo hemos cambiado a puntuación dinámica. Esto significa que los puntos de retos no son fijos: irán disminuyendo cada vez que son resueltos.<br>
|
||||
|
||||
Los puntos de retos empiezan en 200, y no pueden valer menos de 5 puntos. <br><br>
|
||||
|
||||
Esperamos que esto ayude a reflejar la dificultad del reto. Eventos de tiempo limitado nos e ven afectados por este cambio.
|
|
@ -0,0 +1,9 @@
|
|||
¿ Estás buscando tu alma gemela ? ¿ Un nuevo amigo ? ¿ O simplemente un buen compañero de CTF ?<br><br>
|
||||
|
||||
Aquí en 42CTF tenemos lo que necesitas: el <a href="/events/speed_dating_2022">Speed Dating CTF</a> !<br><br>
|
||||
|
||||
Ven solo o en compañía a esta competición cortita, que solo durará 4 horas.<br>
|
||||
Podrás contar con un solo compañero para este CTF por equipos.<br>
|
||||
Puedes o elegir un compañero o dejar a la fortuna que elija por ti.<br><br>
|
||||
|
||||
¡ Buena suerte !
|
|
@ -0,0 +1,8 @@
|
|||
¿ Siempre has querido aprender sobre SQL injection ? <br>
|
||||
<br>
|
||||
Te ofrecemos tres nuevos retos creados por <b><a class=profile_link href=https://www.42ctf.org/accounts/profile/aldubar>aldubar</a></b>:<br>
|
||||
- <b><a href='https://www.42ctf.org/ctfs/web/simple_question_1'>Cuestión de lógica simple 1</a></b> (10 puntos)<br>
|
||||
- <b><a href='https://www.42ctf.org/ctfs/web/simple_question_2'>Cuestión de lógica simple 2</a></b> (30 puntos)<br>
|
||||
- <b><a href='https://www.42ctf.org/ctfs/web/simple_question_3'>Cuestión de lógica simple 3</a></b> (40 puntos)<br>
|
||||
<br>
|
||||
No te olvides que siempre puedes contactarnos en <a class="footer_imgs" href="https://discord.gg/DwZqPpA" target="_blank"><img src="/static/img/discord.png" width="30"></a> para proponer nuevos retos !
|
|
@ -0,0 +1,9 @@
|
|||
Nuevo evento de tiempo limitado: <b>Bienvenida a CTF 2021</b> !<br><br>
|
||||
|
||||
Fechas: desde 10/12/2021 8pm a 12/12/2021 8pm (Hora parís).<br>
|
||||
Este CTF es una bienvenida para los nuevos estudiantes que se unan a 42.<br>
|
||||
Solo estará disponible para las personas que empezaron su cursus <b>después</b> de 01/09/2021.<br><br>
|
||||
|
||||
Para otros, puedes resolver otros retos ya disponibles e intentar llegar al top 10! <br><br>
|
||||
|
||||
Registro: <a href=https://forms.42l.fr/apps/forms/SooTbnT4PCs9na7C>aquí</a>
|
|
@ -0,0 +1,7 @@
|
|||
Comme vous le savez surement déjà, résoudre des challenges nécessite beaucoup d'outils et il peut être difficile de savoir lesquels sont vraiment nécessaires. <br>
|
||||
|
||||
Nous avons créé une VM avec tout ce dont vous avez besoin pour 42CTF afin que vous vous concentriez sur ce qui compte vraiment : flag ! <br>
|
||||
|
||||
Tout ce dont vous avez besoin est de télécharger cet <b><a href="/media/xubuntu-42ctf.ova">OVA</a></b> et de l'importer dans <b><a href="https://www.virtualbox.org/wiki/Downloads">Virtual Box</a></b>.<br>
|
||||
|
||||
Alors, qu'est ce que vous attendez ?
|
|
@ -0,0 +1,7 @@
|
|||
Vous avez remarqué un petit changement sur le scoreboard de 42CTF ?<br><br>
|
||||
|
||||
Pas de panique, tous vos flags sont sains et saufs. Nous avons juste basculé sur du scoring dynamique. Cela signifie que les points des challenges ne sont plus fixes : ils diminueront désormais à chaque nouvelle résolution.<br>
|
||||
|
||||
Un challenge démarre à 200 points, et ne peut pas descendre en dessous de 5 points.<br><br>
|
||||
|
||||
Nous espérons que cela permettra de mieux refléter la véritable difficulté des challenges. Les événements à durée limitée ne sont pas concernés par ce changement.
|
|
@ -0,0 +1,9 @@
|
|||
À la recherche de l'âme soeur, d'un nouvel ami, ou juste d'un compagnon de CTF ?<br><br>
|
||||
|
||||
Nous avons ce dont vous avez besoin : le <a href="/events/speed_dating_2022">Speed Dating CTF</a> !<br><br>
|
||||
|
||||
Venez seul ou bien accompagné pour cette très courte compétition, qui ne durera que 4 heures.<br>
|
||||
Vous ne pourrez compter que sur une seule autre personne pour ce CTF en équipe.<br>
|
||||
Vous pouvez soit choisir votre partenaire, soit laisser laisser le destin décider pour vous.<br><br>
|
||||
|
||||
Bonne chance !
|
|
@ -0,0 +1,8 @@
|
|||
Vous avez toujours voulu en apprendre plus sur les injections SQL ? <br>
|
||||
<br>
|
||||
On vous propose trois nouveaux challenges créés par <b><a class=profile_link href=https://www.42ctf.org/accounts/profile/aldubar>aldubar</a></b>:<br>
|
||||
- <b><a href='https://www.42ctf.org/ctfs/web/simple_question_1'>Simple Question of Logic 1</a></b> (10 points)<br>
|
||||
- <b><a href='https://www.42ctf.org/ctfs/web/simple_question_2'>Simple Question of Logic 2</a></b> (30 points)<br>
|
||||
- <b><a href='https://www.42ctf.org/ctfs/web/simple_question_3'>Simple Question of Logic 3</a></b> (40 points)<br>
|
||||
<br>
|
||||
N'oubliez pas que vous pouvez toujours nous contacter sur <a class="footer_imgs" href="https://discord.gg/DwZqPpA" target="_blank"><img src="/static/img/discord.png" width="30"></a> pour proposer des nouveaux challenges !
|
|
@ -0,0 +1,9 @@
|
|||
Nouvel évènement en temps limité : <b>Welcome CTF 2021</b> !<br><br>
|
||||
|
||||
Dates : du 10/12/2021 20h au 12/12/2021 20h. <br>
|
||||
Il s'agit d'un CTF pour souhaiter la bienvenue aux nouveaux étudiants qui nous rejoignent à 42.<br>
|
||||
Il ne sera donc accessible qu'aux personnes ayant effectué leur rentrée <b>après</b> le 01/09/2021.<br><br>
|
||||
|
||||
Pour les autres, vous pouvez toujours résoudre les challenges déjà disponibles sur le site et tenter de vous hisser dans le top 10 ! <br><br>
|
||||
|
||||
Inscriptions <a href=https://forms.42l.fr/apps/forms/SooTbnT4PCs9na7C>ici</a>
|
|
@ -0,0 +1,4 @@
|
|||
すでにお気づきかもしれませんが、CTFの課題を解くには多くのツールが必要で、どれをインストールすれば良いのかがわかりにくいかもしれません。</br>
|
||||
私たちは、あなたが本当に重要なことに集中できるように、42CTFの課題に必要な全てのツールを備えたVMを作成しました。重要なのはフラグです!</br>
|
||||
この<b><a href="/media/xubuntu-42ctf.ova">OVA</a></b>をダウンロードし、<b><a href="https://www.virtualbox.org/wiki/Downloads">Virtual Box</a></b>にインポートするだけです。<br>
|
||||
さて、何をためらっているのですか?
|
|
@ -0,0 +1,7 @@
|
|||
42CTFのスコアボードにちょっとした変化があったことにお気づきですか?<br><br>
|
||||
|
||||
慌てないでください、 あなたのフラグはすべて無事です。 動的スコアリングに切り替えただけです。 それはチャレンジポイントがもう固定ではないことを意味します。解決するたびに減少します。<br>
|
||||
|
||||
チャレンジポイントは200から始まり、5より低くなることはありません。<br><br>
|
||||
|
||||
これにより、チャレンジの実際の難易度をより良く反映できるようになると期待しています。期間限定イベントは、この変更の影響は受けません。
|
|
@ -0,0 +1,9 @@
|
|||
ソウルメイト、新しい友達、またはちょうど良いCTFの仲間を探していますか?<br><br>
|
||||
|
||||
私たち42CTFは、あなたが求めているものを持っています。それは<a href="/events/speed_dating_2022">Speed Dating CTF</a>です!<br><br>
|
||||
|
||||
4時間という短い時間ですが、お一人でも、お仲間とご一緒でも、ぜひご参加ください。<br>
|
||||
このチーム戦CTFでは、自分以外の一人のプレーヤーのみ頼ることができます。<br>
|
||||
相手を選ぶもよし、運命に身を任せるもよし。<br><br>
|
||||
|
||||
幸運を祈ります!
|
|
@ -0,0 +1,8 @@
|
|||
SQLインジェクションについて学びたいと思ったことはありませんか?<br>
|
||||
<br>
|
||||
<b><a class=profile_link href=https://www.42ctf.org/accounts/profile/aldubar>aldubar</a></b>が作成した全く新しい3つのチャレンジを提供します。<br>
|
||||
- <b><a href='https://www.42ctf.org/ctfs/web/simple_question_1'>Simple Question of Logic 1</a></b> (10 points)<br>
|
||||
- <b><a href='https://www.42ctf.org/ctfs/web/simple_question_2'>Simple Question of Logic 2</a></b> (30 points)<br>
|
||||
- <b><a href='https://www.42ctf.org/ctfs/web/simple_question_3'>Simple Question of Logic 3</a></b> (40 points)<br>
|
||||
<br>
|
||||
新しいチャレンジを提案するために、<a class="footer_imgs" href="https://discord.gg/DwZqPpA" target="_blank"><img src="/static/img/discord.png" width="30"></a>へいつでも連絡できることを忘れないでください!
|
|
@ -0,0 +1,9 @@
|
|||
期間限定の新イベント:<b>Welcome CTF 2021</b>!<br><br>
|
||||
|
||||
日程:2021年12月10日20時~2021年12月12日20時(パリ時間)<br>
|
||||
42に入学する新入生を歓迎するためのCTFです。<br>
|
||||
2021年9月1日<b>以降</b>にカーサスを開始した方のみアクセス可能です。<br><br>
|
||||
|
||||
それ以外の方は、ウェブサイト上で公開されている課題を解いて、トップ10入りを目指してください!<br><br>
|
||||
|
||||
登録は<a href=https://forms.42l.fr/apps/forms/SooTbnT4PCs9na7C>こちら</a>
|
|
@ -0,0 +1,13 @@
|
|||
from django import template
|
||||
from django.core.files.storage import default_storage
|
||||
|
||||
register = template.Library()
|
||||
|
||||
@register.simple_tag
|
||||
def get_news_by_lang(news, lang):
|
||||
filepath = "home/templates/news/"+ lang + "/" + news.slug + ".html"
|
||||
try:
|
||||
with open(filepath) as fp:
|
||||
return fp.read()
|
||||
except:
|
||||
return news.content_en
|
|
@ -3,4 +3,5 @@ from . import views
|
|||
|
||||
urlpatterns = [
|
||||
path('', views.home, name='home'),
|
||||
path('CGU', views.cgu, name='cgu'),
|
||||
]
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
from django.shortcuts import render
|
||||
from django.shortcuts import render, redirect
|
||||
from django.conf import settings
|
||||
from django.http import HttpResponse, HttpResponseRedirect
|
||||
from .models import new
|
||||
|
@ -8,6 +8,23 @@ from django.urls import translate_url
|
|||
from django.utils.translation import (
|
||||
LANGUAGE_SESSION_KEY, check_for_language, get_language,
|
||||
)
|
||||
from django.core.files.storage import default_storage
|
||||
import datetime
|
||||
from collections import defaultdict
|
||||
import operator
|
||||
|
||||
def get_weekly_top():
|
||||
week_ago = datetime.datetime.now() - datetime.timedelta(days=7)
|
||||
weekly_flags = CTF_flags.objects.filter(flag_date__gt=week_ago, ctf__disabled=False, ctf__event=None)
|
||||
scores = defaultdict(int)
|
||||
|
||||
for sol in weekly_flags:
|
||||
scores[sol.user] += sol.ctf.points
|
||||
|
||||
users = sorted(scores.items(), key=operator.itemgetter(1), reverse=True)
|
||||
users = [(u[0].userprofileinfo, u[1]) for u in users]
|
||||
|
||||
return(users[:5])
|
||||
|
||||
def home(request):
|
||||
lang_code = get_language()
|
||||
|
@ -19,14 +36,24 @@ def home(request):
|
|||
response = HttpResponseRedirect(url_translated)
|
||||
return response
|
||||
news = new.objects.order_by('-pub_date')[:5]
|
||||
latest_ctfs = CTF.objects.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]
|
||||
nb_flags = CTF_flags.objects.count()
|
||||
nb_users = UserProfileInfo.objects.count()
|
||||
return render(request, 'home/home.html', {'news' : news, 'ctfs' : latest_ctfs, 'top' : top10, 'flags' : nb_flags})
|
||||
latest_flags = CTF_flags.objects.filter(ctf__event = None, ctf__disabled=False).order_by('-flag_date')[:5]
|
||||
top_weekly = get_weekly_top()
|
||||
|
||||
return render(request, 'home/home.html', {'news' : news, 'ctfs' : latest_ctfs, 'top' : top10, 'flags' : nb_flags,
|
||||
'latest_flags':latest_flags, 'top_weekly': top_weekly, 'nb_users': nb_users})
|
||||
|
||||
def cgu(request):
|
||||
return render(request, 'cgu.html')
|
||||
|
||||
|
||||
def set_language(request, lang_code):
|
||||
next = '/'
|
||||
if request.GET.get('next'):
|
||||
next = request.GET.get('next')
|
||||
response = HttpResponseRedirect(next)
|
||||
if lang_code and check_for_language(lang_code):
|
||||
if next:
|
||||
|
@ -42,6 +69,7 @@ def set_language(request, lang_code):
|
|||
path=settings.LANGUAGE_COOKIE_PATH,
|
||||
domain=settings.LANGUAGE_COOKIE_DOMAIN,
|
||||
)
|
||||
return response
|
||||
return redirect('/'+lang_code+next)
|
||||
|
||||
|
||||
# Create your views here.
|
||||
|
|
|
@ -3,331 +3,636 @@
|
|||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-05-10 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"POT-Creation-Date: 2022-02-14 19:36+0100\n"
|
||||
"PO-Revision-Date: 2022-02-10 19:50+0100\n"
|
||||
"Last-Translator: Clément Hamada <clementhamada@pm.me>\n"
|
||||
"Language-Team: \n"
|
||||
"Language: de\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: accounts/templates/accounts/delete.html:8
|
||||
msgid "Delete account"
|
||||
msgstr "Account löschen"
|
||||
|
||||
#: accounts/templates/accounts/delete.html:11
|
||||
msgid "Please confirm your password to delete your account."
|
||||
msgstr "Bitte bestätigen Sie Ihr Passwort, um Ihren Account zu löschen."
|
||||
|
||||
#: accounts/templates/accounts/delete.html:12
|
||||
msgid "Deleted accounts cannot be recovered."
|
||||
msgstr "Gelöschte Accounts können nicht wiederhergestellt werden."
|
||||
|
||||
#: accounts/templates/accounts/delete.html:15
|
||||
msgid "Password inccorect."
|
||||
msgstr "Falsches Passwort."
|
||||
|
||||
#: accounts/templates/accounts/delete.html:17
|
||||
msgid "Your account has been deleted."
|
||||
msgstr "Ihr Account wurde gelöscht."
|
||||
|
||||
#: accounts/templates/accounts/delete.html:22
|
||||
#: accounts/templates/accounts/login.html:19
|
||||
#: accounts/templates/accounts/register.html:23
|
||||
#: events/templates/events/create_team.html:27
|
||||
#: events/templates/events/join_team.html:32
|
||||
msgid "Password"
|
||||
msgstr "Passwort"
|
||||
|
||||
#: accounts/templates/accounts/edit.html:21
|
||||
#: accounts/templates/accounts/login.html:18
|
||||
#: accounts/templates/accounts/register.html:22
|
||||
#: ctfs/templates/ctfs/ctf_info.html:50 ctfs/templates/ctfs/ctfs_list.html:12
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:12
|
||||
#: ctfs/templates/ctfs/ctf_info.html:61 ctfs/templates/ctfs/ctfs_list.html:12
|
||||
#: events/templates/events/ctf_info.html:65
|
||||
#: events/templates/events/event_info.html:64
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
||||
msgid "Username"
|
||||
msgstr ""
|
||||
msgstr "Nutzername"
|
||||
|
||||
#: accounts/templates/accounts/edit.html:25
|
||||
msgid "Email"
|
||||
msgstr ""
|
||||
msgstr "Email"
|
||||
|
||||
#: accounts/templates/accounts/edit.html:30
|
||||
#: ctfs/templates/ctfs/ctf_info.html:51
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
||||
#: ctfs/templates/ctfs/ctf_info.html:62
|
||||
#: events/templates/events/ctf_info.html:66
|
||||
#: events/templates/events/event_info.html:65
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:14
|
||||
msgid "Website"
|
||||
msgstr ""
|
||||
msgstr "Webseite"
|
||||
|
||||
#: accounts/templates/accounts/edit.html:36
|
||||
#: events/templates/events/manage_team.html:29
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
msgstr "Anwenden"
|
||||
|
||||
#: accounts/templates/accounts/edit.html:44
|
||||
msgid "Connected accounts"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:51
|
||||
msgid "Disconnect Discord"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:56
|
||||
msgid "Connect Discord"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:66
|
||||
#: accounts/templates/accounts/profile.html:37
|
||||
#: ctfs/templates/ctfs/ctf_info.html:52 ctfs/templates/ctfs/ctfs_list.html:13
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:14
|
||||
#: accounts/templates/accounts/edit.html:47
|
||||
#: accounts/templates/accounts/profile.html:46
|
||||
#: ctfs/templates/ctfs/ctf_info.html:63 ctfs/templates/ctfs/ctfs_list.html:13
|
||||
#: events/templates/events/event_info.html:66
|
||||
#: events/templates/events/event_info.html:89
|
||||
#: events/templates/events/manage_team.html:40
|
||||
#: events/templates/events/team.html:45
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:15
|
||||
msgid "Score"
|
||||
msgstr ""
|
||||
msgstr "Punktzahl"
|
||||
|
||||
#: accounts/templates/accounts/edit.html:74
|
||||
#: accounts/templates/accounts/profile.html:45
|
||||
msgid "Member since"
|
||||
msgstr ""
|
||||
#: accounts/templates/accounts/edit.html:55
|
||||
#: accounts/templates/accounts/profile.html:60
|
||||
msgid "Registered since"
|
||||
msgstr "Registriert seit"
|
||||
|
||||
#: accounts/templates/accounts/edit.html:61
|
||||
msgid "Delete my account"
|
||||
msgstr "Meinen Account löschen"
|
||||
|
||||
#: accounts/templates/accounts/login.html:13
|
||||
msgid "Please, verify your infos."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/login.html:19
|
||||
#: accounts/templates/accounts/register.html:23
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
msgstr "Überprüfen Sie bitte ihre Daten."
|
||||
|
||||
#: accounts/templates/accounts/login.html:22
|
||||
msgid "Reset password"
|
||||
msgstr ""
|
||||
msgstr "Passwort zurücksetzen"
|
||||
|
||||
#: accounts/templates/accounts/login.html:31
|
||||
#: accounts/templates/accounts/register.html:38 templates/base.html:90
|
||||
#: accounts/templates/accounts/register.html:38 templates/base.html:97
|
||||
#: templates/registration/password_reset_complete.html:18
|
||||
#: templates/registration/password_reset_confirm.html:37
|
||||
#: templates/registration/password_reset_done.html:17
|
||||
#: templates/registration/password_reset_form.html:25
|
||||
#: templates/registration/password_reset_confirm.html:38
|
||||
#: templates/registration/password_reset_done.html:18
|
||||
#: templates/registration/password_reset_form.html:26
|
||||
msgid "Login"
|
||||
msgstr ""
|
||||
msgstr "Anmelden"
|
||||
|
||||
#: accounts/templates/accounts/login.html:32
|
||||
#: accounts/templates/accounts/register.html:37
|
||||
#: templates/registration/password_reset_complete.html:19
|
||||
#: templates/registration/password_reset_confirm.html:38
|
||||
#: templates/registration/password_reset_done.html:18
|
||||
#: templates/registration/password_reset_form.html:26
|
||||
#: templates/registration/password_reset_confirm.html:39
|
||||
#: templates/registration/password_reset_done.html:19
|
||||
#: templates/registration/password_reset_form.html:27
|
||||
msgid "Sign up"
|
||||
msgstr ""
|
||||
msgstr "Registrieren"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:12
|
||||
#: accounts/templates/accounts/profile.html:10
|
||||
msgid "Challenges Solved by"
|
||||
msgstr "Herausforderung gelöst von"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:21
|
||||
#: events/templates/events/team.html:20
|
||||
msgid "Challenge Name"
|
||||
msgstr ""
|
||||
msgstr "Name der Herausforderung"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:13
|
||||
#: accounts/templates/accounts/profile.html:22
|
||||
#: events/templates/events/team.html:21
|
||||
msgid "Category"
|
||||
msgstr ""
|
||||
msgstr "Kategorie"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:14
|
||||
#: accounts/templates/accounts/profile.html:23
|
||||
#: events/templates/events/team.html:22
|
||||
msgid "Points"
|
||||
msgstr ""
|
||||
msgstr "Punkte"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:15
|
||||
#: ctfs/templates/ctfs/ctf_info.html:53
|
||||
#: accounts/templates/accounts/profile.html:24
|
||||
#: ctfs/templates/ctfs/ctf_info.html:64
|
||||
#: events/templates/events/ctf_info.html:67
|
||||
#: events/templates/events/team.html:23
|
||||
msgid "Date"
|
||||
msgstr ""
|
||||
msgstr "Datum"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:30
|
||||
msgid "It's seem {{ user.username }} have never solved any CTF yet..."
|
||||
msgstr ""
|
||||
#: accounts/templates/accounts/profile.html:39
|
||||
msgid "It seems that this user has not solved any challenge yet..."
|
||||
msgstr "Es scheint bisher noch keiner diese Herausforderung gelöst zu haben..."
|
||||
|
||||
#: accounts/templates/accounts/profile.html:47
|
||||
#: events/templates/events/event_info.html:63
|
||||
#: events/templates/events/event_info.html:87
|
||||
#: events/templates/events/manage_team.html:41
|
||||
#: events/templates/events/team.html:46
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:12
|
||||
msgid "Rank"
|
||||
msgstr "Rang"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:56
|
||||
msgid "Status: Member"
|
||||
msgstr "Status: Mitglied"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:58
|
||||
msgid "Status: Visitor"
|
||||
msgstr "Status: Gast"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:64
|
||||
#: events/templates/events/team.html:57
|
||||
msgid "Categories stats"
|
||||
msgstr "Kategorie Statistiken"
|
||||
|
||||
#: accounts/templates/accounts/register.html:13
|
||||
msgid "Welcome !"
|
||||
msgstr ""
|
||||
msgstr "Willkommen!"
|
||||
|
||||
#: accounts/templates/accounts/register.html:14
|
||||
msgid "Your account has been created."
|
||||
msgstr ""
|
||||
msgstr "Ihr Account wurde erstellt."
|
||||
|
||||
#: accounts/templates/accounts/register.html:25
|
||||
msgid "Personal website"
|
||||
msgstr ""
|
||||
msgstr "Persönliche Webseite"
|
||||
|
||||
#: accounts/templates/accounts/register.html:26
|
||||
#: events/templates/events/event_info.html:119
|
||||
msgid "Register"
|
||||
msgstr ""
|
||||
msgstr "Registrieren"
|
||||
|
||||
#: accounts/views/views.py:31
|
||||
#: accounts/views/views.py:33
|
||||
msgid "Your account was inactive."
|
||||
msgstr ""
|
||||
msgstr "Ihr Account war inaktiv."
|
||||
|
||||
#: accounts/views/views.py:50
|
||||
#: accounts/views/views.py:52
|
||||
msgid ""
|
||||
"The password must contain at least one letter and at least one digit or "
|
||||
"punctuation character."
|
||||
msgstr ""
|
||||
"Das Passwort muss mindestens einen Buchstaben und eine Ziffer oder einen "
|
||||
"Satzzeichen enthalten."
|
||||
|
||||
#: accounts/views/views.py:52
|
||||
#: accounts/views/views.py:54
|
||||
msgid "A user with that email already exists."
|
||||
msgstr ""
|
||||
msgstr "Ein Nutzer mit dieser Email existiert bereits."
|
||||
|
||||
#: accounts/views/views.py:65
|
||||
#: accounts/views/views.py:67
|
||||
msgid "A user with that username already exists."
|
||||
msgstr ""
|
||||
msgstr "Ein Nutzer mit diesem Nutzernamen existiert bereits."
|
||||
|
||||
#: accounts/views/views.py:93
|
||||
#: accounts/views/views.py:95
|
||||
msgid "Email already taken."
|
||||
msgstr ""
|
||||
msgstr "Email bereits vergeben."
|
||||
|
||||
#: accounts/views/views.py:99
|
||||
#: accounts/views/views.py:101
|
||||
msgid "Username already taken."
|
||||
msgstr ""
|
||||
msgstr "Nutzername bereits vergeben."
|
||||
|
||||
#: accounts/views/views.py:103
|
||||
#: accounts/views/views.py:105 events/views/teams.py:124
|
||||
msgid "Updated."
|
||||
msgstr ""
|
||||
msgstr "Aktualisiert."
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:9
|
||||
#: ctfs/templates/ctfs/ctf_info.html:10
|
||||
#: events/templates/events/ctf_info.html:12
|
||||
msgid "Published date"
|
||||
msgstr ""
|
||||
msgstr "Veröffentlichungsdatum"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:17
|
||||
msgid "Congratulation !"
|
||||
msgstr ""
|
||||
#: ctfs/templates/ctfs/ctf_info.html:14
|
||||
msgid "Challenge is not yet available."
|
||||
msgstr "Herausforderung ist noch nicht verfügbar."
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:19
|
||||
msgid "Already flagged"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:21 ctfs/templates/ctfs/ctf_info.html:30
|
||||
msgid "Start the challenge"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:23 ctfs/templates/ctfs/ctf_info.html:32
|
||||
msgid "Download"
|
||||
#: ctfs/templates/ctfs/ctf_info.html:21
|
||||
#: events/templates/events/ctf_info.html:18
|
||||
msgid ""
|
||||
"No translation available. Please try another language (English or French)."
|
||||
msgstr ""
|
||||
"Keine Übersetzung verfügbar. Bitte versuchen Sie es auf einer anderen "
|
||||
"Sprache noch einmal (Englisch oder Französisch)."
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:27
|
||||
#: events/templates/events/ctf_info.html:24
|
||||
msgid "Congratulation !"
|
||||
msgstr "Herzlichen Glückwunsch!"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:29
|
||||
#: events/templates/events/ctf_info.html:26
|
||||
msgid "Already flagged"
|
||||
msgstr "Schon gelöst"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:31 ctfs/templates/ctfs/ctf_info.html:40
|
||||
#: events/templates/events/ctf_info.html:36
|
||||
#: events/templates/events/ctf_info.html:45
|
||||
msgid "Start the challenge"
|
||||
msgstr "Herausforderung beginnen"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:33 ctfs/templates/ctfs/ctf_info.html:42
|
||||
#: events/templates/events/ctf_info.html:38
|
||||
#: events/templates/events/ctf_info.html:47
|
||||
msgid "Download"
|
||||
msgstr "Herunterladen"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:37
|
||||
#: events/templates/events/ctf_info.html:42
|
||||
msgid "Wrong flag ! You can do it !"
|
||||
msgstr ""
|
||||
msgstr "Falsche flagge! Sie können es schaffen!"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:45
|
||||
#: ctfs/templates/ctfs/ctf_info.html:56
|
||||
#: events/templates/events/ctf_info.html:60
|
||||
msgid "Solved by"
|
||||
msgstr ""
|
||||
msgstr "Gelöst von"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:68
|
||||
msgid "Nobody have solved this CTF."
|
||||
msgstr ""
|
||||
#: ctfs/templates/ctfs/ctf_info.html:80
|
||||
#: events/templates/events/ctf_info.html:90
|
||||
msgid "Nobody has solved this challenge yet."
|
||||
msgstr "Bisher hat noch niemand diese Herausforderung gelöst."
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:74
|
||||
#: ctfs/templates/ctfs/ctf_info.html:87
|
||||
#: events/templates/events/ctf_info.html:97
|
||||
msgid "Author"
|
||||
msgstr ""
|
||||
msgstr "Autor/-in"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:75
|
||||
#: ctfs/templates/ctfs/ctf_info.html:88
|
||||
#: events/templates/events/ctf_info.html:98
|
||||
msgid "Point reward"
|
||||
msgstr ""
|
||||
msgstr "Belohnungspunkte"
|
||||
|
||||
#: ctfs/templates/ctfs/ctfs_list.html:14
|
||||
msgid "Solved"
|
||||
msgstr ""
|
||||
msgstr "Gelöst"
|
||||
|
||||
#: ctfs/templates/ctfs/ctfs_list.html:37
|
||||
msgid "No ctf available for this category."
|
||||
msgstr ""
|
||||
msgstr "Kein CTF in dieser Kategorie verfügbar."
|
||||
|
||||
#: ctfs/templates/ctfs/ctfs_list.html:42
|
||||
msgid "Categories"
|
||||
msgstr ""
|
||||
msgstr "Kategorien"
|
||||
|
||||
#: ctfs/templates/ctfs/ctfs_list.html:48 templates/base.html:54
|
||||
msgid "No category available."
|
||||
msgstr "Keine Kategorie verfügbar."
|
||||
|
||||
#: events/templates/events/create_team.html:10
|
||||
#: events/templates/events/join_team.html:10
|
||||
msgid "This event starts at"
|
||||
msgstr "Dieses Ereignis beginnt am"
|
||||
|
||||
#: events/templates/events/create_team.html:17
|
||||
#: events/templates/events/join_team.html:17
|
||||
msgid "You need to be registered to the event."
|
||||
msgstr "Sie müssen am Ereignis teilnehmen."
|
||||
|
||||
#: events/templates/events/create_team.html:20 events/views/teams.py:120
|
||||
msgid "Name already taken."
|
||||
msgstr "Name schon vergeben."
|
||||
|
||||
#: events/templates/events/create_team.html:26
|
||||
#: events/templates/events/join_team.html:31
|
||||
#: events/templates/events/manage_team.html:22
|
||||
msgid "Team name"
|
||||
msgstr "Teamname"
|
||||
|
||||
#: events/templates/events/create_team.html:28
|
||||
#: events/templates/events/create_team.html:49
|
||||
#: events/templates/events/join_team.html:54
|
||||
msgid "Create Team"
|
||||
msgstr "Team erstellen"
|
||||
|
||||
#: events/templates/events/create_team.html:33
|
||||
#: events/templates/events/event_pwd.html:28
|
||||
#: events/templates/events/join_team.html:38
|
||||
msgid "You need to be logged to access this event."
|
||||
msgstr "Sie müssen angemeldet sein um auf dieses Ereignis zuzugreifen."
|
||||
|
||||
#: events/templates/events/create_team.html:42
|
||||
#: events/templates/events/event_info.html:113
|
||||
#: events/templates/events/event_pwd.html:36
|
||||
#: events/templates/events/join_team.html:47
|
||||
msgid "Starts at"
|
||||
msgstr "Beginnt am"
|
||||
|
||||
#: events/templates/events/create_team.html:43
|
||||
#: events/templates/events/event_info.html:114
|
||||
#: events/templates/events/event_pwd.html:37
|
||||
#: events/templates/events/join_team.html:48
|
||||
msgid "Ends at"
|
||||
msgstr "Endet am"
|
||||
|
||||
#: events/templates/events/create_team.html:47
|
||||
#: events/templates/events/event_info.html:129
|
||||
#: events/templates/events/join_team.html:52
|
||||
msgid "Manage my team"
|
||||
msgstr "Team verwalten"
|
||||
|
||||
#: events/templates/events/create_team.html:48
|
||||
#: events/templates/events/join_team.html:33
|
||||
#: events/templates/events/join_team.html:53
|
||||
msgid "Join Team"
|
||||
msgstr "Team beitreten"
|
||||
|
||||
#: events/templates/events/create_team.html:53
|
||||
#: events/templates/events/join_team.html:58
|
||||
msgid "Auto-matching"
|
||||
msgstr "Auto-Matching"
|
||||
|
||||
#: events/templates/events/create_team.html:57
|
||||
#: events/templates/events/join_team.html:62
|
||||
msgid "Find me a team !"
|
||||
msgstr "Finde mir einen Team!"
|
||||
|
||||
#: events/templates/events/ctf_info.html:10
|
||||
msgid "Event"
|
||||
msgstr "Ereignis"
|
||||
|
||||
#: events/templates/events/ctf_info.html:28
|
||||
#: events/templates/events/event_info.html:18
|
||||
msgid "This event is over."
|
||||
msgstr "Dieses Ereignis hat bereits geendet."
|
||||
|
||||
#: events/templates/events/ctf_info.html:30
|
||||
msgid "Error while processing your request. (Invalid Form)"
|
||||
msgstr "Fehler während der Verarbeitung ihrer Anfrage. (Ungültiges Formular)"
|
||||
|
||||
#: events/templates/events/ctf_info.html:32
|
||||
msgid "You must register to the event before submitting flags."
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:19
|
||||
#: events/templates/events/ctf_info.html:34
|
||||
msgid ""
|
||||
"This is a team event, please create or join a team before submitting flags."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:9
|
||||
msgid "Subscriptions is over."
|
||||
msgstr "Die Registrierung hat geendet."
|
||||
|
||||
#: events/templates/events/event_info.html:12
|
||||
#: events/templates/events/event_pwd.html:18
|
||||
msgid "You're already registered to this event."
|
||||
msgstr "Sie haben sich schon für dieses Ereignis registriert."
|
||||
|
||||
#: events/templates/events/event_info.html:20
|
||||
#: events/templates/events/event_pwd.html:9
|
||||
msgid "This event start at"
|
||||
msgstr "Dieses Ereignis startet am"
|
||||
|
||||
#: events/templates/events/event_info.html:30
|
||||
msgid "Challenges"
|
||||
msgstr "Herausforderungen"
|
||||
|
||||
#: events/templates/events/event_info.html:47
|
||||
msgid "No challenges available."
|
||||
msgstr "Keine Herausforderung verfügbar."
|
||||
|
||||
#: events/templates/events/event_info.html:51
|
||||
msgid "The event has not started yet."
|
||||
msgstr "Das Ereignis hat noch nicht begonnen."
|
||||
|
||||
#: events/templates/events/event_info.html:57
|
||||
msgid "ScoreBoard"
|
||||
msgstr "Punktestand"
|
||||
|
||||
#: events/templates/events/event_info.html:88
|
||||
msgid "Team"
|
||||
msgstr "Team"
|
||||
|
||||
#: events/templates/events/event_info.html:106
|
||||
msgid "No one have earn point yet, you gonna be the first ?"
|
||||
msgstr "Niemand hat bisher Punkte verdient, werden Sie der erste sein?"
|
||||
|
||||
#: events/templates/events/event_pwd.html:15
|
||||
#: events/templates/events/join_team.html:22
|
||||
msgid "Wrong password submited."
|
||||
msgstr "Falsches Passwort eingetragen."
|
||||
|
||||
#: events/templates/events/event_pwd.html:20
|
||||
msgid "This event is password protected"
|
||||
msgstr "Dieses Ereignis ist passwortgeschützt"
|
||||
|
||||
#: events/templates/events/event_pwd.html:21
|
||||
msgid "You need to submit the event password to gain access to this event."
|
||||
msgstr "Sie müssen das Ereignispasswort eintragen um darauf zuzugreifen."
|
||||
|
||||
#: events/templates/events/events_list.html:6 templates/base.html:61
|
||||
msgid "Events"
|
||||
msgstr "Ereignisse"
|
||||
|
||||
#: events/templates/events/events_list.html:38
|
||||
msgid "See more"
|
||||
msgstr "Weiter"
|
||||
|
||||
#: events/templates/events/events_list.html:44
|
||||
msgid "No events available."
|
||||
msgstr "Keine Ereignisse verfügbar."
|
||||
|
||||
#: events/templates/events/join_team.html:20
|
||||
msgid "Team does not exist."
|
||||
msgstr "Team existiert nicht."
|
||||
|
||||
#: events/templates/events/join_team.html:24
|
||||
msgid "Maximum size reached."
|
||||
msgstr "Maximale Mitgliederanzahl erreicht."
|
||||
|
||||
#: events/templates/events/manage_team.html:26
|
||||
msgid "Team password"
|
||||
msgstr "Teampasswort"
|
||||
|
||||
#: events/templates/events/manage_team.html:44
|
||||
#: events/templates/events/team.html:49
|
||||
msgid "Members"
|
||||
msgstr "Mitgliede"
|
||||
|
||||
#: events/templates/events/manage_team.html:52
|
||||
msgid "Leave Team"
|
||||
msgstr "Team verlassen"
|
||||
|
||||
#: events/templates/events/manage_team.html:59
|
||||
#, fuzzy
|
||||
#| msgid "Auto-matching"
|
||||
msgid "Open to automatching"
|
||||
msgstr "Auto-Matching"
|
||||
|
||||
#: events/templates/events/manage_team.html:66
|
||||
#, fuzzy
|
||||
#| msgid "Auto-matching"
|
||||
msgid "Close to automatching"
|
||||
msgstr "Auto-Matching"
|
||||
|
||||
#: events/templates/events/team.html:38
|
||||
msgid "It seems that this team has not solved any challenge yet..."
|
||||
msgstr "Dieses Team scheint noch keine Herausforderung gelöst zu haben..."
|
||||
|
||||
#: home/templates/home/home.html:21
|
||||
msgid "Weekly Top 5"
|
||||
msgstr "Top 5 der Woche"
|
||||
|
||||
#: home/templates/home/home.html:48
|
||||
msgid "No article available."
|
||||
msgstr ""
|
||||
msgstr "Kein Artikel verfügbar."
|
||||
|
||||
#: home/templates/home/home.html:24
|
||||
#: home/templates/home/home.html:53
|
||||
msgid "Latest challenges added"
|
||||
msgstr ""
|
||||
msgstr "Neue Herausforderungen"
|
||||
|
||||
#: home/templates/home/home.html:30
|
||||
#: home/templates/home/home.html:58
|
||||
msgid "points"
|
||||
msgstr "Punkte"
|
||||
|
||||
#: home/templates/home/home.html:62
|
||||
msgid "No ctf available."
|
||||
msgstr ""
|
||||
msgstr "Kein CTF verfügbar."
|
||||
|
||||
#: home/templates/home/home.html:40
|
||||
msgid "Flags counter"
|
||||
#: home/templates/home/home.html:66
|
||||
msgid "Latest Flags"
|
||||
msgstr "Letzte Flaggen"
|
||||
|
||||
#: home/templates/home/home.html:80
|
||||
msgid "Flags"
|
||||
msgstr "Flaggen"
|
||||
|
||||
#: home/templates/home/home.html:86
|
||||
msgid "Users"
|
||||
msgstr "Nutzer"
|
||||
|
||||
#: project/settings.py:115
|
||||
msgid "English"
|
||||
msgstr "Englisch"
|
||||
|
||||
#: project/settings.py:116
|
||||
msgid "German"
|
||||
msgstr "Deutsch"
|
||||
|
||||
#: project/settings.py:117
|
||||
msgid "French"
|
||||
msgstr "Französisch"
|
||||
|
||||
#: project/settings.py:118
|
||||
msgid "Russian"
|
||||
msgstr "Russisch"
|
||||
|
||||
#: project/settings.py:119
|
||||
msgid "Japanese"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:120
|
||||
msgid "Global Site"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:121
|
||||
msgid "Italian"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:122
|
||||
msgid "German"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:123
|
||||
msgid "French"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:124
|
||||
msgid "Spanish"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:125
|
||||
msgid "Russian"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:11
|
||||
msgid "Rank"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:36
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:38
|
||||
msgid "First"
|
||||
msgstr ""
|
||||
msgstr "Erste"
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:37
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:39
|
||||
msgid "Previous"
|
||||
msgstr ""
|
||||
msgstr "Vorherige"
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:41
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:43
|
||||
msgid "Page "
|
||||
msgstr ""
|
||||
msgstr "Seite "
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:45
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:47
|
||||
msgid "Next"
|
||||
msgstr ""
|
||||
msgstr "Nächste"
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:46
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:48
|
||||
msgid "Last"
|
||||
msgstr ""
|
||||
msgstr "Letzte"
|
||||
|
||||
#: templates/base.html:59
|
||||
msgid "Scoreboard"
|
||||
msgstr ""
|
||||
msgstr "Punktestand"
|
||||
|
||||
#: templates/base.html:86
|
||||
msgid "Logout"
|
||||
msgstr ""
|
||||
#: templates/base.html:64
|
||||
msgid "Resources"
|
||||
msgstr "Ressourcen"
|
||||
|
||||
#: templates/base.html:93
|
||||
msgid "Logout"
|
||||
msgstr "Abmelden"
|
||||
|
||||
#: templates/base.html:100
|
||||
msgid "Sign Up"
|
||||
msgstr ""
|
||||
msgstr "Registrieren"
|
||||
|
||||
#: templates/base.html:135
|
||||
msgid "Become a Patron!"
|
||||
msgstr "Unterstützen Sie uns!"
|
||||
|
||||
#: templates/registration/password_reset_complete.html:11
|
||||
msgid "Your new password has been set."
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:19
|
||||
msgid "Your password can’t be too similar to your other personal information."
|
||||
msgstr ""
|
||||
msgstr "Ihr neues Passwort wurde festgelegt."
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:20
|
||||
msgid "Your password must contain at least 8 characters."
|
||||
msgstr ""
|
||||
msgid "Your password can’t be too similar to your other personal information."
|
||||
msgstr "Ihr Passwort kann nicht zu ähnlich zu ihren persönlichen Daten sein."
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:21
|
||||
msgid "Your password can’t be a commonly used password."
|
||||
msgstr ""
|
||||
msgid "Your password must contain at least 8 characters."
|
||||
msgstr "Ihr Passwort muss mindestens 8 Zeichen enthalten."
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:22
|
||||
msgid "Your password can’t be a commonly used password."
|
||||
msgstr "Ihr Passwort kann nicht ein häufig benutztes Passwort sein."
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:23
|
||||
msgid "Your password can’t be entirely numeric."
|
||||
msgstr ""
|
||||
msgstr "Ihr Passwort kann nicht nur Ziffern enthalten."
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:25
|
||||
#: templates/registration/password_reset_confirm.html:26
|
||||
msgid "Confirm"
|
||||
msgstr ""
|
||||
msgstr "Bestätigen"
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:27
|
||||
#: templates/registration/password_reset_confirm.html:28
|
||||
msgid "Submit"
|
||||
msgstr ""
|
||||
msgstr "Einreichen"
|
||||
|
||||
#: templates/registration/password_reset_done.html:10
|
||||
#: templates/registration/password_reset_done.html:11
|
||||
msgid ""
|
||||
"We've emailed you instructions for setting your password. You should receive "
|
||||
"the email shortly!"
|
||||
msgstr ""
|
||||
"Wir haben Ihnen eine Anleitung um Ihren Passwort zurückzusetzen per Email "
|
||||
"geschickt. Sie sollten sie in Kürze empfangen!"
|
||||
|
||||
#: templates/registration/password_reset_form.html:15
|
||||
#: templates/registration/password_reset_form.html:16
|
||||
msgid "Reset"
|
||||
msgstr ""
|
||||
msgstr "Zurücksetzen"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Error: you're not registered to this event, so you can't register scores, "
|
||||
#~ "fucking logic."
|
||||
#~ msgstr ""
|
||||
#~ "Fehler: Sie nehmen an diesem Ereignis nicht teil, und können deshalb "
|
||||
#~ "keinen Punktestand registrieren."
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Manage my team"
|
||||
#~ msgid "Manage team"
|
||||
#~ msgstr "Team verwalten"
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-05-10 19:28+0000\n"
|
||||
"POT-Creation-Date: 2022-02-14 19:36+0100\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -18,11 +18,41 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: accounts/templates/accounts/delete.html:8
|
||||
msgid "Delete account"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/delete.html:11
|
||||
msgid "Please confirm your password to delete your account."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/delete.html:12
|
||||
msgid "Deleted accounts cannot be recovered."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/delete.html:15
|
||||
msgid "Password inccorect."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/delete.html:17
|
||||
msgid "Your account has been deleted."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/delete.html:22
|
||||
#: accounts/templates/accounts/login.html:19
|
||||
#: accounts/templates/accounts/register.html:23
|
||||
#: events/templates/events/create_team.html:27
|
||||
#: events/templates/events/join_team.html:32
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:21
|
||||
#: accounts/templates/accounts/login.html:18
|
||||
#: accounts/templates/accounts/register.html:22
|
||||
#: ctfs/templates/ctfs/ctf_info.html:50 ctfs/templates/ctfs/ctfs_list.html:12
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:12
|
||||
#: ctfs/templates/ctfs/ctf_info.html:61 ctfs/templates/ctfs/ctfs_list.html:12
|
||||
#: events/templates/events/ctf_info.html:65
|
||||
#: events/templates/events/event_info.html:64
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
||||
msgid "Username"
|
||||
msgstr ""
|
||||
|
||||
|
@ -31,89 +61,114 @@ msgid "Email"
|
|||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:30
|
||||
#: ctfs/templates/ctfs/ctf_info.html:51
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
||||
#: ctfs/templates/ctfs/ctf_info.html:62
|
||||
#: events/templates/events/ctf_info.html:66
|
||||
#: events/templates/events/event_info.html:65
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:14
|
||||
msgid "Website"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:36
|
||||
#: events/templates/events/manage_team.html:29
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:44
|
||||
msgid "Connected accounts"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:51
|
||||
msgid "Disconnect Discord"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:56
|
||||
msgid "Connect Discord"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:66
|
||||
#: accounts/templates/accounts/profile.html:37
|
||||
#: ctfs/templates/ctfs/ctf_info.html:52 ctfs/templates/ctfs/ctfs_list.html:13
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:14
|
||||
#: accounts/templates/accounts/edit.html:47
|
||||
#: accounts/templates/accounts/profile.html:46
|
||||
#: ctfs/templates/ctfs/ctf_info.html:63 ctfs/templates/ctfs/ctfs_list.html:13
|
||||
#: events/templates/events/event_info.html:66
|
||||
#: events/templates/events/event_info.html:89
|
||||
#: events/templates/events/manage_team.html:40
|
||||
#: events/templates/events/team.html:45
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:15
|
||||
msgid "Score"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:74
|
||||
#: accounts/templates/accounts/profile.html:45
|
||||
msgid "Member since"
|
||||
#: accounts/templates/accounts/edit.html:55
|
||||
#: accounts/templates/accounts/profile.html:60
|
||||
msgid "Registered since"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:61
|
||||
msgid "Delete my account"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/login.html:13
|
||||
msgid "Please, verify your infos."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/login.html:19
|
||||
#: accounts/templates/accounts/register.html:23
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/login.html:22
|
||||
msgid "Reset password"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/login.html:31
|
||||
#: accounts/templates/accounts/register.html:38 templates/base.html:90
|
||||
#: accounts/templates/accounts/register.html:38 templates/base.html:97
|
||||
#: templates/registration/password_reset_complete.html:18
|
||||
#: templates/registration/password_reset_confirm.html:37
|
||||
#: templates/registration/password_reset_done.html:17
|
||||
#: templates/registration/password_reset_form.html:25
|
||||
#: templates/registration/password_reset_confirm.html:38
|
||||
#: templates/registration/password_reset_done.html:18
|
||||
#: templates/registration/password_reset_form.html:26
|
||||
msgid "Login"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/login.html:32
|
||||
#: accounts/templates/accounts/register.html:37
|
||||
#: templates/registration/password_reset_complete.html:19
|
||||
#: templates/registration/password_reset_confirm.html:38
|
||||
#: templates/registration/password_reset_done.html:18
|
||||
#: templates/registration/password_reset_form.html:26
|
||||
#: templates/registration/password_reset_confirm.html:39
|
||||
#: templates/registration/password_reset_done.html:19
|
||||
#: templates/registration/password_reset_form.html:27
|
||||
msgid "Sign up"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:12
|
||||
#: accounts/templates/accounts/profile.html:10
|
||||
msgid "Challenges Solved by"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:21
|
||||
#: events/templates/events/team.html:20
|
||||
msgid "Challenge Name"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:13
|
||||
#: accounts/templates/accounts/profile.html:22
|
||||
#: events/templates/events/team.html:21
|
||||
msgid "Category"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:14
|
||||
#: accounts/templates/accounts/profile.html:23
|
||||
#: events/templates/events/team.html:22
|
||||
msgid "Points"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:15
|
||||
#: ctfs/templates/ctfs/ctf_info.html:53
|
||||
#: accounts/templates/accounts/profile.html:24
|
||||
#: ctfs/templates/ctfs/ctf_info.html:64
|
||||
#: events/templates/events/ctf_info.html:67
|
||||
#: events/templates/events/team.html:23
|
||||
msgid "Date"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:30
|
||||
msgid "It's seem {{ user.username }} have never solved any CTF yet..."
|
||||
#: accounts/templates/accounts/profile.html:39
|
||||
msgid "It seems that this user has not solved any challenge yet..."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:47
|
||||
#: events/templates/events/event_info.html:63
|
||||
#: events/templates/events/event_info.html:87
|
||||
#: events/templates/events/manage_team.html:41
|
||||
#: events/templates/events/team.html:46
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:12
|
||||
msgid "Rank"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:56
|
||||
msgid "Status: Member"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:58
|
||||
msgid "Status: Visitor"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:64
|
||||
#: events/templates/events/team.html:57
|
||||
msgid "Categories stats"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/register.html:13
|
||||
|
@ -129,76 +184,99 @@ msgid "Personal website"
|
|||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/register.html:26
|
||||
#: events/templates/events/event_info.html:119
|
||||
msgid "Register"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:31
|
||||
#: accounts/views/views.py:33
|
||||
msgid "Your account was inactive."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:50
|
||||
#: accounts/views/views.py:52
|
||||
msgid ""
|
||||
"The password must contain at least one letter and at least one digit or "
|
||||
"punctuation character."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:52
|
||||
#: accounts/views/views.py:54
|
||||
msgid "A user with that email already exists."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:65
|
||||
#: accounts/views/views.py:67
|
||||
msgid "A user with that username already exists."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:93
|
||||
#: accounts/views/views.py:95
|
||||
msgid "Email already taken."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:99
|
||||
#: accounts/views/views.py:101
|
||||
msgid "Username already taken."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:103
|
||||
#: accounts/views/views.py:105 events/views/teams.py:124
|
||||
msgid "Updated."
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:9
|
||||
#: ctfs/templates/ctfs/ctf_info.html:10
|
||||
#: events/templates/events/ctf_info.html:12
|
||||
msgid "Published date"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:17
|
||||
msgid "Congratulation !"
|
||||
#: ctfs/templates/ctfs/ctf_info.html:14
|
||||
msgid "Challenge is not yet available."
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:19
|
||||
msgid "Already flagged"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:21 ctfs/templates/ctfs/ctf_info.html:30
|
||||
msgid "Start the challenge"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:23 ctfs/templates/ctfs/ctf_info.html:32
|
||||
msgid "Download"
|
||||
#: ctfs/templates/ctfs/ctf_info.html:21
|
||||
#: events/templates/events/ctf_info.html:18
|
||||
msgid ""
|
||||
"No translation available. Please try another language (English or French)."
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:27
|
||||
#: events/templates/events/ctf_info.html:24
|
||||
msgid "Congratulation !"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:29
|
||||
#: events/templates/events/ctf_info.html:26
|
||||
msgid "Already flagged"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:31 ctfs/templates/ctfs/ctf_info.html:40
|
||||
#: events/templates/events/ctf_info.html:36
|
||||
#: events/templates/events/ctf_info.html:45
|
||||
msgid "Start the challenge"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:33 ctfs/templates/ctfs/ctf_info.html:42
|
||||
#: events/templates/events/ctf_info.html:38
|
||||
#: events/templates/events/ctf_info.html:47
|
||||
msgid "Download"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:37
|
||||
#: events/templates/events/ctf_info.html:42
|
||||
msgid "Wrong flag ! You can do it !"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:45
|
||||
#: ctfs/templates/ctfs/ctf_info.html:56
|
||||
#: events/templates/events/ctf_info.html:60
|
||||
msgid "Solved by"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:68
|
||||
msgid "Nobody have solved this CTF."
|
||||
#: ctfs/templates/ctfs/ctf_info.html:80
|
||||
#: events/templates/events/ctf_info.html:90
|
||||
msgid "Nobody has solved this challenge yet."
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:74
|
||||
#: ctfs/templates/ctfs/ctf_info.html:87
|
||||
#: events/templates/events/ctf_info.html:97
|
||||
msgid "Author"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:75
|
||||
#: ctfs/templates/ctfs/ctf_info.html:88
|
||||
#: events/templates/events/ctf_info.html:98
|
||||
msgid "Point reward"
|
||||
msgstr ""
|
||||
|
||||
|
@ -218,67 +296,265 @@ msgstr ""
|
|||
msgid "No category available."
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:19
|
||||
#: events/templates/events/create_team.html:10
|
||||
#: events/templates/events/join_team.html:10
|
||||
msgid "This event starts at"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:17
|
||||
#: events/templates/events/join_team.html:17
|
||||
msgid "You need to be registered to the event."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:20 events/views/teams.py:120
|
||||
msgid "Name already taken."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:26
|
||||
#: events/templates/events/join_team.html:31
|
||||
#: events/templates/events/manage_team.html:22
|
||||
msgid "Team name"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:28
|
||||
#: events/templates/events/create_team.html:49
|
||||
#: events/templates/events/join_team.html:54
|
||||
msgid "Create Team"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:33
|
||||
#: events/templates/events/event_pwd.html:28
|
||||
#: events/templates/events/join_team.html:38
|
||||
msgid "You need to be logged to access this event."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:42
|
||||
#: events/templates/events/event_info.html:113
|
||||
#: events/templates/events/event_pwd.html:36
|
||||
#: events/templates/events/join_team.html:47
|
||||
msgid "Starts at"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:43
|
||||
#: events/templates/events/event_info.html:114
|
||||
#: events/templates/events/event_pwd.html:37
|
||||
#: events/templates/events/join_team.html:48
|
||||
msgid "Ends at"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:47
|
||||
#: events/templates/events/event_info.html:129
|
||||
#: events/templates/events/join_team.html:52
|
||||
msgid "Manage my team"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:48
|
||||
#: events/templates/events/join_team.html:33
|
||||
#: events/templates/events/join_team.html:53
|
||||
msgid "Join Team"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:53
|
||||
#: events/templates/events/join_team.html:58
|
||||
msgid "Auto-matching"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:57
|
||||
#: events/templates/events/join_team.html:62
|
||||
msgid "Find me a team !"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/ctf_info.html:10
|
||||
msgid "Event"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/ctf_info.html:28
|
||||
#: events/templates/events/event_info.html:18
|
||||
msgid "This event is over."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/ctf_info.html:30
|
||||
msgid "Error while processing your request. (Invalid Form)"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/ctf_info.html:32
|
||||
msgid "You must register to the event before submitting flags."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/ctf_info.html:34
|
||||
msgid ""
|
||||
"This is a team event, please create or join a team before submitting flags."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:9
|
||||
msgid "Subscriptions is over."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:12
|
||||
#: events/templates/events/event_pwd.html:18
|
||||
msgid "You're already registered to this event."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:20
|
||||
#: events/templates/events/event_pwd.html:9
|
||||
msgid "This event start at"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:30
|
||||
msgid "Challenges"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:47
|
||||
msgid "No challenges available."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:51
|
||||
msgid "The event has not started yet."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:57
|
||||
msgid "ScoreBoard"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:88
|
||||
msgid "Team"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:106
|
||||
msgid "No one have earn point yet, you gonna be the first ?"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_pwd.html:15
|
||||
#: events/templates/events/join_team.html:22
|
||||
msgid "Wrong password submited."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_pwd.html:20
|
||||
msgid "This event is password protected"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_pwd.html:21
|
||||
msgid "You need to submit the event password to gain access to this event."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/events_list.html:6 templates/base.html:61
|
||||
msgid "Events"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/events_list.html:38
|
||||
msgid "See more"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/events_list.html:44
|
||||
msgid "No events available."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/join_team.html:20
|
||||
msgid "Team does not exist."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/join_team.html:24
|
||||
msgid "Maximum size reached."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/manage_team.html:26
|
||||
msgid "Team password"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/manage_team.html:44
|
||||
#: events/templates/events/team.html:49
|
||||
msgid "Members"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/manage_team.html:52
|
||||
msgid "Leave Team"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/manage_team.html:59
|
||||
msgid "Open to automatching"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/manage_team.html:66
|
||||
msgid "Close to automatching"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/team.html:38
|
||||
msgid "It seems that this team has not solved any challenge yet..."
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:21
|
||||
msgid "Weekly Top 5"
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:48
|
||||
msgid "No article available."
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:24
|
||||
#: home/templates/home/home.html:53
|
||||
msgid "Latest challenges added"
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:30
|
||||
#: home/templates/home/home.html:58
|
||||
msgid "points"
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:62
|
||||
msgid "No ctf available."
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:40
|
||||
msgid "Flags counter"
|
||||
#: home/templates/home/home.html:66
|
||||
msgid "Latest Flags"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:120
|
||||
msgid "Global Site"
|
||||
#: home/templates/home/home.html:80
|
||||
msgid "Flags"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:121
|
||||
msgid "Italian"
|
||||
#: home/templates/home/home.html:86
|
||||
msgid "Users"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:122
|
||||
#: project/settings.py:115
|
||||
msgid "English"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:116
|
||||
msgid "German"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:123
|
||||
#: project/settings.py:117
|
||||
msgid "French"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:124
|
||||
msgid "Spanish"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:125
|
||||
#: project/settings.py:118
|
||||
msgid "Russian"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:11
|
||||
msgid "Rank"
|
||||
#: project/settings.py:119
|
||||
msgid "Japanese"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:36
|
||||
#: project/settings.py:120
|
||||
msgid "Spanish"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:38
|
||||
msgid "First"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:37
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:39
|
||||
msgid "Previous"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:41
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:43
|
||||
msgid "Page "
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:45
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:47
|
||||
msgid "Next"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:46
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:48
|
||||
msgid "Last"
|
||||
msgstr ""
|
||||
|
||||
|
@ -286,48 +562,56 @@ msgstr ""
|
|||
msgid "Scoreboard"
|
||||
msgstr ""
|
||||
|
||||
#: templates/base.html:86
|
||||
msgid "Logout"
|
||||
#: templates/base.html:64
|
||||
msgid "Resources"
|
||||
msgstr ""
|
||||
|
||||
#: templates/base.html:93
|
||||
msgid "Logout"
|
||||
msgstr ""
|
||||
|
||||
#: templates/base.html:100
|
||||
msgid "Sign Up"
|
||||
msgstr ""
|
||||
|
||||
#: templates/base.html:135
|
||||
msgid "Become a Patron!"
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_complete.html:11
|
||||
msgid "Your new password has been set."
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:19
|
||||
#: templates/registration/password_reset_confirm.html:20
|
||||
msgid "Your password can’t be too similar to your other personal information."
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:20
|
||||
#: templates/registration/password_reset_confirm.html:21
|
||||
msgid "Your password must contain at least 8 characters."
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:21
|
||||
#: templates/registration/password_reset_confirm.html:22
|
||||
msgid "Your password can’t be a commonly used password."
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:22
|
||||
#: templates/registration/password_reset_confirm.html:23
|
||||
msgid "Your password can’t be entirely numeric."
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:25
|
||||
#: templates/registration/password_reset_confirm.html:26
|
||||
msgid "Confirm"
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:27
|
||||
#: templates/registration/password_reset_confirm.html:28
|
||||
msgid "Submit"
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_done.html:10
|
||||
#: templates/registration/password_reset_done.html:11
|
||||
msgid ""
|
||||
"We've emailed you instructions for setting your password. You should receive "
|
||||
"the email shortly!"
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_form.html:15
|
||||
#: templates/registration/password_reset_form.html:16
|
||||
msgid "Reset"
|
||||
msgstr ""
|
||||
|
|
|
@ -8,326 +8,627 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-05-10 19:28+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"POT-Creation-Date: 2022-02-14 19:36+0100\n"
|
||||
"PO-Revision-Date: 2022-02-09 10:55+0100\n"
|
||||
"Last-Translator: Javier Uhagón (uhagontorralvojavier@gmail.com)\n"
|
||||
"Language-Team: \n"
|
||||
"Language: es\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: accounts/templates/accounts/delete.html:8
|
||||
msgid "Delete account"
|
||||
msgstr "Borrar cuenta"
|
||||
|
||||
#: accounts/templates/accounts/delete.html:11
|
||||
msgid "Please confirm your password to delete your account."
|
||||
msgstr "Por favor confirme su contraseña para borrar su cuenta."
|
||||
|
||||
#: accounts/templates/accounts/delete.html:12
|
||||
msgid "Deleted accounts cannot be recovered."
|
||||
msgstr "Las cuentas borradas no pueden ser recuperadas."
|
||||
|
||||
#: accounts/templates/accounts/delete.html:15
|
||||
msgid "Password inccorect."
|
||||
msgstr "Contraseña incorrecta."
|
||||
|
||||
#: accounts/templates/accounts/delete.html:17
|
||||
msgid "Your account has been deleted."
|
||||
msgstr "Su cuenta ha sido borrada."
|
||||
|
||||
#: accounts/templates/accounts/delete.html:22
|
||||
#: accounts/templates/accounts/login.html:19
|
||||
#: accounts/templates/accounts/register.html:23
|
||||
#: events/templates/events/create_team.html:27
|
||||
#: events/templates/events/join_team.html:32
|
||||
msgid "Password"
|
||||
msgstr "Contraseña"
|
||||
|
||||
#: accounts/templates/accounts/edit.html:21
|
||||
#: accounts/templates/accounts/login.html:18
|
||||
#: accounts/templates/accounts/register.html:22
|
||||
#: ctfs/templates/ctfs/ctf_info.html:50 ctfs/templates/ctfs/ctfs_list.html:12
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:12
|
||||
#: ctfs/templates/ctfs/ctf_info.html:61 ctfs/templates/ctfs/ctfs_list.html:12
|
||||
#: events/templates/events/ctf_info.html:65
|
||||
#: events/templates/events/event_info.html:64
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
||||
msgid "Username"
|
||||
msgstr ""
|
||||
msgstr "Usuario"
|
||||
|
||||
#: accounts/templates/accounts/edit.html:25
|
||||
msgid "Email"
|
||||
msgstr ""
|
||||
msgstr "Email"
|
||||
|
||||
#: accounts/templates/accounts/edit.html:30
|
||||
#: ctfs/templates/ctfs/ctf_info.html:51
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
||||
#: ctfs/templates/ctfs/ctf_info.html:62
|
||||
#: events/templates/events/ctf_info.html:66
|
||||
#: events/templates/events/event_info.html:65
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:14
|
||||
msgid "Website"
|
||||
msgstr ""
|
||||
msgstr "Página Web"
|
||||
|
||||
#: accounts/templates/accounts/edit.html:36
|
||||
#: events/templates/events/manage_team.html:29
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
msgstr "Aplicar"
|
||||
|
||||
#: accounts/templates/accounts/edit.html:44
|
||||
msgid "Connected accounts"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:51
|
||||
msgid "Disconnect Discord"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:56
|
||||
msgid "Connect Discord"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:66
|
||||
#: accounts/templates/accounts/profile.html:37
|
||||
#: ctfs/templates/ctfs/ctf_info.html:52 ctfs/templates/ctfs/ctfs_list.html:13
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:14
|
||||
#: accounts/templates/accounts/edit.html:47
|
||||
#: accounts/templates/accounts/profile.html:46
|
||||
#: ctfs/templates/ctfs/ctf_info.html:63 ctfs/templates/ctfs/ctfs_list.html:13
|
||||
#: events/templates/events/event_info.html:66
|
||||
#: events/templates/events/event_info.html:89
|
||||
#: events/templates/events/manage_team.html:40
|
||||
#: events/templates/events/team.html:45
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:15
|
||||
msgid "Score"
|
||||
msgstr ""
|
||||
msgstr "Puntuación"
|
||||
|
||||
#: accounts/templates/accounts/edit.html:74
|
||||
#: accounts/templates/accounts/profile.html:45
|
||||
msgid "Member since"
|
||||
msgstr ""
|
||||
#: accounts/templates/accounts/edit.html:55
|
||||
#: accounts/templates/accounts/profile.html:60
|
||||
msgid "Registered since"
|
||||
msgstr "Registrado desde"
|
||||
|
||||
#: accounts/templates/accounts/edit.html:61
|
||||
msgid "Delete my account"
|
||||
msgstr "Borrar mi cuenta"
|
||||
|
||||
#: accounts/templates/accounts/login.html:13
|
||||
msgid "Please, verify your infos."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/login.html:19
|
||||
#: accounts/templates/accounts/register.html:23
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
msgstr "Por favor, verifique su información."
|
||||
|
||||
#: accounts/templates/accounts/login.html:22
|
||||
msgid "Reset password"
|
||||
msgstr ""
|
||||
msgstr "Cambiar contraseña"
|
||||
|
||||
#: accounts/templates/accounts/login.html:31
|
||||
#: accounts/templates/accounts/register.html:38 templates/base.html:90
|
||||
#: accounts/templates/accounts/register.html:38 templates/base.html:97
|
||||
#: templates/registration/password_reset_complete.html:18
|
||||
#: templates/registration/password_reset_confirm.html:37
|
||||
#: templates/registration/password_reset_done.html:17
|
||||
#: templates/registration/password_reset_form.html:25
|
||||
#: templates/registration/password_reset_confirm.html:38
|
||||
#: templates/registration/password_reset_done.html:18
|
||||
#: templates/registration/password_reset_form.html:26
|
||||
msgid "Login"
|
||||
msgstr ""
|
||||
msgstr "Iniciar Sesión"
|
||||
|
||||
#: accounts/templates/accounts/login.html:32
|
||||
#: accounts/templates/accounts/register.html:37
|
||||
#: templates/registration/password_reset_complete.html:19
|
||||
#: templates/registration/password_reset_confirm.html:38
|
||||
#: templates/registration/password_reset_done.html:18
|
||||
#: templates/registration/password_reset_form.html:26
|
||||
#: templates/registration/password_reset_confirm.html:39
|
||||
#: templates/registration/password_reset_done.html:19
|
||||
#: templates/registration/password_reset_form.html:27
|
||||
msgid "Sign up"
|
||||
msgstr ""
|
||||
msgstr "Registrarse"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:12
|
||||
#: accounts/templates/accounts/profile.html:10
|
||||
msgid "Challenges Solved by"
|
||||
msgstr "Retos resueltos por"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:21
|
||||
#: events/templates/events/team.html:20
|
||||
msgid "Challenge Name"
|
||||
msgstr ""
|
||||
msgstr "Nombre del reto"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:13
|
||||
#: accounts/templates/accounts/profile.html:22
|
||||
#: events/templates/events/team.html:21
|
||||
msgid "Category"
|
||||
msgstr ""
|
||||
msgstr "Categoría"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:14
|
||||
#: accounts/templates/accounts/profile.html:23
|
||||
#: events/templates/events/team.html:22
|
||||
msgid "Points"
|
||||
msgstr ""
|
||||
msgstr "Puntos"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:15
|
||||
#: ctfs/templates/ctfs/ctf_info.html:53
|
||||
#: accounts/templates/accounts/profile.html:24
|
||||
#: ctfs/templates/ctfs/ctf_info.html:64
|
||||
#: events/templates/events/ctf_info.html:67
|
||||
#: events/templates/events/team.html:23
|
||||
msgid "Date"
|
||||
msgstr ""
|
||||
msgstr "Fecha"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:30
|
||||
msgid "It's seem {{ user.username }} have never solved any CTF yet..."
|
||||
msgstr ""
|
||||
#: accounts/templates/accounts/profile.html:39
|
||||
msgid "It seems that this user has not solved any challenge yet..."
|
||||
msgstr "Parece que este usuario no ha resuelto ningún reto aún..."
|
||||
|
||||
#: accounts/templates/accounts/profile.html:47
|
||||
#: events/templates/events/event_info.html:63
|
||||
#: events/templates/events/event_info.html:87
|
||||
#: events/templates/events/manage_team.html:41
|
||||
#: events/templates/events/team.html:46
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:12
|
||||
msgid "Rank"
|
||||
msgstr "Rango"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:56
|
||||
msgid "Status: Member"
|
||||
msgstr "Estatus: Miembro"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:58
|
||||
msgid "Status: Visitor"
|
||||
msgstr "Estatus: Visitante"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:64
|
||||
#: events/templates/events/team.html:57
|
||||
msgid "Categories stats"
|
||||
msgstr "Estádisticas de las categorías"
|
||||
|
||||
#: accounts/templates/accounts/register.html:13
|
||||
msgid "Welcome !"
|
||||
msgstr ""
|
||||
msgstr "¡ Bienvenid@ !"
|
||||
|
||||
#: accounts/templates/accounts/register.html:14
|
||||
msgid "Your account has been created."
|
||||
msgstr ""
|
||||
msgstr "Tu cuenta ha sido creada."
|
||||
|
||||
#: accounts/templates/accounts/register.html:25
|
||||
msgid "Personal website"
|
||||
msgstr ""
|
||||
msgstr "Web personal"
|
||||
|
||||
#: accounts/templates/accounts/register.html:26
|
||||
#: events/templates/events/event_info.html:119
|
||||
msgid "Register"
|
||||
msgstr ""
|
||||
msgstr "Registrarse"
|
||||
|
||||
#: accounts/views/views.py:31
|
||||
#: accounts/views/views.py:33
|
||||
msgid "Your account was inactive."
|
||||
msgstr ""
|
||||
msgstr "Tu cuenta estaba inactiva."
|
||||
|
||||
#: accounts/views/views.py:50
|
||||
#: accounts/views/views.py:52
|
||||
msgid ""
|
||||
"The password must contain at least one letter and at least one digit or "
|
||||
"punctuation character."
|
||||
msgstr ""
|
||||
"La contraseña debe contener al menos una letra y un dígito o un signo de "
|
||||
"puntuación."
|
||||
|
||||
#: accounts/views/views.py:52
|
||||
#: accounts/views/views.py:54
|
||||
msgid "A user with that email already exists."
|
||||
msgstr ""
|
||||
msgstr "Ya existe un usuario con este email."
|
||||
|
||||
#: accounts/views/views.py:65
|
||||
#: accounts/views/views.py:67
|
||||
msgid "A user with that username already exists."
|
||||
msgstr ""
|
||||
msgstr "Ese nombre de usuario ya está en uso."
|
||||
|
||||
#: accounts/views/views.py:93
|
||||
#: accounts/views/views.py:95
|
||||
msgid "Email already taken."
|
||||
msgstr ""
|
||||
msgstr "Email ya usado."
|
||||
|
||||
#: accounts/views/views.py:99
|
||||
#: accounts/views/views.py:101
|
||||
msgid "Username already taken."
|
||||
msgstr ""
|
||||
msgstr "Nombre de usuario ya usado."
|
||||
|
||||
#: accounts/views/views.py:103
|
||||
#: accounts/views/views.py:105 events/views/teams.py:124
|
||||
msgid "Updated."
|
||||
msgstr ""
|
||||
msgstr "Actualizado."
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:9
|
||||
#: ctfs/templates/ctfs/ctf_info.html:10
|
||||
#: events/templates/events/ctf_info.html:12
|
||||
msgid "Published date"
|
||||
msgstr ""
|
||||
msgstr "Fecha de publicación"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:17
|
||||
msgid "Congratulation !"
|
||||
msgstr ""
|
||||
#: ctfs/templates/ctfs/ctf_info.html:14
|
||||
msgid "Challenge is not yet available."
|
||||
msgstr "El reto aún no está disponible."
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:19
|
||||
msgid "Already flagged"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:21 ctfs/templates/ctfs/ctf_info.html:30
|
||||
msgid "Start the challenge"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:23 ctfs/templates/ctfs/ctf_info.html:32
|
||||
msgid "Download"
|
||||
#: ctfs/templates/ctfs/ctf_info.html:21
|
||||
#: events/templates/events/ctf_info.html:18
|
||||
msgid ""
|
||||
"No translation available. Please try another language (English or French)."
|
||||
msgstr ""
|
||||
"Traducción no disponible. Por favor pruebe otro idioma (inglés o francés)."
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:27
|
||||
#: events/templates/events/ctf_info.html:24
|
||||
msgid "Congratulation !"
|
||||
msgstr "¡ Felicidades !"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:29
|
||||
#: events/templates/events/ctf_info.html:26
|
||||
msgid "Already flagged"
|
||||
msgstr "Flag ya conseguida"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:31 ctfs/templates/ctfs/ctf_info.html:40
|
||||
#: events/templates/events/ctf_info.html:36
|
||||
#: events/templates/events/ctf_info.html:45
|
||||
msgid "Start the challenge"
|
||||
msgstr "Comenzar el reto"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:33 ctfs/templates/ctfs/ctf_info.html:42
|
||||
#: events/templates/events/ctf_info.html:38
|
||||
#: events/templates/events/ctf_info.html:47
|
||||
msgid "Download"
|
||||
msgstr "Descargar"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:37
|
||||
#: events/templates/events/ctf_info.html:42
|
||||
msgid "Wrong flag ! You can do it !"
|
||||
msgstr ""
|
||||
msgstr "¡ Flag incorrecta ! ¡ Puedes hacerlo !"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:45
|
||||
#: ctfs/templates/ctfs/ctf_info.html:56
|
||||
#: events/templates/events/ctf_info.html:60
|
||||
msgid "Solved by"
|
||||
msgstr ""
|
||||
msgstr "Resuelto por"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:68
|
||||
msgid "Nobody have solved this CTF."
|
||||
msgstr ""
|
||||
#: ctfs/templates/ctfs/ctf_info.html:80
|
||||
#: events/templates/events/ctf_info.html:90
|
||||
msgid "Nobody has solved this challenge yet."
|
||||
msgstr "Nadie ha resuelto este reto aún."
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:74
|
||||
#: ctfs/templates/ctfs/ctf_info.html:87
|
||||
#: events/templates/events/ctf_info.html:97
|
||||
msgid "Author"
|
||||
msgstr ""
|
||||
msgstr "Autor"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:75
|
||||
#: ctfs/templates/ctfs/ctf_info.html:88
|
||||
#: events/templates/events/ctf_info.html:98
|
||||
msgid "Point reward"
|
||||
msgstr ""
|
||||
msgstr "Recompensa de puntos"
|
||||
|
||||
#: ctfs/templates/ctfs/ctfs_list.html:14
|
||||
msgid "Solved"
|
||||
msgstr ""
|
||||
msgstr "Resuelto"
|
||||
|
||||
#: ctfs/templates/ctfs/ctfs_list.html:37
|
||||
msgid "No ctf available for this category."
|
||||
msgstr ""
|
||||
msgstr "No hay un ctf disponible para esta categoría."
|
||||
|
||||
#: ctfs/templates/ctfs/ctfs_list.html:42
|
||||
msgid "Categories"
|
||||
msgstr ""
|
||||
msgstr "Categorías"
|
||||
|
||||
#: ctfs/templates/ctfs/ctfs_list.html:48 templates/base.html:54
|
||||
msgid "No category available."
|
||||
msgstr "No hay categoría disponible."
|
||||
|
||||
#: events/templates/events/create_team.html:10
|
||||
#: events/templates/events/join_team.html:10
|
||||
msgid "This event starts at"
|
||||
msgstr "Este evento empieza"
|
||||
|
||||
#: events/templates/events/create_team.html:17
|
||||
#: events/templates/events/join_team.html:17
|
||||
msgid "You need to be registered to the event."
|
||||
msgstr "Necesitas estar registrado al evento."
|
||||
|
||||
#: events/templates/events/create_team.html:20 events/views/teams.py:120
|
||||
msgid "Name already taken."
|
||||
msgstr "Nombre ya elegido."
|
||||
|
||||
#: events/templates/events/create_team.html:26
|
||||
#: events/templates/events/join_team.html:31
|
||||
#: events/templates/events/manage_team.html:22
|
||||
msgid "Team name"
|
||||
msgstr "Nombre de equipo"
|
||||
|
||||
#: events/templates/events/create_team.html:28
|
||||
#: events/templates/events/create_team.html:49
|
||||
#: events/templates/events/join_team.html:54
|
||||
msgid "Create Team"
|
||||
msgstr "Crear equipo"
|
||||
|
||||
#: events/templates/events/create_team.html:33
|
||||
#: events/templates/events/event_pwd.html:28
|
||||
#: events/templates/events/join_team.html:38
|
||||
msgid "You need to be logged to access this event."
|
||||
msgstr "Necesitas tener una sesión iniciada para acceder a este evento."
|
||||
|
||||
#: events/templates/events/create_team.html:42
|
||||
#: events/templates/events/event_info.html:113
|
||||
#: events/templates/events/event_pwd.html:36
|
||||
#: events/templates/events/join_team.html:47
|
||||
msgid "Starts at"
|
||||
msgstr "Empieza a las"
|
||||
|
||||
#: events/templates/events/create_team.html:43
|
||||
#: events/templates/events/event_info.html:114
|
||||
#: events/templates/events/event_pwd.html:37
|
||||
#: events/templates/events/join_team.html:48
|
||||
msgid "Ends at"
|
||||
msgstr "Acaba a las"
|
||||
|
||||
#: events/templates/events/create_team.html:47
|
||||
#: events/templates/events/event_info.html:129
|
||||
#: events/templates/events/join_team.html:52
|
||||
msgid "Manage my team"
|
||||
msgstr "Gestionar mi equipo"
|
||||
|
||||
#: events/templates/events/create_team.html:48
|
||||
#: events/templates/events/join_team.html:33
|
||||
#: events/templates/events/join_team.html:53
|
||||
msgid "Join Team"
|
||||
msgstr "Unirse a un equipo"
|
||||
|
||||
#: events/templates/events/create_team.html:53
|
||||
#: events/templates/events/join_team.html:58
|
||||
msgid "Auto-matching"
|
||||
msgstr "Auto-matching"
|
||||
|
||||
#: events/templates/events/create_team.html:57
|
||||
#: events/templates/events/join_team.html:62
|
||||
msgid "Find me a team !"
|
||||
msgstr "¡ Encuentrame un equipo !"
|
||||
|
||||
#: events/templates/events/ctf_info.html:10
|
||||
msgid "Event"
|
||||
msgstr "Evento"
|
||||
|
||||
#: events/templates/events/ctf_info.html:28
|
||||
#: events/templates/events/event_info.html:18
|
||||
msgid "This event is over."
|
||||
msgstr "Este evento ya ha acabado."
|
||||
|
||||
#: events/templates/events/ctf_info.html:30
|
||||
msgid "Error while processing your request. (Invalid Form)"
|
||||
msgstr "Error al procesar tu solicitud. (Formulario incorrecto)"
|
||||
|
||||
#: events/templates/events/ctf_info.html:32
|
||||
msgid "You must register to the event before submitting flags."
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:19
|
||||
#: events/templates/events/ctf_info.html:34
|
||||
msgid ""
|
||||
"This is a team event, please create or join a team before submitting flags."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:9
|
||||
msgid "Subscriptions is over."
|
||||
msgstr "El periodo de suscripción ha acabado."
|
||||
|
||||
#: events/templates/events/event_info.html:12
|
||||
#: events/templates/events/event_pwd.html:18
|
||||
msgid "You're already registered to this event."
|
||||
msgstr "Ya estás registrado a este evento."
|
||||
|
||||
#: events/templates/events/event_info.html:20
|
||||
#: events/templates/events/event_pwd.html:9
|
||||
msgid "This event start at"
|
||||
msgstr "Este evento empieza"
|
||||
|
||||
#: events/templates/events/event_info.html:30
|
||||
msgid "Challenges"
|
||||
msgstr "Retos"
|
||||
|
||||
#: events/templates/events/event_info.html:47
|
||||
msgid "No challenges available."
|
||||
msgstr "No hay retos disponibles."
|
||||
|
||||
#: events/templates/events/event_info.html:51
|
||||
msgid "The event has not started yet."
|
||||
msgstr "El evento no ha empezado aún."
|
||||
|
||||
#: events/templates/events/event_info.html:57
|
||||
msgid "ScoreBoard"
|
||||
msgstr "Tabla de puntuaciones"
|
||||
|
||||
#: events/templates/events/event_info.html:88
|
||||
msgid "Team"
|
||||
msgstr "Equipo"
|
||||
|
||||
#: events/templates/events/event_info.html:106
|
||||
msgid "No one have earn point yet, you gonna be the first ?"
|
||||
msgstr "Nadie ha conseguido puntos aún, ¿Vas a ser el primero?"
|
||||
|
||||
#: events/templates/events/event_pwd.html:15
|
||||
#: events/templates/events/join_team.html:22
|
||||
msgid "Wrong password submited."
|
||||
msgstr "Contraseña incorrecta."
|
||||
|
||||
#: events/templates/events/event_pwd.html:20
|
||||
msgid "This event is password protected"
|
||||
msgstr "Este evento está protegido con contraseña"
|
||||
|
||||
#: events/templates/events/event_pwd.html:21
|
||||
msgid "You need to submit the event password to gain access to this event."
|
||||
msgstr "Necesitas introducir la contraseña del evento para participar."
|
||||
|
||||
#: events/templates/events/events_list.html:6 templates/base.html:61
|
||||
msgid "Events"
|
||||
msgstr "Eventos"
|
||||
|
||||
#: events/templates/events/events_list.html:38
|
||||
msgid "See more"
|
||||
msgstr "Ver más"
|
||||
|
||||
#: events/templates/events/events_list.html:44
|
||||
msgid "No events available."
|
||||
msgstr "No hay eventos disponibles."
|
||||
|
||||
#: events/templates/events/join_team.html:20
|
||||
msgid "Team does not exist."
|
||||
msgstr "El equipo no existe."
|
||||
|
||||
#: events/templates/events/join_team.html:24
|
||||
msgid "Maximum size reached."
|
||||
msgstr "Tamaño máximo alcanzado."
|
||||
|
||||
#: events/templates/events/manage_team.html:26
|
||||
msgid "Team password"
|
||||
msgstr "Contraseña del equipo"
|
||||
|
||||
#: events/templates/events/manage_team.html:44
|
||||
#: events/templates/events/team.html:49
|
||||
msgid "Members"
|
||||
msgstr "Miembros"
|
||||
|
||||
#: events/templates/events/manage_team.html:52
|
||||
msgid "Leave Team"
|
||||
msgstr "Salir del equipo"
|
||||
|
||||
#: events/templates/events/manage_team.html:59
|
||||
#, fuzzy
|
||||
#| msgid "Auto-matching"
|
||||
msgid "Open to automatching"
|
||||
msgstr "Auto-matching"
|
||||
|
||||
#: events/templates/events/manage_team.html:66
|
||||
#, fuzzy
|
||||
#| msgid "Auto-matching"
|
||||
msgid "Close to automatching"
|
||||
msgstr "Auto-matching"
|
||||
|
||||
#: events/templates/events/team.html:38
|
||||
msgid "It seems that this team has not solved any challenge yet..."
|
||||
msgstr "Parece que este equipo aún no ha resuelto ningún reto..."
|
||||
|
||||
#: home/templates/home/home.html:21
|
||||
msgid "Weekly Top 5"
|
||||
msgstr "Top 5 semanal"
|
||||
|
||||
#: home/templates/home/home.html:48
|
||||
msgid "No article available."
|
||||
msgstr ""
|
||||
msgstr "Articulos no disponibles."
|
||||
|
||||
#: home/templates/home/home.html:24
|
||||
#: home/templates/home/home.html:53
|
||||
msgid "Latest challenges added"
|
||||
msgstr ""
|
||||
msgstr "Ultimos retos añadidos"
|
||||
|
||||
#: home/templates/home/home.html:30
|
||||
#: home/templates/home/home.html:58
|
||||
msgid "points"
|
||||
msgstr "puntos"
|
||||
|
||||
#: home/templates/home/home.html:62
|
||||
msgid "No ctf available."
|
||||
msgstr ""
|
||||
msgstr "ctf no disponible."
|
||||
|
||||
#: home/templates/home/home.html:40
|
||||
msgid "Flags counter"
|
||||
#: home/templates/home/home.html:66
|
||||
msgid "Latest Flags"
|
||||
msgstr "Ultimas Flags."
|
||||
|
||||
#: home/templates/home/home.html:80
|
||||
msgid "Flags"
|
||||
msgstr "Flags"
|
||||
|
||||
#: home/templates/home/home.html:86
|
||||
msgid "Users"
|
||||
msgstr "Usuarios"
|
||||
|
||||
#: project/settings.py:115
|
||||
msgid "English"
|
||||
msgstr "Inglés"
|
||||
|
||||
#: project/settings.py:116
|
||||
msgid "German"
|
||||
msgstr "Alemán"
|
||||
|
||||
#: project/settings.py:117
|
||||
msgid "French"
|
||||
msgstr "Francés"
|
||||
|
||||
#: project/settings.py:118
|
||||
msgid "Russian"
|
||||
msgstr "Ruso"
|
||||
|
||||
#: project/settings.py:119
|
||||
msgid "Japanese"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:120
|
||||
msgid "Global Site"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:121
|
||||
msgid "Italian"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:122
|
||||
msgid "German"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:123
|
||||
msgid "French"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:124
|
||||
msgid "Spanish"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:125
|
||||
msgid "Russian"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:11
|
||||
msgid "Rank"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:36
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:38
|
||||
msgid "First"
|
||||
msgstr ""
|
||||
msgstr "Primero"
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:37
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:39
|
||||
msgid "Previous"
|
||||
msgstr ""
|
||||
msgstr "Anterior"
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:41
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:43
|
||||
msgid "Page "
|
||||
msgstr ""
|
||||
msgstr "Pagina "
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:45
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:47
|
||||
msgid "Next"
|
||||
msgstr ""
|
||||
msgstr "Siguiente"
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:46
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:48
|
||||
msgid "Last"
|
||||
msgstr ""
|
||||
msgstr "Último"
|
||||
|
||||
#: templates/base.html:59
|
||||
msgid "Scoreboard"
|
||||
msgstr ""
|
||||
msgstr "Tabla de puntuaciones"
|
||||
|
||||
#: templates/base.html:86
|
||||
msgid "Logout"
|
||||
msgstr ""
|
||||
#: templates/base.html:64
|
||||
msgid "Resources"
|
||||
msgstr "Recursos"
|
||||
|
||||
#: templates/base.html:93
|
||||
msgid "Logout"
|
||||
msgstr "Cerrar sesión"
|
||||
|
||||
#: templates/base.html:100
|
||||
msgid "Sign Up"
|
||||
msgstr ""
|
||||
msgstr "Registrarse"
|
||||
|
||||
#: templates/base.html:135
|
||||
msgid "Become a Patron!"
|
||||
msgstr "¡Conviertete en un Mecenas!"
|
||||
|
||||
#: templates/registration/password_reset_complete.html:11
|
||||
msgid "Your new password has been set."
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:19
|
||||
msgid "Your password can’t be too similar to your other personal information."
|
||||
msgstr ""
|
||||
msgstr "Contraseña cambiada correctamente."
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:20
|
||||
msgid "Your password must contain at least 8 characters."
|
||||
msgid "Your password can’t be too similar to your other personal information."
|
||||
msgstr ""
|
||||
"Tu contraseña no puede ser tan similar al resto de tu información personal."
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:21
|
||||
msgid "Your password can’t be a commonly used password."
|
||||
msgstr ""
|
||||
msgid "Your password must contain at least 8 characters."
|
||||
msgstr "Tu contraseña debe tener al menos 8 carácteres."
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:22
|
||||
msgid "Your password can’t be a commonly used password."
|
||||
msgstr "Tu contraseña no puede ser una contraseña tan común."
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:23
|
||||
msgid "Your password can’t be entirely numeric."
|
||||
msgstr ""
|
||||
msgstr "Tu contraseña no puede ser solo numérica."
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:25
|
||||
#: templates/registration/password_reset_confirm.html:26
|
||||
msgid "Confirm"
|
||||
msgstr ""
|
||||
msgstr "Confirmar"
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:27
|
||||
#: templates/registration/password_reset_confirm.html:28
|
||||
msgid "Submit"
|
||||
msgstr ""
|
||||
msgstr "Enviar"
|
||||
|
||||
#: templates/registration/password_reset_done.html:10
|
||||
#: templates/registration/password_reset_done.html:11
|
||||
msgid ""
|
||||
"We've emailed you instructions for setting your password. You should receive "
|
||||
"the email shortly!"
|
||||
msgstr ""
|
||||
"Te hemos enviado por email las instrucciones para cambiar tu contraseña. "
|
||||
"¡Deberías recibir el email pronto!"
|
||||
|
||||
#: templates/registration/password_reset_form.html:15
|
||||
#: templates/registration/password_reset_form.html:16
|
||||
msgid "Reset"
|
||||
msgstr ""
|
||||
msgstr "Restablecer"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Error: you're not registered to this event, so you can't register scores, "
|
||||
#~ "fucking logic."
|
||||
#~ msgstr ""
|
||||
#~ "Error: No estás registrado a este evento, por lo que no puedes ganar "
|
||||
#~ "puntos, Maldita lógica."
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-05-10 19:28+0000\n"
|
||||
"POT-Creation-Date: 2022-02-14 19:36+0100\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -18,316 +18,654 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
|
||||
#: accounts/templates/accounts/delete.html:8
|
||||
#, fuzzy
|
||||
#| msgid "Connected accounts"
|
||||
msgid "Delete account"
|
||||
msgstr "Comptes connectés"
|
||||
|
||||
#: accounts/templates/accounts/delete.html:11
|
||||
msgid "Please confirm your password to delete your account."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/delete.html:12
|
||||
msgid "Deleted accounts cannot be recovered."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/delete.html:15
|
||||
msgid "Password inccorect."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/delete.html:17
|
||||
#, fuzzy
|
||||
#| msgid "Your account has been created."
|
||||
msgid "Your account has been deleted."
|
||||
msgstr "Votre compte a été créé."
|
||||
|
||||
#: accounts/templates/accounts/delete.html:22
|
||||
#: accounts/templates/accounts/login.html:19
|
||||
#: accounts/templates/accounts/register.html:23
|
||||
#: events/templates/events/create_team.html:27
|
||||
#: events/templates/events/join_team.html:32
|
||||
msgid "Password"
|
||||
msgstr "Mot de passe"
|
||||
|
||||
#: accounts/templates/accounts/edit.html:21
|
||||
#: accounts/templates/accounts/login.html:18
|
||||
#: accounts/templates/accounts/register.html:22
|
||||
#: ctfs/templates/ctfs/ctf_info.html:50 ctfs/templates/ctfs/ctfs_list.html:12
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:12
|
||||
#: ctfs/templates/ctfs/ctf_info.html:61 ctfs/templates/ctfs/ctfs_list.html:12
|
||||
#: events/templates/events/ctf_info.html:65
|
||||
#: events/templates/events/event_info.html:64
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
||||
msgid "Username"
|
||||
msgstr ""
|
||||
msgstr "Pseudo"
|
||||
|
||||
#: accounts/templates/accounts/edit.html:25
|
||||
msgid "Email"
|
||||
msgstr ""
|
||||
msgstr "Email"
|
||||
|
||||
#: accounts/templates/accounts/edit.html:30
|
||||
#: ctfs/templates/ctfs/ctf_info.html:51
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
||||
#: ctfs/templates/ctfs/ctf_info.html:62
|
||||
#: events/templates/events/ctf_info.html:66
|
||||
#: events/templates/events/event_info.html:65
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:14
|
||||
msgid "Website"
|
||||
msgstr ""
|
||||
msgstr "Site internet"
|
||||
|
||||
#: accounts/templates/accounts/edit.html:36
|
||||
#: events/templates/events/manage_team.html:29
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
msgstr "Appliquer"
|
||||
|
||||
#: accounts/templates/accounts/edit.html:44
|
||||
msgid "Connected accounts"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:51
|
||||
msgid "Disconnect Discord"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:56
|
||||
msgid "Connect Discord"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:66
|
||||
#: accounts/templates/accounts/profile.html:37
|
||||
#: ctfs/templates/ctfs/ctf_info.html:52 ctfs/templates/ctfs/ctfs_list.html:13
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:14
|
||||
#: accounts/templates/accounts/edit.html:47
|
||||
#: accounts/templates/accounts/profile.html:46
|
||||
#: ctfs/templates/ctfs/ctf_info.html:63 ctfs/templates/ctfs/ctfs_list.html:13
|
||||
#: events/templates/events/event_info.html:66
|
||||
#: events/templates/events/event_info.html:89
|
||||
#: events/templates/events/manage_team.html:40
|
||||
#: events/templates/events/team.html:45
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:15
|
||||
msgid "Score"
|
||||
msgstr ""
|
||||
msgstr "Score"
|
||||
|
||||
#: accounts/templates/accounts/edit.html:74
|
||||
#: accounts/templates/accounts/profile.html:45
|
||||
msgid "Member since"
|
||||
msgstr ""
|
||||
#: accounts/templates/accounts/edit.html:55
|
||||
#: accounts/templates/accounts/profile.html:60
|
||||
msgid "Registered since"
|
||||
msgstr "Inscrit depuis"
|
||||
|
||||
#: accounts/templates/accounts/edit.html:61
|
||||
#, fuzzy
|
||||
#| msgid "Connected accounts"
|
||||
msgid "Delete my account"
|
||||
msgstr "Comptes connectés"
|
||||
|
||||
#: accounts/templates/accounts/login.html:13
|
||||
msgid "Please, verify your infos."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/login.html:19
|
||||
#: accounts/templates/accounts/register.html:23
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
msgstr "Merci de vérifier vos informations."
|
||||
|
||||
#: accounts/templates/accounts/login.html:22
|
||||
msgid "Reset password"
|
||||
msgstr ""
|
||||
msgstr "Réinitialiser le mot de passe"
|
||||
|
||||
#: accounts/templates/accounts/login.html:31
|
||||
#: accounts/templates/accounts/register.html:38 templates/base.html:90
|
||||
#: accounts/templates/accounts/register.html:38 templates/base.html:97
|
||||
#: templates/registration/password_reset_complete.html:18
|
||||
#: templates/registration/password_reset_confirm.html:37
|
||||
#: templates/registration/password_reset_done.html:17
|
||||
#: templates/registration/password_reset_form.html:25
|
||||
#: templates/registration/password_reset_confirm.html:38
|
||||
#: templates/registration/password_reset_done.html:18
|
||||
#: templates/registration/password_reset_form.html:26
|
||||
msgid "Login"
|
||||
msgstr ""
|
||||
msgstr "Connexion"
|
||||
|
||||
#: accounts/templates/accounts/login.html:32
|
||||
#: accounts/templates/accounts/register.html:37
|
||||
#: templates/registration/password_reset_complete.html:19
|
||||
#: templates/registration/password_reset_confirm.html:38
|
||||
#: templates/registration/password_reset_done.html:18
|
||||
#: templates/registration/password_reset_form.html:26
|
||||
#: templates/registration/password_reset_confirm.html:39
|
||||
#: templates/registration/password_reset_done.html:19
|
||||
#: templates/registration/password_reset_form.html:27
|
||||
msgid "Sign up"
|
||||
msgstr ""
|
||||
msgstr "Inscription"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:12
|
||||
#: accounts/templates/accounts/profile.html:10
|
||||
msgid "Challenges Solved by"
|
||||
msgstr "Challenges résolus par"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:21
|
||||
#: events/templates/events/team.html:20
|
||||
msgid "Challenge Name"
|
||||
msgstr ""
|
||||
msgstr "Nom du challenge"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:13
|
||||
#: accounts/templates/accounts/profile.html:22
|
||||
#: events/templates/events/team.html:21
|
||||
msgid "Category"
|
||||
msgstr ""
|
||||
msgstr "Catégorie"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:14
|
||||
#: accounts/templates/accounts/profile.html:23
|
||||
#: events/templates/events/team.html:22
|
||||
msgid "Points"
|
||||
msgstr ""
|
||||
msgstr "Points"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:15
|
||||
#: ctfs/templates/ctfs/ctf_info.html:53
|
||||
#: accounts/templates/accounts/profile.html:24
|
||||
#: ctfs/templates/ctfs/ctf_info.html:64
|
||||
#: events/templates/events/ctf_info.html:67
|
||||
#: events/templates/events/team.html:23
|
||||
msgid "Date"
|
||||
msgstr ""
|
||||
msgstr "Date"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:30
|
||||
msgid "It's seem {{ user.username }} have never solved any CTF yet..."
|
||||
msgstr ""
|
||||
#: accounts/templates/accounts/profile.html:39
|
||||
msgid "It seems that this user has not solved any challenge yet..."
|
||||
msgstr "Il semble que cet utilisateur n'a pas encore résolu de CTF..."
|
||||
|
||||
#: accounts/templates/accounts/profile.html:47
|
||||
#: events/templates/events/event_info.html:63
|
||||
#: events/templates/events/event_info.html:87
|
||||
#: events/templates/events/manage_team.html:41
|
||||
#: events/templates/events/team.html:46
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:12
|
||||
msgid "Rank"
|
||||
msgstr "Rang"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:56
|
||||
msgid "Status: Member"
|
||||
msgstr "Status : Membre"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:58
|
||||
msgid "Status: Visitor"
|
||||
msgstr "Status : Visiteur"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:64
|
||||
#: events/templates/events/team.html:57
|
||||
#, fuzzy
|
||||
#| msgid "Categories"
|
||||
msgid "Categories stats"
|
||||
msgstr "Catégories"
|
||||
|
||||
#: accounts/templates/accounts/register.html:13
|
||||
msgid "Welcome !"
|
||||
msgstr ""
|
||||
msgstr "Bienvenue !"
|
||||
|
||||
#: accounts/templates/accounts/register.html:14
|
||||
msgid "Your account has been created."
|
||||
msgstr ""
|
||||
msgstr "Votre compte a été créé."
|
||||
|
||||
#: accounts/templates/accounts/register.html:25
|
||||
msgid "Personal website"
|
||||
msgstr ""
|
||||
msgstr "Site personnel"
|
||||
|
||||
#: accounts/templates/accounts/register.html:26
|
||||
#: events/templates/events/event_info.html:119
|
||||
msgid "Register"
|
||||
msgstr ""
|
||||
msgstr "Inscription"
|
||||
|
||||
#: accounts/views/views.py:31
|
||||
#: accounts/views/views.py:33
|
||||
msgid "Your account was inactive."
|
||||
msgstr ""
|
||||
msgstr "Votre compte était inactif."
|
||||
|
||||
#: accounts/views/views.py:50
|
||||
#: accounts/views/views.py:52
|
||||
msgid ""
|
||||
"The password must contain at least one letter and at least one digit or "
|
||||
"punctuation character."
|
||||
msgstr ""
|
||||
"Le mot de passe doit contenir au moins une lettre, un chiffre et un signe de "
|
||||
"ponctuation."
|
||||
|
||||
#: accounts/views/views.py:52
|
||||
#: accounts/views/views.py:54
|
||||
msgid "A user with that email already exists."
|
||||
msgstr ""
|
||||
msgstr "Un utilisateur avec cet email existe déjà."
|
||||
|
||||
#: accounts/views/views.py:65
|
||||
#: accounts/views/views.py:67
|
||||
msgid "A user with that username already exists."
|
||||
msgstr ""
|
||||
msgstr "Un utilisateur avec ce pseudo existe déjà."
|
||||
|
||||
#: accounts/views/views.py:93
|
||||
#: accounts/views/views.py:95
|
||||
msgid "Email already taken."
|
||||
msgstr ""
|
||||
msgstr "L'adresse mail est déjà utilisée."
|
||||
|
||||
#: accounts/views/views.py:99
|
||||
#: accounts/views/views.py:101
|
||||
msgid "Username already taken."
|
||||
msgstr ""
|
||||
msgstr "Le pseudo est déjà utilisé."
|
||||
|
||||
#: accounts/views/views.py:103
|
||||
#: accounts/views/views.py:105 events/views/teams.py:124
|
||||
msgid "Updated."
|
||||
msgstr ""
|
||||
msgstr "Mis à jour."
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:9
|
||||
#: ctfs/templates/ctfs/ctf_info.html:10
|
||||
#: events/templates/events/ctf_info.html:12
|
||||
msgid "Published date"
|
||||
msgstr ""
|
||||
msgstr "Date de publication"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:17
|
||||
msgid "Congratulation !"
|
||||
msgstr ""
|
||||
#: ctfs/templates/ctfs/ctf_info.html:14
|
||||
#, fuzzy
|
||||
#| msgid "No category available."
|
||||
msgid "Challenge is not yet available."
|
||||
msgstr "Il n'y a pas de catégorie disponible."
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:19
|
||||
msgid "Already flagged"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:21 ctfs/templates/ctfs/ctf_info.html:30
|
||||
msgid "Start the challenge"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:23 ctfs/templates/ctfs/ctf_info.html:32
|
||||
msgid "Download"
|
||||
#: ctfs/templates/ctfs/ctf_info.html:21
|
||||
#: events/templates/events/ctf_info.html:18
|
||||
msgid ""
|
||||
"No translation available. Please try another language (English or French)."
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:27
|
||||
#: events/templates/events/ctf_info.html:24
|
||||
msgid "Congratulation !"
|
||||
msgstr "Félicitations !"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:29
|
||||
#: events/templates/events/ctf_info.html:26
|
||||
msgid "Already flagged"
|
||||
msgstr "Déjà résolu"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:31 ctfs/templates/ctfs/ctf_info.html:40
|
||||
#: events/templates/events/ctf_info.html:36
|
||||
#: events/templates/events/ctf_info.html:45
|
||||
msgid "Start the challenge"
|
||||
msgstr "Démarrer le challenge"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:33 ctfs/templates/ctfs/ctf_info.html:42
|
||||
#: events/templates/events/ctf_info.html:38
|
||||
#: events/templates/events/ctf_info.html:47
|
||||
msgid "Download"
|
||||
msgstr "Télécharger"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:37
|
||||
#: events/templates/events/ctf_info.html:42
|
||||
msgid "Wrong flag ! You can do it !"
|
||||
msgstr ""
|
||||
msgstr "Mauvais flag ! Vous pouvez le faire !"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:45
|
||||
#: ctfs/templates/ctfs/ctf_info.html:56
|
||||
#: events/templates/events/ctf_info.html:60
|
||||
msgid "Solved by"
|
||||
msgstr ""
|
||||
msgstr "Résolu par"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:68
|
||||
msgid "Nobody have solved this CTF."
|
||||
msgstr ""
|
||||
#: ctfs/templates/ctfs/ctf_info.html:80
|
||||
#: events/templates/events/ctf_info.html:90
|
||||
msgid "Nobody has solved this challenge yet."
|
||||
msgstr "Personne n'a résolu ce CTF."
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:74
|
||||
#: ctfs/templates/ctfs/ctf_info.html:87
|
||||
#: events/templates/events/ctf_info.html:97
|
||||
msgid "Author"
|
||||
msgstr ""
|
||||
msgstr "Auteur"
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:75
|
||||
#: ctfs/templates/ctfs/ctf_info.html:88
|
||||
#: events/templates/events/ctf_info.html:98
|
||||
msgid "Point reward"
|
||||
msgstr ""
|
||||
msgstr "Points"
|
||||
|
||||
#: ctfs/templates/ctfs/ctfs_list.html:14
|
||||
msgid "Solved"
|
||||
msgstr ""
|
||||
msgstr "Résolu"
|
||||
|
||||
#: ctfs/templates/ctfs/ctfs_list.html:37
|
||||
msgid "No ctf available for this category."
|
||||
msgstr ""
|
||||
msgstr "Il n'y a pas de challenges dans cette catégorie."
|
||||
|
||||
#: ctfs/templates/ctfs/ctfs_list.html:42
|
||||
msgid "Categories"
|
||||
msgstr ""
|
||||
msgstr "Catégories"
|
||||
|
||||
#: ctfs/templates/ctfs/ctfs_list.html:48 templates/base.html:54
|
||||
msgid "No category available."
|
||||
msgstr "Il n'y a pas de catégorie disponible."
|
||||
|
||||
#: events/templates/events/create_team.html:10
|
||||
#: events/templates/events/join_team.html:10
|
||||
#, fuzzy
|
||||
#| msgid "This event start at"
|
||||
msgid "This event starts at"
|
||||
msgstr "Cet événement débute à"
|
||||
|
||||
#: events/templates/events/create_team.html:17
|
||||
#: events/templates/events/join_team.html:17
|
||||
#, fuzzy
|
||||
#| msgid "You're already registered to this event."
|
||||
msgid "You need to be registered to the event."
|
||||
msgstr "Vous êtes déjà inscrit à cet événement."
|
||||
|
||||
#: events/templates/events/create_team.html:20 events/views/teams.py:120
|
||||
#, fuzzy
|
||||
#| msgid "Username already taken."
|
||||
msgid "Name already taken."
|
||||
msgstr "Ce nom est déjà utilisé."
|
||||
|
||||
#: events/templates/events/create_team.html:26
|
||||
#: events/templates/events/join_team.html:31
|
||||
#: events/templates/events/manage_team.html:22
|
||||
msgid "Team name"
|
||||
msgstr "Nom de l'équipe"
|
||||
|
||||
#: events/templates/events/create_team.html:28
|
||||
#: events/templates/events/create_team.html:49
|
||||
#: events/templates/events/join_team.html:54
|
||||
msgid "Create Team"
|
||||
msgstr "Créer une équipe"
|
||||
|
||||
#: events/templates/events/create_team.html:33
|
||||
#: events/templates/events/event_pwd.html:28
|
||||
#: events/templates/events/join_team.html:38
|
||||
msgid "You need to be logged to access this event."
|
||||
msgstr "Vous devez être connecté pour accéder à cet événement."
|
||||
|
||||
#: events/templates/events/create_team.html:42
|
||||
#: events/templates/events/event_info.html:113
|
||||
#: events/templates/events/event_pwd.html:36
|
||||
#: events/templates/events/join_team.html:47
|
||||
msgid "Starts at"
|
||||
msgstr "Début"
|
||||
|
||||
#: events/templates/events/create_team.html:43
|
||||
#: events/templates/events/event_info.html:114
|
||||
#: events/templates/events/event_pwd.html:37
|
||||
#: events/templates/events/join_team.html:48
|
||||
msgid "Ends at"
|
||||
msgstr "Fin"
|
||||
|
||||
#: events/templates/events/create_team.html:47
|
||||
#: events/templates/events/event_info.html:129
|
||||
#: events/templates/events/join_team.html:52
|
||||
msgid "Manage my team"
|
||||
msgstr "Gérer mon équipe"
|
||||
|
||||
#: events/templates/events/create_team.html:48
|
||||
#: events/templates/events/join_team.html:33
|
||||
#: events/templates/events/join_team.html:53
|
||||
msgid "Join Team"
|
||||
msgstr "Rejoindre une équipe"
|
||||
|
||||
#: events/templates/events/create_team.html:53
|
||||
#: events/templates/events/join_team.html:58
|
||||
msgid "Auto-matching"
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:19
|
||||
#: events/templates/events/create_team.html:57
|
||||
#: events/templates/events/join_team.html:62
|
||||
msgid "Find me a team !"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/ctf_info.html:10
|
||||
msgid "Event"
|
||||
msgstr "Événement"
|
||||
|
||||
#: events/templates/events/ctf_info.html:28
|
||||
#: events/templates/events/event_info.html:18
|
||||
msgid "This event is over."
|
||||
msgstr "Cet événement est terminé."
|
||||
|
||||
#: events/templates/events/ctf_info.html:30
|
||||
msgid "Error while processing your request. (Invalid Form)"
|
||||
msgstr "Erreur lors du traitement de votre requête. (Formulaire non valide)"
|
||||
|
||||
#: events/templates/events/ctf_info.html:32
|
||||
msgid "You must register to the event before submitting flags."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/ctf_info.html:34
|
||||
msgid ""
|
||||
"This is a team event, please create or join a team before submitting flags."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:9
|
||||
msgid "Subscriptions is over."
|
||||
msgstr "Les inscriptions sont terminées."
|
||||
|
||||
#: events/templates/events/event_info.html:12
|
||||
#: events/templates/events/event_pwd.html:18
|
||||
msgid "You're already registered to this event."
|
||||
msgstr "Vous êtes déjà inscrit à cet événement."
|
||||
|
||||
#: events/templates/events/event_info.html:20
|
||||
#: events/templates/events/event_pwd.html:9
|
||||
msgid "This event start at"
|
||||
msgstr "Cet événement débute à"
|
||||
|
||||
#: events/templates/events/event_info.html:30
|
||||
#, fuzzy
|
||||
#| msgid "Challenge Name"
|
||||
msgid "Challenges"
|
||||
msgstr "Nom du challenge"
|
||||
|
||||
#: events/templates/events/event_info.html:47
|
||||
#, fuzzy
|
||||
#| msgid "No category available."
|
||||
msgid "No challenges available."
|
||||
msgstr "Il n'y a pas de catégorie disponible."
|
||||
|
||||
#: events/templates/events/event_info.html:51
|
||||
msgid "The event has not started yet."
|
||||
msgstr "L'événement n'a pas encore commencé."
|
||||
|
||||
#: events/templates/events/event_info.html:57
|
||||
#, fuzzy
|
||||
#| msgid "Scoreboard"
|
||||
msgid "ScoreBoard"
|
||||
msgstr "Classement"
|
||||
|
||||
#: events/templates/events/event_info.html:88
|
||||
msgid "Team"
|
||||
msgstr "Équipe"
|
||||
|
||||
#: events/templates/events/event_info.html:106
|
||||
msgid "No one have earn point yet, you gonna be the first ?"
|
||||
msgstr "Personne n'a encore gagné de point, allez-vous être le premier ?"
|
||||
|
||||
#: events/templates/events/event_pwd.html:15
|
||||
#: events/templates/events/join_team.html:22
|
||||
msgid "Wrong password submited."
|
||||
msgstr "Mauvais mot de passe saisi."
|
||||
|
||||
#: events/templates/events/event_pwd.html:20
|
||||
msgid "This event is password protected"
|
||||
msgstr "Cet événement est protégé par un mot de passe"
|
||||
|
||||
#: events/templates/events/event_pwd.html:21
|
||||
msgid "You need to submit the event password to gain access to this event."
|
||||
msgstr "Vous devez saisir le mot de passe de l'événement pour y avoir accès."
|
||||
|
||||
#: events/templates/events/events_list.html:6 templates/base.html:61
|
||||
msgid "Events"
|
||||
msgstr "Événements"
|
||||
|
||||
#: events/templates/events/events_list.html:38
|
||||
msgid "See more"
|
||||
msgstr "Voir plus"
|
||||
|
||||
#: events/templates/events/events_list.html:44
|
||||
msgid "No events available."
|
||||
msgstr "Pas d'évènement disponible."
|
||||
|
||||
#: events/templates/events/join_team.html:20
|
||||
msgid "Team does not exist."
|
||||
msgstr "Cette équipe n'existe pas."
|
||||
|
||||
#: events/templates/events/join_team.html:24
|
||||
msgid "Maximum size reached."
|
||||
msgstr "Taille maximale atteinte."
|
||||
|
||||
#: events/templates/events/manage_team.html:26
|
||||
msgid "Team password"
|
||||
msgstr "Mot de passe de l'équipe"
|
||||
|
||||
#: events/templates/events/manage_team.html:44
|
||||
#: events/templates/events/team.html:49
|
||||
msgid "Members"
|
||||
msgstr "Membres"
|
||||
|
||||
#: events/templates/events/manage_team.html:52
|
||||
msgid "Leave Team"
|
||||
msgstr "Quitte l'équipe"
|
||||
|
||||
#: events/templates/events/manage_team.html:59
|
||||
msgid "Open to automatching"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/manage_team.html:66
|
||||
msgid "Close to automatching"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/team.html:38
|
||||
msgid "It seems that this team has not solved any challenge yet..."
|
||||
msgstr "Il semble que cette équipe n'a pas encore résolu de challenge..."
|
||||
|
||||
#: home/templates/home/home.html:21
|
||||
msgid "Weekly Top 5"
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:48
|
||||
msgid "No article available."
|
||||
msgstr ""
|
||||
msgstr "Il n'y a pas d'article disponible."
|
||||
|
||||
#: home/templates/home/home.html:24
|
||||
#: home/templates/home/home.html:53
|
||||
msgid "Latest challenges added"
|
||||
msgstr ""
|
||||
msgstr "Derniers challenges ajoutés"
|
||||
|
||||
#: home/templates/home/home.html:30
|
||||
#: home/templates/home/home.html:58
|
||||
#, fuzzy
|
||||
#| msgid "Points"
|
||||
msgid "points"
|
||||
msgstr "Points"
|
||||
|
||||
#: home/templates/home/home.html:62
|
||||
msgid "No ctf available."
|
||||
msgstr "Pas de challenge disponible"
|
||||
|
||||
#: home/templates/home/home.html:66
|
||||
msgid "Latest Flags"
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:40
|
||||
msgid "Flags counter"
|
||||
#: home/templates/home/home.html:80
|
||||
msgid "Flags"
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:86
|
||||
#, fuzzy
|
||||
#| msgid "Username"
|
||||
msgid "Users"
|
||||
msgstr "Pseudo"
|
||||
|
||||
#: project/settings.py:115
|
||||
msgid "English"
|
||||
msgstr "Anglais"
|
||||
|
||||
#: project/settings.py:116
|
||||
msgid "German"
|
||||
msgstr "Allemand"
|
||||
|
||||
#: project/settings.py:117
|
||||
msgid "French"
|
||||
msgstr "Français"
|
||||
|
||||
#: project/settings.py:118
|
||||
msgid "Russian"
|
||||
msgstr "Russe"
|
||||
|
||||
#: project/settings.py:119
|
||||
msgid "Japanese"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:120
|
||||
msgid "Global Site"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:121
|
||||
msgid "Italian"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:122
|
||||
msgid "German"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:123
|
||||
msgid "French"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:124
|
||||
msgid "Spanish"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:125
|
||||
msgid "Russian"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:11
|
||||
msgid "Rank"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:36
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:38
|
||||
msgid "First"
|
||||
msgstr ""
|
||||
msgstr "Début"
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:37
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:39
|
||||
msgid "Previous"
|
||||
msgstr ""
|
||||
msgstr "Précédente"
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:41
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:43
|
||||
msgid "Page "
|
||||
msgstr ""
|
||||
msgstr "Page"
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:45
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:47
|
||||
msgid "Next"
|
||||
msgstr ""
|
||||
msgstr "Suivante"
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:46
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:48
|
||||
msgid "Last"
|
||||
msgstr ""
|
||||
msgstr "Fin"
|
||||
|
||||
#: templates/base.html:59
|
||||
msgid "Scoreboard"
|
||||
msgstr ""
|
||||
msgstr "Classement"
|
||||
|
||||
#: templates/base.html:86
|
||||
msgid "Logout"
|
||||
#: templates/base.html:64
|
||||
msgid "Resources"
|
||||
msgstr ""
|
||||
|
||||
#: templates/base.html:93
|
||||
msgid "Logout"
|
||||
msgstr "Déconnexion"
|
||||
|
||||
#: templates/base.html:100
|
||||
msgid "Sign Up"
|
||||
msgstr ""
|
||||
msgstr "Inscription"
|
||||
|
||||
#: templates/base.html:135
|
||||
msgid "Become a Patron!"
|
||||
msgstr "Soutenez nous via Patreon !"
|
||||
|
||||
#: templates/registration/password_reset_complete.html:11
|
||||
msgid "Your new password has been set."
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:19
|
||||
msgid "Your password can’t be too similar to your other personal information."
|
||||
msgstr ""
|
||||
msgstr "Votre mot de passe a été mis à jour."
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:20
|
||||
msgid "Your password must contain at least 8 characters."
|
||||
msgstr ""
|
||||
msgid "Your password can’t be too similar to your other personal information."
|
||||
msgstr "Votre mot de passe ne peut pas être similaire à votre adresse mail."
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:21
|
||||
msgid "Your password can’t be a commonly used password."
|
||||
msgstr ""
|
||||
msgid "Your password must contain at least 8 characters."
|
||||
msgstr "Votre mot de passe doit contenir au moins 8 caractères."
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:22
|
||||
msgid "Your password can’t be a commonly used password."
|
||||
msgstr "Votre mot de passe ne peut pas être un mot de passe commun."
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:23
|
||||
msgid "Your password can’t be entirely numeric."
|
||||
msgstr ""
|
||||
msgstr "Votre mot de passe ne peut pas être entièrement numérique."
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:25
|
||||
#: templates/registration/password_reset_confirm.html:26
|
||||
msgid "Confirm"
|
||||
msgstr ""
|
||||
msgstr "Confirmer"
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:27
|
||||
#: templates/registration/password_reset_confirm.html:28
|
||||
msgid "Submit"
|
||||
msgstr ""
|
||||
msgstr "Soumettre"
|
||||
|
||||
#: templates/registration/password_reset_done.html:10
|
||||
#: templates/registration/password_reset_done.html:11
|
||||
msgid ""
|
||||
"We've emailed you instructions for setting your password. You should receive "
|
||||
"the email shortly!"
|
||||
msgstr ""
|
||||
"Vous devrierz recevoir rapidement un email avec des instructions pour "
|
||||
"réinitialiser votre mot de passe."
|
||||
|
||||
#: templates/registration/password_reset_form.html:15
|
||||
#: templates/registration/password_reset_form.html:16
|
||||
msgid "Reset"
|
||||
msgstr ""
|
||||
msgstr "Réinitialiser"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Error: you're not registered to this event, so you can't register scores, "
|
||||
#~ "fucking logic."
|
||||
#~ msgstr ""
|
||||
#~ "Erreur : vous n'êtes pas inscrit à cet événement, vous ne pouvez donc pas "
|
||||
#~ "enregistrer de scores,C'est putain de logique."
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Manage my team"
|
||||
#~ msgid "Manage team"
|
||||
#~ msgstr "Gérer mon équipe"
|
||||
|
||||
#~ msgid "Start at"
|
||||
#~ msgstr "Début"
|
||||
|
||||
#~ msgid "End at"
|
||||
#~ msgstr "Fin"
|
||||
|
||||
#~ msgid "Disconnect Discord"
|
||||
#~ msgstr "Déconnecter Discord"
|
||||
|
||||
#~ msgid "Connect Discord"
|
||||
#~ msgstr "Connecter Discord"
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-05-10 19:28+0000\n"
|
||||
"POT-Creation-Date: 2022-02-14 19:36+0100\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -18,11 +18,41 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: accounts/templates/accounts/delete.html:8
|
||||
msgid "Delete account"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/delete.html:11
|
||||
msgid "Please confirm your password to delete your account."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/delete.html:12
|
||||
msgid "Deleted accounts cannot be recovered."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/delete.html:15
|
||||
msgid "Password inccorect."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/delete.html:17
|
||||
msgid "Your account has been deleted."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/delete.html:22
|
||||
#: accounts/templates/accounts/login.html:19
|
||||
#: accounts/templates/accounts/register.html:23
|
||||
#: events/templates/events/create_team.html:27
|
||||
#: events/templates/events/join_team.html:32
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:21
|
||||
#: accounts/templates/accounts/login.html:18
|
||||
#: accounts/templates/accounts/register.html:22
|
||||
#: ctfs/templates/ctfs/ctf_info.html:50 ctfs/templates/ctfs/ctfs_list.html:12
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:12
|
||||
#: ctfs/templates/ctfs/ctf_info.html:61 ctfs/templates/ctfs/ctfs_list.html:12
|
||||
#: events/templates/events/ctf_info.html:65
|
||||
#: events/templates/events/event_info.html:64
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
||||
msgid "Username"
|
||||
msgstr ""
|
||||
|
||||
|
@ -31,89 +61,114 @@ msgid "Email"
|
|||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:30
|
||||
#: ctfs/templates/ctfs/ctf_info.html:51
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
||||
#: ctfs/templates/ctfs/ctf_info.html:62
|
||||
#: events/templates/events/ctf_info.html:66
|
||||
#: events/templates/events/event_info.html:65
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:14
|
||||
msgid "Website"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:36
|
||||
#: events/templates/events/manage_team.html:29
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:44
|
||||
msgid "Connected accounts"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:51
|
||||
msgid "Disconnect Discord"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:56
|
||||
msgid "Connect Discord"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:66
|
||||
#: accounts/templates/accounts/profile.html:37
|
||||
#: ctfs/templates/ctfs/ctf_info.html:52 ctfs/templates/ctfs/ctfs_list.html:13
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:14
|
||||
#: accounts/templates/accounts/edit.html:47
|
||||
#: accounts/templates/accounts/profile.html:46
|
||||
#: ctfs/templates/ctfs/ctf_info.html:63 ctfs/templates/ctfs/ctfs_list.html:13
|
||||
#: events/templates/events/event_info.html:66
|
||||
#: events/templates/events/event_info.html:89
|
||||
#: events/templates/events/manage_team.html:40
|
||||
#: events/templates/events/team.html:45
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:15
|
||||
msgid "Score"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:74
|
||||
#: accounts/templates/accounts/profile.html:45
|
||||
msgid "Member since"
|
||||
#: accounts/templates/accounts/edit.html:55
|
||||
#: accounts/templates/accounts/profile.html:60
|
||||
msgid "Registered since"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:61
|
||||
msgid "Delete my account"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/login.html:13
|
||||
msgid "Please, verify your infos."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/login.html:19
|
||||
#: accounts/templates/accounts/register.html:23
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/login.html:22
|
||||
msgid "Reset password"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/login.html:31
|
||||
#: accounts/templates/accounts/register.html:38 templates/base.html:90
|
||||
#: accounts/templates/accounts/register.html:38 templates/base.html:97
|
||||
#: templates/registration/password_reset_complete.html:18
|
||||
#: templates/registration/password_reset_confirm.html:37
|
||||
#: templates/registration/password_reset_done.html:17
|
||||
#: templates/registration/password_reset_form.html:25
|
||||
#: templates/registration/password_reset_confirm.html:38
|
||||
#: templates/registration/password_reset_done.html:18
|
||||
#: templates/registration/password_reset_form.html:26
|
||||
msgid "Login"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/login.html:32
|
||||
#: accounts/templates/accounts/register.html:37
|
||||
#: templates/registration/password_reset_complete.html:19
|
||||
#: templates/registration/password_reset_confirm.html:38
|
||||
#: templates/registration/password_reset_done.html:18
|
||||
#: templates/registration/password_reset_form.html:26
|
||||
#: templates/registration/password_reset_confirm.html:39
|
||||
#: templates/registration/password_reset_done.html:19
|
||||
#: templates/registration/password_reset_form.html:27
|
||||
msgid "Sign up"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:12
|
||||
#: accounts/templates/accounts/profile.html:10
|
||||
msgid "Challenges Solved by"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:21
|
||||
#: events/templates/events/team.html:20
|
||||
msgid "Challenge Name"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:13
|
||||
#: accounts/templates/accounts/profile.html:22
|
||||
#: events/templates/events/team.html:21
|
||||
msgid "Category"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:14
|
||||
#: accounts/templates/accounts/profile.html:23
|
||||
#: events/templates/events/team.html:22
|
||||
msgid "Points"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:15
|
||||
#: ctfs/templates/ctfs/ctf_info.html:53
|
||||
#: accounts/templates/accounts/profile.html:24
|
||||
#: ctfs/templates/ctfs/ctf_info.html:64
|
||||
#: events/templates/events/ctf_info.html:67
|
||||
#: events/templates/events/team.html:23
|
||||
msgid "Date"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:30
|
||||
msgid "It's seem {{ user.username }} have never solved any CTF yet..."
|
||||
#: accounts/templates/accounts/profile.html:39
|
||||
msgid "It seems that this user has not solved any challenge yet..."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:47
|
||||
#: events/templates/events/event_info.html:63
|
||||
#: events/templates/events/event_info.html:87
|
||||
#: events/templates/events/manage_team.html:41
|
||||
#: events/templates/events/team.html:46
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:12
|
||||
msgid "Rank"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:56
|
||||
msgid "Status: Member"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:58
|
||||
msgid "Status: Visitor"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:64
|
||||
#: events/templates/events/team.html:57
|
||||
msgid "Categories stats"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/register.html:13
|
||||
|
@ -129,76 +184,99 @@ msgid "Personal website"
|
|||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/register.html:26
|
||||
#: events/templates/events/event_info.html:119
|
||||
msgid "Register"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:31
|
||||
#: accounts/views/views.py:33
|
||||
msgid "Your account was inactive."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:50
|
||||
#: accounts/views/views.py:52
|
||||
msgid ""
|
||||
"The password must contain at least one letter and at least one digit or "
|
||||
"punctuation character."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:52
|
||||
#: accounts/views/views.py:54
|
||||
msgid "A user with that email already exists."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:65
|
||||
#: accounts/views/views.py:67
|
||||
msgid "A user with that username already exists."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:93
|
||||
#: accounts/views/views.py:95
|
||||
msgid "Email already taken."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:99
|
||||
#: accounts/views/views.py:101
|
||||
msgid "Username already taken."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:103
|
||||
#: accounts/views/views.py:105 events/views/teams.py:124
|
||||
msgid "Updated."
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:9
|
||||
#: ctfs/templates/ctfs/ctf_info.html:10
|
||||
#: events/templates/events/ctf_info.html:12
|
||||
msgid "Published date"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:17
|
||||
msgid "Congratulation !"
|
||||
#: ctfs/templates/ctfs/ctf_info.html:14
|
||||
msgid "Challenge is not yet available."
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:19
|
||||
msgid "Already flagged"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:21 ctfs/templates/ctfs/ctf_info.html:30
|
||||
msgid "Start the challenge"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:23 ctfs/templates/ctfs/ctf_info.html:32
|
||||
msgid "Download"
|
||||
#: ctfs/templates/ctfs/ctf_info.html:21
|
||||
#: events/templates/events/ctf_info.html:18
|
||||
msgid ""
|
||||
"No translation available. Please try another language (English or French)."
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:27
|
||||
#: events/templates/events/ctf_info.html:24
|
||||
msgid "Congratulation !"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:29
|
||||
#: events/templates/events/ctf_info.html:26
|
||||
msgid "Already flagged"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:31 ctfs/templates/ctfs/ctf_info.html:40
|
||||
#: events/templates/events/ctf_info.html:36
|
||||
#: events/templates/events/ctf_info.html:45
|
||||
msgid "Start the challenge"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:33 ctfs/templates/ctfs/ctf_info.html:42
|
||||
#: events/templates/events/ctf_info.html:38
|
||||
#: events/templates/events/ctf_info.html:47
|
||||
msgid "Download"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:37
|
||||
#: events/templates/events/ctf_info.html:42
|
||||
msgid "Wrong flag ! You can do it !"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:45
|
||||
#: ctfs/templates/ctfs/ctf_info.html:56
|
||||
#: events/templates/events/ctf_info.html:60
|
||||
msgid "Solved by"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:68
|
||||
msgid "Nobody have solved this CTF."
|
||||
#: ctfs/templates/ctfs/ctf_info.html:80
|
||||
#: events/templates/events/ctf_info.html:90
|
||||
msgid "Nobody has solved this challenge yet."
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:74
|
||||
#: ctfs/templates/ctfs/ctf_info.html:87
|
||||
#: events/templates/events/ctf_info.html:97
|
||||
msgid "Author"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:75
|
||||
#: ctfs/templates/ctfs/ctf_info.html:88
|
||||
#: events/templates/events/ctf_info.html:98
|
||||
msgid "Point reward"
|
||||
msgstr ""
|
||||
|
||||
|
@ -218,67 +296,265 @@ msgstr ""
|
|||
msgid "No category available."
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:19
|
||||
#: events/templates/events/create_team.html:10
|
||||
#: events/templates/events/join_team.html:10
|
||||
msgid "This event starts at"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:17
|
||||
#: events/templates/events/join_team.html:17
|
||||
msgid "You need to be registered to the event."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:20 events/views/teams.py:120
|
||||
msgid "Name already taken."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:26
|
||||
#: events/templates/events/join_team.html:31
|
||||
#: events/templates/events/manage_team.html:22
|
||||
msgid "Team name"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:28
|
||||
#: events/templates/events/create_team.html:49
|
||||
#: events/templates/events/join_team.html:54
|
||||
msgid "Create Team"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:33
|
||||
#: events/templates/events/event_pwd.html:28
|
||||
#: events/templates/events/join_team.html:38
|
||||
msgid "You need to be logged to access this event."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:42
|
||||
#: events/templates/events/event_info.html:113
|
||||
#: events/templates/events/event_pwd.html:36
|
||||
#: events/templates/events/join_team.html:47
|
||||
msgid "Starts at"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:43
|
||||
#: events/templates/events/event_info.html:114
|
||||
#: events/templates/events/event_pwd.html:37
|
||||
#: events/templates/events/join_team.html:48
|
||||
msgid "Ends at"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:47
|
||||
#: events/templates/events/event_info.html:129
|
||||
#: events/templates/events/join_team.html:52
|
||||
msgid "Manage my team"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:48
|
||||
#: events/templates/events/join_team.html:33
|
||||
#: events/templates/events/join_team.html:53
|
||||
msgid "Join Team"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:53
|
||||
#: events/templates/events/join_team.html:58
|
||||
msgid "Auto-matching"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:57
|
||||
#: events/templates/events/join_team.html:62
|
||||
msgid "Find me a team !"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/ctf_info.html:10
|
||||
msgid "Event"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/ctf_info.html:28
|
||||
#: events/templates/events/event_info.html:18
|
||||
msgid "This event is over."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/ctf_info.html:30
|
||||
msgid "Error while processing your request. (Invalid Form)"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/ctf_info.html:32
|
||||
msgid "You must register to the event before submitting flags."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/ctf_info.html:34
|
||||
msgid ""
|
||||
"This is a team event, please create or join a team before submitting flags."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:9
|
||||
msgid "Subscriptions is over."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:12
|
||||
#: events/templates/events/event_pwd.html:18
|
||||
msgid "You're already registered to this event."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:20
|
||||
#: events/templates/events/event_pwd.html:9
|
||||
msgid "This event start at"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:30
|
||||
msgid "Challenges"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:47
|
||||
msgid "No challenges available."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:51
|
||||
msgid "The event has not started yet."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:57
|
||||
msgid "ScoreBoard"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:88
|
||||
msgid "Team"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:106
|
||||
msgid "No one have earn point yet, you gonna be the first ?"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_pwd.html:15
|
||||
#: events/templates/events/join_team.html:22
|
||||
msgid "Wrong password submited."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_pwd.html:20
|
||||
msgid "This event is password protected"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_pwd.html:21
|
||||
msgid "You need to submit the event password to gain access to this event."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/events_list.html:6 templates/base.html:61
|
||||
msgid "Events"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/events_list.html:38
|
||||
msgid "See more"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/events_list.html:44
|
||||
msgid "No events available."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/join_team.html:20
|
||||
msgid "Team does not exist."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/join_team.html:24
|
||||
msgid "Maximum size reached."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/manage_team.html:26
|
||||
msgid "Team password"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/manage_team.html:44
|
||||
#: events/templates/events/team.html:49
|
||||
msgid "Members"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/manage_team.html:52
|
||||
msgid "Leave Team"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/manage_team.html:59
|
||||
msgid "Open to automatching"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/manage_team.html:66
|
||||
msgid "Close to automatching"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/team.html:38
|
||||
msgid "It seems that this team has not solved any challenge yet..."
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:21
|
||||
msgid "Weekly Top 5"
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:48
|
||||
msgid "No article available."
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:24
|
||||
#: home/templates/home/home.html:53
|
||||
msgid "Latest challenges added"
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:30
|
||||
#: home/templates/home/home.html:58
|
||||
msgid "points"
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:62
|
||||
msgid "No ctf available."
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:40
|
||||
msgid "Flags counter"
|
||||
#: home/templates/home/home.html:66
|
||||
msgid "Latest Flags"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:120
|
||||
msgid "Global Site"
|
||||
#: home/templates/home/home.html:80
|
||||
msgid "Flags"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:121
|
||||
msgid "Italian"
|
||||
#: home/templates/home/home.html:86
|
||||
msgid "Users"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:122
|
||||
#: project/settings.py:115
|
||||
msgid "English"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:116
|
||||
msgid "German"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:123
|
||||
#: project/settings.py:117
|
||||
msgid "French"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:124
|
||||
msgid "Spanish"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:125
|
||||
#: project/settings.py:118
|
||||
msgid "Russian"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:11
|
||||
msgid "Rank"
|
||||
#: project/settings.py:119
|
||||
msgid "Japanese"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:36
|
||||
#: project/settings.py:120
|
||||
msgid "Spanish"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:38
|
||||
msgid "First"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:37
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:39
|
||||
msgid "Previous"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:41
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:43
|
||||
msgid "Page "
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:45
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:47
|
||||
msgid "Next"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:46
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:48
|
||||
msgid "Last"
|
||||
msgstr ""
|
||||
|
||||
|
@ -286,48 +562,56 @@ msgstr ""
|
|||
msgid "Scoreboard"
|
||||
msgstr ""
|
||||
|
||||
#: templates/base.html:86
|
||||
msgid "Logout"
|
||||
#: templates/base.html:64
|
||||
msgid "Resources"
|
||||
msgstr ""
|
||||
|
||||
#: templates/base.html:93
|
||||
msgid "Logout"
|
||||
msgstr ""
|
||||
|
||||
#: templates/base.html:100
|
||||
msgid "Sign Up"
|
||||
msgstr ""
|
||||
|
||||
#: templates/base.html:135
|
||||
msgid "Become a Patron!"
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_complete.html:11
|
||||
msgid "Your new password has been set."
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:19
|
||||
#: templates/registration/password_reset_confirm.html:20
|
||||
msgid "Your password can’t be too similar to your other personal information."
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:20
|
||||
#: templates/registration/password_reset_confirm.html:21
|
||||
msgid "Your password must contain at least 8 characters."
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:21
|
||||
#: templates/registration/password_reset_confirm.html:22
|
||||
msgid "Your password can’t be a commonly used password."
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:22
|
||||
#: templates/registration/password_reset_confirm.html:23
|
||||
msgid "Your password can’t be entirely numeric."
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:25
|
||||
#: templates/registration/password_reset_confirm.html:26
|
||||
msgid "Confirm"
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:27
|
||||
#: templates/registration/password_reset_confirm.html:28
|
||||
msgid "Submit"
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_done.html:10
|
||||
#: templates/registration/password_reset_done.html:11
|
||||
msgid ""
|
||||
"We've emailed you instructions for setting your password. You should receive "
|
||||
"the email shortly!"
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_form.html:15
|
||||
#: templates/registration/password_reset_form.html:16
|
||||
msgid "Reset"
|
||||
msgstr ""
|
||||
|
|
|
@ -0,0 +1,617 @@
|
|||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-14 19:36+0100\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: accounts/templates/accounts/delete.html:8
|
||||
msgid "Delete account"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/delete.html:11
|
||||
msgid "Please confirm your password to delete your account."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/delete.html:12
|
||||
msgid "Deleted accounts cannot be recovered."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/delete.html:15
|
||||
msgid "Password inccorect."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/delete.html:17
|
||||
msgid "Your account has been deleted."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/delete.html:22
|
||||
#: accounts/templates/accounts/login.html:19
|
||||
#: accounts/templates/accounts/register.html:23
|
||||
#: events/templates/events/create_team.html:27
|
||||
#: events/templates/events/join_team.html:32
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:21
|
||||
#: accounts/templates/accounts/login.html:18
|
||||
#: accounts/templates/accounts/register.html:22
|
||||
#: ctfs/templates/ctfs/ctf_info.html:61 ctfs/templates/ctfs/ctfs_list.html:12
|
||||
#: events/templates/events/ctf_info.html:65
|
||||
#: events/templates/events/event_info.html:64
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
||||
msgid "Username"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:25
|
||||
msgid "Email"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:30
|
||||
#: ctfs/templates/ctfs/ctf_info.html:62
|
||||
#: events/templates/events/ctf_info.html:66
|
||||
#: events/templates/events/event_info.html:65
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:14
|
||||
msgid "Website"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:36
|
||||
#: events/templates/events/manage_team.html:29
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:47
|
||||
#: accounts/templates/accounts/profile.html:46
|
||||
#: ctfs/templates/ctfs/ctf_info.html:63 ctfs/templates/ctfs/ctfs_list.html:13
|
||||
#: events/templates/events/event_info.html:66
|
||||
#: events/templates/events/event_info.html:89
|
||||
#: events/templates/events/manage_team.html:40
|
||||
#: events/templates/events/team.html:45
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:15
|
||||
msgid "Score"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:55
|
||||
#: accounts/templates/accounts/profile.html:60
|
||||
msgid "Registered since"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:61
|
||||
msgid "Delete my account"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/login.html:13
|
||||
msgid "Please, verify your infos."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/login.html:22
|
||||
msgid "Reset password"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/login.html:31
|
||||
#: accounts/templates/accounts/register.html:38 templates/base.html:97
|
||||
#: templates/registration/password_reset_complete.html:18
|
||||
#: templates/registration/password_reset_confirm.html:38
|
||||
#: templates/registration/password_reset_done.html:18
|
||||
#: templates/registration/password_reset_form.html:26
|
||||
msgid "Login"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/login.html:32
|
||||
#: accounts/templates/accounts/register.html:37
|
||||
#: templates/registration/password_reset_complete.html:19
|
||||
#: templates/registration/password_reset_confirm.html:39
|
||||
#: templates/registration/password_reset_done.html:19
|
||||
#: templates/registration/password_reset_form.html:27
|
||||
msgid "Sign up"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:10
|
||||
msgid "Challenges Solved by"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:21
|
||||
#: events/templates/events/team.html:20
|
||||
msgid "Challenge Name"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:22
|
||||
#: events/templates/events/team.html:21
|
||||
msgid "Category"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:23
|
||||
#: events/templates/events/team.html:22
|
||||
msgid "Points"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:24
|
||||
#: ctfs/templates/ctfs/ctf_info.html:64
|
||||
#: events/templates/events/ctf_info.html:67
|
||||
#: events/templates/events/team.html:23
|
||||
msgid "Date"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:39
|
||||
msgid "It seems that this user has not solved any challenge yet..."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:47
|
||||
#: events/templates/events/event_info.html:63
|
||||
#: events/templates/events/event_info.html:87
|
||||
#: events/templates/events/manage_team.html:41
|
||||
#: events/templates/events/team.html:46
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:12
|
||||
msgid "Rank"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:56
|
||||
msgid "Status: Member"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:58
|
||||
msgid "Status: Visitor"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:64
|
||||
#: events/templates/events/team.html:57
|
||||
msgid "Categories stats"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/register.html:13
|
||||
msgid "Welcome !"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/register.html:14
|
||||
msgid "Your account has been created."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/register.html:25
|
||||
msgid "Personal website"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/register.html:26
|
||||
#: events/templates/events/event_info.html:119
|
||||
msgid "Register"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:33
|
||||
msgid "Your account was inactive."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:52
|
||||
msgid ""
|
||||
"The password must contain at least one letter and at least one digit or "
|
||||
"punctuation character."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:54
|
||||
msgid "A user with that email already exists."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:67
|
||||
msgid "A user with that username already exists."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:95
|
||||
msgid "Email already taken."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:101
|
||||
msgid "Username already taken."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:105 events/views/teams.py:124
|
||||
msgid "Updated."
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:10
|
||||
#: events/templates/events/ctf_info.html:12
|
||||
msgid "Published date"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:14
|
||||
msgid "Challenge is not yet available."
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:21
|
||||
#: events/templates/events/ctf_info.html:18
|
||||
msgid ""
|
||||
"No translation available. Please try another language (English or French)."
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:27
|
||||
#: events/templates/events/ctf_info.html:24
|
||||
msgid "Congratulation !"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:29
|
||||
#: events/templates/events/ctf_info.html:26
|
||||
msgid "Already flagged"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:31 ctfs/templates/ctfs/ctf_info.html:40
|
||||
#: events/templates/events/ctf_info.html:36
|
||||
#: events/templates/events/ctf_info.html:45
|
||||
msgid "Start the challenge"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:33 ctfs/templates/ctfs/ctf_info.html:42
|
||||
#: events/templates/events/ctf_info.html:38
|
||||
#: events/templates/events/ctf_info.html:47
|
||||
msgid "Download"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:37
|
||||
#: events/templates/events/ctf_info.html:42
|
||||
msgid "Wrong flag ! You can do it !"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:56
|
||||
#: events/templates/events/ctf_info.html:60
|
||||
msgid "Solved by"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:80
|
||||
#: events/templates/events/ctf_info.html:90
|
||||
msgid "Nobody has solved this challenge yet."
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:87
|
||||
#: events/templates/events/ctf_info.html:97
|
||||
msgid "Author"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:88
|
||||
#: events/templates/events/ctf_info.html:98
|
||||
msgid "Point reward"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctfs_list.html:14
|
||||
msgid "Solved"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctfs_list.html:37
|
||||
msgid "No ctf available for this category."
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctfs_list.html:42
|
||||
msgid "Categories"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctfs_list.html:48 templates/base.html:54
|
||||
msgid "No category available."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:10
|
||||
#: events/templates/events/join_team.html:10
|
||||
msgid "This event starts at"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:17
|
||||
#: events/templates/events/join_team.html:17
|
||||
msgid "You need to be registered to the event."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:20 events/views/teams.py:120
|
||||
msgid "Name already taken."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:26
|
||||
#: events/templates/events/join_team.html:31
|
||||
#: events/templates/events/manage_team.html:22
|
||||
msgid "Team name"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:28
|
||||
#: events/templates/events/create_team.html:49
|
||||
#: events/templates/events/join_team.html:54
|
||||
msgid "Create Team"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:33
|
||||
#: events/templates/events/event_pwd.html:28
|
||||
#: events/templates/events/join_team.html:38
|
||||
msgid "You need to be logged to access this event."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:42
|
||||
#: events/templates/events/event_info.html:113
|
||||
#: events/templates/events/event_pwd.html:36
|
||||
#: events/templates/events/join_team.html:47
|
||||
msgid "Starts at"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:43
|
||||
#: events/templates/events/event_info.html:114
|
||||
#: events/templates/events/event_pwd.html:37
|
||||
#: events/templates/events/join_team.html:48
|
||||
msgid "Ends at"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:47
|
||||
#: events/templates/events/event_info.html:129
|
||||
#: events/templates/events/join_team.html:52
|
||||
msgid "Manage my team"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:48
|
||||
#: events/templates/events/join_team.html:33
|
||||
#: events/templates/events/join_team.html:53
|
||||
msgid "Join Team"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:53
|
||||
#: events/templates/events/join_team.html:58
|
||||
msgid "Auto-matching"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:57
|
||||
#: events/templates/events/join_team.html:62
|
||||
msgid "Find me a team !"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/ctf_info.html:10
|
||||
msgid "Event"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/ctf_info.html:28
|
||||
#: events/templates/events/event_info.html:18
|
||||
msgid "This event is over."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/ctf_info.html:30
|
||||
msgid "Error while processing your request. (Invalid Form)"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/ctf_info.html:32
|
||||
msgid "You must register to the event before submitting flags."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/ctf_info.html:34
|
||||
msgid ""
|
||||
"This is a team event, please create or join a team before submitting flags."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:9
|
||||
msgid "Subscriptions is over."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:12
|
||||
#: events/templates/events/event_pwd.html:18
|
||||
msgid "You're already registered to this event."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:20
|
||||
#: events/templates/events/event_pwd.html:9
|
||||
msgid "This event start at"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:30
|
||||
msgid "Challenges"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:47
|
||||
msgid "No challenges available."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:51
|
||||
msgid "The event has not started yet."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:57
|
||||
msgid "ScoreBoard"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:88
|
||||
msgid "Team"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:106
|
||||
msgid "No one have earn point yet, you gonna be the first ?"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_pwd.html:15
|
||||
#: events/templates/events/join_team.html:22
|
||||
msgid "Wrong password submited."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_pwd.html:20
|
||||
msgid "This event is password protected"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_pwd.html:21
|
||||
msgid "You need to submit the event password to gain access to this event."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/events_list.html:6 templates/base.html:61
|
||||
msgid "Events"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/events_list.html:38
|
||||
msgid "See more"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/events_list.html:44
|
||||
msgid "No events available."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/join_team.html:20
|
||||
msgid "Team does not exist."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/join_team.html:24
|
||||
msgid "Maximum size reached."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/manage_team.html:26
|
||||
msgid "Team password"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/manage_team.html:44
|
||||
#: events/templates/events/team.html:49
|
||||
msgid "Members"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/manage_team.html:52
|
||||
msgid "Leave Team"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/manage_team.html:59
|
||||
msgid "Open to automatching"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/manage_team.html:66
|
||||
msgid "Close to automatching"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/team.html:38
|
||||
msgid "It seems that this team has not solved any challenge yet..."
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:21
|
||||
msgid "Weekly Top 5"
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:48
|
||||
msgid "No article available."
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:53
|
||||
msgid "Latest challenges added"
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:58
|
||||
msgid "points"
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:62
|
||||
msgid "No ctf available."
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:66
|
||||
msgid "Latest Flags"
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:80
|
||||
msgid "Flags"
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:86
|
||||
msgid "Users"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:115
|
||||
msgid "English"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:116
|
||||
msgid "German"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:117
|
||||
msgid "French"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:118
|
||||
msgid "Russian"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:119
|
||||
msgid "Japanese"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:120
|
||||
msgid "Spanish"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:38
|
||||
msgid "First"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:39
|
||||
msgid "Previous"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:43
|
||||
msgid "Page "
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:47
|
||||
msgid "Next"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:48
|
||||
msgid "Last"
|
||||
msgstr ""
|
||||
|
||||
#: templates/base.html:59
|
||||
msgid "Scoreboard"
|
||||
msgstr ""
|
||||
|
||||
#: templates/base.html:64
|
||||
msgid "Resources"
|
||||
msgstr ""
|
||||
|
||||
#: templates/base.html:93
|
||||
msgid "Logout"
|
||||
msgstr ""
|
||||
|
||||
#: templates/base.html:100
|
||||
msgid "Sign Up"
|
||||
msgstr ""
|
||||
|
||||
#: templates/base.html:135
|
||||
msgid "Become a Patron!"
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_complete.html:11
|
||||
msgid "Your new password has been set."
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:20
|
||||
msgid "Your password can’t be too similar to your other personal information."
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:21
|
||||
msgid "Your password must contain at least 8 characters."
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:22
|
||||
msgid "Your password can’t be a commonly used password."
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:23
|
||||
msgid "Your password can’t be entirely numeric."
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:26
|
||||
msgid "Confirm"
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:28
|
||||
msgid "Submit"
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_done.html:11
|
||||
msgid ""
|
||||
"We've emailed you instructions for setting your password. You should receive "
|
||||
"the email shortly!"
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_form.html:16
|
||||
msgid "Reset"
|
||||
msgstr ""
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-05-10 19:28+0000\n"
|
||||
"POT-Creation-Date: 2022-02-14 19:36+0100\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -20,11 +20,41 @@ msgstr ""
|
|||
"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
|
||||
"%100>=11 && n%100<=14)? 2 : 3);\n"
|
||||
|
||||
#: accounts/templates/accounts/delete.html:8
|
||||
msgid "Delete account"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/delete.html:11
|
||||
msgid "Please confirm your password to delete your account."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/delete.html:12
|
||||
msgid "Deleted accounts cannot be recovered."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/delete.html:15
|
||||
msgid "Password inccorect."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/delete.html:17
|
||||
msgid "Your account has been deleted."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/delete.html:22
|
||||
#: accounts/templates/accounts/login.html:19
|
||||
#: accounts/templates/accounts/register.html:23
|
||||
#: events/templates/events/create_team.html:27
|
||||
#: events/templates/events/join_team.html:32
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:21
|
||||
#: accounts/templates/accounts/login.html:18
|
||||
#: accounts/templates/accounts/register.html:22
|
||||
#: ctfs/templates/ctfs/ctf_info.html:50 ctfs/templates/ctfs/ctfs_list.html:12
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:12
|
||||
#: ctfs/templates/ctfs/ctf_info.html:61 ctfs/templates/ctfs/ctfs_list.html:12
|
||||
#: events/templates/events/ctf_info.html:65
|
||||
#: events/templates/events/event_info.html:64
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
||||
msgid "Username"
|
||||
msgstr ""
|
||||
|
||||
|
@ -33,89 +63,114 @@ msgid "Email"
|
|||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:30
|
||||
#: ctfs/templates/ctfs/ctf_info.html:51
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:13
|
||||
#: ctfs/templates/ctfs/ctf_info.html:62
|
||||
#: events/templates/events/ctf_info.html:66
|
||||
#: events/templates/events/event_info.html:65
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:14
|
||||
msgid "Website"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:36
|
||||
#: events/templates/events/manage_team.html:29
|
||||
msgid "Apply"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:44
|
||||
msgid "Connected accounts"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:51
|
||||
msgid "Disconnect Discord"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:56
|
||||
msgid "Connect Discord"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:66
|
||||
#: accounts/templates/accounts/profile.html:37
|
||||
#: ctfs/templates/ctfs/ctf_info.html:52 ctfs/templates/ctfs/ctfs_list.html:13
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:14
|
||||
#: accounts/templates/accounts/edit.html:47
|
||||
#: accounts/templates/accounts/profile.html:46
|
||||
#: ctfs/templates/ctfs/ctf_info.html:63 ctfs/templates/ctfs/ctfs_list.html:13
|
||||
#: events/templates/events/event_info.html:66
|
||||
#: events/templates/events/event_info.html:89
|
||||
#: events/templates/events/manage_team.html:40
|
||||
#: events/templates/events/team.html:45
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:15
|
||||
msgid "Score"
|
||||
msgstr "счет"
|
||||
|
||||
#: accounts/templates/accounts/edit.html:74
|
||||
#: accounts/templates/accounts/profile.html:45
|
||||
msgid "Member since"
|
||||
#: accounts/templates/accounts/edit.html:55
|
||||
#: accounts/templates/accounts/profile.html:60
|
||||
msgid "Registered since"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/edit.html:61
|
||||
msgid "Delete my account"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/login.html:13
|
||||
msgid "Please, verify your infos."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/login.html:19
|
||||
#: accounts/templates/accounts/register.html:23
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/login.html:22
|
||||
msgid "Reset password"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/login.html:31
|
||||
#: accounts/templates/accounts/register.html:38 templates/base.html:90
|
||||
#: accounts/templates/accounts/register.html:38 templates/base.html:97
|
||||
#: templates/registration/password_reset_complete.html:18
|
||||
#: templates/registration/password_reset_confirm.html:37
|
||||
#: templates/registration/password_reset_done.html:17
|
||||
#: templates/registration/password_reset_form.html:25
|
||||
#: templates/registration/password_reset_confirm.html:38
|
||||
#: templates/registration/password_reset_done.html:18
|
||||
#: templates/registration/password_reset_form.html:26
|
||||
msgid "Login"
|
||||
msgstr "Авторизоваться"
|
||||
|
||||
#: accounts/templates/accounts/login.html:32
|
||||
#: accounts/templates/accounts/register.html:37
|
||||
#: templates/registration/password_reset_complete.html:19
|
||||
#: templates/registration/password_reset_confirm.html:38
|
||||
#: templates/registration/password_reset_done.html:18
|
||||
#: templates/registration/password_reset_form.html:26
|
||||
#: templates/registration/password_reset_confirm.html:39
|
||||
#: templates/registration/password_reset_done.html:19
|
||||
#: templates/registration/password_reset_form.html:27
|
||||
msgid "Sign up"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:12
|
||||
#: accounts/templates/accounts/profile.html:10
|
||||
msgid "Challenges Solved by"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:21
|
||||
#: events/templates/events/team.html:20
|
||||
msgid "Challenge Name"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:13
|
||||
#: accounts/templates/accounts/profile.html:22
|
||||
#: events/templates/events/team.html:21
|
||||
msgid "Category"
|
||||
msgstr "Категории"
|
||||
|
||||
#: accounts/templates/accounts/profile.html:14
|
||||
#: accounts/templates/accounts/profile.html:23
|
||||
#: events/templates/events/team.html:22
|
||||
msgid "Points"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:15
|
||||
#: ctfs/templates/ctfs/ctf_info.html:53
|
||||
#: accounts/templates/accounts/profile.html:24
|
||||
#: ctfs/templates/ctfs/ctf_info.html:64
|
||||
#: events/templates/events/ctf_info.html:67
|
||||
#: events/templates/events/team.html:23
|
||||
msgid "Date"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:30
|
||||
msgid "It's seem {{ user.username }} have never solved any CTF yet..."
|
||||
#: accounts/templates/accounts/profile.html:39
|
||||
msgid "It seems that this user has not solved any challenge yet..."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:47
|
||||
#: events/templates/events/event_info.html:63
|
||||
#: events/templates/events/event_info.html:87
|
||||
#: events/templates/events/manage_team.html:41
|
||||
#: events/templates/events/team.html:46
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:12
|
||||
msgid "Rank"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:56
|
||||
msgid "Status: Member"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:58
|
||||
msgid "Status: Visitor"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/profile.html:64
|
||||
#: events/templates/events/team.html:57
|
||||
msgid "Categories stats"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/register.html:13
|
||||
|
@ -131,76 +186,101 @@ msgid "Personal website"
|
|||
msgstr ""
|
||||
|
||||
#: accounts/templates/accounts/register.html:26
|
||||
#: events/templates/events/event_info.html:119
|
||||
msgid "Register"
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:31
|
||||
#: accounts/views/views.py:33
|
||||
msgid "Your account was inactive."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:50
|
||||
#: accounts/views/views.py:52
|
||||
msgid ""
|
||||
"The password must contain at least one letter and at least one digit or "
|
||||
"punctuation character."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:52
|
||||
#: accounts/views/views.py:54
|
||||
msgid "A user with that email already exists."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:65
|
||||
#: accounts/views/views.py:67
|
||||
msgid "A user with that username already exists."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:93
|
||||
#: accounts/views/views.py:95
|
||||
msgid "Email already taken."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:99
|
||||
#: accounts/views/views.py:101
|
||||
msgid "Username already taken."
|
||||
msgstr ""
|
||||
|
||||
#: accounts/views/views.py:103
|
||||
#: accounts/views/views.py:105 events/views/teams.py:124
|
||||
msgid "Updated."
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:9
|
||||
#: ctfs/templates/ctfs/ctf_info.html:10
|
||||
#: events/templates/events/ctf_info.html:12
|
||||
msgid "Published date"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:17
|
||||
msgid "Congratulation !"
|
||||
msgstr ""
|
||||
#: ctfs/templates/ctfs/ctf_info.html:14
|
||||
#, fuzzy
|
||||
#| msgid "No article available."
|
||||
msgid "Challenge is not yet available."
|
||||
msgstr "Нет доступных статей."
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:19
|
||||
msgid "Already flagged"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:21 ctfs/templates/ctfs/ctf_info.html:30
|
||||
msgid "Start the challenge"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:23 ctfs/templates/ctfs/ctf_info.html:32
|
||||
msgid "Download"
|
||||
#: ctfs/templates/ctfs/ctf_info.html:21
|
||||
#: events/templates/events/ctf_info.html:18
|
||||
msgid ""
|
||||
"No translation available. Please try another language (English or French)."
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:27
|
||||
#: events/templates/events/ctf_info.html:24
|
||||
msgid "Congratulation !"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:29
|
||||
#: events/templates/events/ctf_info.html:26
|
||||
msgid "Already flagged"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:31 ctfs/templates/ctfs/ctf_info.html:40
|
||||
#: events/templates/events/ctf_info.html:36
|
||||
#: events/templates/events/ctf_info.html:45
|
||||
msgid "Start the challenge"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:33 ctfs/templates/ctfs/ctf_info.html:42
|
||||
#: events/templates/events/ctf_info.html:38
|
||||
#: events/templates/events/ctf_info.html:47
|
||||
msgid "Download"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:37
|
||||
#: events/templates/events/ctf_info.html:42
|
||||
msgid "Wrong flag ! You can do it !"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:45
|
||||
#: ctfs/templates/ctfs/ctf_info.html:56
|
||||
#: events/templates/events/ctf_info.html:60
|
||||
msgid "Solved by"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:68
|
||||
msgid "Nobody have solved this CTF."
|
||||
#: ctfs/templates/ctfs/ctf_info.html:80
|
||||
#: events/templates/events/ctf_info.html:90
|
||||
msgid "Nobody has solved this challenge yet."
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:74
|
||||
#: ctfs/templates/ctfs/ctf_info.html:87
|
||||
#: events/templates/events/ctf_info.html:97
|
||||
msgid "Author"
|
||||
msgstr ""
|
||||
|
||||
#: ctfs/templates/ctfs/ctf_info.html:75
|
||||
#: ctfs/templates/ctfs/ctf_info.html:88
|
||||
#: events/templates/events/ctf_info.html:98
|
||||
msgid "Point reward"
|
||||
msgstr ""
|
||||
|
||||
|
@ -220,67 +300,271 @@ msgstr ""
|
|||
msgid "No category available."
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:19
|
||||
#: events/templates/events/create_team.html:10
|
||||
#: events/templates/events/join_team.html:10
|
||||
msgid "This event starts at"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:17
|
||||
#: events/templates/events/join_team.html:17
|
||||
msgid "You need to be registered to the event."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:20 events/views/teams.py:120
|
||||
msgid "Name already taken."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:26
|
||||
#: events/templates/events/join_team.html:31
|
||||
#: events/templates/events/manage_team.html:22
|
||||
msgid "Team name"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:28
|
||||
#: events/templates/events/create_team.html:49
|
||||
#: events/templates/events/join_team.html:54
|
||||
msgid "Create Team"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:33
|
||||
#: events/templates/events/event_pwd.html:28
|
||||
#: events/templates/events/join_team.html:38
|
||||
msgid "You need to be logged to access this event."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:42
|
||||
#: events/templates/events/event_info.html:113
|
||||
#: events/templates/events/event_pwd.html:36
|
||||
#: events/templates/events/join_team.html:47
|
||||
msgid "Starts at"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:43
|
||||
#: events/templates/events/event_info.html:114
|
||||
#: events/templates/events/event_pwd.html:37
|
||||
#: events/templates/events/join_team.html:48
|
||||
msgid "Ends at"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:47
|
||||
#: events/templates/events/event_info.html:129
|
||||
#: events/templates/events/join_team.html:52
|
||||
msgid "Manage my team"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:48
|
||||
#: events/templates/events/join_team.html:33
|
||||
#: events/templates/events/join_team.html:53
|
||||
msgid "Join Team"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:53
|
||||
#: events/templates/events/join_team.html:58
|
||||
msgid "Auto-matching"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/create_team.html:57
|
||||
#: events/templates/events/join_team.html:62
|
||||
msgid "Find me a team !"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/ctf_info.html:10
|
||||
msgid "Event"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/ctf_info.html:28
|
||||
#: events/templates/events/event_info.html:18
|
||||
msgid "This event is over."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/ctf_info.html:30
|
||||
msgid "Error while processing your request. (Invalid Form)"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/ctf_info.html:32
|
||||
msgid "You must register to the event before submitting flags."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/ctf_info.html:34
|
||||
msgid ""
|
||||
"This is a team event, please create or join a team before submitting flags."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:9
|
||||
msgid "Subscriptions is over."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:12
|
||||
#: events/templates/events/event_pwd.html:18
|
||||
msgid "You're already registered to this event."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:20
|
||||
#: events/templates/events/event_pwd.html:9
|
||||
msgid "This event start at"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:30
|
||||
msgid "Challenges"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:47
|
||||
#, fuzzy
|
||||
#| msgid "No article available."
|
||||
msgid "No challenges available."
|
||||
msgstr "Нет доступных статей."
|
||||
|
||||
#: events/templates/events/event_info.html:51
|
||||
msgid "The event has not started yet."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:57
|
||||
#, fuzzy
|
||||
#| msgid "Score"
|
||||
msgid "ScoreBoard"
|
||||
msgstr "счет"
|
||||
|
||||
#: events/templates/events/event_info.html:88
|
||||
msgid "Team"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_info.html:106
|
||||
msgid "No one have earn point yet, you gonna be the first ?"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_pwd.html:15
|
||||
#: events/templates/events/join_team.html:22
|
||||
msgid "Wrong password submited."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_pwd.html:20
|
||||
msgid "This event is password protected"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/event_pwd.html:21
|
||||
msgid "You need to submit the event password to gain access to this event."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/events_list.html:6 templates/base.html:61
|
||||
msgid "Events"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/events_list.html:38
|
||||
msgid "See more"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/events_list.html:44
|
||||
#, fuzzy
|
||||
#| msgid "No article available."
|
||||
msgid "No events available."
|
||||
msgstr "Нет доступных статей."
|
||||
|
||||
#: events/templates/events/join_team.html:20
|
||||
msgid "Team does not exist."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/join_team.html:24
|
||||
msgid "Maximum size reached."
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/manage_team.html:26
|
||||
msgid "Team password"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/manage_team.html:44
|
||||
#: events/templates/events/team.html:49
|
||||
msgid "Members"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/manage_team.html:52
|
||||
msgid "Leave Team"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/manage_team.html:59
|
||||
msgid "Open to automatching"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/manage_team.html:66
|
||||
msgid "Close to automatching"
|
||||
msgstr ""
|
||||
|
||||
#: events/templates/events/team.html:38
|
||||
msgid "It seems that this team has not solved any challenge yet..."
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:21
|
||||
msgid "Weekly Top 5"
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:48
|
||||
msgid "No article available."
|
||||
msgstr "Нет доступных статей."
|
||||
|
||||
#: home/templates/home/home.html:24
|
||||
#: home/templates/home/home.html:53
|
||||
msgid "Latest challenges added"
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:30
|
||||
#: home/templates/home/home.html:58
|
||||
msgid "points"
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:62
|
||||
msgid "No ctf available."
|
||||
msgstr ""
|
||||
|
||||
#: home/templates/home/home.html:40
|
||||
msgid "Flags counter"
|
||||
#: home/templates/home/home.html:66
|
||||
msgid "Latest Flags"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:120
|
||||
msgid "Global Site"
|
||||
#: home/templates/home/home.html:80
|
||||
msgid "Flags"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:121
|
||||
msgid "Italian"
|
||||
#: home/templates/home/home.html:86
|
||||
msgid "Users"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:122
|
||||
#: project/settings.py:115
|
||||
msgid "English"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:116
|
||||
msgid "German"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:123
|
||||
#: project/settings.py:117
|
||||
msgid "French"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:124
|
||||
msgid "Spanish"
|
||||
msgstr ""
|
||||
|
||||
#: project/settings.py:125
|
||||
#: project/settings.py:118
|
||||
msgid "Russian"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:11
|
||||
msgid "Rank"
|
||||
#: project/settings.py:119
|
||||
msgid "Japanese"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:36
|
||||
#: project/settings.py:120
|
||||
msgid "Spanish"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:38
|
||||
msgid "First"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:37
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:39
|
||||
msgid "Previous"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:41
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:43
|
||||
msgid "Page "
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:45
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:47
|
||||
msgid "Next"
|
||||
msgstr ""
|
||||
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:46
|
||||
#: scoreboard/templates/scoreboard/scoreboard.html:48
|
||||
msgid "Last"
|
||||
msgstr ""
|
||||
|
||||
|
@ -288,48 +572,56 @@ msgstr ""
|
|||
msgid "Scoreboard"
|
||||
msgstr ""
|
||||
|
||||
#: templates/base.html:86
|
||||
#: templates/base.html:64
|
||||
msgid "Resources"
|
||||
msgstr ""
|
||||
|
||||
#: templates/base.html:93
|
||||
msgid "Logout"
|
||||
msgstr "Выйти"
|
||||
|
||||
#: templates/base.html:93
|
||||
#: templates/base.html:100
|
||||
msgid "Sign Up"
|
||||
msgstr ""
|
||||
|
||||
#: templates/base.html:135
|
||||
msgid "Become a Patron!"
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_complete.html:11
|
||||
msgid "Your new password has been set."
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:19
|
||||
#: templates/registration/password_reset_confirm.html:20
|
||||
msgid "Your password can’t be too similar to your other personal information."
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:20
|
||||
#: templates/registration/password_reset_confirm.html:21
|
||||
msgid "Your password must contain at least 8 characters."
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:21
|
||||
#: templates/registration/password_reset_confirm.html:22
|
||||
msgid "Your password can’t be a commonly used password."
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:22
|
||||
#: templates/registration/password_reset_confirm.html:23
|
||||
msgid "Your password can’t be entirely numeric."
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:25
|
||||
#: templates/registration/password_reset_confirm.html:26
|
||||
msgid "Confirm"
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_confirm.html:27
|
||||
#: templates/registration/password_reset_confirm.html:28
|
||||
msgid "Submit"
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_done.html:10
|
||||
#: templates/registration/password_reset_done.html:11
|
||||
msgid ""
|
||||
"We've emailed you instructions for setting your password. You should receive "
|
||||
"the email shortly!"
|
||||
msgstr ""
|
||||
|
||||
#: templates/registration/password_reset_form.html:15
|
||||
#: templates/registration/password_reset_form.html:16
|
||||
msgid "Reset"
|
||||
msgstr ""
|
||||
|
|
|
@ -0,0 +1,156 @@
|
|||
"""
|
||||
Django settings for project project.
|
||||
|
||||
Generated by 'django-admin startproject' using Django 2.2.5.
|
||||
|
||||
For more information on this file, see
|
||||
https://docs.djangoproject.com/en/2.2/topics/settings/
|
||||
|
||||
For the full list of settings and their values, see
|
||||
https://docs.djangoproject.com/en/2.2/ref/settings/
|
||||
"""
|
||||
|
||||
import os
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from local_settings import *
|
||||
|
||||
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
|
||||
|
||||
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
||||
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
# Quick-start development settings - unsuitable for production
|
||||
# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/
|
||||
|
||||
# Application definition
|
||||
|
||||
INSTALLED_APPS = [
|
||||
'django.contrib.admin',
|
||||
'django.contrib.auth',
|
||||
'django.contrib.contenttypes',
|
||||
'django.contrib.sessions',
|
||||
'django.contrib.messages',
|
||||
'django.contrib.staticfiles',
|
||||
'home.apps.HomeConfig',
|
||||
'ctfs.apps.CtfsConfig',
|
||||
'events.apps.EventsConfig',
|
||||
'accounts.apps.AccountsConfig',
|
||||
'scoreboard.apps.ScoreboardConfig',
|
||||
'resources.apps.ResourcesConfig',
|
||||
'django.contrib.sites',
|
||||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
'django.middleware.security.SecurityMiddleware',
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.locale.LocaleMiddleware',
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
'django.middleware.csrf.CsrfViewMiddleware',
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
]
|
||||
|
||||
ROOT_URLCONF = 'project.urls'
|
||||
|
||||
TEMPLATES = [
|
||||
{
|
||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||
'DIRS': [(os.path.join(BASE_DIR, 'templates')),],
|
||||
'APP_DIRS': True,
|
||||
'OPTIONS': {
|
||||
'context_processors': [
|
||||
'django.template.context_processors.debug',
|
||||
'django.template.context_processors.request',
|
||||
'django.contrib.auth.context_processors.auth',
|
||||
'django.contrib.messages.context_processors.messages',
|
||||
],
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
WSGI_APPLICATION = 'project.wsgi.application'
|
||||
|
||||
|
||||
# Database
|
||||
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
|
||||
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.sqlite3',
|
||||
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Password validation
|
||||
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators
|
||||
|
||||
AUTH_PASSWORD_VALIDATORS = [
|
||||
{
|
||||
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
|
||||
},
|
||||
{
|
||||
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
|
||||
},
|
||||
{
|
||||
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
|
||||
},
|
||||
{
|
||||
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
# Internationalization
|
||||
# https://docs.djangoproject.com/en/2.2/topics/i18n/
|
||||
|
||||
LANGUAGE_CODE = 'en-us'
|
||||
|
||||
LANGUAGE_COOKIE_NAME = 'django_language'
|
||||
|
||||
USE_I18N = True
|
||||
|
||||
LANGUAGES = (
|
||||
('en', _("English")),
|
||||
('de', _('German')),
|
||||
('fr', _('French')),
|
||||
('ru', _('Russian')),
|
||||
('ja', _('Japanese')),
|
||||
('es', _("Spanish")),
|
||||
)
|
||||
|
||||
LOCALE_PATHS = (
|
||||
os.path.join(BASE_DIR, 'locale'),
|
||||
)
|
||||
|
||||
TIME_ZONE = 'Europe/Paris'
|
||||
|
||||
USE_I18N = True
|
||||
|
||||
USE_L10N = True
|
||||
|
||||
USE_TZ = True
|
||||
|
||||
|
||||
# Static files (CSS, JavaScript, Images)
|
||||
# https://docs.djangoproject.com/en/2.2/howto/static-files/
|
||||
|
||||
SITE_ID = 1
|
||||
|
||||
|
||||
STATIC_URL = '/static/'
|
||||
STATIC_ROOT = ''
|
||||
if DEBUG:
|
||||
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
|
||||
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'statics'),)
|
||||
else:
|
||||
STATIC_ROOT = '/home/user/42ctf/src/statics'
|
||||
TEMPLATES[0]['OPTIONS']['context_processors'].append("ctfs.context_processors.cat_processor")
|
||||
MEDIA_URL = '/media/'
|
||||
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
|
||||
LOGIN_URL = '/accounts/signin/'
|
||||
EMAIL_BACKEND = 'django_mailjet.backends.MailjetBackend'
|
||||
EMAIL_HOST = 'in-v3.mailjet.com'
|
||||
EMAIL_PORT = 587
|
||||
DEFAULT_FROM_EMAIL = '42ctf <no-reply@42ctf.org>'
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue