Skip to content
Snippets Groups Projects
Commit f5a087d8 authored by Zdenek Kubala's avatar Zdenek Kubala
Browse files

added passphrase into stages and better templates

parent 5a845e71
No related branches found
No related tags found
No related merge requests found
...@@ -40,6 +40,7 @@ INSTALLED_APPS = [ ...@@ -40,6 +40,7 @@ INSTALLED_APPS = [
'django.contrib.sessions', 'django.contrib.sessions',
'django.contrib.messages', 'django.contrib.messages',
'django.contrib.staticfiles', 'django.contrib.staticfiles',
'tinymce',
] ]
MIDDLEWARE = [ MIDDLEWARE = [
...@@ -133,6 +134,40 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' ...@@ -133,6 +134,40 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
LOGIN_REDIRECT_URL = 'home' LOGIN_REDIRECT_URL = 'home'
LOGOUT_REDIRECT_URL = 'index' LOGOUT_REDIRECT_URL = 'index'
# Custom settings STATIC
STATIC_URL = "/static/"
STATIC_ROOT = BASE_DIR / 'static'
#STATICFILES_DIRS = BASE_DIR / 'static'
# Custom settings MEDIA # Custom settings MEDIA
MEDIA_URL = "/media/" MEDIA_URL = "/media/"
MEDIA_ROOT = BASE_DIR / 'media' MEDIA_ROOT = BASE_DIR / 'media'
# TinyMCE settings
TINYMCE_DEFAULT_CONFIG = {
'cleanup_on_startup': True,
'custom_undo_redo_levels': 20,
'selector': 'textarea',
'theme': 'silver',
'plugins': '''
textcolor save link image media preview codesample contextmenu
table code lists fullscreen insertdatetime nonbreaking
contextmenu directionality searchreplace wordcount visualblocks
visualchars code fullscreen autolink lists charmap print hr
anchor pagebreak
''',
'toolbar1': '''
fullscreen preview bold italic underline | fontselect,
fontsizeselect | forecolor backcolor | alignleft alignright |
aligncenter alignjustify | indent outdent | bullist numlist table |
| link image media | codesample |
''',
'toolbar2': '''
visualblocks visualchars |
charmap hr pagebreak nonbreaking anchor | code |
''',
'contextmenu': 'formats | link image',
'menubar': True,
'statusbar': True,
}
...@@ -15,9 +15,15 @@ Including another URLconf ...@@ -15,9 +15,15 @@ Including another URLconf
""" """
from django.contrib import admin from django.contrib import admin
from django.urls import path, include from django.urls import path, include
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [ urlpatterns = [
# path('polls/', include('polls.urls')), # path('polls/', include('polls.urls')),
path('sifrovacka/', include('sifrovacka.urls')), path('sifrovacka/', include('sifrovacka.urls')),
path('admin/', admin.site.urls), path('admin/', admin.site.urls),
] ]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
appdirs==1.4.4
asgiref==3.3.4
asn1crypto==1.4.0
backcall==0.2.0
certifi==2021.5.30
cffi==1.14.6
charset-normalizer==2.0.4
confusable-homoglyphs==3.2.0
cryptography==3.3.2
dbus-python==1.2.16
decorator==5.0.9
distlib==0.3.1
Django==3.2.3
django-registration==3.2
entrypoints==0.3
filelock==3.0.12
idna==3.2
importlib-metadata==1.6.0
ipython==7.27.0
ipython-genutils==0.2.0
jedi==0.18.0
jeepney==0.6.0
keyring==22.0.1
keyrings.alt==4.0.2
Mako==1.1.3
Markdown==3.3.4
MarkupSafe==1.1.1
matplotlib-inline==0.1.2
more-itertools==4.2.0
parso==0.8.2
pexpect==4.8.0
pickleshare==0.7.5
Pillow==8.3.2
prompt-toolkit==3.0.20
ptyprocess==0.7.0
pycairo==1.20.1
pycparser==2.20
pycrypto==2.6.1
pycryptodomex==3.9.7
Pygments==2.7.1
PyGObject==3.38.0
pytz==2021.1
pyxdg==0.27
PyYAML==5.3.1
requests==2.26.0
SecretStorage==3.3.1
six==1.16.0
sqlparse==0.4.1
traitlets==5.0.5
typing-extensions==3.10.0.0
urllib3==1.26.6
virtualenv==20.4.0+ds
wcwidth==0.2.5
xdg==5
zipp==1.0.0
from django import forms
#from .models import Sifrovacka, Stages, Participants
class PassphraseForm(forms.Form):
passphrase = forms.CharField(label='Vloz heslo k dalsi fazi', max_length=30)
stage_current_urlhash = forms.CharField()
# def clean(self)
# cleaned_data = super(PassphraseForm, self).clean()
# passphrase = cleaned_data.get('passphrase')
# if request.user.is_authenticated:
# sifrovacka_current_stage_urlhash = Participants.objects.get(id = \
# tmp_stage_id)
# if (sifrovacka_current_stage_urlhash.at_stage == stage_urlhash):
# print('hehe')
# stage_current_id = Stages.objects.get(stage_urlhash =
# sifrovacka_current_stage_urlhash.at_stage)
# #sifrovacka_current = Participants.objects.get(id = \
# # tmp_stage_id)
# else:
# print('not same')
#
# Generated by Django 3.2.3 on 2021-09-06 09:19
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('sifrovacka', '0026_alter_stages_stage_urlhash'),
]
operations = [
migrations.AddField(
model_name='stages',
name='stage_help',
field=models.CharField(blank=True, max_length=200),
),
migrations.AlterField(
model_name='stages',
name='stage_urlhash',
field=models.CharField(default='7aa966760ef311eca0fc2016b9b07b5b', max_length=32),
),
]
# Generated by Django 3.2.3 on 2021-09-06 13:57
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('sifrovacka', '0027_auto_20210906_0919'),
]
operations = [
migrations.AddField(
model_name='participants',
name='finished',
field=models.BooleanField(default=False),
),
migrations.AlterField(
model_name='stages',
name='stage_urlhash',
field=models.CharField(default='5b00798c0f1a11ec936e2016b9b07b5b', max_length=32),
),
]
...@@ -45,6 +45,7 @@ class Stages(models.Model): ...@@ -45,6 +45,7 @@ class Stages(models.Model):
stage_number = models.IntegerField() stage_number = models.IntegerField()
stage_name = models.CharField(max_length=80) stage_name = models.CharField(max_length=80)
stage_description = HTMLField() stage_description = HTMLField()
stage_help = models.CharField(max_length=200, blank=True)
#sifrovacka_description = models.CharField(max_length=2000) #sifrovacka_description = models.CharField(max_length=2000)
stage_passphrase = models.CharField(max_length=30, stage_passphrase = models.CharField(max_length=30,
default='hesl0Sifrovacka') default='hesl0Sifrovacka')
...@@ -67,6 +68,7 @@ class Participants(models.Model): ...@@ -67,6 +68,7 @@ class Participants(models.Model):
#at_stage = models.IntegerField(default=1) #at_stage = models.IntegerField(default=1)
at_stage = models.CharField(max_length=32,default='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx') at_stage = models.CharField(max_length=32,default='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
inactive = models.BooleanField(default = False) inactive = models.BooleanField(default = False)
finished = models.BooleanField(default = False)
def __str__(self): def __str__(self):
return str(self.user) + " - " + str(self.sifrovacka) return str(self.user) + " - " + str(self.sifrovacka)
......
{% load static %}
<!doctype html> <!doctype html>
{% load static %}
<html lang="cs"> <html lang="cs">
<head> <head>
<!-- Meta --> <!-- Meta -->
...@@ -31,6 +31,29 @@ ...@@ -31,6 +31,29 @@
text-decoration: none !important; text-decoration: none !important;
} }
</style> </style>
<style type="text/css">
.collapsible {
cursor: pointer;
padding: 18px;
width: 100%;
border: none;
text-align: center;
outline: none;
font-size: 15px;
}
.active, .collapsible:hover {
background-color: #555;
}
.content {
padding: 0 18px;
overflow: hidden;
background-color: #f0f0f0;
max-height: 0;
transition: max-height 0.2s ease-out;
}
</style>
{% if settings.SIFROVACKA_ENV == "prod" and settings.ONBOARDING_MATOMO_ID %} {% if settings.SIFROVACKA_ENV == "prod" and settings.ONBOARDING_MATOMO_ID %}
{% include "shared/matomo_snippet.html" with matomo_id=settings.ONBOARDING_MATOMO_ID %} {% include "shared/matomo_snippet.html" with matomo_id=settings.ONBOARDING_MATOMO_ID %}
......
...@@ -5,8 +5,10 @@ ...@@ -5,8 +5,10 @@
<p> Toto je detail sifrovacky se jmenem: <b>{{sifrovacka_detail}} </b> a id: {{sifrovacka_id}}. </p> <p> Toto je detail sifrovacky se jmenem: <b>{{sifrovacka_detail}} </b> a id: {{sifrovacka_id}}. </p>
</br> </br>
<p> Pocet ukolu: <b> {{ sifrovacka_stage_count }} </b> </br> <p> Pocet ukolu: <b> {{ sifrovacka_stage_count }} </b> </br>
<!--
Obtiznost: NONE</br> Obtiznost: NONE</br>
Casova narocnost: NONE</p> Casova narocnost: NONE</p>
-->
</br> </br>
{{ sifrovacka_detail.sifrovacka_description | safe }} {{ sifrovacka_detail.sifrovacka_description | safe }}
......
{% extends "sifrovacka.html" %} {% extends "sifrovacka.html" %}
{% load static %} {% load static %}
{% comment %} {% comment %}
{{ sifrovacka_current_id }} - {{ sifrovacka_current_stage_url_hash.at_stage }} {{ sifrovacka_current_id }} - {{ sifrovacka_current_stage_url_hash.at_stage }}
{% endcomment %} {% endcomment %}
{% block content %} {% block content %}
{% if sifrovacka_current_stage_urlhash %} {% if stage_current_id %}
{% if request.user.is_authenticated %} {% if request.user.is_authenticated %}
<p> <b>{{ sifrovacka_current_stage_urlhash }} </b> - krok cislo {{ stage_current_id.stage_number }} z {{ sifrovacka_stage_count }}. </p> <p> <b>{{ sifrovacka_current_stage_urlhash }} </b> - krok cislo {{ stage_current_id.stage_number }} z {{ sifrovacka_stage_count }}. </p>
...@@ -19,8 +18,73 @@ ...@@ -19,8 +18,73 @@
Autor: Junius Koolen CC-BY-SA Autor: Junius Koolen CC-BY-SA
</figcaption> </figcaption>
</figure> </figure>
{{ sifrovacka_detail.sifrovacka_img }}
{% endif %} {% endif %}
{% if not last_stage %}
{{ stage_current_id.stage_img }}
{{ stage_current_id.stage_urlhash }}
<form action="{% url 'stage' sifrovacka_id stage_current_id.stage_urlhash %}" method="post">
{% csrf_token %}
{{ form.non_field_errors }}
</br>
</br>
<!-- <div class="inline-flex flex-col sm:flex-row space-y-8 sm:space-y-0 sm:space-x-8"> -->
<button class="collapsible btn btn--fullwidth btn--grey-700 ">
<div class="btn__body "> Klikni pro napovedu</div>
</button>
<!-- </div> -->
<!-- <button type="button" class="collapsible">Klikni pro napovedu</button> -->
<div class="content">
<p>{{ stage_current_id.stage_help }}</p>
</div>
<script>
var coll = document.getElementsByClassName("collapsible");
var i;
for (i = 0; i < coll.length; i++) {
coll[i].addEventListener("click", function() {
this.classList.toggle("active");
var content = this.nextElementSibling;
if (content.style.maxHeight){
content.style.maxHeight = null;
} else {
content.style.maxHeight = content.scrollHeight + "px";
}
});
}
</script>
</br>
<div class="form-field ">
<div class="form-field__wrapper form-field__wrapper--shadowed">
{{ passphrase_form.passphrase.errors }}
<label for="{{ passphrase_form.passphrase.id_for_label }}">Zadejte heslo pro pristup do dalsi urovne: </label>
{{ passphrase_form.passphrase }}
</div>
</div>
<div class="form-field ">
<div class="form-field__wrapper form-field__wrapper--shadowed">
{{ passphrase_form.stage_current_urlhash.errors }}
{% comment %}
<label for="{{ passphrase_form.stage_current_urlhash.id_for_label }}">URLHASH: </label>
{% endcomment %}
<input id="id_stage_current_urlhash" type="hidden" name="stage_current_urlhash" required="" value="{{stage_current_id.stage_urlhash}}">
</div>
</div>
{% comment %}
{{ passphrase_form.passphrase }}</br>
{{ passphrase_form.stage_current_urlhash }}
{% endcomment %}
<button class="btn btn--autowidth {{ classes }}">
<div class="btn__body">Odeslat</div>
</button>
<!-- <input type="submit" value= 'Odeslat' name='passphrase_form'> -->
</form>
{% else %}
nejaky else
{% endif%}
{% comment %}
{% endcomment %}
{% endif %} {% endif %}
{% else %} {% else %}
<div class="alert alert--red-600"> <div class="alert alert--red-600">
......
...@@ -19,8 +19,4 @@ urlpatterns = [ ...@@ -19,8 +19,4 @@ urlpatterns = [
path('', views.index, name='index'), path('', views.index, name='index'),
] ]
# ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) # ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
if settings.DEBUG:
print("XXXXXX")
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
from django.shortcuts import get_object_or_404, render from django.shortcuts import get_object_or_404, render, redirect
# Create your views here. # Create your views here.
from django.db import IntegrityError from django.db import IntegrityError
...@@ -8,25 +8,30 @@ from django.template import loader ...@@ -8,25 +8,30 @@ from django.template import loader
from django.contrib.auth import login,logout from django.contrib.auth import login,logout
from .models import Sifrovacka, Stages, Participants from .models import Sifrovacka, Stages, Participants
# forms
from .forms import PassphraseForm
def stage(request, sifrovacka_id, stage_urlhash): def stage(request, sifrovacka_id, stage_urlhash):
# print(dir(request.user.participants_set.values)) # print(dir(request.user.participants_set.values))
# print(stage_urlhash) # print(stage_urlhash)
# print(request.user.participants_set.values()) # print(request.user.participants_set.values())
# sifrovacka_current_stage = request.user.participants_set.values_list('id') # sifrovacka_current_stage = request.user.participants_set.values_list('id')
passphrase_form = None
sifrovacka_next_stage = None
sifrovacka_current_stage_urlhash = None sifrovacka_current_stage_urlhash = None
sifrovacka_current_id = None
sifrovacka_detail = Sifrovacka.objects.get(id = sifrovacka_id) sifrovacka_detail = Sifrovacka.objects.get(id = sifrovacka_id)
sifrovacka_stages = Stages.objects.filter(sifrovacka__sifrovacka_name = sifrovacka_detail) sifrovacka_stages = Stages.objects.filter(sifrovacka__sifrovacka_name = sifrovacka_detail)
sifrovacka_stage_count = sifrovacka_stages.count() sifrovacka_stage_count = sifrovacka_stages.count()
stage_current_id = None
last_stage = False
if request.user.is_authenticated: if request.user.is_authenticated:
sifrovacka_all_user_current_stages= Participants.objects.filter(user = \ sifrovacka_all_user_current_stages= Participants.objects.filter(user = \
request.user).filter(sifrovacka_id = \ request.user).filter(sifrovacka_id = \
sifrovacka_id).values('sifrovacka_id','id') sifrovacka_id).values('sifrovacka_id','id')
for s in sifrovacka_all_user_current_stages: for s in sifrovacka_all_user_current_stages:
if s['sifrovacka_id'] == sifrovacka_id: if s['sifrovacka_id'] == sifrovacka_id:
print("---AA---") print("---SIFROVACKA---")
# print(s['at_stage']) # print(s['id'])
tmp_stage_id = s['id'] tmp_stage_id = s['id']
sifrovacka_current_stage_urlhash = Participants.objects.get(id = \ sifrovacka_current_stage_urlhash = Participants.objects.get(id = \
tmp_stage_id) tmp_stage_id)
...@@ -36,18 +41,62 @@ def stage(request, sifrovacka_id, stage_urlhash): ...@@ -36,18 +41,62 @@ def stage(request, sifrovacka_id, stage_urlhash):
sifrovacka_current_stage_urlhash.at_stage) sifrovacka_current_stage_urlhash.at_stage)
#sifrovacka_current = Participants.objects.get(id = \ #sifrovacka_current = Participants.objects.get(id = \
# tmp_stage_id) # tmp_stage_id)
print(stage_current_id)
else: else:
print('not same') print('not same')
# else:
# sifrovacka_current = None
print(sifrovacka_current_id) if stage_current_id.stage_number < sifrovacka_stage_count:
if request.method == 'POST':
print("---POST---")
passphrase_form = PassphraseForm(request.POST)
if passphrase_form.is_valid():
print(request.path)
print(dir(request))
print("----BETWEEN STAGES----")
tmp_next_stage_number = stage_current_id.stage_number + 1
print(tmp_next_stage_number)
sifrovacka_current = sifrovacka_stages.filter(stage_number = tmp_next_stage_number)
print(sifrovacka_current)
sifrovacka_next_stage = sifrovacka_current.get(stage_number = tmp_next_stage_number)
print(sifrovacka_next_stage)
tmp_stage_next_urlhash = sifrovacka_next_stage.stage_urlhash
tmp_stage_next_passphrase = sifrovacka_next_stage.stage_passphrase
print(tmp_next_stage_number)
print(tmp_stage_next_urlhash)
print(tmp_stage_next_passphrase)
if tmp_stage_next_passphrase == request.POST['passphrase']:
print('correct passphrase')
setattr(sifrovacka_current_stage_urlhash, 'at_stage', tmp_stage_next_urlhash)
sifrovacka_current_stage_urlhash.save()
tmp_stage_url = request.path.split('/')
tmp_stage_url[3] = tmp_stage_next_urlhash
tmp_stage_next_url = "/".join(tmp_stage_url)
print(tmp_stage_next_url)
return redirect(tmp_stage_next_url)
passphrase_form = PassphraseForm()
print("ENDHASH")
else:
print("---GET---")
passphrase_form = PassphraseForm()
else:
print("VETSI")
last_stage = True
print(last_stage)
context = {"sifrovacka_id": sifrovacka_id, context = {"sifrovacka_id": sifrovacka_id,
"sifrovacka_detail": sifrovacka_detail, "sifrovacka_detail": sifrovacka_detail,
"sifrovacka_stages": sifrovacka_stages, "sifrovacka_stages": sifrovacka_stages,
"sifrovacka_stage_count": sifrovacka_stage_count, "sifrovacka_stage_count": sifrovacka_stage_count,
"sifrovacka_current_stage_urlhash": sifrovacka_current_stage_urlhash,
"stage_current_id": stage_current_id, "stage_current_id": stage_current_id,
"sifrovacka_current_stage_urlhash": sifrovacka_current_stage_urlhash "last_stage": last_stage,
'passphrase_form': passphrase_form
} }
return render(request, 'stage.html', context) return render(request, 'stage.html', context)
...@@ -64,7 +113,7 @@ def detail(request, sifrovacka_id): ...@@ -64,7 +113,7 @@ def detail(request, sifrovacka_id):
sifrovacka_id).values('sifrovacka_id','id') sifrovacka_id).values('sifrovacka_id','id')
for s in sifrovacka_all_user_current_stages: for s in sifrovacka_all_user_current_stages:
if s['sifrovacka_id'] == sifrovacka_id: if s['sifrovacka_id'] == sifrovacka_id:
print("---AA---") print("---SIFROVACKA---")
# print(s['at_stage']) # print(s['at_stage'])
tmp_stage_id = s['id'] tmp_stage_id = s['id']
sifrovacka_current_stage_urlhash = Participants.objects.get(id = \ sifrovacka_current_stage_urlhash = Participants.objects.get(id = \
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment