Skip to content

Commit

Permalink
initial
Browse files Browse the repository at this point in the history
  • Loading branch information
pandaxcore committed Jun 3, 2024
1 parent fd2b55e commit f667871
Show file tree
Hide file tree
Showing 14 changed files with 235 additions and 22 deletions.
34 changes: 29 additions & 5 deletions acme_project/acme_project/settings.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
"""Docstring."""
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

SECRET_KEY = 'django-insecure-m&$lzdzkutvrbr5vt=jpm)7#g7cken_tk%($ty+w902n7wb#=e'
SECRET_KEY = (
'django-insecure-m&$lzdzkutvrbr5vt=jpm)7#g7cken_tk%($ty+w902n7wb#=e'
)

DEBUG = True

Expand Down Expand Up @@ -61,16 +64,28 @@

AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
'NAME': (
'django.contrib.auth.password_validation.'
'UserAttributeSimilarityValidator'
),
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'NAME': (
'django.contrib.auth.password_validation.'
'MinimumLengthValidator'
),
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
'NAME': (
'django.contrib.auth.password_validation.'
'CommonPasswordValidator'
),
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
'NAME': (
'django.contrib.auth.password_validation.'
'NumericPasswordValidator'
),
},
]

Expand All @@ -89,3 +104,12 @@
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

MEDIA_ROOT = BASE_DIR / 'media/'

# Подключаем бэкенд filebased.EmailBackend:
EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
# Указываем директорию, в которую будут сохраняться файлы писем:
EMAIL_FILE_PATH = BASE_DIR / 'sent_emails'

LOGIN_REDIRECT_URL = 'pages:homepage'

LOGIN_URL = 'login'
24 changes: 20 additions & 4 deletions acme_project/acme_project/urls.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,31 @@
"""Docstring."""

# acme_project/urls.py
# Импортируем настройки проекта.
from django.conf import settings

# Добавьте новые строчки с импортами классов.
from django.contrib.auth.forms import UserCreationForm
from django.views.generic.edit import CreateView

# Импортируем функцию, позволяющую серверу разработки отдавать файлы.
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import include, path
from django.urls import include, path, reverse_lazy

urlpatterns = [
path('', include('pages.urls')),
path('admin/', admin.site.urls),
path('birthday/', include('birthday.urls')),
path("", include("pages.urls")),
path("admin/", admin.site.urls),
path("auth/", include("django.contrib.auth.urls")),
path(
"auth/registration/",
CreateView.as_view(
template_name="registration/registration_form.html",
form_class=UserCreationForm,
success_url=reverse_lazy("pages:homepage"),
),
name="registration",
),
path("birthday/", include("birthday.urls")),
# В конце добавляем к списку вызов функции static.
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
1 change: 1 addition & 0 deletions acme_project/birthday/admin.py
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
"""Docstring."""
from django.contrib import admin
30 changes: 20 additions & 10 deletions acme_project/birthday/forms.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
"""Docstring."""

# birthday/forms.py
from django import forms

# Импортируем класс ошибки валидации.
from django.core.exceptions import ValidationError

from .models import Birthday

# Импорт функции для отправки почты.
from django.core.mail import send_mail

# Множество с именами участников Ливерпульской четвёрки.
BEATLES = {'Джон Леннон', 'Пол Маккартни', 'Джордж Харрисон', 'Ринго Старр'}
BEATLES = {"Джон Леннон", "Пол Маккартни", "Джордж Харрисон", "Ринго Старр"}


class BirthdayForm(forms.ModelForm):
Expand All @@ -17,15 +22,13 @@ class Meta:
"""Docstring."""

model = Birthday
fields = '__all__'
widgets = {
'birthday': forms.DateInput(attrs={'type': 'date'})
}
fields = "__all__"
widgets = {"birthday": forms.DateInput(attrs={"type": "date"})}

def clean_first_name(self):
"""Docstring."""
# Получаем значение имени из словаря очищенных данных.
first_name = self.cleaned_data['first_name']
first_name = self.cleaned_data["first_name"]
# Разбиваем полученную строку по пробелам
# и возвращаем только первое имя.
return first_name.split()[0]
Expand All @@ -35,10 +38,17 @@ def clean(self):
# Вызов родительского метода clean.
super().clean()
# Получаем имя и фамилию из очищенных полей формы.
first_name = self.cleaned_data['first_name']
last_name = self.cleaned_data['last_name']
first_name = self.cleaned_data["first_name"]
last_name = self.cleaned_data["last_name"]
# Проверяем вхождение сочетания имени и фамилии во множество имён.
if f'{first_name} {last_name}' in BEATLES:
if f"{first_name} {last_name}" in BEATLES:
send_mail(
subject="Another Beatles member",
message=f"{first_name} {last_name} пытался опубликовать запись!",
from_email="[email protected]",
recipient_list=["[email protected]"],
fail_silently=True,
)
raise ValidationError(
'Мы тоже любим Битлз, но введите, пожалуйста, настоящее имя!'
"Мы тоже любим Битлз, но введите, пожалуйста, настоящее имя!"
)
21 changes: 18 additions & 3 deletions acme_project/templates/includes/header.html
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
<!-- templates/includes/header.html -->
<header>
<nav class="navbar shadow-sm">
<div class="container">
Expand All @@ -16,11 +17,25 @@
</a>
</li>
<li class="nav-item">
<a class="nav-link {% if view_name == 'birthday:list' %} active {% endif %}"
href="{% url 'birthday:list' %}">
Список дней рождения
<a class="nav-link {% if view_name == 'birthday:list' %} active {% endif %}" href="{% url 'birthday:list' %}">
Cписок дней рождения
</a>
</li>

<!-- Это блок ссылок для авторизованного пользователя -->
{% if user.is_authenticated %}
<span class="navbar-text">Пользователь: <b>Логин пользователя</b></span>
<li class="nav-item">
<a class="nav-link" href="{% url 'logout' %}">Выйти</a>
</li>
<!-- Конец блока ссылок для авторизованного пользователя -->
{% else %}
<!-- А здесь блок ссылок для неавторизованного пользователя -->
<li class="nav-item">
<a class="nav-link{% if view_name == 'login' %} active {% endif %}" href="{% url 'login' %}">Войти</a>
</li>
{% endif %}
<!-- Конец блока ссылок для неавторизованного пользователя -->
</ul>
{% endwith %}
</div>
Expand Down
5 changes: 5 additions & 0 deletions acme_project/templates/registration/logged_out.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{% extends "base.html" %}

{% block content %}
<h2>Вы вышли из системы!</h2>
{% endblock %}
45 changes: 45 additions & 0 deletions acme_project/templates/registration/login.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<!-- templates/registration/login.html -->
{% extends "base.html" %}
<!-- Загружаем библиотеку для работы со стилями Bootstrap. -->
{% load django_bootstrap5 %}

{% block content %}
<!-- Если в запросе передан GET-параметр с указанием страницы,
куда надо перейти после входа. -->
{% if next %}
<!-- Если пользователь уже залогинен, но не обладает нужными правами. -->
{% if user.is_authenticated %}
<p>
У вашего аккаунта нет доступа к этой странице.
Чтобы продолжить, войдите в систему с аккаунтом,
у которого есть доступ.
</p>
{% else %}
<p>
Пожалуйста, войдите в систему,
чтобы просматривать эту страницу.
</p>
{% endif %}
{% endif %}

<div class="card col-4 m-3">
<div class="card-header">
Войти в систему
</div>
<div class="card-body">
<!-- В атрибуте action указываем адрес, куда должен отправляться запрос. -->
<form method="post" action="{% url 'login' %}">
{% csrf_token %}
{% bootstrap_form form %}
<!-- В скрытом поле передаём параметр next,
это URL для переадресации после логина. -->
<input type="hidden" name="next" value="{{ next }}">
{% bootstrap_button button_type="submit" content="Войти" %}
</form>
<div>
<!-- Ссылка для перехода на страницу восстановления пароля. -->
<a href="{% url 'password_reset' %}">Забыли пароль?</a>
</div>
</div>
</div>
{% endblock %}
6 changes: 6 additions & 0 deletions acme_project/templates/registration/password_change_done.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{% extends "base.html" %}

{% block content %}
<h2>Пароль успешно изменён!</h2>
<p><a href="{% url 'pages:homepage' %}">На главную</a></p>
{% endblock %}
17 changes: 17 additions & 0 deletions acme_project/templates/registration/password_change_form.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{% extends "base.html" %}
{% load django_bootstrap5 %}

{% block content %}
<div class="card col-4 m-3">
<div class="card-header">
Поменять пароль
</div>
<div class="card-body">
<form method="post">
{% csrf_token %}
{% bootstrap_form form %}
{% bootstrap_button button_type="submit" content="Поменять пароль" %}
</form>
</div>
</div>
{% endblock %}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{% extends "base.html" %}

{% block content %}
<h2>Восстановление пароля завершено</h2>
<p>Ваш новый пароль сохранён. Теперь вы можете войти.</p>
<p><a href="{% url 'login' %}">Войти</a></p>
{% endblock %}
17 changes: 17 additions & 0 deletions acme_project/templates/registration/password_reset_confirm.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{% extends "base.html" %}
{% load django_bootstrap5 %}

{% block content %}
<div class="card col-4 m-3">
<div class="card-header">
Восстановление пароля
</div>
<div class="card-body">
<form method="post">
{% csrf_token %}
{% bootstrap_form form %}
{% bootstrap_button button_type="submit" content="Поменять пароль" %}
</form>
</div>
</div>
{% endblock %}
16 changes: 16 additions & 0 deletions acme_project/templates/registration/password_reset_done.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{% extends "base.html" %}

{% block content %}
<h2>Письмо с инструкциями по восстановлению пароля отправлено</h2>
<p>
Мы отправили вам инструкцию по установке нового пароля
на указанный адрес электронной почты (если в нашей базе данных есть такой адрес).
Вы должны получить её в ближайшее время.
</p>
<p>
Если вы не получили письмо, пожалуйста,
убедитесь, что вы ввели адрес, с которым Вы зарегистрировались,
и проверьте папку со спамом.
</p>
<p><a href="{% url 'pages:homepage' %}">На главную</a></p>
{% endblock %}
17 changes: 17 additions & 0 deletions acme_project/templates/registration/password_reset_form.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{% extends "base.html" %}
{% load django_bootstrap5 %}

{% block content %}
<div class="card col-4 m-3">
<div class="card-header">
Восстановить пароль
</div>
<div class="card-body">
<form method="post">
{% csrf_token %}
{% bootstrap_form form %}
{% bootstrap_button button_type="submit" content="Отправить" %}
</form>
</div>
</div>
{% endblock %}
17 changes: 17 additions & 0 deletions acme_project/templates/registration/registration_form.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{% extends "base.html" %}
{% load django_bootstrap5 %}

{% block content %}
<div class="card col-4 m-3">
<div class="card-header">
Регистрация пользователя
</div>
<div class="card-body">
<form method="post">
{% csrf_token %}
{% bootstrap_form form %}
{% bootstrap_button button_type="submit" content="Зарегистрироваться" %}
</form>
</div>
</div>
{% endblock %}

0 comments on commit f667871

Please sign in to comment.