diff --git a/django_apps/settings.py b/django_apps/settings.py index c5b608fc0a989561180a7a5cbb885246faf20551..c6f73421b8889f06518f460efe03d7ba7818f9f8 100644 --- a/django_apps/settings.py +++ b/django_apps/settings.py @@ -40,6 +40,7 @@ INSTALLED_APPS = [ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'tinymce', ] MIDDLEWARE = [ @@ -133,6 +134,40 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' LOGIN_REDIRECT_URL = 'home' LOGOUT_REDIRECT_URL = 'index' +# Custom settings STATIC +STATIC_URL = "/static/" +STATIC_ROOT = BASE_DIR / 'static' +#STATICFILES_DIRS = BASE_DIR / 'static' + # Custom settings MEDIA MEDIA_URL = "/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, +} + diff --git a/django_apps/urls.py b/django_apps/urls.py index d3c3f95b70ce0af72b597b482f4b954fee07497e..e70575b2d97e698d00ed7a0c6639d4d030e509a0 100644 --- a/django_apps/urls.py +++ b/django_apps/urls.py @@ -15,9 +15,15 @@ Including another URLconf """ from django.contrib import admin from django.urls import path, include +from django.conf.urls.static import static +from django.conf import settings + urlpatterns = [ # path('polls/', include('polls.urls')), path('sifrovacka/', include('sifrovacka.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) diff --git a/requirements.txt_ b/requirements.txt_ new file mode 100644 index 0000000000000000000000000000000000000000..53b86ebcfdf52b4057d8c7d9c5126d9b5fea0478 --- /dev/null +++ b/requirements.txt_ @@ -0,0 +1,55 @@ +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 diff --git a/sifrovacka/forms.py b/sifrovacka/forms.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..363bbdc5b232a9481be1e6c289f2aa807fb73e28 100644 --- a/sifrovacka/forms.py +++ b/sifrovacka/forms.py @@ -0,0 +1,23 @@ +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') +# diff --git a/sifrovacka/migrations/0027_auto_20210906_0919.py b/sifrovacka/migrations/0027_auto_20210906_0919.py new file mode 100644 index 0000000000000000000000000000000000000000..f0297dabd03cebdead156c1b6f114d09cb5e4acd --- /dev/null +++ b/sifrovacka/migrations/0027_auto_20210906_0919.py @@ -0,0 +1,23 @@ +# 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), + ), + ] diff --git a/sifrovacka/migrations/0028_auto_20210906_1357.py b/sifrovacka/migrations/0028_auto_20210906_1357.py new file mode 100644 index 0000000000000000000000000000000000000000..b48c729c86233c8d8e9037fe849926ca4decc495 --- /dev/null +++ b/sifrovacka/migrations/0028_auto_20210906_1357.py @@ -0,0 +1,23 @@ +# 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), + ), + ] diff --git a/sifrovacka/models.py b/sifrovacka/models.py index dbd2b2acf7e753b8149503d0d08f75e6fda277f1..a62780ce10386704e4d9ec81068449637e189ff0 100644 --- a/sifrovacka/models.py +++ b/sifrovacka/models.py @@ -45,6 +45,7 @@ class Stages(models.Model): stage_number = models.IntegerField() stage_name = models.CharField(max_length=80) stage_description = HTMLField() + stage_help = models.CharField(max_length=200, blank=True) #sifrovacka_description = models.CharField(max_length=2000) stage_passphrase = models.CharField(max_length=30, default='hesl0Sifrovacka') @@ -67,6 +68,7 @@ class Participants(models.Model): #at_stage = models.IntegerField(default=1) at_stage = models.CharField(max_length=32,default='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx') inactive = models.BooleanField(default = False) + finished = models.BooleanField(default = False) def __str__(self): return str(self.user) + " - " + str(self.sifrovacka) diff --git a/sifrovacka/templates/base.html b/sifrovacka/templates/base.html index 58a9f665ff9bac18b4c20e78822b55c3a2e0d32e..457cbb470dc07e181d957d1470eef3411d81eb53 100644 --- a/sifrovacka/templates/base.html +++ b/sifrovacka/templates/base.html @@ -1,5 +1,5 @@ -{% load static %} <!doctype html> +{% load static %} <html lang="cs"> <head> <!-- Meta --> @@ -31,6 +31,29 @@ text-decoration: none !important; } </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 %} {% include "shared/matomo_snippet.html" with matomo_id=settings.ONBOARDING_MATOMO_ID %} diff --git a/sifrovacka/templates/sifrovacka.html b/sifrovacka/templates/sifrovacka.html index 237f4902893d42a4a804756f3203cd085ffa6611..1dded661cf0589a77bdcce8aba48514b2cb1a276 100644 --- a/sifrovacka/templates/sifrovacka.html +++ b/sifrovacka/templates/sifrovacka.html @@ -5,8 +5,10 @@ <p> Toto je detail sifrovacky se jmenem: <b>{{sifrovacka_detail}} </b> a id: {{sifrovacka_id}}. </p> </br> <p> Pocet ukolu: <b> {{ sifrovacka_stage_count }} </b> </br> +<!-- Obtiznost: NONE</br> Casova narocnost: NONE</p> +--> </br> {{ sifrovacka_detail.sifrovacka_description | safe }} diff --git a/sifrovacka/templates/stage.html b/sifrovacka/templates/stage.html index bcb15c870fdd424fc720db5c90407f695c82d381..061d085020a6fcd99e21a1f77ddb6ce80a58962c 100644 --- a/sifrovacka/templates/stage.html +++ b/sifrovacka/templates/stage.html @@ -1,13 +1,12 @@ {% extends "sifrovacka.html" %} {% load static %} - {% comment %} {{ sifrovacka_current_id }} - {{ sifrovacka_current_stage_url_hash.at_stage }} {% endcomment %} {% block content %} - {% if sifrovacka_current_stage_urlhash %} + {% if stage_current_id %} {% if request.user.is_authenticated %} <p> <b>{{ sifrovacka_current_stage_urlhash }} </b> - krok cislo {{ stage_current_id.stage_number }} z {{ sifrovacka_stage_count }}. </p> @@ -19,8 +18,73 @@ Autor: Junius Koolen CC-BY-SA </figcaption> </figure> - {{ sifrovacka_detail.sifrovacka_img }} + {% 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 %} {% else %} <div class="alert alert--red-600"> diff --git a/sifrovacka/urls.py b/sifrovacka/urls.py index f1d65ad9378bd3f6b1ae4d2932e1f0a2f36c4bbf..1183f0824c287c68e3c0a1a91aec0c1a3b532aef 100644 --- a/sifrovacka/urls.py +++ b/sifrovacka/urls.py @@ -19,8 +19,4 @@ urlpatterns = [ path('', views.index, name='index'), ] # ] + 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) diff --git a/sifrovacka/views.py b/sifrovacka/views.py index a011d658e639c6d6477c6aa04067d89ca1ca61d1..63ad7287cdde013c90098795e2c58348f3712324 100644 --- a/sifrovacka/views.py +++ b/sifrovacka/views.py @@ -1,4 +1,4 @@ -from django.shortcuts import get_object_or_404, render +from django.shortcuts import get_object_or_404, render, redirect # Create your views here. from django.db import IntegrityError @@ -8,25 +8,30 @@ from django.template import loader from django.contrib.auth import login,logout from .models import Sifrovacka, Stages, Participants +# forms +from .forms import PassphraseForm def stage(request, sifrovacka_id, stage_urlhash): # print(dir(request.user.participants_set.values)) # print(stage_urlhash) # print(request.user.participants_set.values()) # sifrovacka_current_stage = request.user.participants_set.values_list('id') + passphrase_form = None + sifrovacka_next_stage = None sifrovacka_current_stage_urlhash = None - sifrovacka_current_id = None sifrovacka_detail = Sifrovacka.objects.get(id = sifrovacka_id) sifrovacka_stages = Stages.objects.filter(sifrovacka__sifrovacka_name = sifrovacka_detail) sifrovacka_stage_count = sifrovacka_stages.count() + stage_current_id = None + last_stage = False if request.user.is_authenticated: sifrovacka_all_user_current_stages= Participants.objects.filter(user = \ request.user).filter(sifrovacka_id = \ sifrovacka_id).values('sifrovacka_id','id') for s in sifrovacka_all_user_current_stages: if s['sifrovacka_id'] == sifrovacka_id: - print("---AA---") - # print(s['at_stage']) + print("---SIFROVACKA---") +# print(s['id']) tmp_stage_id = s['id'] sifrovacka_current_stage_urlhash = Participants.objects.get(id = \ tmp_stage_id) @@ -36,18 +41,62 @@ def stage(request, sifrovacka_id, stage_urlhash): sifrovacka_current_stage_urlhash.at_stage) #sifrovacka_current = Participants.objects.get(id = \ # tmp_stage_id) + print(stage_current_id) else: 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, "sifrovacka_detail": sifrovacka_detail, "sifrovacka_stages": sifrovacka_stages, "sifrovacka_stage_count": sifrovacka_stage_count, + "sifrovacka_current_stage_urlhash": sifrovacka_current_stage_urlhash, "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) @@ -64,7 +113,7 @@ def detail(request, sifrovacka_id): sifrovacka_id).values('sifrovacka_id','id') for s in sifrovacka_all_user_current_stages: if s['sifrovacka_id'] == sifrovacka_id: - print("---AA---") + print("---SIFROVACKA---") # print(s['at_stage']) tmp_stage_id = s['id'] sifrovacka_current_stage_urlhash = Participants.objects.get(id = \