Limit events to certain campus

This commit is contained in:
Arthur-TRT 2022-05-30 10:25:18 +02:00
parent a1ec3e5f20
commit ff657c070a
5 changed files with 89 additions and 20 deletions

View File

@ -0,0 +1,19 @@
# Generated by Django 3.2.11 on 2022-05-30 07:30
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('accounts', '0011_migration_campus'),
('events', '0009_auto_20220215_1706'),
]
operations = [
migrations.AddField(
model_name='event',
name='campus',
field=models.ManyToManyField(blank=True, null=True, to='accounts.Campus'),
),
]

View File

@ -0,0 +1,19 @@
# Generated by Django 3.2.11 on 2022-05-30 07:30
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('accounts', '0011_migration_campus'),
('events', '0010_event_campus'),
]
operations = [
migrations.AlterField(
model_name='event',
name='campus',
field=models.ManyToManyField(blank=True, to='accounts.Campus'),
),
]

View File

@ -2,6 +2,8 @@ from django.db import models
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib.auth.models import timezone from django.contrib.auth.models import timezone
import uuid import uuid
from accounts.models import Campus
from scoreboard.views import campus
# Create your models here. # Create your models here.
class Event(models.Model): class Event(models.Model):
@ -17,6 +19,7 @@ class Event(models.Model):
team_size = models.PositiveIntegerField(default=1) team_size = models.PositiveIntegerField(default=1)
auto_match = models.BooleanField(default=False) auto_match = models.BooleanField(default=False)
dynamic = models.BooleanField(default=False) dynamic = models.BooleanField(default=False)
campus = models.ManyToManyField(Campus, blank=True)
def __str__(self): def __str__(self):
return self.name return self.name
@ -28,7 +31,7 @@ class Team(models.Model):
last_submission_date = models.DateTimeField('Last Submission Date', default=timezone.now) last_submission_date = models.DateTimeField('Last Submission Date', default=timezone.now)
auto = models.BooleanField(default=False) auto = models.BooleanField(default=False)
def __str__(self): def __str__(self):
return self.name return self.name
class EventPlayer(models.Model): class EventPlayer(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE) user = models.ForeignKey(User, on_delete=models.CASCADE)

View File

@ -8,22 +8,38 @@
<h3>{{ event.name }}</h3> <h3>{{ event.name }}</h3>
<small>{% trans "This event start at" %} : {{ event.start_date }}</small> <small>{% trans "This event start at" %} : {{ event.start_date }}</small>
</div> </div>
<div class="ctf-footer"> <div class="ctf-footer">
{% if logged == True %} {% if logged == True %}
{% if wrongpwd == True %} {% if userHasCampus == False %}
<span class="message error-msg">{% trans "Wrong password submited." %}</span> <span class="message error-msg">
{% trans "This event is reserved for one or more 42 campuses. If you have not connected your intranet to 42CTF, you can do so with this button: " %}
<form action="{% url 'accounts:connections-connect-intra42' %}" method='POST' class="form-inline p-2">
{%csrf_token%}
<button class="btn btn-dark" type="submit">{% trans "Connect 42" %}</button>
</form>
</span>
{% endif %} {% endif %}
{% if alreadyregistered == True %} {% if campusCanJoin == False %}
<span class="message error-msg">{% trans "You're already registered to this event." %}</span> <span class="message error-msg">
{% trans "This event is reserved for one or more 42 campuses. And unfortunately your campus can't participate. Do not hesitate to contact us to organize an event on your campus!" %}
</span>
{% endif %}
{% if userHasCampus == True and campusCanJoin == 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>
{% endif %} {% 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 %} {% else %}
<h4>{% trans "You need to be logged to access this event." %}</h4> <h4>{% trans "You need to be logged to access this event." %}</h4>
{% endif %} {% endif %}
@ -35,7 +51,7 @@
<li class="list-group-item">{{ event.name }}</li> <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 "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> <li class="list-group-item">{% trans "Ends at" %} : {{ event.end_date | date:'H:i d-m-y'}}</li>
</ul> </ul>
</div> </div>
</div> </div>

View File

@ -1,9 +1,11 @@
from pprint import pprint
from django.shortcuts import render, get_object_or_404, redirect from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import timezone from django.contrib.auth.models import timezone
from ..forms import submit_flag from ..forms import submit_flag
from ..models import Event, EventPlayer, Team from ..models import Event, EventPlayer, Team
from ctfs.models import CTF, CTF_flags, Category from ctfs.models import CTF, CTF_flags, Category
from accounts.models import UserProfileInfo
from django.utils.translation import get_language from django.utils.translation import get_language
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@ -113,9 +115,19 @@ def event(request, event_slug):
if request.user.is_authenticated: if request.user.is_authenticated:
if request.user.is_staff is False: if request.user.is_staff is False:
if not player: if not player:
return render(request, 'events/event_pwd.html', {'event' : event_info, 'logged': True, 'wrongpwd': wrongpwd, 'alreadyregistered': alreadyregistered}) return render(request, 'events/event_pwd.html', {'event' : event_info, 'logged': True, 'wrongpwd': wrongpwd, 'alreadyregistered': alreadyregistered, 'userHasCampus': True, 'campusCanJoin': True})
else: else:
return render(request, 'events/event_pwd.html', {'event' : event_info, 'logged': False, 'wrongpwd': wrongpwd, 'alreadyregistered': alreadyregistered}) return render(request, 'events/event_pwd.html', {'event' : event_info, 'logged': False, 'wrongpwd': wrongpwd, 'alreadyregistered': alreadyregistered, 'userHasCampus': True, 'campusCanJoin': True})
if event_info.campus.all():
if request.user.is_authenticated:
if request.user.is_staff is False:
user = UserProfileInfo.objects.get(user=request.user)
if user.campus is None:
return render(request, 'events/event_pwd.html', {'event' : event_info, 'logged': True, 'wrongpwd': wrongpwd, 'alreadyregistered': alreadyregistered, 'userHasCampus': False, 'campusCanJoin': True})
elif user.campus not in event_info.campus.all():
return render(request, 'events/event_pwd.html', {'event' : event_info, 'logged': True, 'wrongpwd': wrongpwd, 'alreadyregistered': alreadyregistered, 'userHasCampus': True, 'campusCanJoin': False})
else:
return render(request, 'events/event_pwd.html', {'event' : event_info, 'logged': False, 'wrongpwd': wrongpwd, 'alreadyregistered': alreadyregistered, 'userHasCampus': True, 'campusCanJoin': True})
ended = False ended = False
if timezone.now() >= event_info.end_date: if timezone.now() >= event_info.end_date:
ended = True ended = True
@ -127,7 +139,7 @@ def event(request, event_slug):
solved_list = EventPlayer.objects.filter(event=event_info).order_by('-score', 'last_submission_date', 'user__username') solved_list = EventPlayer.objects.filter(event=event_info).order_by('-score', 'last_submission_date', 'user__username')
else: else:
solved_list = Team.objects.filter(event=event_info).order_by('-score', 'last_submission_date', 'name') 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, 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}) 'ended': ended, 'begun': begun, 'wrongpwd': wrongpwd, 'alreadyregistered': alreadyregistered, 'subisover': subisover})
@login_required @login_required
@ -145,12 +157,12 @@ def submit_event_flag(request, event_slug, chall_slug):
if not ctf_info: if not ctf_info:
response['Location'] += '?ChallengeNotFound=1' response['Location'] += '?ChallengeNotFound=1'
return response return response
try: try:
player = EventPlayer.objects.get(event=ev, user=request.user) player = EventPlayer.objects.get(event=ev, user=request.user)
except: except:
player = None player = None
if player: if player:
if ev.team_size > 1 and player.team is None: if ev.team_size > 1 and player.team is None:
response['Location'] += '?NoTeam=1' response['Location'] += '?NoTeam=1'
@ -219,7 +231,7 @@ def submit_pwd(request, event_slug):
new = EventPlayer(user=request.user, event=ev) new = EventPlayer(user=request.user, event=ev)
new.save() new.save()
return redirect('events:event_info', event_slug=event_slug) return redirect('events:event_info', event_slug=event_slug)
@login_required @login_required
def register_to_event(request, event_slug): def register_to_event(request, event_slug):