diff --git a/.environment-dev b/.environment-dev index 335bee02784270b902cb18a538adb44da03977dc..d92b941dcad49a7f5b8c08a21898151a6e73df59 100644 --- a/.environment-dev +++ b/.environment-dev @@ -1,9 +1,16 @@ -UWSGI_PROCESS_PER_CONTAINER=4 -DEBUG=true ALLOWED_HOSTS=localhost,127.0.0.1 -SECRET_KEY=Ixosoh1iemoh0Heloh1thee5akooboonu5veehae4aikoh2ohg DATABASE_HOST=shellvalier-postgresql DATABASE_NAME=shellvalier -DATABASE_USER=shellvalier DATABASE_PASSWORD=shellvalier DATABASE_PORT=5432 +DATABASE_USER=shellvalier +DEBUG=true +EMAIL_BACKEND=django.core.mail.backends.console.EmailBackend +EMAIL_HOST= +EMAIL_PORT=25 +EMAIL_HOST_USER= +EMAIL_HOST_PASSWORD= +EMAIL_USE_TLS=false +EMAIL_USE_SSL=false +SECRET_KEY=Ixosoh1iemoh0Heloh1thee5akooboonu5veehae4aikoh2ohg +UWSGI_PROCESS_PER_CONTAINER=4 diff --git a/locale/en/LC_MESSAGES/django.mo b/locale/en/LC_MESSAGES/django.mo index f7595614722432da63fc8ccf1e3efcd5f783fe8f..29f13eb298a0c8e679ff2df730c09217471e3bb9 100644 Binary files a/locale/en/LC_MESSAGES/django.mo and b/locale/en/LC_MESSAGES/django.mo differ diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index 56413e06d44ffb05795ec4e8352700e97c68a701..2986a6ffea95bba2b7fdc6eb850605b61925a229 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-04-07 23:17+0200\n" +"POT-Creation-Date: 2022-04-08 21:59+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -46,9 +46,8 @@ msgstr "Your profile" msgid "Wyloguj się" msgstr "Sign out" -#: common/templates/base.html:89 users/forms.py:71 -#: users/templates/registration/login.html:6 -#: users/templates/registration/login.html:12 +#: common/templates/base.html:89 users/forms.py:74 users/templates/login.html:6 +#: users/templates/login.html:12 msgid "Zaloguj się" msgstr "Sign in" @@ -2290,28 +2289,100 @@ msgstr "distributive phrase" msgid "fraza posesywna" msgstr "possesive phrase" -#: users/forms.py:10 users/templates/user_list.html:21 +#: users/forms.py:12 users/templates/user_list.html:21 msgid "Grupa" msgstr "Group" -#: users/forms.py:29 users/forms.py:59 +#: users/forms.py:31 users/forms.py:61 msgid "Zapisz" msgstr "Save" -#: users/forms.py:30 users/forms.py:60 +#: users/forms.py:32 users/forms.py:63 users/forms.py:84 users/forms.py:93 +#: users/forms.py:102 msgid "Wróć" msgstr "Back" -#: users/forms.py:84 +#: users/forms.py:62 users/templates/password_change.html:6 +#: users/templates/password_change.html:12 +msgid "Zmień swoje hasło" +msgstr "Change your password" + +#: users/forms.py:75 +msgid "Nie pamiętam hasła" +msgstr "I forgot my password" + +#: users/forms.py:83 msgid "Zresetuj hasło" msgstr "Reset password" -#: users/templates/registration/password_reset.html:6 -#: users/templates/registration/password_reset.html:12 +#: users/forms.py:92 +msgid "Zmień hasło" +msgstr "Change password" + +#: users/forms.py:101 +msgid "Ustaw hasło" +msgstr "Set password" + +#: users/templates/new_user_email.html:2 +#, python-format +msgid "Otrzymujesz ten e-mail, ponieważ ktoś zaprosił Cię do %(site_name)s." +msgstr "" +"You're receiving this email because you have been invited to %(site_name)s." + +#: users/templates/new_user_email.html:4 +msgid "Przejdź na poniższą stronę i ustaw swoje hasło:" +msgstr "Please go to the following page and set your password:" + +#: users/templates/new_user_email.html:8 +msgid "Twoja nazwa użytkownika" +msgstr "Your username" + +#: users/templates/new_user_email.html:10 +#: users/templates/password_reset_email.html:10 +#, python-format +msgid "Zespół %(site_name)s" +msgstr "The %(site_name)s team" + +#: users/templates/password_reset.html:6 users/templates/password_reset.html:12 msgid "Zresetuj swoje hasło" msgstr "Reset your password" -#: users/templates/user_list.html:12 users/views.py:35 +#: users/templates/password_reset_email.html:2 +#, python-format +msgid "" +"Otrzymujesz ten e-mail w związku z prośbą o zmianę hasła Twojego użytkownia " +"na %(site_name)s." +msgstr "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." + +#: users/templates/password_reset_email.html:4 +msgid "Przejdź na poniższą stronę i ustaw swoje nowe hasło:" +msgstr "Please go to the following page and choose a new password:" + +#: users/templates/password_reset_email.html:8 +msgid "Twoja nazwa użytkownia:" +msgstr "Your username, in case you’ve forgotten:" + +#: users/templates/password_reset_form.html:6 +#: users/templates/password_reset_form.html:12 +msgid "Ustaw swoje nowe hasło" +msgstr "Choose your new password" + +#: users/templates/password_reset_requested.html:6 +#: users/templates/password_reset_requested.html:12 +msgid "Sprawdź swoją skrzynkę e-mail" +msgstr "Please check your e-mail inbox" + +#: users/templates/password_reset_requested.html:13 +msgid "" +"Wysłaliśmy na Twój adres e-mail link, po kliknięciu którego uzyskasz " +"możliwość wprowadzenia swojego nowego hasła." +msgstr "" +"We've sent you an e-mail containing a link you can use to set your new " +"password." + +#: users/templates/user_list.html:12 users/views.py:38 msgid "Dodaj użytkownika" msgstr "Add a user" @@ -2335,7 +2406,12 @@ msgstr "Actions" msgid "Edytuj" msgstr "Edit" -#: users/views.py:48 +#: users/utils.py:7 +#, python-format +msgid "Zaproszenie do %s" +msgstr "An invitation to %s" + +#: users/views.py:51 msgid "Edytuj użytkownika" msgstr "Edit user" diff --git a/locale/en/LC_MESSAGES/djangojs.po b/locale/en/LC_MESSAGES/djangojs.po index fb7fa6fc0cacfb9be3b7ebf56bdaeacf3a7298e4..e5f578e8e1bc7926f857b206a7bba0ce5368c160 100644 --- a/locale/en/LC_MESSAGES/djangojs.po +++ b/locale/en/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-04-07 23:17+0200\n" +"POT-Creation-Date: 2022-04-08 21:59+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" diff --git a/shellvalier/settings.py b/shellvalier/settings.py index 89ee949596a18b838e7573bf307d4a64a48b9cfc..4bd5bef14bb0aa051311b79e514f83d815e595a5 100644 --- a/shellvalier/settings.py +++ b/shellvalier/settings.py @@ -162,6 +162,14 @@ STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'common/static/'), ] -LOGIN_URL = reverse_lazy("users:login") +LOGIN_URL = reverse_lazy('users:login') LOGIN_REDIRECT_URL = reverse_lazy('dash') LOGOUT_REDIRECT_URL = reverse_lazy('dash') + +EMAIL_BACKEND = get_environment('EMAIL_BACKEND') +EMAIL_HOST = get_environment('EMAIL_HOST') +EMAIL_PORT = get_environment('EMAIL_PORT', mapper=int) +EMAIL_HOST_USER = get_environment('EMAIL_HOST_USER') +EMAIL_HOST_PASSWORD = get_environment('EMAIL_HOST_PASSWORD') +EMAIL_USE_TLS = get_environment('EMAIL_USE_TLS', mapper=boolean_mapper) +EMAIL_USE_SSL = get_environment('EMAIL_USE_SSL', mapper=boolean_mapper) diff --git a/users/forms.py b/users/forms.py index e0d98f1683665d27456c77d4808a485879d91055..054b6aff9a2e3eba0224de9188072d5fc486beb2 100644 --- a/users/forms.py +++ b/users/forms.py @@ -1,13 +1,15 @@ from django import forms from django.contrib.auth.models import Group, User -from django.utils.translation import gettext as _ +from django.urls import reverse_lazy +from django.utils.text import format_lazy +from django.utils.translation import gettext_lazy as _ from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, Layout, Fieldset, ButtonHolder, Submit class UserForm(forms.ModelForm): - group = forms.ModelChoiceField(queryset=Group.objects.all(), label=_("Grupa")) + group = forms.ModelChoiceField(queryset=Group.objects.all(), label=_('Grupa')) class Meta: model = User @@ -27,7 +29,7 @@ class UserForm(forms.ModelForm): Fieldset('', 'first_name', 'last_name', 'username', 'email', 'group', 'is_active'), ButtonHolder( Submit('submit', _('Zapisz'), css_class='btn btn-sm btn-success'), - HTML('''<a class="btn btn-sm btn-light" href="{% url 'users:user_list' %}">''' + _('Wróć') + '</a>'), + HTML(format_lazy('<a class="btn btn-sm btn-light" href="{}">{}</a>', reverse_lazy('users:user_list'), _('Wróć'))), ), ) for field in ['first_name', 'last_name', 'email']: @@ -57,7 +59,8 @@ class UserProfileForm(forms.ModelForm): Fieldset('', 'first_name', 'last_name', 'email'), ButtonHolder( Submit('submit', _('Zapisz'), css_class='btn btn-sm btn-success'), - HTML('''<a class="btn btn-sm btn-light" href="{% url 'dash' %}">''' + _('Wróć') + '</a>'), + HTML(format_lazy('<a class="btn btn-sm btn-light" href="{}">{}</a>', reverse_lazy('users:password_change'), _('Zmień swoje hasło'))), + HTML(format_lazy('<a class="btn btn-sm btn-light" href="{}">{}</a>', reverse_lazy('dash'), _('Wróć'))), ), ) for field in ['first_name', 'last_name', 'email']: @@ -69,11 +72,7 @@ login_form_helper.layout = Layout( Fieldset('', 'username', 'password'), ButtonHolder( Submit('submit', _('Zaloguj się'), css_class='btn btn-sm btn-success'), - HTML( - '''<a class="btn btn-sm btn-light" href="{% url 'users:password_reset' %}">''' - f"{_('Nie pamiętam hasła')}" - '</a>' - ), + HTML(format_lazy('<a class="btn btn-sm btn-light" href="{}">{}</a>', reverse_lazy('users:password_reset'), _('Nie pamiętam hasła'))), ), ) @@ -82,6 +81,24 @@ password_reset_form_helper.layout = Layout( Fieldset('', 'email'), ButtonHolder( Submit('submit', _('Zresetuj hasło'), css_class='btn btn-sm btn-success'), - HTML('''<a class="btn btn-sm btn-light" href="{% url 'users:login' %}">''' f"{_('Wróć')}" '</a>'), + HTML(format_lazy('<a class="btn btn-sm btn-light" href="{}">{}</a>', reverse_lazy('users:login'), _('Wróć'))), + ) +) + +password_change_form_helper = FormHelper() +password_change_form_helper.layout = Layout( + Fieldset('', 'old_password', 'new_password1', 'new_password2'), + ButtonHolder( + Submit('submit', _('Zmień hasło'), css_class='btn btn-sm btn-success'), + HTML(format_lazy('<a class="btn btn-sm btn-light" href="{}">{}</a>', reverse_lazy('users:user_profile'), _("Wróć"))), + ) +) + +password_reset_set_password_form_helper = FormHelper() +password_reset_set_password_form_helper.layout = Layout( + Fieldset('', 'new_password1', 'new_password2'), + ButtonHolder( + Submit('submit', _('Ustaw hasło'), css_class='btn btn-sm btn-success'), + HTML(format_lazy('<a class="btn btn-sm btn-light" href="{}">{}</a>', reverse_lazy('dash'), _("Wróć"))), ) ) diff --git a/users/management/commands/create_groups_and_permissions.py b/users/management/commands/create_groups_and_permissions.py index 195d2d1942458bd7a63f4d41ff8c4a97c051dc5f..a4361ca1c071820a42947ba2a3c222300bba2e0c 100644 --- a/users/management/commands/create_groups_and_permissions.py +++ b/users/management/commands/create_groups_and_permissions.py @@ -5,18 +5,18 @@ from django.core.management.base import BaseCommand class Command(BaseCommand): def handle(self, **options): - admins, __ = Group.objects.get_or_create(name="Admini") + admins, __ = Group.objects.get_or_create(name='Admini') admins.permissions.add( - Permission.objects.get(codename="view_user", content_type=ContentType.objects.get_for_model(User)), - Permission.objects.get(codename="add_user", content_type=ContentType.objects.get_for_model(User)), - Permission.objects.get(codename="change_user", content_type=ContentType.objects.get_for_model(User)), - Permission.objects.get(codename="delete_user", content_type=ContentType.objects.get_for_model(User)), + Permission.objects.get(codename='view_user', content_type=ContentType.objects.get_for_model(User)), + Permission.objects.get(codename='add_user', content_type=ContentType.objects.get_for_model(User)), + Permission.objects.get(codename='change_user', content_type=ContentType.objects.get_for_model(User)), + Permission.objects.get(codename='delete_user', content_type=ContentType.objects.get_for_model(User)), ) - lexicographs, __ = Group.objects.get_or_create(name="Leksykografowie") + lexicographs, __ = Group.objects.get_or_create(name='Leksykografowie') lexicographs.permissions.add( # TODO ) - super_lexicographs, __ = Group.objects.get_or_create(name="Super Leksykografowie") + super_lexicographs, __ = Group.objects.get_or_create(name='Super Leksykografowie') super_lexicographs.permissions.add( # TODO ) diff --git a/users/templates/registration/login.html b/users/templates/login.html similarity index 71% rename from users/templates/registration/login.html rename to users/templates/login.html index 10834c7ffb611fb88384be4752384c3879a255c2..d184db392db4e40d59fdb2f57346f56e711f7e0e 100644 --- a/users/templates/registration/login.html +++ b/users/templates/login.html @@ -1,15 +1,15 @@ -{% extends "base.html" %} +{% extends 'base.html' %} {% load i18n %} {% load crispy_forms_filters %} -{% block title %}{% trans "Zaloguj się" %}{% endblock %} +{% block title %}{% trans 'Zaloguj się' %}{% endblock %} {% block content %} <div class="row m-0"> <div class="col-lg-4 col-md-6 m-auto"> <div class="bg-white mt-4 p-3 clearfix"> - <h5 class="mt-2 mb-4">{% trans "Zaloguj się" %}</h5> + <h5 class="mt-2 mb-4">{% trans 'Zaloguj się' %}</h5> <form action="." method="post"> {% crispy form helper %} </form> diff --git a/users/templates/new_user_email.html b/users/templates/new_user_email.html new file mode 100644 index 0000000000000000000000000000000000000000..1d4ca57c4134ae1b910f5279c4da5d824f334d1d --- /dev/null +++ b/users/templates/new_user_email.html @@ -0,0 +1,11 @@ +{% load i18n %}{% autoescape off %} +{% blocktranslate %}Otrzymujesz ten e-mail, ponieważ ktoś zaprosił Cię do {{ site_name }}.{% endblocktranslate %} + +{% translate 'Przejdź na poniższą stronę i ustaw swoje hasło:' %} +{% block reset_link %} +{{ protocol }}://{{ domain }}{% url 'users:password_reset' %} +{% endblock %} +{% translate 'Twoja nazwa użytkownika' %}: {{ user.get_username }} + +{% blocktranslate %}Zespół {{ site_name }}{% endblocktranslate %} +{% endautoescape %} diff --git a/users/templates/password_change.html b/users/templates/password_change.html new file mode 100644 index 0000000000000000000000000000000000000000..33ac0d7b86654d07cb6f9d5970c90836dff73b62 --- /dev/null +++ b/users/templates/password_change.html @@ -0,0 +1,19 @@ +{% extends 'base.html' %} + +{% load i18n %} +{% load crispy_forms_filters %} + +{% block title %}{% trans 'Zmień swoje hasło' %}{% endblock %} + +{% block content %} + <div class="row m-0"> + <div class="col-lg-4 col-md-6 m-auto"> + <div class="bg-white mt-4 p-3 clearfix"> + <h5 class="mt-2 mb-4">{% trans 'Zmień swoje hasło' %}</h5> + <form action="." method="post"> + {% crispy form helper %} + </form> + </div> + </div> + </div> +{% endblock %} diff --git a/users/templates/registration/password_reset.html b/users/templates/password_reset.html similarity index 69% rename from users/templates/registration/password_reset.html rename to users/templates/password_reset.html index 7d37fa921a0e368d281916c3a87cd588213ea538..195135cb7d61bde6fe5fbb1f0d06c3cfe1b72148 100644 --- a/users/templates/registration/password_reset.html +++ b/users/templates/password_reset.html @@ -1,15 +1,15 @@ -{% extends "base.html" %} +{% extends 'base.html' %} {% load i18n %} {% load crispy_forms_filters %} -{% block title %}{% trans "Zresetuj swoje hasło" %}{% endblock %} +{% block title %}{% trans 'Zresetuj swoje hasło' %}{% endblock %} {% block content %} <div class="row m-0"> <div class="col-lg-4 col-md-6 m-auto"> <div class="bg-white mt-4 p-3 clearfix"> - <h5 class="mt-2 mb-4">{% trans "Zresetuj swoje hasło" %}</h5> + <h5 class="mt-2 mb-4">{% trans 'Zresetuj swoje hasło' %}</h5> <form action="." method="post"> {% crispy form helper %} </form> diff --git a/users/templates/password_reset_email.html b/users/templates/password_reset_email.html new file mode 100644 index 0000000000000000000000000000000000000000..32d2ae9f470a241e2fe7c70245db10d389a13c34 --- /dev/null +++ b/users/templates/password_reset_email.html @@ -0,0 +1,11 @@ +{% load i18n %}{% autoescape off %} +{% blocktranslate %}Otrzymujesz ten e-mail w związku z prośbą o zmianę hasła Twojego użytkownia na {{ site_name }}.{% endblocktranslate %} + +{% translate 'Przejdź na poniższą stronę i ustaw swoje nowe hasło:' %} +{% block reset_link %} +{{ protocol }}://{{ domain }}{% url 'users:password_reset_confirm' uidb64=uid token=token %} +{% endblock %} +{% translate 'Twoja nazwa użytkownia:' %} {{ user.get_username }} + +{% blocktranslate %}Zespół {{ site_name }}{% endblocktranslate %} +{% endautoescape %} diff --git a/users/templates/password_reset_form.html b/users/templates/password_reset_form.html new file mode 100644 index 0000000000000000000000000000000000000000..83e179e0ebf4872ac9bf19585347a62293a19e76 --- /dev/null +++ b/users/templates/password_reset_form.html @@ -0,0 +1,23 @@ +{% extends 'base.html' %} + +{% load i18n %} +{% load crispy_forms_filters %} + +{% block title %}{% trans 'Ustaw swoje nowe hasło' %}{% endblock %} + +{% block content %} + <div class="row m-0"> + <div class="col-lg-4 col-md-6 m-auto"> + <div class="bg-white mt-4 p-3 clearfix"> + <h5 class="mt-2 mb-4">{% trans 'Ustaw swoje nowe hasło' %}</h5> + <form action="." method="post"> + {% if form %} + {% crispy form helper %} + {% else %} + <div class="alert alert-danger">{{ title }}</div> + {% endif %} + </form> + </div> + </div> + </div> +{% endblock %} diff --git a/users/templates/password_reset_requested.html b/users/templates/password_reset_requested.html new file mode 100644 index 0000000000000000000000000000000000000000..84a64e3fdba21f7df347da92fd728fdbd03ab4ca --- /dev/null +++ b/users/templates/password_reset_requested.html @@ -0,0 +1,17 @@ +{% extends 'base.html' %} + +{% load i18n %} +{% load crispy_forms_filters %} + +{% block title %}{% trans 'Sprawdź swoją skrzynkę e-mail' %}{% endblock %} + +{% block content %} + <div class="row m-0"> + <div class="col-lg-4 col-md-6 m-auto"> + <div class="bg-white mt-4 p-3 clearfix"> + <h5 class="mt-2 mb-4">{% trans 'Sprawdź swoją skrzynkę e-mail' %}</h5> + <p>{% trans 'Wysłaliśmy na Twój adres e-mail link, po kliknięciu którego uzyskasz możliwość wprowadzenia swojego nowego hasła.' %}</p> + </div> + </div> + </div> +{% endblock %} diff --git a/users/templates/user_form.html b/users/templates/user_form.html index 82fbbf3540492162a340f08a1165c63a2e1fa62b..25d2a4624a39c08205b8fd7302782a91ac4429cb 100644 --- a/users/templates/user_form.html +++ b/users/templates/user_form.html @@ -1,4 +1,4 @@ -{% extends "base-margins.html" %} +{% extends 'base-margins.html' %} {% load i18n %} diff --git a/users/templates/user_list.html b/users/templates/user_list.html index c3b00516c9eac5e6ebe75f76222384c388421f16..4d84c66b448595f50648f2ff09a8cf18d38b4a1e 100644 --- a/users/templates/user_list.html +++ b/users/templates/user_list.html @@ -1,4 +1,4 @@ -{% extends "base-margins.html" %} +{% extends 'base-margins.html' %} {% load i18n %} @@ -16,11 +16,11 @@ <table class="table"> <thead> <tr> - <th>{% trans "Imię i nazwisko" %}</th> - <th>{% trans "Nazwa użytkownika" %}</th> - <th>{% trans "Grupa" %}</th> - <th>{% trans "Aktywny" %}</th> - <th>{% trans "Akcje" %}</th> + <th>{% trans 'Imię i nazwisko' %}</th> + <th>{% trans 'Nazwa użytkownika' %}</th> + <th>{% trans 'Grupa' %}</th> + <th>{% trans 'Aktywny' %}</th> + <th>{% trans 'Akcje' %}</th> </tr> </thead> <tbody> @@ -28,7 +28,7 @@ <tr> <td>{{ user.get_full_name }}</td> <td>{{ user.username }}</td> - <td>{{ user.groups.all|join:", " }}</td> + <td>{{ user.groups.all|join:', ' }}</td> <td>{{ user.is_active|yesno }}</td> <td><a href="{% url 'users:user_edit' pk=user.pk %}" class="btn btn-xs btn-outline-dark">{% trans 'Edytuj' %}</a></td> </tr> diff --git a/users/templates/user_profile.html b/users/templates/user_profile.html index 35db9c221e1fd076b4dce4c02ff56ab1cd350170..e29608cd606750027f6dd872894237ef6225a40b 100644 --- a/users/templates/user_profile.html +++ b/users/templates/user_profile.html @@ -1,4 +1,4 @@ -{% extends "base-margins.html" %} +{% extends 'base-margins.html' %} {% load i18n %} diff --git a/users/urls.py b/users/urls.py index 76ae1faa248c31572c181cbb1e88b1829f8eef33..03b60f160ea1186d8f4275c17bb56203c36910b5 100644 --- a/users/urls.py +++ b/users/urls.py @@ -1,29 +1,57 @@ -from django.urls import include, path, reverse_lazy - from django.contrib.auth import views as auth_views +from django.urls import include, path, reverse_lazy +from django.views.generic import TemplateView from . import views -from .forms import login_form_helper, password_reset_form_helper +from . import forms app_name = 'users' urlpatterns = [ - path('', views.user_list, name="user_list"), - path('add/', views.user_add, name="user_add"), - path('<int:pk>/edit/', views.user_edit, name="user_edit"), - path('profile/', views.user_profile, name="user_profile"), + path('', views.user_list, name='user_list'), + path('add/', views.user_add, name='user_add'), + path('<int:pk>/edit/', views.user_edit, name='user_edit'), + path('profile/', views.user_profile, name='user_profile'), path( 'login/', - auth_views.LoginView.as_view(extra_context={"helper": login_form_helper}, success_url=reverse_lazy('dash')), - name="login", + auth_views.LoginView.as_view( + template_name='login.html', + success_url=reverse_lazy('dash'), + extra_context={'helper': forms.login_form_helper}, + ), + name='login', ), - path('logout/', auth_views.LogoutView.as_view(), name="logout"), + path('logout/', auth_views.LogoutView.as_view(), name='logout'), + path( + 'psasword-change/', + auth_views.PasswordChangeView.as_view( + template_name='password_change.html', + success_url=reverse_lazy('users:user_profile'), + extra_context={'helper': forms.password_change_form_helper}, + ), + name='password_change'), path( 'password-reset/', auth_views.PasswordResetView.as_view( - template_name="registration/password_reset.html", - extra_context={"helper": password_reset_form_helper}, + template_name='password_reset.html', + email_template_name='password_reset_email.html', + success_url=reverse_lazy('users:password_reset_requested'), + extra_context={'helper': forms.password_reset_form_helper}, + ), + name='password_reset', + ), + path( + 'password-reset/check-your-inbox/', + TemplateView.as_view(template_name='password_reset_requested.html'), + name='password_reset_requested', + ), + path( + 'password-reset/<uidb64>/<token>/', + auth_views.PasswordResetConfirmView.as_view( + template_name='password_reset_form.html', + success_url=reverse_lazy('users:login'), + extra_context={'helper': forms.password_reset_set_password_form_helper}, ), - name="password_reset", + name='password_reset_confirm' ), ] diff --git a/users/utils.py b/users/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..ae63178dd6fd61841290acf7c820d243972e00fe --- /dev/null +++ b/users/utils.py @@ -0,0 +1,14 @@ +from django.core.mail import send_mail +from django.utils.translation import gettext as _ +from django.template import loader + + +def send_new_user_email(site, user, use_https): + subject = _('Zaproszenie do %s') % (site.name, ) + body = loader.render_to_string('new_user_email.html', { + 'site_name': site.name, + 'protocol': 'https' if use_https else 'http', + 'domain': site.domain, + 'user': user, + }) + send_mail(subject, body, from_email=None, recipient_list=[user.email]) diff --git a/users/views.py b/users/views.py index 97b3b5aac9bed68aad34067282e246964e79c094..9e9a6a806937cc2fe1e0b705e9faa0d4ee1cabec 100644 --- a/users/views.py +++ b/users/views.py @@ -1,9 +1,11 @@ from django.contrib.auth.decorators import login_required, permission_required from django.contrib.auth.models import User +from django.contrib.sites.shortcuts import get_current_site from django.shortcuts import get_object_or_404, render, redirect from django.utils.translation import gettext_lazy as _ from users.forms import UserForm, UserProfileForm +from users.utils import send_new_user_email @permission_required('users.view_user') @@ -28,7 +30,8 @@ def user_add(request): if request.method == 'POST': form = UserForm(instance=User(), data=request.POST) if form.is_valid(): - form.save() + user = form.save() + send_new_user_email(site=get_current_site(request), user=user, use_https=request.is_secure()) return redirect('users:user_list') else: form = UserForm(instance=User())