diff --git a/.gitignore b/.gitignore index d52706e7..267a467b 100644 --- a/.gitignore +++ b/.gitignore @@ -43,5 +43,3 @@ server/media/ .coverage -# Cypress screenshots -client/cypress/screenshots diff --git a/client/.gitignore b/client/.gitignore index 2ced117e..b5235d68 100644 --- a/client/.gitignore +++ b/client/.gitignore @@ -13,3 +13,7 @@ cypress/videos *.ntvs* *.njsproj *.sln + +# Cypress +cypress/screenshots +cypress/videos diff --git a/client/cypress/integration/login-page-spec.js b/client/cypress/integration/login-page.spec.js similarity index 100% rename from client/cypress/integration/login-page-spec.js rename to client/cypress/integration/login-page.spec.js diff --git a/client/cypress/integration/registration-page-spec.js b/client/cypress/integration/registration-page.spec.js similarity index 100% rename from client/cypress/integration/registration-page-spec.js rename to client/cypress/integration/registration-page.spec.js diff --git a/client/package-lock.json b/client/package-lock.json index 10fba723..20e10dce 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -8985,8 +8985,7 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true, - "optional": true + "bundled": true }, "aproba": { "version": "1.2.0", @@ -9004,13 +9003,11 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true, - "optional": true + "bundled": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -9023,18 +9020,15 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true, - "optional": true + "bundled": true }, "concat-map": { "version": "0.0.1", - "bundled": true, - "optional": true + "bundled": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, - "optional": true + "bundled": true }, "core-util-is": { "version": "1.0.2", @@ -9137,8 +9131,7 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, - "optional": true + "bundled": true }, "ini": { "version": "1.3.5", @@ -9148,7 +9141,6 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -9161,20 +9153,17 @@ "minimatch": { "version": "3.0.4", "bundled": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true, - "optional": true + "bundled": true }, "minipass": { "version": "2.2.4", "bundled": true, - "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -9191,7 +9180,6 @@ "mkdirp": { "version": "0.5.1", "bundled": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -9264,8 +9252,7 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, - "optional": true + "bundled": true }, "object-assign": { "version": "4.1.1", @@ -9275,7 +9262,6 @@ "once": { "version": "1.4.0", "bundled": true, - "optional": true, "requires": { "wrappy": "1" } @@ -9351,8 +9337,7 @@ }, "safe-buffer": { "version": "5.1.1", - "bundled": true, - "optional": true + "bundled": true }, "safer-buffer": { "version": "2.1.2", @@ -9382,7 +9367,6 @@ "string-width": { "version": "1.0.2", "bundled": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -9400,7 +9384,6 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -9439,13 +9422,11 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, - "optional": true + "bundled": true }, "yallist": { "version": "3.0.2", - "bundled": true, - "optional": true + "bundled": true } } }, @@ -11428,8 +11409,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -11450,14 +11430,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -11472,20 +11450,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -11602,8 +11577,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -11615,7 +11589,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -11630,7 +11603,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -11638,14 +11610,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -11664,7 +11634,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -11745,8 +11714,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -11758,7 +11726,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -11844,8 +11811,7 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -11881,7 +11847,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -11901,7 +11866,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -11945,14 +11909,12 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, diff --git a/client/src/pages/registration.vue b/client/src/pages/registration.vue index d3179091..9de11181 100644 --- a/client/src/pages/registration.vue +++ b/client/src/pages/registration.vue @@ -149,7 +149,7 @@ export default { ) { try { if (success) { - window.location.href = '/set-password/done/'; + window.location.href = '/registration/set-password/done/'; } else { errors.forEach(function(error) { switch (error.field) { diff --git a/client/src/pages/waitForClass.vue b/client/src/pages/waitForClass.vue index efc0f9ba..38a53372 100644 --- a/client/src/pages/waitForClass.vue +++ b/client/src/pages/waitForClass.vue @@ -1,6 +1,6 @@ diff --git a/server/core/static/styles/main.scss b/server/core/static/styles/main.scss index 74b4c672..2073aaf4 100644 --- a/server/core/static/styles/main.scss +++ b/server/core/static/styles/main.scss @@ -25,6 +25,8 @@ $base-font-size: 15px; $space: 10px; +$color-brand: #17A887; + body { font-family: $font-family; font-size: $base-font-size; @@ -117,6 +119,13 @@ input[type=text], input[type=password], input[type=email], select { margin-bottom: 52px; line-height: 1.5rem; font-size: 1.125rem; + + a { + color: $color-brand; + font-family: 'Montserrat', Arial, sans-serif; + font-size: 18px; + font-weight: 300; + } } .reset__form label { diff --git a/server/core/templates/registration/registration_set_password_complete.html b/server/core/templates/registration/registration_set_password_complete.html new file mode 100644 index 00000000..32215383 --- /dev/null +++ b/server/core/templates/registration/registration_set_password_complete.html @@ -0,0 +1,12 @@ +{% extends 'base.html' %} +{% load i18n %} + +{% block title %}{% trans 'Sie haben es geschafft' %}{% endblock %} + +{% block body %} +
+

{% trans 'Sie haben es geschafft' %}

+

{% trans 'Ihr Passwort wurde erfolgreich gespeichert. Sie können sich nun anmelden.' %}

+

{% trans 'Jetzt anmelden' %}

+
+{% endblock %} diff --git a/server/core/templates/registration/registration_set_password_confirm.html b/server/core/templates/registration/registration_set_password_confirm.html new file mode 100644 index 00000000..e5181163 --- /dev/null +++ b/server/core/templates/registration/registration_set_password_confirm.html @@ -0,0 +1,17 @@ + +{% extends 'base.html' %} +{% load i18n %} + +{% block title %}{% trans 'Setzen Sie Ihr Passwort' %}{% endblock %} + +{% block body %} +
+

{% trans 'Geben Sie ein persönliches Passwort ein:' %}

+

{% trans 'Kein Problem! Geben Sie Ihre E-Mail-Adresse ein und erhalten Sie weitere Anweisungen.' %}

+
+ {% csrf_token %} + {{ form.as_p }} + +
+
+{% endblock %} diff --git a/server/core/templates/registration/registration_set_password_done.html b/server/core/templates/registration/registration_set_password_done.html new file mode 100644 index 00000000..1dd1fe9c --- /dev/null +++ b/server/core/templates/registration/registration_set_password_done.html @@ -0,0 +1,12 @@ + +{% extends 'base.html' %} +{% load i18n %} + +{% block title %}{% trans 'Schauen Sie in Ihr Postfach' %}{% endblock %} + +{% block body %} +
+

{% trans 'Schauen Sie in Ihr Postfach' %}

+

{% trans 'Wir haben ein E-Mail mit allen weiteren Anweisungen an Sie verschickt. Die E-Mail sollte in Kürze bei Ihnen ankommen.' %}

+
+{% endblock %} diff --git a/server/core/templates/registration/registration_set_password_email.html b/server/core/templates/registration/registration_set_password_email.html new file mode 100644 index 00000000..c752eada --- /dev/null +++ b/server/core/templates/registration/registration_set_password_email.html @@ -0,0 +1,12 @@ +{% load i18n %}{% autoescape off %} +{% blocktrans %}Sie erhalten diese E-Mail, um Ihr Passwort auf mySkillbox initial zu setzen.{% endblocktrans %} + +{% trans "Bitte öffnen Sie folgende Seite, um Ihr neues Passwort einzugeben:" %} +{% block reset_link %} +{{ protocol }}://{{ domain }}{% url 'set_password_confirm' uidb64=uid token=token %} +{% endblock %} +{% trans "Ihr Benutzername lautet:" %} {{ user.get_username }} + +{% trans "Ihr mySkillbox Team" %} + +{% endautoescape %} diff --git a/server/core/templates/registration/registration_set_password_form.html b/server/core/templates/registration/registration_set_password_form.html new file mode 100644 index 00000000..4fba77cb --- /dev/null +++ b/server/core/templates/registration/registration_set_password_form.html @@ -0,0 +1,21 @@ + +{% extends 'base.html' %} +{% load i18n %} + +{% block title %}{% trans 'Willkommen bei mySkillbox' %}{% endblock %} + +{% block body %} +
+

{% trans 'Willkommen bei Myskillbox' %}

+

{% trans 'Bevor Sie mySkillbox verwenden können, müssen Sie Ihre E-Mail-Adresse bestätigen und ein persönliches Passwort festlegen.' %}

+
+ {% csrf_token %} +
+ + {{ form.email }} +
+ + +
+
+{% endblock %} diff --git a/server/core/templates/registration/registration_set_password_subject.txt b/server/core/templates/registration/registration_set_password_subject.txt new file mode 100644 index 00000000..94018095 --- /dev/null +++ b/server/core/templates/registration/registration_set_password_subject.txt @@ -0,0 +1 @@ +Myskillbox: E-Mail bestätigen und Passwort setzen diff --git a/server/core/templates/registration/set_password_email.html b/server/core/templates/registration/set_password_email.html index 732e86f9..c752eada 100644 --- a/server/core/templates/registration/set_password_email.html +++ b/server/core/templates/registration/set_password_email.html @@ -1,5 +1,5 @@ {% load i18n %}{% autoescape off %} -{% blocktrans %}Sie erhalten diese E-Mail, um Ihr Passwort auf {{ site_name }} initial zu setzen.{% endblocktrans %} +{% blocktrans %}Sie erhalten diese E-Mail, um Ihr Passwort auf mySkillbox initial zu setzen.{% endblocktrans %} {% trans "Bitte öffnen Sie folgende Seite, um Ihr neues Passwort einzugeben:" %} {% block reset_link %} diff --git a/server/core/urls.py b/server/core/urls.py index cddcdeb0..ef247798 100644 --- a/server/core/urls.py +++ b/server/core/urls.py @@ -8,7 +8,8 @@ from wagtail.admin import urls as wagtailadmin_urls from wagtail.core import urls as wagtail_urls from core import views -from core.views import SetPasswordView, SetPasswordDoneView, SetPasswordConfirmView, SetPasswordCompleteView +from core.views import LegacySetPasswordView, LegacySetPasswordDoneView, LegacySetPasswordConfirmView,\ + LegacySetPasswordCompleteView, SetPasswordView, SetPasswordDoneView, SetPasswordConfirmView, SetPasswordCompleteView urlpatterns = [ # django admin @@ -16,11 +17,20 @@ urlpatterns = [ url(r'^accounts/', include('django.contrib.auth.urls')), url(r'^statistics/', include('statistics.urls', namespace='statistics')), + # legacy - will be removed # set password - path('welcome/', SetPasswordView.as_view(), name='set_password'), - path('set-password/done/', SetPasswordDoneView.as_view(), name='set_password_done'), - path('set-password///', SetPasswordConfirmView.as_view(), name='set_password_confirm'), - path('set-password/complete/', SetPasswordCompleteView.as_view(), name='set_password_complete'), + path('welcome/', LegacySetPasswordView.as_view(), name='set_password'), + path('set-password/done/', LegacySetPasswordDoneView.as_view(), name='set_password_done'), + path('set-password///', LegacySetPasswordConfirmView.as_view(), name='set_password_confirm'), + path('set-password/complete/', LegacySetPasswordCompleteView.as_view(), name='set_password_complete'), + + # set password upon registration + path('registration/welcome/', SetPasswordView.as_view(), name='registration_set_password'), + path('registration/set-password/done/', SetPasswordDoneView.as_view(), name='registration_set_password_done'), + path('registration/set-password///', SetPasswordConfirmView.as_view(), + name='registration_set_password_confirm'), + path('registration/set-password/complete/', SetPasswordCompleteView.as_view(), + name='registration_set_password_complete'), # wagtail url(r'^cms/', include(wagtailadmin_urls)), diff --git a/server/core/views.py b/server/core/views.py index 1cece2c1..b495cfc1 100644 --- a/server/core/views.py +++ b/server/core/views.py @@ -27,6 +27,31 @@ def home(request): class SetPasswordView(PasswordResetView): + email_template_name = 'registration/registration_set_password_email.html' + subject_template_name = 'registration/registration_set_password_subject.txt' + success_url = reverse_lazy('registration_set_password_done') + template_name = 'registration/registration_set_password_form.html' + title = _('Password setzen') + + +class SetPasswordDoneView(PasswordResetDoneView): + template_name = 'registration/registration_set_password_done.html' + title = _('Password setzen versandt') + + +class SetPasswordConfirmView(PasswordResetConfirmView): + success_url = reverse_lazy('registration_set_password_complete') + template_name = 'registration/registration_set_password_confirm.html' + title = _('Gib ein Passwort ein') + + +class SetPasswordCompleteView(PasswordResetCompleteView): + template_name = 'registration/registration_set_password_complete.html' + title = _('Passwort setzen erfolgreich') + + +# legacy +class LegacySetPasswordView(PasswordResetView): email_template_name = 'registration/set_password_email.html' subject_template_name = 'registration/set_password_subject.txt' success_url = reverse_lazy('set_password_done') @@ -34,17 +59,17 @@ class SetPasswordView(PasswordResetView): title = _('Password setzen') -class SetPasswordDoneView(PasswordResetDoneView): +class LegacySetPasswordDoneView(PasswordResetDoneView): template_name = 'registration/set_password_done.html' title = _('Password setzen versandt') -class SetPasswordConfirmView(PasswordResetConfirmView): +class LegacySetPasswordConfirmView(PasswordResetConfirmView): success_url = reverse_lazy('set_password_complete') template_name = 'registration/set_password_confirm.html' title = _('Gib ein Passwort ein') -class SetPasswordCompleteView(PasswordResetCompleteView): +class LegacySetPasswordCompleteView(PasswordResetCompleteView): template_name = 'registration/set_password_complete.html' title = _('Passwort setzen erfolgreich') diff --git a/server/registration/tests/test_registration.py b/server/registration/tests/test_registration.py index c50c6c03..15779a98 100644 --- a/server/registration/tests/test_registration.py +++ b/server/registration/tests/test_registration.py @@ -74,12 +74,12 @@ class RegistrationTests(TestCase): def test_user_can_register_as_teacher(self): self._assert_user_registration(0, self.email, RoleManager.TEACHER_KEY) - school_classes = SchoolClass.objects.filter(name__startswith='Meine Gruppe') + school_classes = SchoolClass.objects.filter(name__startswith='Meine Klasse') self.assertEqual(len(school_classes), 0) result = self.make_register_mutation(self.first_name, self.last_name, self.email, self.teacher_license_type.key) self.assertTrue(result.get('data').get('registration').get('success')) self._assert_user_registration(1, self.email, RoleManager.TEACHER_KEY) - school_classes = SchoolClass.objects.filter(name__startswith='Meine Gruppe') + school_classes = SchoolClass.objects.filter(name__startswith='Meine Klasse') self.assertEqual(len(school_classes), 1) user = User.objects.get(email=self.email) self.assertTrue(school_classes[0].is_user_in_schoolclass(user)) diff --git a/server/users/models.py b/server/users/models.py index 11ba360a..070fa503 100644 --- a/server/users/models.py +++ b/server/users/models.py @@ -76,8 +76,8 @@ class SchoolClass(models.Model): @classmethod def generate_default_group_name(cls): - prefix = 'Meine Gruppe' - prefix_regex = r'Meine Gruppe (\d+)' + prefix = 'Meine Klasse' + prefix_regex = r'Meine Klasse (\d+)' initial_default_group = '{} 1'.format(prefix) my_group_filter = cls.objects.filter(name__startswith=prefix).order_by('-pk') diff --git a/server/users/tests/test_school_classes.py b/server/users/tests/test_school_classes.py index 7e9d6535..67bf66a9 100644 --- a/server/users/tests/test_school_classes.py +++ b/server/users/tests/test_school_classes.py @@ -25,19 +25,19 @@ from users.models import SchoolClass class SchoolClasses(TestCase): def setUp(self): - self.prefix = 'Meine Gruppe' + self.prefix = 'Meine Klasse' def test_default_class_name_initial(self): class_name = SchoolClass.generate_default_group_name() self.assertEqual('{} 1'.format(self.prefix), class_name) def test_default_class_name_initial_with_similar_existing(self): - SchoolClass.objects.create(name='{} abc212'.format('Meine Gruppe')) + SchoolClass.objects.create(name='{} abc212'.format(self.prefix)) class_name = SchoolClass.generate_default_group_name() self.assertEqual('{} 1'.format(self.prefix), class_name) def test_default_class_name_if_existing(self): - SchoolClass.objects.create(name='{} 1'.format('Meine Gruppe')) - SchoolClass.objects.create(name='{} 10'.format('Meine Gruppe')) + SchoolClass.objects.create(name='{} 1'.format(self.prefix)) + SchoolClass.objects.create(name='{} 10'.format(self.prefix)) class_name = SchoolClass.generate_default_group_name() self.assertEqual('{} 11'.format(self.prefix), class_name)