diff --git a/.gitignore b/.gitignore
index b0af3886860594515460f1df3d25c624bed52200..cb6d38b4f9984f617b359064ea46e0ba964cd909 100644
--- a/.gitignore
+++ b/.gitignore
@@ -104,4 +104,7 @@ GitHub.sublime-settings
 !.vscode/launch.json
 !.vscode/extensions.json
 .history
+
+# Custom #
 db.sqlite3
+media/*
diff --git a/django_apps/settings.py b/django_apps/settings.py
index 2fca22b0505bf8a1e40ab303c647483ca1e8af68..012e16bbc498f7729f12a8674005f8918be2f0fe 100644
--- a/django_apps/settings.py
+++ b/django_apps/settings.py
@@ -23,9 +23,10 @@ BASE_DIR = Path(__file__).resolve().parent.parent
 SECRET_KEY = 'django-insecure-kog+-x*xtt5e7shmxa-ddldzdtz@u#*tj^s9jzm#%&ghy*a8x%'
 
 # SECURITY WARNING: don't run with debug turned on in production!
-DEBUG = True
+DEBUG = False
+#DEBUG = True
 
-ALLOWED_HOSTS = []
+ALLOWED_HOSTS = ['*']
 
 
 # Application definition
@@ -40,6 +41,7 @@ INSTALLED_APPS = [
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
+    'tinymce',
 ]
 
 MIDDLEWARE = [
@@ -63,6 +65,7 @@ TEMPLATES = [
             'context_processors': [
                 'django.template.context_processors.debug',
                 'django.template.context_processors.request',
+                'django.template.context_processors.media',
                 'django.contrib.auth.context_processors.auth',
                 'django.contrib.messages.context_processors.messages',
             ],
@@ -131,3 +134,41 @@ 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
index 83d66431530342db426469989fa4a293a3928085..e245cfaee3958c44f943b0d846424917a0c01ca1 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,7 +2,9 @@ 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
@@ -10,8 +12,10 @@ decorator==5.0.9
 distlib==0.3.1
 Django==3.2.3
 django-registration==3.2
+django-tinymce==3.3.0
 entrypoints==0.3
 filelock==3.0.12
+idna==3.2
 importlib-metadata==1.6.0
 ipython==7.27.0
 ipython-genutils==0.2.0
@@ -27,6 +31,7 @@ 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
@@ -38,11 +43,13 @@ 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
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
new file mode 100644
index 0000000000000000000000000000000000000000..777189152181f14e34c9ed0bf5b28ee4e0e5c72c
--- /dev/null
+++ b/sifrovacka/forms.py
@@ -0,0 +1,26 @@
+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, widget=forms.TextInput(attrs={'class':
+                'text-input form-field__contro','placeholder':
+                'sem vloz heslo pro postup do dalsi faze'}))
+    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/0012_auto_20210904_1228.py b/sifrovacka/migrations/0012_auto_20210904_1228.py
new file mode 100644
index 0000000000000000000000000000000000000000..9c811965ad15ec6bc596218f3e30a2c074564a6d
--- /dev/null
+++ b/sifrovacka/migrations/0012_auto_20210904_1228.py
@@ -0,0 +1,28 @@
+# Generated by Django 3.2.3 on 2021-09-04 12:28
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('sifrovacka', '0011_alter_sifrovacka_pub_date'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='stages',
+            name='stage_img',
+            field=models.ImageField(blank=True, upload_to='UserDirectoryPath'),
+        ),
+        migrations.AddField(
+            model_name='stages',
+            name='stage_passphrase',
+            field=models.CharField(default='hesl0Sifrovacka', max_length=30),
+        ),
+        migrations.AlterField(
+            model_name='stages',
+            name='stage_name',
+            field=models.CharField(max_length=80),
+        ),
+    ]
diff --git a/sifrovacka/migrations/0013_stages_stage_urlhash.py b/sifrovacka/migrations/0013_stages_stage_urlhash.py
new file mode 100644
index 0000000000000000000000000000000000000000..5e52464d3fb7037f1f54b3e5605bddb3997ffe92
--- /dev/null
+++ b/sifrovacka/migrations/0013_stages_stage_urlhash.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.3 on 2021-09-04 12:41
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('sifrovacka', '0012_auto_20210904_1228'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='stages',
+            name='stage_urlhash',
+            field=models.CharField(default='5f2500a80d7d11ec9b142016b9b07b5b', max_length=32),
+        ),
+    ]
diff --git a/sifrovacka/migrations/0014_auto_20210904_1318.py b/sifrovacka/migrations/0014_auto_20210904_1318.py
new file mode 100644
index 0000000000000000000000000000000000000000..1db0ed6ab50e6a08ea2ec0d279317d205b5fce0a
--- /dev/null
+++ b/sifrovacka/migrations/0014_auto_20210904_1318.py
@@ -0,0 +1,34 @@
+# Generated by Django 3.2.3 on 2021-09-04 13:18
+
+from django.db import migrations, models
+import sifrovacka.models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('sifrovacka', '0013_stages_stage_urlhash'),
+    ]
+
+    operations = [
+        migrations.RenameField(
+            model_name='participants',
+            old_name='Inactive',
+            new_name='inactive',
+        ),
+        migrations.AddField(
+            model_name='participants',
+            name='at_stage',
+            field=models.IntegerField(default=1),
+        ),
+        migrations.AlterField(
+            model_name='stages',
+            name='stage_img',
+            field=models.ImageField(blank=True, upload_to=sifrovacka.models.UserDirectoryPath),
+        ),
+        migrations.AlterField(
+            model_name='stages',
+            name='stage_urlhash',
+            field=models.CharField(default='a3c350e80d8211ec9b5f2016b9b07b5b', max_length=32),
+        ),
+    ]
diff --git a/sifrovacka/migrations/0015_auto_20210904_1328.py b/sifrovacka/migrations/0015_auto_20210904_1328.py
new file mode 100644
index 0000000000000000000000000000000000000000..d5fcbcba0326390ae81ba5f69dee16153db9e969
--- /dev/null
+++ b/sifrovacka/migrations/0015_auto_20210904_1328.py
@@ -0,0 +1,23 @@
+# Generated by Django 3.2.3 on 2021-09-04 13:28
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('sifrovacka', '0014_auto_20210904_1318'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='stages',
+            name='stage_description',
+            field=models.CharField(default='', max_length=500),
+        ),
+        migrations.AlterField(
+            model_name='stages',
+            name='stage_urlhash',
+            field=models.CharField(default='fcb0adee0d8311ecb18b2016b9b07b5b', max_length=32),
+        ),
+    ]
diff --git a/sifrovacka/migrations/0016_auto_20210904_1328.py b/sifrovacka/migrations/0016_auto_20210904_1328.py
new file mode 100644
index 0000000000000000000000000000000000000000..cd9b6f548ccf62111e893e6ff3067524447fff41
--- /dev/null
+++ b/sifrovacka/migrations/0016_auto_20210904_1328.py
@@ -0,0 +1,23 @@
+# Generated by Django 3.2.3 on 2021-09-04 13:28
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('sifrovacka', '0015_auto_20210904_1328'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='stages',
+            name='stage_description',
+            field=models.CharField(max_length=500),
+        ),
+        migrations.AlterField(
+            model_name='stages',
+            name='stage_urlhash',
+            field=models.CharField(default='0582c6140d8411ec9c962016b9b07b5b', max_length=32),
+        ),
+    ]
diff --git a/sifrovacka/migrations/0017_alter_stages_stage_urlhash.py b/sifrovacka/migrations/0017_alter_stages_stage_urlhash.py
new file mode 100644
index 0000000000000000000000000000000000000000..ee146bc37273d52285a4ca6e6b90e4941f9a9049
--- /dev/null
+++ b/sifrovacka/migrations/0017_alter_stages_stage_urlhash.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.3 on 2021-09-04 13:29
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('sifrovacka', '0016_auto_20210904_1328'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='stages',
+            name='stage_urlhash',
+            field=models.CharField(default='2aa2950a0d8411ecb3ad2016b9b07b5b', max_length=32),
+        ),
+    ]
diff --git a/sifrovacka/migrations/0018_alter_stages_stage_urlhash.py b/sifrovacka/migrations/0018_alter_stages_stage_urlhash.py
new file mode 100644
index 0000000000000000000000000000000000000000..65e7543b338e63121c7f6b030873f6ef41ab5ec9
--- /dev/null
+++ b/sifrovacka/migrations/0018_alter_stages_stage_urlhash.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.3 on 2021-09-04 18:16
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('sifrovacka', '0017_alter_stages_stage_urlhash'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='stages',
+            name='stage_urlhash',
+            field=models.CharField(default='2d64fb520dac11ecb4c92016b9b07b5b', max_length=32),
+        ),
+    ]
diff --git a/sifrovacka/migrations/0019_auto_20210904_1913.py b/sifrovacka/migrations/0019_auto_20210904_1913.py
new file mode 100644
index 0000000000000000000000000000000000000000..39d67bfd6636730bea8129353927a3f09a283c3a
--- /dev/null
+++ b/sifrovacka/migrations/0019_auto_20210904_1913.py
@@ -0,0 +1,23 @@
+# Generated by Django 3.2.3 on 2021-09-04 19:13
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('sifrovacka', '0018_alter_stages_stage_urlhash'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='participants',
+            name='at_stage',
+            field=models.CharField(default='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', max_length=32),
+        ),
+        migrations.AlterField(
+            model_name='stages',
+            name='stage_urlhash',
+            field=models.CharField(default='3b1487ba0db411ecae702016b9b07b5b', max_length=32),
+        ),
+    ]
diff --git a/sifrovacka/migrations/0020_auto_20210905_0834.py b/sifrovacka/migrations/0020_auto_20210905_0834.py
new file mode 100644
index 0000000000000000000000000000000000000000..3dc1c5473f4aa12c49257fd352fdc9c56ab46a9a
--- /dev/null
+++ b/sifrovacka/migrations/0020_auto_20210905_0834.py
@@ -0,0 +1,29 @@
+# Generated by Django 3.2.3 on 2021-09-05 08:34
+
+from django.db import migrations, models
+import sifrovacka.models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('sifrovacka', '0019_auto_20210904_1913'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='sifrovacka',
+            name='sifrovacka_description',
+            field=models.CharField(default='', max_length=500),
+        ),
+        migrations.AddField(
+            model_name='sifrovacka',
+            name='sifrovacka_img',
+            field=models.ImageField(blank=True, upload_to=sifrovacka.models.UserDirectoryPath),
+        ),
+        migrations.AlterField(
+            model_name='stages',
+            name='stage_urlhash',
+            field=models.CharField(default='25aaa7720e2411ecb82f2016b9b07b5b', max_length=32),
+        ),
+    ]
diff --git a/sifrovacka/migrations/0021_auto_20210905_0835.py b/sifrovacka/migrations/0021_auto_20210905_0835.py
new file mode 100644
index 0000000000000000000000000000000000000000..ef836e414cfb295bf42dca766c5f52b1666c85e4
--- /dev/null
+++ b/sifrovacka/migrations/0021_auto_20210905_0835.py
@@ -0,0 +1,23 @@
+# Generated by Django 3.2.3 on 2021-09-05 08:35
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('sifrovacka', '0020_auto_20210905_0834'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='sifrovacka',
+            name='sifrovacka_description',
+            field=models.CharField(max_length=500),
+        ),
+        migrations.AlterField(
+            model_name='stages',
+            name='stage_urlhash',
+            field=models.CharField(default='39acc55c0e2411ec9d5e2016b9b07b5b', max_length=32),
+        ),
+    ]
diff --git a/sifrovacka/migrations/0022_auto_20210905_1653.py b/sifrovacka/migrations/0022_auto_20210905_1653.py
new file mode 100644
index 0000000000000000000000000000000000000000..4baf52cf4a1bc4e0d62c5828391967c13250ad0e
--- /dev/null
+++ b/sifrovacka/migrations/0022_auto_20210905_1653.py
@@ -0,0 +1,28 @@
+# Generated by Django 3.2.3 on 2021-09-05 16:53
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('sifrovacka', '0021_auto_20210905_0835'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='sifrovacka',
+            name='sifrovacka_description',
+            field=models.CharField(max_length=800),
+        ),
+        migrations.AlterField(
+            model_name='stages',
+            name='stage_description',
+            field=models.CharField(max_length=800),
+        ),
+        migrations.AlterField(
+            model_name='stages',
+            name='stage_urlhash',
+            field=models.CharField(default='baacf3800e6911eca1db2016b9b07b5b', max_length=32),
+        ),
+    ]
diff --git a/sifrovacka/migrations/0023_auto_20210905_1654.py b/sifrovacka/migrations/0023_auto_20210905_1654.py
new file mode 100644
index 0000000000000000000000000000000000000000..c84bfc6e24b37e25913d52a4f049026a5efc516e
--- /dev/null
+++ b/sifrovacka/migrations/0023_auto_20210905_1654.py
@@ -0,0 +1,28 @@
+# Generated by Django 3.2.3 on 2021-09-05 16:54
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('sifrovacka', '0022_auto_20210905_1653'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='sifrovacka',
+            name='sifrovacka_description',
+            field=models.CharField(max_length=2000),
+        ),
+        migrations.AlterField(
+            model_name='stages',
+            name='stage_description',
+            field=models.CharField(max_length=2000),
+        ),
+        migrations.AlterField(
+            model_name='stages',
+            name='stage_urlhash',
+            field=models.CharField(default='f70c86ec0e6911ecb6a22016b9b07b5b', max_length=32),
+        ),
+    ]
diff --git a/sifrovacka/migrations/0024_auto_20210905_1719.py b/sifrovacka/migrations/0024_auto_20210905_1719.py
new file mode 100644
index 0000000000000000000000000000000000000000..4fc421d8a01f5d5132038ebedc8358ca929370da
--- /dev/null
+++ b/sifrovacka/migrations/0024_auto_20210905_1719.py
@@ -0,0 +1,29 @@
+# Generated by Django 3.2.3 on 2021-09-05 17:19
+
+from django.db import migrations, models
+import tinymce.models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('sifrovacka', '0023_auto_20210905_1654'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='sifrovacka',
+            name='sifrovacka_description',
+            field=tinymce.models.HTMLField(),
+        ),
+        migrations.AlterField(
+            model_name='stages',
+            name='stage_description',
+            field=tinymce.models.HTMLField(),
+        ),
+        migrations.AlterField(
+            model_name='stages',
+            name='stage_urlhash',
+            field=models.CharField(default='60bf43560e6d11ecba282016b9b07b5b', max_length=32),
+        ),
+    ]
diff --git a/sifrovacka/migrations/0025_alter_stages_stage_urlhash.py b/sifrovacka/migrations/0025_alter_stages_stage_urlhash.py
new file mode 100644
index 0000000000000000000000000000000000000000..834eaab1a20e6ad3772d52a4e884e726461ed1fc
--- /dev/null
+++ b/sifrovacka/migrations/0025_alter_stages_stage_urlhash.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.3 on 2021-09-05 17:32
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('sifrovacka', '0024_auto_20210905_1719'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='stages',
+            name='stage_urlhash',
+            field=models.CharField(default='3f5301b00e6f11ecbda72016b9b07b5b', max_length=32),
+        ),
+    ]
diff --git a/sifrovacka/migrations/0026_alter_stages_stage_urlhash.py b/sifrovacka/migrations/0026_alter_stages_stage_urlhash.py
new file mode 100644
index 0000000000000000000000000000000000000000..0ab4de590b264debbcc0e0cb1ecf2150bad98ada
--- /dev/null
+++ b/sifrovacka/migrations/0026_alter_stages_stage_urlhash.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.3 on 2021-09-05 17:32
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('sifrovacka', '0025_alter_stages_stage_urlhash'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='stages',
+            name='stage_urlhash',
+            field=models.CharField(default='43efd7700e6f11ecb08f2016b9b07b5b', max_length=32),
+        ),
+    ]
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/migrations/0029_alter_stages_stage_urlhash.py b/sifrovacka/migrations/0029_alter_stages_stage_urlhash.py
new file mode 100644
index 0000000000000000000000000000000000000000..ccf71087064f7e68611ef0bb5ac27d7fefaeb87f
--- /dev/null
+++ b/sifrovacka/migrations/0029_alter_stages_stage_urlhash.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.3 on 2021-09-07 10:48
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('sifrovacka', '0028_auto_20210906_1357'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='stages',
+            name='stage_urlhash',
+            field=models.CharField(default='219a29ae0fc911ecb2d12016b9b07b5b', max_length=32),
+        ),
+    ]
diff --git a/sifrovacka/models.py b/sifrovacka/models.py
index 6cf73731103779e0a53df9054db62b9f8e01c4eb..a62780ce10386704e4d9ec81068449637e189ff0 100644
--- a/sifrovacka/models.py
+++ b/sifrovacka/models.py
@@ -3,13 +3,31 @@ from django.db import models
 # Create your models here.
 
 from django.conf import settings
-
+from uuid import uuid1
+from django.utils import encoding
+from tinymce.models import HTMLField
+
+def UserDirectoryPath(instance, filename):
+    try:
+         # file will be uploaded to MEDIA_ROOT/sifrovacka_<id>/stage_<id>/<filename>
+        return 'sifrovacka_{0}/stage_{1}/{2}'.format(instance.sifrovacka_id,
+            instance.stage_number,
+            encoding.smart_str(filename, encoding='utf-8', strings_only = True))
+    except:
+        pass
+    finally:
+        # file will be uploaded to MEDIA_ROOT/sifrovacka_<id>/<filename>
+        return 'sifrovacka_{0}/{1}'.format(instance.id,
+                encoding.smart_str(filename, encoding='utf-8', strings_only = True))
 
 class Sifrovacka(models.Model):
     '''
     model which describes sifrovacka
     '''
     sifrovacka_name = models.CharField(max_length=200)
+    sifrovacka_description = HTMLField()
+    #sifrovacka_description = models.CharField(max_length=2000)
+    sifrovacka_img = models.ImageField(blank=True, upload_to=UserDirectoryPath)
     #pub_date = models.DateField()
     pub_date = models.DateTimeField('date published')
     startdate_sifrovacka = models.DateField()
@@ -19,23 +37,20 @@ class Sifrovacka(models.Model):
         return self.sifrovacka_name
 
 
-
-
 class Stages(models.Model):
     '''
     model which describes how many stages are in particular sifrovacka
     '''
-    stage_name = models.CharField(max_length=200)
     sifrovacka = models.ForeignKey(Sifrovacka, on_delete=models.CASCADE)
     stage_number = models.IntegerField()
-#    if not stage_name_text models:
-#        stage_name = getattr(Stages, sifrovacka_name)
-#            "-" + getattr(Stages, stage_number))
-#    else:
-#        stage_name = stage_name_text
-#    votes = models.IntegerField(default=0)
-#    startdate_stages = models.DateField()
-#    enddate_stages= models.DateField()
+    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')
+    stage_img = models.ImageField(blank=True, upload_to=UserDirectoryPath)
+    stage_urlhash = models.CharField(max_length=32, default=uuid1().hex)
 
     def __str__(self):
         return str(self.sifrovacka) + " - Stage " + str(self.stage_number)
@@ -44,14 +59,16 @@ class Stages(models.Model):
     class Meta:
         unique_together = [['stage_number', 'sifrovacka']]
 
-
 class Participants(models.Model):
     '''
     table which connects sifrovacka with users who participate
     '''
     user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete = models.CASCADE)
     sifrovacka = models.ForeignKey(Sifrovacka, on_delete = models.CASCADE)
-    Inactive = models.BooleanField(default = False)
+    #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/404.html b/sifrovacka/templates/404.html
new file mode 100644
index 0000000000000000000000000000000000000000..e6da4277c770a3c3010ff35feecaec5248e5a8c6
--- /dev/null
+++ b/sifrovacka/templates/404.html
@@ -0,0 +1,8 @@
+{% extends "base.html" %}
+{% load static %}
+
+{% block content %}
+<div class="alert alert--red-600">
+ <span> Stranka nenalezena. </span>
+</div>
+{% endblock %}
diff --git a/sifrovacka/templates/405.html b/sifrovacka/templates/405.html
new file mode 100644
index 0000000000000000000000000000000000000000..86cec24fe70e527fd3f49eb6a39dbcb50271d3e5
--- /dev/null
+++ b/sifrovacka/templates/405.html
@@ -0,0 +1,9 @@
+{% extends "base.html" %}
+{% load static %}
+
+{% block content %}
+<div class="alert alert--red-600">
+<!-- intentionally wrong encoded text - JUST FOR TESTING 500.html ERROR page -->
+<span>Omlouváme se, ale nastala <b>chyba serveru</b>. </br>Pokud se chyba stala p¿i b¿¿né operaci, prosím kontaktujte správce a popi¿te mu situaci v¿etn¿ screenshotu, kontakt je ní¿e. </span>
+</div>
+{% endblock %}
diff --git a/sifrovacka/templates/500.html b/sifrovacka/templates/500.html
new file mode 100644
index 0000000000000000000000000000000000000000..be87cb12afb2ab3890a0d24526047938c6ac98b2
--- /dev/null
+++ b/sifrovacka/templates/500.html
@@ -0,0 +1,8 @@
+{% extends "base.html" %}
+{% load static %}
+
+{% block content %}
+<div class="alert alert--red-600">
+ <span>Omlouvame se, ale nastala <b>chyba serveru</b>. </br>Pokud se chyba stala pri bezne operaci, prosim kontaktujte spravce a popiste mu situaci vcetne screenshotu, kontakt je nize. </span>
+</div>
+{% endblock %}
diff --git a/sifrovacka/templates/base.html b/sifrovacka/templates/base.html
index 58a9f665ff9bac18b4c20e78822b55c3a2e0d32e..d82b1d4f6a6b9062ae7a0d57f7f69e2a7df5748f 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,12 +31,35 @@
       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 %}
   {% endif %}
 
-  <title>Šifrovačky</title>
+  <title>Šifrovačka</title>
 </head>
 
 <body>
@@ -51,7 +74,7 @@
         <div class="navbar__brand my-4 flex items-center lg:pr-8 lg:my-0">
           <a href="/"><img src="https://styleguide.pir-test.eu/2.3.x/images/logo-round-white.svg" class="w-8"></a>
           <span class="pl-4 font-bold text-xl lg:border-r lg:border-grey-300 lg:pr-8">
-           <a href={% url "index"%}>Sifrovacky</a>
+           <a href={% url "index"%}>Sifrovacka</a>
             {% if settings.SIFROVACKA_ENV == "dev" %}<sup class="text-cyan-100">(DEV)</sup>{% endif %}
           </span>
         </div>
diff --git a/sifrovacka/templates/index.html b/sifrovacka/templates/index.html
index f33ceda666e63bdfb2d4ec726d867cdf999eede6..b1220ae6ba97dfb2d34f3a33b9ed09506545325e 100644
--- a/sifrovacka/templates/index.html
+++ b/sifrovacka/templates/index.html
@@ -1,37 +1,52 @@
 {% extends "base.html" %}
 
 {% block content %}
+ <div class="container container--default">
  {% if sifrovacky_list %}
-{% comment %}
-   {% if request.user.is_authenticated %}
-    {% for sifrovacka in available_sifrovacky_list %}
-{% endcomment %}
-   <ul>
-    <p> <b>Aktivni sifrovacky: </b> </p>
-    {% for sifrovacka in sifrovacky_list %}
-     <li><a href={% url 'detail' sifrovacka.id %}>{{ sifrovacka.sifrovacka_name }}</a></li>
-    {% endfor %}
-   </ul>
-   {% if request.user.is_authenticated %}
-   <ul>
-    <p> <b>Prihlasene sifrovacky: </b> </p>
-    {% for sifrovacka in user_active_sifrovacky %}
-     <li><a href={% url 'detail' sifrovacka.sifrovacka.id %}>{{ sifrovacka }}</a></li>
-    {% endfor %}
-   </ul>
-   {% endif %}
-   <ul>
-    <p> <b>Ukoncene sifrovacky: </b> </p>
-    {% for sifrovacka in archived_sifrovacky %}
-     <li><a href={% url 'detail' sifrovacka.id %}>{{ sifrovacka.sifrovacka_name }}</a></li>
-    {% endfor %}
-   </ul>
+ <ul>
+  <h1 class="head-alt-md">Aktivni sifrovacky:</h1>
+  {% for sifrovacka in sifrovacky_list %}
+   <li><a href={% url 'detail' sifrovacka.id %}>{{ sifrovacka.sifrovacka_name }}</a></li>
+  {% endfor %}
+ {% else %}
+  {% if not request.user.is_authenticated %}
+   <div class="alert alert--grey-125">
+    <span>Je nam lito, ale zadne sifrovacky nejsou aktualne dostupne.</span>
+   </div>
+  {% else %}
+   <h1 class="head-alt-md">Aktivni sifrovacky:</h1>
+   <p>Je nam lito, ale zadne sifrovacky nejsou aktualne dostupne.</p>
+  {% endif %}
+ {% endif %}
+ </ul>
+
+ {% if request.user.is_authenticated %}
+  <ul>
+  <h1 class="head-alt-base">Prihlasene sifrovacky:</h1>
+  {% if user_active_sifrovacky %}
+   {% for sifrovacka in user_active_sifrovacky %}
+    <li><a href={% url 'detail' sifrovacka.sifrovacka.id %}>{{ sifrovacka }}</a></li>
+   {% endfor %}
+  {% else %}
+   <p>Nemate zapsane zadne sifrovacky.</p>
+  {% endif %}
+  </ul>
+ {% endif %}
+ <ul>
+ {% if archived_sifrovacky %}
+  <h1 class="head-alt-base">Ukoncene sifrovacky:</h1>
+   {% for sifrovacka in archived_sifrovacky %}
+    <li><a href={% url 'detail' sifrovacka.id %}>{{ sifrovacka.sifrovacka_name }}</a></li>
+   {% endfor %}
+  {% endif %}
+ </ul>
 {% comment %}
   {% else %}
    <p>Zadne sifrovacky nejsou aktivni nebo se ucastnite vsech dostupnych.</p>
   {% endif %}
-{% endcomment %}
  {% else %}
   <p>Je nam lito, ale zadne sifrovacky nejsou aktualne dostupne.</p>
  {% endif %}
+{% endcomment %}
+ </div>
 {% endblock %}
diff --git a/sifrovacka/templates/sifrovacka.html b/sifrovacka/templates/sifrovacka.html
index bb322a6288a6c565770dbf452259e7a227249ce0..8c49b306ad9cb271e5532139d485ef4ef2f91aaf 100644
--- a/sifrovacka/templates/sifrovacka.html
+++ b/sifrovacka/templates/sifrovacka.html
@@ -1,41 +1,63 @@
 {% extends "base.html" %}
+{% load static %}
 
 {% block content %}
-<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>
+ <div class="container container--default">
+  <h1 class="head-alt-md">{{sifrovacka_detail}}</h1>
+  </br>
+  <p> Pocet ukolu: <b> {{ sifrovacka_stage_count }} </b> </br>
+  <!--
+      Obtiznost: NONE</br>
+      Casova narocnost: NONE</p>
+  -->
 
-</br>
-{% if request.user.is_authenticated %}
-<form action="{% url 'home' %}" method="post">
-{% csrf_token %}
-{% comment %}
-<form action="{% url 'sifrovacka:home' sifrovacka.id %}" method="post">
-{% csrf_token %}
-<button type="submit" value=signupsif name='signupsif'>Prihlasit se k sifrovacce</button>
-<button type="submit" value=signupsif onclick="location.href='{% url 'home' %}'" name='_signupsif'>Prihlasit se k sifrovacce</button>
-<fieldset>
-    <legend><h1>{{ sifrovacka_detail }}</h1></legend>
-    {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
-    {% for choice in question.choice_set.all %}
-        <input type="radio" name="signupsif" id="signupsif" value="{{ sifrovacka_id }}">
-        <label for="signupsif"> Začít šifrovačku</label><br>
-    {% endfor %}
-</fieldset>
-<input type="submit" name="signupsif" value={{ sifrovacka_id }}>
-{% endcomment %}
-<button type="submit" value={{ sifrovacka_id }} name='signupsif'>Prihlasit se k sifrovacce</button>
-</form>
-{% endif %}
-</br>
-</br>
-</br>
-Debug:
-<div>
-{% for stage in sifrovacka_stages %}
- {{ stage }}</br>
-{% endfor %}
-</div>
+  <h1 class="head-alt-sm">Pruvodni slovo</h1>
+  <hr>
+  </br>
+  {{ sifrovacka_detail.sifrovacka_description | safe }}
+  {% if sifrovacka_detail.sifrovacka_img %}
+   <figure class="figure">
+    <img src=" {% get_media_prefix %}{{sifrovacka_detail.sifrovacka_img}}" alt="16x9 Image">
+   <figcaption>
+       Autor: Junius Koolen CC-BY-SA
+   </figcaption>
+  </figure>
+  {% endif%}
+  <hr>
+  {% if request.user.is_authenticated %}
+   {% if not sifrovacka_stage_count == 0 %}
+    {% if not sifrovacka_current_stage_urlhash %}
+      <form action="{% url 'home' %}" method="post">
+      {% csrf_token %}
+      <button class="btn btn--autowidth btn--hoveractive btn--to-grey-500" type="submit" value={{ sifrovacka_id }} name='signupsif'>
+      <div class="btn__body ">Prihlasit se k sifrovacce</div>
+     </button>
+      </form>
+    {% else %}
+      <h1 class="head-alt-sm">Vase Aktualni uroven</h1>
+      {% for stage in sifrovacka_stages %}
+          {% if sifrovacka_current_stage_urlhash.at_stage == stage.stage_urlhash %}
+           <li><a href={% url 'stage' stage.sifrovacka_id stage.stage_urlhash %}>{{ stage }}</a></li>
+          {% endif %}
+      {% endfor %}
+    {% endif %}
+   {% else %}
+    <div class="alert alert--grey-125">
+     <span> Sifrovacka zatim nema zadne urovne, proto neni mozne se k ni prihlasit.</span>
+    </div>
+   {% endif %}
+  {% endif %}
+ </div>
+  {% comment %}
+  </br>
+  </br>
+  </br>
+  Debug:
+  <div>
+  {% for stage in sifrovacka_stages %}
+       <li><a href={% url 'stage' stage.sifrovacka_id stage.stage_urlhash %}>{{ stage }}</a></li>
+  {% endfor %}
+  </br>
+  </div>
+ {% endcomment %}
 {% endblock %}
diff --git a/sifrovacka/templates/stage.html b/sifrovacka/templates/stage.html
new file mode 100644
index 0000000000000000000000000000000000000000..2e556979913ce830e6a1e11ea21d2e95e6c98aa1
--- /dev/null
+++ b/sifrovacka/templates/stage.html
@@ -0,0 +1,104 @@
+{% extends "base.html" %}
+{% load static %}
+
+{% block content %}
+<div class="container container--default">
+ {% if stage_current_id %}
+  {% if request.user.is_authenticated %}
+
+  <h1 class="head-alt-md">{{ sifrovacka_current_stage_urlhash }}</h1>
+  <p>Krok: <b>{{ stage_current_id.stage_number }}</b> z {{ sifrovacka_stage_count }}. </p>
+  {% if error_passphrase %}
+    <div class="alert alert--red-600">
+     <span>Zadali jste Spatne heslo pro vstup do dalsi urovne. </span>
+    </div>
+  {% endif %}  
+  <h1 class="head-alt-sm">Pruvodni slovo</h1>
+  <hr>
+  {{ stage_current_id.stage_description | safe }}
+
+   {% if stage_current_id.stage_img %}
+    <figure class="figure">
+     <img src=" {% get_media_prefix %}{{stage_current_id.stage_img}}" alt="16x9 Image">
+{% comment  %}
+<!-- mozna doprovodny text k fotce -->
+      <figcaption>
+       Autor: Junius Koolen CC-BY-SA {{ stage_current_picture_extra_text }
+      </figcaption>
+{% endcomment  %}
+
+    </figure>
+   {% endif %}
+   {% if not last_stage %}
+    <form action="{% url 'stage' sifrovacka_id stage_current_id.stage_urlhash %}" method="post">
+     {% csrf_token %}
+     </br>
+     </br>
+     <div>
+      <button class="collapsible btn btn--fullwidth btn--grey-700 " type="button">
+       <div class="btn__body "> Klikni pro napovedu</div>
+      </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>
+     </div>
+     <hr>
+     </br>
+<!-- Form field-->
+     <div class="form-field  ">
+      <div class="fieldWrapper">
+       {{ passphrase_form.non_field_errors }}
+       {{ passphrase_form.errors }}
+       {{ passphrase_form.passphrase.errors }}
+      </div>
+      <div class="form-field__wrapper form-field__wrapper--shadowed">
+       {{ passphrase_form.passphrase }}
+       <input id="id_stage_current_urlhash" type="hidden" name="stage_current_urlhash" required="" value="{{stage_current_id.stage_urlhash}}">
+
+       <button class="btn btn--autowidth ">
+        <div class="btn__body">Odeslat</div>
+       </button>
+      </div>
+     </div>
+<!-- End Form field -->
+     </form>
+   {% else %}
+    {% if not participant_sifrovacka.finished %}
+ {% comment %}
+ {% endcomment %}
+     <form action="{% url 'stage' sifrovacka_id stage_current_id.stage_urlhash %}" method="post">
+       {% csrf_token %}
+       <button id="id_finish" class="btn btn--autowidth btn--hoveractive btn--to-grey-500" type="submit" value=True name="finish">
+        <div class="btn__body ">Dokoncit</div>
+       </button>
+     </form>
+    {% else %}
+    <div class="alert alert--green-400">
+     <span>Tuto sifrovacku mate dokoncenou.</span>
+    </div>
+    {% endif %}
+   {% endif%}
+  {% endif %}
+ {% else %}
+  <div class="alert alert--red-600">
+   <span> Stranka neni dostupna </span>
+  </div>
+ {% endif %}
+</div>
+{% endblock %}
diff --git a/sifrovacka/urls.py b/sifrovacka/urls.py
index fd54650f39434ed0a70751a75f7df41f516f3cdb..1183f0824c287c68e3c0a1a91aec0c1a3b532aef 100644
--- a/sifrovacka/urls.py
+++ b/sifrovacka/urls.py
@@ -1,4 +1,6 @@
-from django.urls import include,path
+from django.urls import include,path,re_path
+from django.conf import settings
+from django.conf.urls.static import static
 
 from . import views
 
@@ -8,8 +10,13 @@ urlpatterns = [
     path('accounts/', include('django.contrib.auth.urls')),
     # the 'name' value as called by the {% url %} template tag
     path('<int:sifrovacka_id>/', views.detail, name='detail'),
+    path('<int:sifrovacka_id>/<slug:stage_urlhash>/', views.stage, name='stage'),
     # home page
     path('home/', views.home, name='home'),
+    # rich test editor
+    re_path(r'^tinymce/', include('tinymce.urls')),
     # /
     path('', views.index, name='index'),
-]
+    ]
+#    ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
+
diff --git a/sifrovacka/views.py b/sifrovacka/views.py
index 5eb47d6f78c3e8e7483f338daa68f5d943ac83ac..4cf0b27a242cc1c25cf706263214958d8d052f31 100644
--- a/sifrovacka/views.py
+++ b/sifrovacka/views.py
@@ -1,22 +1,174 @@
-from django.shortcuts import get_object_or_404, render
+from django.shortcuts import get_object_or_404, redirect, render
 
 # Create your views here.
 from django.db import IntegrityError
 from django.utils import timezone
-from django.http import HttpResponse
+from django.http import HttpResponse, Http404
 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):
+    passphrase_form = None
+    sifrovacka_next_stage = None
+    sifrovacka_current_stage_urlhash = None
+    sifrovacka_detail = get_object_or_404(Sifrovacka,id = sifrovacka_id)
+    sifrovacka_stages = Stages.objects.filter(sifrovacka__sifrovacka_name = sifrovacka_detail)
+    sifrovacka_stage_count = sifrovacka_stages.count()
+    stage_current_id = None
+    participant_sifrovacka = None
+    last_stage = False
+    error_passphrase= 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("---SIFROVACKA---")
+                tmp_stage_id = s['id']
+                sifrovacka_current_stage_urlhash = Participants.objects.get(id = \
+                                                    tmp_stage_id)
+                tmp_participant_sifrovacka = Participants.objects.filter(user = \
+                                              request.user).filter(sifrovacka_id = \
+                                              sifrovacka_id)
+                participant_sifrovacka = Participants.objects.get(id = \
+                                          tmp_participant_sifrovacka[0].id)
+                if (sifrovacka_current_stage_urlhash.at_stage == stage_urlhash):
+                    print('hehe')
+                    stage_current_id = get_object_or_404(Stages,stage_urlhash =
+                                        sifrovacka_current_stage_urlhash.at_stage)
+                    print(stage_current_id)
+                else:
+                    print('not same')
+                    raise Http404
+
+                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)
+                            tmp_sifrovacka_current = sifrovacka_stages.filter(stage_number = tmp_next_stage_number)
+                            print(tmp_sifrovacka_current)
+                            sifrovacka_next_stage = tmp_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')
+                                try:
+                                    setattr(sifrovacka_current_stage_urlhash, 'at_stage', tmp_stage_next_urlhash)
+                                except IntegrityError as e:
+                                    print(e)
+                                    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,
+                                               "last_stage": last_stage,
+                                               "passphrase_form": passphrase_form,
+                                               "error_alreadysigned": e
+                                              }
+                                    return render(request, 'stage.html', context)
+                                else:
+                                    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)
+                            else:
+                                error_passphrase = True
+
+                            passphrase_form = PassphraseForm()
+                            print("ENDHASH")
+                    else:
+                        print("---GET---")
+                        passphrase_form = PassphraseForm()
+                elif stage_current_id.stage_number == sifrovacka_stage_count:
+                    last_stage = True
+                    print("---Participant---")
+                    print(participant_sifrovacka.finished)
+                    if (sifrovacka_current_stage_urlhash.at_stage == stage_urlhash):
+                        try:
+                            if request.POST['finish']:
+                                print("FINISH")
+                        except KeyError as e:
+                            pass
+                        else:
+                            print("not key")
+                            try:
+                                setattr(participant_sifrovacka, 'finished', True)
+                            except IntegrityError as e:
+                                print(e)
+                            else:
+                                print("xx")
+                                participant_sifrovacka.save()
+
+
+
+
+#                else:
+#                    print("VETSI")
+
+
+    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,
+               "participant_sifrovacka": participant_sifrovacka,
+               "last_stage": last_stage,
+               'passphrase_form': passphrase_form,
+               "error_passphrase": error_passphrase
+              }
+    return render(request, 'stage.html', context)
 
 def detail(request, sifrovacka_id):
-    sifrovacka_detail = Sifrovacka.objects.get(id = sifrovacka_id)
+#    print(dir(request))
+    sifrovacka_current_stage_urlhash = None
+    sifrovacka_current_id = None
+    sifrovacka_detail = get_object_or_404(Sifrovacka,id = sifrovacka_id)
+    #sifrovacka_detail = Sifrovacka.objects.get(id = sifrovacka_id)
     sifrovacka_stages = Stages.objects.filter(sifrovacka__sifrovacka_name = sifrovacka_detail)
     sifrovacka_stage_count = sifrovacka_stages.count()
+    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("---SIFROVACKA---")
+    #            print(s['at_stage'])
+                tmp_stage_id = s['id']
+                sifrovacka_current_stage_urlhash = Participants.objects.get(id = \
+                                                    tmp_stage_id)
+                sifrovacka_current_id = tmp_stage_id
+
     context = {"sifrovacka_id": sifrovacka_id,
                "sifrovacka_detail": sifrovacka_detail,
                "sifrovacka_stages": sifrovacka_stages,
-               "sifrovacka_stage_count": sifrovacka_stage_count}
+               "sifrovacka_stage_count": sifrovacka_stage_count,
+               "sifrovacka_current_id": sifrovacka_current_id,
+               "sifrovacka_current_stage_urlhash":
+               sifrovacka_current_stage_urlhash
+              }
     return render(request, 'sifrovacka.html', context)
 
 def home(request):
@@ -25,21 +177,28 @@ def home(request):
     if request.user.is_authenticated:
         participation_sifrovacky_list = Participants.objects.filter(user =
                                         request.user).order_by('sifrovacka_id')
-       # available_sifrovacky_list = all_sifrovacky_list.difference(
-                                    #participation_sifrovacky_list)
         if request.method == 'POST':
-              if request.POST["signupsif"]:
-                  post_signupsif = request.POST["signupsif"]
+              if request.POST['signupsif']:
+
+                  post_signupsif = request.POST['signupsif']
                   print(post_signupsif)
+
+                  sifrovacka_detail = Sifrovacka.objects.get(id = post_signupsif)
+                  sifrovacka_stages = Stages.objects.filter(sifrovacka__sifrovacka_name =
+                                       sifrovacka_detail).filter(stage_number = "1")
+                  stage_current_urlhash = sifrovacka_stages[0].stage_urlhash
+                  print(stage_current_urlhash)
                   try:
                       p = Participants.objects.create(user=request.user,
-                              sifrovacka_id=post_signupsif)
+                           sifrovacka_id=post_signupsif,
+                           at_stage=stage_current_urlhash )
                   except IntegrityError as e:
-
+                      print(e)
                       context = {"active_sifrovacky_list": all_sifrovacky_list,
-                                  "participation_sifrovacky_list": participation_sifrovacky_list,
-                                  "error_alreadysigned": e
+                                 "participation_sifrovacky_list": participation_sifrovacky_list,
+                                 "error_alreadysigned": e
                                 }
+                      return render(request, 'home.html', context)
                   else:
                       p.save()
     else: