From 9ace7627d5e9cd7ae314f0499b2d0f4a659111fb Mon Sep 17 00:00:00 2001 From: Vitor Freitas Date: Sun, 13 Jan 2019 21:03:23 +0200 Subject: Add user timezone. Update account settings pages. --- colossus/apps/accounts/forms.py | 21 +++++- colossus/apps/accounts/middleware.py | 19 ++++++ .../apps/accounts/migrations/0002_user_timezone.py | 18 +++++ colossus/apps/accounts/models.py | 3 + .../apps/accounts/templates/accounts/profile.html | 11 +++ .../apps/accounts/templates/registration/base.html | 18 +++++ .../templates/registration/logged_out.html | 31 +++++++++ .../accounts/templates/registration/login.html | 22 ++++++ .../registration/password_change_done.html | 8 +++ .../registration/password_change_form.html | 12 ++++ .../registration/password_reset_complete.html | 16 +++++ .../registration/password_reset_confirm.html | 30 +++++++++ .../registration/password_reset_done.html | 20 ++++++ .../registration/password_reset_email.html | 2 + .../registration/password_reset_form.html | 30 +++++++++ colossus/apps/accounts/tests/test_forms.py | 23 +++++++ colossus/apps/accounts/tests/test_views.py | 78 ++++++++++++++++++++++ colossus/apps/accounts/urls.py | 22 +++--- colossus/apps/accounts/views.py | 17 +++++ .../campaigns/schedule_campaign_form.html | 38 +++++++++++ colossus/apps/campaigns/views.py | 4 +- colossus/apps/core/templates/core/settings.html | 13 +++- colossus/apps/core/templates/core/site_form.html | 2 +- colossus/settings.py | 1 + colossus/templates/registration/base.html | 18 ----- colossus/templates/registration/logged_out.html | 31 --------- colossus/templates/registration/login.html | 22 ------ .../registration/password_change_done.html | 16 ----- .../registration/password_change_form.html | 20 ------ .../registration/password_reset_complete.html | 16 ----- .../registration/password_reset_confirm.html | 30 --------- .../registration/password_reset_done.html | 20 ------ .../registration/password_reset_email.html | 2 - .../registration/password_reset_form.html | 30 --------- 34 files changed, 444 insertions(+), 220 deletions(-) create mode 100644 colossus/apps/accounts/middleware.py create mode 100644 colossus/apps/accounts/migrations/0002_user_timezone.py create mode 100644 colossus/apps/accounts/templates/accounts/profile.html create mode 100644 colossus/apps/accounts/templates/registration/base.html create mode 100644 colossus/apps/accounts/templates/registration/logged_out.html create mode 100644 colossus/apps/accounts/templates/registration/login.html create mode 100644 colossus/apps/accounts/templates/registration/password_change_done.html create mode 100644 colossus/apps/accounts/templates/registration/password_change_form.html create mode 100644 colossus/apps/accounts/templates/registration/password_reset_complete.html create mode 100644 colossus/apps/accounts/templates/registration/password_reset_confirm.html create mode 100644 colossus/apps/accounts/templates/registration/password_reset_done.html create mode 100644 colossus/apps/accounts/templates/registration/password_reset_email.html create mode 100644 colossus/apps/accounts/templates/registration/password_reset_form.html create mode 100644 colossus/apps/accounts/tests/test_forms.py create mode 100644 colossus/apps/accounts/tests/test_views.py create mode 100644 colossus/apps/campaigns/templates/campaigns/schedule_campaign_form.html delete mode 100644 colossus/templates/registration/base.html delete mode 100644 colossus/templates/registration/logged_out.html delete mode 100644 colossus/templates/registration/login.html delete mode 100644 colossus/templates/registration/password_change_done.html delete mode 100644 colossus/templates/registration/password_change_form.html delete mode 100644 colossus/templates/registration/password_reset_complete.html delete mode 100644 colossus/templates/registration/password_reset_confirm.html delete mode 100644 colossus/templates/registration/password_reset_done.html delete mode 100644 colossus/templates/registration/password_reset_email.html delete mode 100644 colossus/templates/registration/password_reset_form.html diff --git a/colossus/apps/accounts/forms.py b/colossus/apps/accounts/forms.py index 015f188..42271ad 100644 --- a/colossus/apps/accounts/forms.py +++ b/colossus/apps/accounts/forms.py @@ -1,7 +1,10 @@ -from django.contrib.auth import get_user_model +from django import forms from django.contrib.auth.forms import UserCreationForm +from django.utils.translation import gettext_lazy as _ -User = get_user_model() +import pytz + +from .models import User class AdminUserCreationForm(UserCreationForm): @@ -16,3 +19,17 @@ class AdminUserCreationForm(UserCreationForm): if commit: user.save() return user + + +class UserForm(forms.ModelForm): + TIMEZONE_CHOICES = (('', '---------'),) + tuple(map(lambda tz: (tz, tz), pytz.common_timezones)) + + timezone = forms.ChoiceField( + choices=TIMEZONE_CHOICES, + required=False, + label=_('Timezone') + ) + + class Meta: + model = User + fields = ('first_name', 'last_name', 'email', 'timezone') diff --git a/colossus/apps/accounts/middleware.py b/colossus/apps/accounts/middleware.py new file mode 100644 index 0000000..744ae7c --- /dev/null +++ b/colossus/apps/accounts/middleware.py @@ -0,0 +1,19 @@ +from django.utils import timezone + +import pytz +from pytz import UnknownTimeZoneError + + +class UserTimezoneMiddleware: + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + if request.user.is_authenticated: + try: + timezone.activate(pytz.timezone(request.user.timezone)) + except UnknownTimeZoneError: + timezone.deactivate() + + response = self.get_response(request) + return response diff --git a/colossus/apps/accounts/migrations/0002_user_timezone.py b/colossus/apps/accounts/migrations/0002_user_timezone.py new file mode 100644 index 0000000..12020b1 --- /dev/null +++ b/colossus/apps/accounts/migrations/0002_user_timezone.py @@ -0,0 +1,18 @@ +# Generated by Django 2.1.5 on 2019-01-13 16:22 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('accounts', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='timezone', + field=models.CharField(blank=True, max_length=50), + ), + ] diff --git a/colossus/apps/accounts/models.py b/colossus/apps/accounts/models.py index 44eba0c..d4ef2b7 100644 --- a/colossus/apps/accounts/models.py +++ b/colossus/apps/accounts/models.py @@ -1,6 +1,9 @@ from django.contrib.auth.models import AbstractUser +from django.db import models class User(AbstractUser): + timezone = models.CharField(max_length=50, blank=True) + class Meta: db_table = 'auth_user' diff --git a/colossus/apps/accounts/templates/accounts/profile.html b/colossus/apps/accounts/templates/accounts/profile.html new file mode 100644 index 0000000..04af980 --- /dev/null +++ b/colossus/apps/accounts/templates/accounts/profile.html @@ -0,0 +1,11 @@ +{% extends 'core/settings.html' %} + +{% load crispy_forms_filters i18n %} + +{% block settingscontent %} +
+ {% csrf_token %} + {{ form|crispy }} + +
+{% endblock %} diff --git a/colossus/apps/accounts/templates/registration/base.html b/colossus/apps/accounts/templates/registration/base.html new file mode 100644 index 0000000..4a2dd19 --- /dev/null +++ b/colossus/apps/accounts/templates/registration/base.html @@ -0,0 +1,18 @@ +{% extends 'base.html' %} + +{% block stylesheet %} + +{% endblock %} + +{% block body %} +
+

Colossus

+
+ {% block content %}{% endblock %} +
+
+{% endblock %} diff --git a/colossus/apps/accounts/templates/registration/logged_out.html b/colossus/apps/accounts/templates/registration/logged_out.html new file mode 100644 index 0000000..f8b4827 --- /dev/null +++ b/colossus/apps/accounts/templates/registration/logged_out.html @@ -0,0 +1,31 @@ +{% load i18n %} + + + + + + + {% block title %}Colossus{% endblock %} + + + +
+

Colossus

+
+
+

👋

+

{% trans 'Good bye!' %}

+

+ {% trans 'Log in again' %} +

+
+
+
+ + diff --git a/colossus/apps/accounts/templates/registration/login.html b/colossus/apps/accounts/templates/registration/login.html new file mode 100644 index 0000000..f467249 --- /dev/null +++ b/colossus/apps/accounts/templates/registration/login.html @@ -0,0 +1,22 @@ +{% extends 'registration/base.html' %} + +{% load crispy_forms_tags i18n %} + +{% block content %} +
+
+
+

{% trans 'Log in to your account' %}

+
+ {% csrf_token %} + + {{ form|crispy }} + +
+
+
+
+ {% trans 'Forgot your password?' %} +
+
+{% endblock %} diff --git a/colossus/apps/accounts/templates/registration/password_change_done.html b/colossus/apps/accounts/templates/registration/password_change_done.html new file mode 100644 index 0000000..8ea3abc --- /dev/null +++ b/colossus/apps/accounts/templates/registration/password_change_done.html @@ -0,0 +1,8 @@ +{% extends 'core/settings.html' %} + +{% load i18n %} + +{% block settingscontent %} +

{% trans 'Change password' %}

+

{% trans 'Password changed with success!' %}

+{% endblock %} diff --git a/colossus/apps/accounts/templates/registration/password_change_form.html b/colossus/apps/accounts/templates/registration/password_change_form.html new file mode 100644 index 0000000..0a0eab3 --- /dev/null +++ b/colossus/apps/accounts/templates/registration/password_change_form.html @@ -0,0 +1,12 @@ +{% extends 'core/settings.html' %} + +{% load crispy_forms_filters i18n %} + +{% block settingscontent %} +

{% trans 'Change password' %}

+
+ {% csrf_token %} + {{ form|crispy }} + +
+{% endblock %} diff --git a/colossus/apps/accounts/templates/registration/password_reset_complete.html b/colossus/apps/accounts/templates/registration/password_reset_complete.html new file mode 100644 index 0000000..8bd2400 --- /dev/null +++ b/colossus/apps/accounts/templates/registration/password_reset_complete.html @@ -0,0 +1,16 @@ +{% extends 'registration/base.html' %} + +{% load i18n %} + +{% block content %} +
+
+
+

{% trans 'Password reset complete' %}

+

+ Go to the log in page. +

+
+
+
+{% endblock %} diff --git a/colossus/apps/accounts/templates/registration/password_reset_confirm.html b/colossus/apps/accounts/templates/registration/password_reset_confirm.html new file mode 100644 index 0000000..b538956 --- /dev/null +++ b/colossus/apps/accounts/templates/registration/password_reset_confirm.html @@ -0,0 +1,30 @@ +{% extends 'registration/base.html' %} + +{% load crispy_forms_tags i18n %} + +{% block content %} +
+ {% if validlink %} +
+
+

{% trans 'Change password' %}

+
+ {% csrf_token %} + {{ form|crispy }} + +
+
+
+ {% else %} +
+
+

{% trans 'Invalid link' %}

+

The link you are trying to use has either been used or expired.

+

+ Request a new password reset link. +

+
+
+ {% endif %} +
+{% endblock %} diff --git a/colossus/apps/accounts/templates/registration/password_reset_done.html b/colossus/apps/accounts/templates/registration/password_reset_done.html new file mode 100644 index 0000000..980b22f --- /dev/null +++ b/colossus/apps/accounts/templates/registration/password_reset_done.html @@ -0,0 +1,20 @@ +{% extends 'registration/base.html' %} + +{% load i18n %} + +{% block content %} +
+
+
+

{% trans 'Password reset link sent' %}

+

+ Please click on the link we just sent to your email address to confirm the password reset. +

+

If you did not receive our email, you can request a new link.

+
+
+
+ {% trans 'Return to log in page' %} +
+
+{% endblock %} diff --git a/colossus/apps/accounts/templates/registration/password_reset_email.html b/colossus/apps/accounts/templates/registration/password_reset_email.html new file mode 100644 index 0000000..37467b8 --- /dev/null +++ b/colossus/apps/accounts/templates/registration/password_reset_email.html @@ -0,0 +1,2 @@ +Someone asked for password reset for email {{ email }}. Follow the link below: +{{ protocol}}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %} diff --git a/colossus/apps/accounts/templates/registration/password_reset_form.html b/colossus/apps/accounts/templates/registration/password_reset_form.html new file mode 100644 index 0000000..5c67895 --- /dev/null +++ b/colossus/apps/accounts/templates/registration/password_reset_form.html @@ -0,0 +1,30 @@ +{% extends 'registration/base.html' %} + +{% load crispy_forms_tags i18n %} + +{% block javascript %} + +{% endblock %} + +{% block content %} +
+
+
+

{% trans 'Reset your password' %}

+
+ {% csrf_token %} + + {{ form|crispy }} + +
+
+
+
+ {% trans 'Return to log in page' %} +
+
+{% endblock %} diff --git a/colossus/apps/accounts/tests/test_forms.py b/colossus/apps/accounts/tests/test_forms.py new file mode 100644 index 0000000..d65d8f9 --- /dev/null +++ b/colossus/apps/accounts/tests/test_forms.py @@ -0,0 +1,23 @@ +from colossus.apps.accounts.forms import UserForm +from colossus.apps.accounts.tests.factories import UserFactory +from colossus.test.testcases import TestCase + + +class UserFormTests(TestCase): + def setUp(self): + self.user = UserFactory() + self.data = { + 'first_name': 'John', + 'last_name': 'Doe', + 'email': 'john.doe@example.com', + 'timezone': 'Europe/Helsinki' + } + + def test_invalid_timezone(self): + self.data['timezone'] = 'xxx' + form = UserForm(instance=self.user, data=self.data) + self.assertFalse(form.is_valid()) + + def test_valid_timezone(self): + form = UserForm(instance=self.user, data=self.data) + self.assertTrue(form.is_valid()) diff --git a/colossus/apps/accounts/tests/test_views.py b/colossus/apps/accounts/tests/test_views.py new file mode 100644 index 0000000..635a33b --- /dev/null +++ b/colossus/apps/accounts/tests/test_views.py @@ -0,0 +1,78 @@ +from django.urls import resolve, reverse + +from colossus.apps.accounts import forms, views +from colossus.test.testcases import AuthenticatedTestCase, TestCase + + +class AccountsLoginRequiredTests(TestCase): + """ + Test if all the urls from accounts' app are protected with login_required decorator + Perform a GET request to all urls. The expected outcome is a redirection + to the login page. + """ + def test_redirection(self): + patterns = [ + 'password_change', + 'password_change_done', + 'profile' + ] + for url_name in patterns: + with self.subTest(url_name=url_name): + url = reverse(url_name) + response = self.client.get(url) + self.assertRedirectsLoginRequired(response, url) + + +class ProfileViewTests(AuthenticatedTestCase): + def setUp(self): + super().setUp() + url = reverse('profile') + self.response = self.client.get(url) + + def test_status_code_200(self): + self.assertEqual(self.response.status_code, 200) + + def test_url_resolves_correct_view(self): + view = resolve('/accounts/profile/') + self.assertEqual(view.func.view_class, views.ProfileView) + + def test_csrf(self): + self.assertContains(self.response, 'csrfmiddlewaretoken') + + def test_form(self): + form = self.response.context.get('form') + self.assertIsInstance(form, forms.UserForm) + + def test_html_content(self): + contents = ( + ('//', auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'), + path('reset/done/', auth_views.PasswordResetCompleteView.as_view(), name='password_reset_complete'), - path('password-reset/', views.PasswordResetView.as_view(), name='password_reset'), - path('password-reset/done/', views.PasswordResetDoneView.as_view(), name='password_reset_done'), - path('reset///', views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'), - path('reset/done/', views.PasswordResetCompleteView.as_view(), name='password_reset_complete'), + path('profile/', views.ProfileView.as_view(), name='profile'), ] diff --git a/colossus/apps/accounts/views.py b/colossus/apps/accounts/views.py index e69de29..eaa8d56 100644 --- a/colossus/apps/accounts/views.py +++ b/colossus/apps/accounts/views.py @@ -0,0 +1,17 @@ +from django.contrib.auth.mixins import LoginRequiredMixin +from django.urls import reverse_lazy +from django.views.generic import UpdateView + +from colossus.apps.accounts.forms import UserForm + +from .models import User + + +class ProfileView(LoginRequiredMixin, UpdateView): + model = User + form_class = UserForm + template_name = 'accounts/profile.html' + success_url = reverse_lazy('profile') + + def get_object(self, queryset=None): + return self.request.user diff --git a/colossus/apps/campaigns/templates/campaigns/schedule_campaign_form.html b/colossus/apps/campaigns/templates/campaigns/schedule_campaign_form.html new file mode 100644 index 0000000..9a55699 --- /dev/null +++ b/colossus/apps/campaigns/templates/campaigns/schedule_campaign_form.html @@ -0,0 +1,38 @@ +{% extends 'base.html' %} + +{% load crispy_forms_filters i18n tz %} + +{% block title %}{% trans 'Schedule campaign' %}{% endblock %} + +{% block javascript %} + +{% endblock %} + +{% block content %} + +
+
+

{% trans 'Schedule campaign' %}

+
+ {% csrf_token %} + {{ form|crispy }} +
+ {% get_current_timezone as TIME_ZONE %} + Current time: {{ time|localtime }}
Current time zone: {{ TIME_ZONE }}
+
+ + {% trans 'Never mind' %} +
+
+
+{% endblock %} diff --git a/colossus/apps/campaigns/views.py b/colossus/apps/campaigns/views.py index 50986ee..a35923c 100644 --- a/colossus/apps/campaigns/views.py +++ b/colossus/apps/campaigns/views.py @@ -6,6 +6,7 @@ from django.http import HttpResponse, JsonResponse from django.shortcuts import get_object_or_404, redirect, render from django.template.loader import render_to_string from django.urls import reverse, reverse_lazy +from django.utils import timezone from django.utils.decorators import method_decorator from django.utils.safestring import mark_safe from django.utils.translation import gettext, gettext_lazy as _ @@ -356,12 +357,13 @@ class ScheduleCampaignView(CampaignMixin, UpdateView): model = Campaign context_object_name = 'campaign' form_class = ScheduleCampaignForm + template_name = 'campaigns/schedule_campaign_form.html' def get_queryset(self): return super().get_queryset().filter(status__in={CampaignStatus.DRAFT, CampaignStatus.SCHEDULED}) def get_context_data(self, **kwargs): - kwargs['title'] = _('Schedule campaign') + kwargs['time'] = timezone.now() return super().get_context_data(**kwargs) diff --git a/colossus/apps/core/templates/core/settings.html b/colossus/apps/core/templates/core/settings.html index 917447a..bd1c732 100644 --- a/colossus/apps/core/templates/core/settings.html +++ b/colossus/apps/core/templates/core/settings.html @@ -13,12 +13,21 @@
-
+
+
+ {% trans 'Personal settings' %} +
+ +
+
{% trans 'Application settings' %}
diff --git a/colossus/apps/core/templates/core/site_form.html b/colossus/apps/core/templates/core/site_form.html index 2259441..8fc20d8 100644 --- a/colossus/apps/core/templates/core/site_form.html +++ b/colossus/apps/core/templates/core/site_form.html @@ -1,6 +1,6 @@ {% extends 'core/settings.html' %} -{% load crispy_forms_tags i18n %} +{% load crispy_forms_filters i18n %} {% block settingscontent %}

{% trans 'Site domain' %}

diff --git a/colossus/settings.py b/colossus/settings.py index 157e28f..147ec51 100644 --- a/colossus/settings.py +++ b/colossus/settings.py @@ -71,6 +71,7 @@ MIDDLEWARE = [ 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'colossus.apps.accounts.middleware.UserTimezoneMiddleware', ] diff --git a/colossus/templates/registration/base.html b/colossus/templates/registration/base.html deleted file mode 100644 index 4a2dd19..0000000 --- a/colossus/templates/registration/base.html +++ /dev/null @@ -1,18 +0,0 @@ -{% extends 'base.html' %} - -{% block stylesheet %} - -{% endblock %} - -{% block body %} -
-

Colossus

-
- {% block content %}{% endblock %} -
-
-{% endblock %} diff --git a/colossus/templates/registration/logged_out.html b/colossus/templates/registration/logged_out.html deleted file mode 100644 index f8b4827..0000000 --- a/colossus/templates/registration/logged_out.html +++ /dev/null @@ -1,31 +0,0 @@ -{% load i18n %} - - - - - - - {% block title %}Colossus{% endblock %} - - - -
-

Colossus

-
-
-

👋

-

{% trans 'Good bye!' %}

-

- {% trans 'Log in again' %} -

-
-
-
- - diff --git a/colossus/templates/registration/login.html b/colossus/templates/registration/login.html deleted file mode 100644 index f467249..0000000 --- a/colossus/templates/registration/login.html +++ /dev/null @@ -1,22 +0,0 @@ -{% extends 'registration/base.html' %} - -{% load crispy_forms_tags i18n %} - -{% block content %} -
-
-
-

{% trans 'Log in to your account' %}

-
- {% csrf_token %} - - {{ form|crispy }} - -
-
-
- -
-{% endblock %} diff --git a/colossus/templates/registration/password_change_done.html b/colossus/templates/registration/password_change_done.html deleted file mode 100644 index 3d25abe..0000000 --- a/colossus/templates/registration/password_change_done.html +++ /dev/null @@ -1,16 +0,0 @@ -{% extends 'base.html' %} - -{% load i18n %} - -{% block content %} -
-
-
-
-

{% trans 'Change password' %}

-

Password changed with success!

-
-
-
-
-{% endblock %} diff --git a/colossus/templates/registration/password_change_form.html b/colossus/templates/registration/password_change_form.html deleted file mode 100644 index 3874d28..0000000 --- a/colossus/templates/registration/password_change_form.html +++ /dev/null @@ -1,20 +0,0 @@ -{% extends 'base.html' %} - -{% load crispy_forms_tags i18n %} - -{% block content %} -
-
-
-
-

{% trans 'Change password' %}

-
- {% csrf_token %} - {{ form|crispy }} - -
-
-
-
-
-{% endblock %} diff --git a/colossus/templates/registration/password_reset_complete.html b/colossus/templates/registration/password_reset_complete.html deleted file mode 100644 index 8bd2400..0000000 --- a/colossus/templates/registration/password_reset_complete.html +++ /dev/null @@ -1,16 +0,0 @@ -{% extends 'registration/base.html' %} - -{% load i18n %} - -{% block content %} -
-
-
-

{% trans 'Password reset complete' %}

-

- Go to the log in page. -

-
-
-
-{% endblock %} diff --git a/colossus/templates/registration/password_reset_confirm.html b/colossus/templates/registration/password_reset_confirm.html deleted file mode 100644 index b538956..0000000 --- a/colossus/templates/registration/password_reset_confirm.html +++ /dev/null @@ -1,30 +0,0 @@ -{% extends 'registration/base.html' %} - -{% load crispy_forms_tags i18n %} - -{% block content %} -
- {% if validlink %} -
-
-

{% trans 'Change password' %}

-
- {% csrf_token %} - {{ form|crispy }} - -
-
-
- {% else %} -
-
-

{% trans 'Invalid link' %}

-

The link you are trying to use has either been used or expired.

-

- Request a new password reset link. -

-
-
- {% endif %} -
-{% endblock %} diff --git a/colossus/templates/registration/password_reset_done.html b/colossus/templates/registration/password_reset_done.html deleted file mode 100644 index 980b22f..0000000 --- a/colossus/templates/registration/password_reset_done.html +++ /dev/null @@ -1,20 +0,0 @@ -{% extends 'registration/base.html' %} - -{% load i18n %} - -{% block content %} -
-
-
-

{% trans 'Password reset link sent' %}

-

- Please click on the link we just sent to your email address to confirm the password reset. -

-

If you did not receive our email, you can request a new link.

-
-
- -
-{% endblock %} diff --git a/colossus/templates/registration/password_reset_email.html b/colossus/templates/registration/password_reset_email.html deleted file mode 100644 index 37467b8..0000000 --- a/colossus/templates/registration/password_reset_email.html +++ /dev/null @@ -1,2 +0,0 @@ -Someone asked for password reset for email {{ email }}. Follow the link below: -{{ protocol}}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %} diff --git a/colossus/templates/registration/password_reset_form.html b/colossus/templates/registration/password_reset_form.html deleted file mode 100644 index 5c67895..0000000 --- a/colossus/templates/registration/password_reset_form.html +++ /dev/null @@ -1,30 +0,0 @@ -{% extends 'registration/base.html' %} - -{% load crispy_forms_tags i18n %} - -{% block javascript %} - -{% endblock %} - -{% block content %} -
-
-
-

{% trans 'Reset your password' %}

-
- {% csrf_token %} - - {{ form|crispy }} - -
-
-
- -
-{% endblock %} -- cgit