From 4b9fda695264f64ecc8088993bf612da8baf7211 Mon Sep 17 00:00:00 2001 From: Aleksandr Date: Wed, 29 Mar 2023 08:56:21 +0500 Subject: [PATCH] Update project --- .env.sample | 2 +- src/author/__init__.py | 0 src/author/admin.py | 21 +++++++ src/author/apps.py | 7 +++ src/author/migrations/0001_initial.py | 61 +++++++++++++++++++ src/author/migrations/__init__.py | 0 src/author/models.py | 30 +++++++++ .../templates/author/author_detail.html | 7 +++ src/author/templates/author/author_list.html | 7 +++ src/author/tests.py | 3 + src/author/urls.py | 9 +++ src/author/views.py | 12 ++++ src/blog/urls.py | 3 - src/jobs/migrations/0002_job_content.py | 21 +++++++ src/jobs/models.py | 14 ++++- src/jobs/templates/jobs/job_detail.html | 10 +-- src/jobs/templates/jobs/job_list.html | 3 +- src/jobs/tests.py | 35 +++++++++++ src/jobs/urls.py | 9 +++ src/jobs/views.py | 5 ++ src/portfolio/settings.py | 1 + src/portfolio/templates/base.html | 14 +++-- src/portfolio/urls.py | 4 +- 23 files changed, 260 insertions(+), 18 deletions(-) create mode 100644 src/author/__init__.py create mode 100644 src/author/admin.py create mode 100644 src/author/apps.py create mode 100644 src/author/migrations/0001_initial.py create mode 100644 src/author/migrations/__init__.py create mode 100644 src/author/models.py create mode 100644 src/author/templates/author/author_detail.html create mode 100644 src/author/templates/author/author_list.html create mode 100644 src/author/tests.py create mode 100644 src/author/urls.py create mode 100644 src/author/views.py create mode 100644 src/jobs/migrations/0002_job_content.py create mode 100644 src/jobs/urls.py diff --git a/.env.sample b/.env.sample index c40a8a4..269b392 100644 --- a/.env.sample +++ b/.env.sample @@ -3,7 +3,7 @@ DEBUG=True # секретный ключ Django (можно сгенерировать, например, на https://djecrety.ir) SECRET_KEY=secret_key # список хостов/доменов, для которых может работать сайт -ALLOWED_HOSTS=0.0.0.0,localhost,127.0.0.1 +ALLOWED_HOSTS=0.0.0.0,localhost,127.0.0.1,[::1] # реквизиты подключения к СУБД PostgreSQL # наименование БД diff --git a/src/author/__init__.py b/src/author/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/author/admin.py b/src/author/admin.py new file mode 100644 index 0000000..33d5a47 --- /dev/null +++ b/src/author/admin.py @@ -0,0 +1,21 @@ +from django.contrib import admin + +from author.models import Author + + +@admin.register(Author) +class AuthorAdmin(admin.ModelAdmin): + list_display = ( + "skill_info", + "github_info", + "email_info", + "created_at", + "updated_at", + ) + + search_fields = ("email",) + + list_filter = ( + "created_at", + "updated_at", + ) diff --git a/src/author/apps.py b/src/author/apps.py new file mode 100644 index 0000000..ed859f9 --- /dev/null +++ b/src/author/apps.py @@ -0,0 +1,7 @@ +from django.apps import AppConfig + + +class AuthorConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "author" + verbose_name = "Автор" diff --git a/src/author/migrations/0001_initial.py b/src/author/migrations/0001_initial.py new file mode 100644 index 0000000..b169681 --- /dev/null +++ b/src/author/migrations/0001_initial.py @@ -0,0 +1,61 @@ +# Generated by Django 4.1.7 on 2023-03-03 17:08 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [] + + operations = [ + migrations.CreateModel( + name="Author", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, verbose_name="Время создания записи" + ), + ), + ( + "updated_at", + models.DateTimeField( + auto_now=True, verbose_name="Время обновления записи" + ), + ), + ( + "skill_info", + models.URLField( + help_text="Ссылка на резюме", verbose_name="Резюме" + ), + ), + ( + "github_info", + models.URLField( + help_text="Ссылка на github", verbose_name="GitHub" + ), + ), + ( + "email_info", + models.EmailField( + help_text="Email автора", max_length=254, verbose_name="Email" + ), + ), + ], + options={ + "verbose_name": "Данные об авторе", + "verbose_name_plural": "Данные об авторе", + }, + ), + ] diff --git a/src/author/migrations/__init__.py b/src/author/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/author/models.py b/src/author/models.py new file mode 100644 index 0000000..4f73f3a --- /dev/null +++ b/src/author/models.py @@ -0,0 +1,30 @@ +from django.db import models + +from base.models import TimeStampMixin + + +class Author(TimeStampMixin): + """ + Модель для хранения данных об авторе. + """ + + skill_info = models.URLField( + verbose_name="Резюме", + help_text="Ссылка на резюме", + ) + github_info = models.URLField( + verbose_name="GitHub", + help_text="Ссылка на github", + ) + + email_info = models.EmailField( + verbose_name="Email", + help_text="Email автора", + ) + + class Meta: + verbose_name = "Данные об авторе" + verbose_name_plural = "Данные об авторе" + + def __str__(self) -> str: + return f'Объект "Автор" (id={self.pk})' diff --git a/src/author/templates/author/author_detail.html b/src/author/templates/author/author_detail.html new file mode 100644 index 0000000..eaa756b --- /dev/null +++ b/src/author/templates/author/author_detail.html @@ -0,0 +1,7 @@ +{% block author %} + +{# endblock %} \ No newline at end of file diff --git a/src/author/templates/author/author_list.html b/src/author/templates/author/author_list.html new file mode 100644 index 0000000..13b8ff6 --- /dev/null +++ b/src/author/templates/author/author_list.html @@ -0,0 +1,7 @@ +{% block author %} + +{% endblock %} \ No newline at end of file diff --git a/src/author/tests.py b/src/author/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/src/author/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/src/author/urls.py b/src/author/urls.py new file mode 100644 index 0000000..2a5b74f --- /dev/null +++ b/src/author/urls.py @@ -0,0 +1,9 @@ +from django.urls import path + +from author.views import AuthorListView +from author.views import AuthorDetailView + +urlpatterns = [ + path("", AuthorListView.as_view(), name="authors"), + path("/", AuthorDetailView.as_view(), name="author"), +] diff --git a/src/author/views.py b/src/author/views.py new file mode 100644 index 0000000..09a4859 --- /dev/null +++ b/src/author/views.py @@ -0,0 +1,12 @@ +from django.views.generic import ListView +from django.views.generic import DetailView + +from author.models import Author + + +class AuthorListView(ListView): + model = Author + + +class AuthorDetailView(DetailView): + model = Author diff --git a/src/blog/urls.py b/src/blog/urls.py index 95f3167..7e7cb5a 100644 --- a/src/blog/urls.py +++ b/src/blog/urls.py @@ -6,7 +6,4 @@ urlpatterns = [ path("", BlogsListView.as_view(), name="blogs"), path("/", BlogsDetailView.as_view(), name="blog"), - # path('/', views.DetailView.as_view(), name='detail'), - # path('/results/', views.ResultsView.as_view(), name='results'), - # path('/vote/', views.vote, name='vote'), ] diff --git a/src/jobs/migrations/0002_job_content.py b/src/jobs/migrations/0002_job_content.py new file mode 100644 index 0000000..f9a696e --- /dev/null +++ b/src/jobs/migrations/0002_job_content.py @@ -0,0 +1,21 @@ +# Generated by Django 4.1.7 on 2023-03-03 13:48 + +import ckeditor_uploader.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("jobs", "0001_initial"), + ] + + operations = [ + migrations.AddField( + model_name="job", + name="content", + field=ckeditor_uploader.fields.RichTextUploadingField( + default="", verbose_name="Подробное описание работы" + ), + ), + ] diff --git a/src/jobs/models.py b/src/jobs/models.py index a5525d1..c734e50 100644 --- a/src/jobs/models.py +++ b/src/jobs/models.py @@ -1,7 +1,7 @@ """ Модели для приложения "Jobs" (выполненные работы). """ - +from ckeditor_uploader.fields import RichTextUploadingField from django.db import models from base.models import TimeStampMixin @@ -22,6 +22,9 @@ class Job(TimeStampMixin): verbose_name="Описание", help_text="Краткое описание выполненной работы", ) + content = RichTextUploadingField( + verbose_name="Подробное описание работы", default="" + ) class Meta: verbose_name = "Выполненная работа" @@ -29,3 +32,12 @@ class Meta: def __str__(self) -> str: return f'Объект "Выполненная работа" (id={self.pk})' + + def summary(self) -> str: + """ + Краткое содержание сообщения. + + :return: + """ + + return self.content[:100] + "..." diff --git a/src/jobs/templates/jobs/job_detail.html b/src/jobs/templates/jobs/job_detail.html index 6b40e3f..a2d94d4 100644 --- a/src/jobs/templates/jobs/job_detail.html +++ b/src/jobs/templates/jobs/job_detail.html @@ -3,11 +3,11 @@ {% block content %}
-

{{ blog.title }}

-

{{ blog.pub_date }}

-

{{ blog.title }}

-

{{ blog.content }}

- Вернуться в блог +

{{ job.title }}

+

{{ job.pub_date }}

+

{{ jod.description }}

+

{{ job.content|safe }}

+ Главная
{% endblock %} diff --git a/src/jobs/templates/jobs/job_list.html b/src/jobs/templates/jobs/job_list.html index 5765bc2..83893ab 100644 --- a/src/jobs/templates/jobs/job_list.html +++ b/src/jobs/templates/jobs/job_list.html @@ -34,9 +34,10 @@

{{ job.description }}

+

{{ job.summary|safe }}

{{ job.created_at|date:"d E Y" }}

diff --git a/src/jobs/tests.py b/src/jobs/tests.py index e69de29..876b894 100644 --- a/src/jobs/tests.py +++ b/src/jobs/tests.py @@ -0,0 +1,35 @@ +from django.test import TestCase + +from jobs.models import Job + + +class JobsTestCase(TestCase): + """ + Тестирование функций блога. + """ + + def setUp(self) -> None: + """ + Настройка перед тестированием. + + :return: + """ + + Job.objects.create( + description="Job №1 description", + content="Job №1 content. " * 100, + image="Job №1 image path", + ) + + def test_job_messages_creation(self) -> None: + """ + Тестирование моделей для работ. + + :return: + """ + + job = Job.objects.get(description="Job №1 description") + + content = "Job №1 content. " * 100 + self.assertEqual(job.summary(), content[:100] + "...") + self.assertEqual(str(job), f'Объект "Выполненная работа" (id={job.pk})') diff --git a/src/jobs/urls.py b/src/jobs/urls.py new file mode 100644 index 0000000..b29312f --- /dev/null +++ b/src/jobs/urls.py @@ -0,0 +1,9 @@ +from django.urls import path + +from jobs.views import IndexJobsListView +from jobs.views import JobsDetailView + +urlpatterns = [ + path("", IndexJobsListView.as_view(), name="jobs"), + path("/", JobsDetailView.as_view(), name="job"), +] diff --git a/src/jobs/views.py b/src/jobs/views.py index 17fb444..4cd75dd 100644 --- a/src/jobs/views.py +++ b/src/jobs/views.py @@ -1,7 +1,12 @@ from django.views.generic import ListView +from django.views.generic import DetailView from jobs.models import Job class IndexJobsListView(ListView): model = Job + + +class JobsDetailView(DetailView): + model = Job diff --git a/src/portfolio/settings.py b/src/portfolio/settings.py index dbe6dbd..94a6fb5 100644 --- a/src/portfolio/settings.py +++ b/src/portfolio/settings.py @@ -45,6 +45,7 @@ # созданные приложения "jobs.apps.JobsConfig", "blog.apps.BlogConfig", + "author.apps.AuthorConfig", # установленные приложения "ckeditor", "ckeditor_uploader", diff --git a/src/portfolio/templates/base.html b/src/portfolio/templates/base.html index 42b2f67..bc20119 100644 --- a/src/portfolio/templates/base.html +++ b/src/portfolio/templates/base.html @@ -34,12 +34,14 @@

Обо мне

-

Мои контакты

- +

Мои контакты

+ {% block author %} + + {% endblock %}
diff --git a/src/portfolio/urls.py b/src/portfolio/urls.py index 11ab691..b64086a 100644 --- a/src/portfolio/urls.py +++ b/src/portfolio/urls.py @@ -27,7 +27,9 @@ urlpatterns = [ path("admin/", admin.site.urls), path("ckeditor/", include("ckeditor_uploader.urls")), - path("", IndexJobsListView.as_view(), name="home"), path("blog/", include("blog.urls")), + path("", IndexJobsListView.as_view(), name="content"), + path("jobs/", include("jobs.urls")), + path("author/", include("author.urls")), ] urlpatterns.extend(static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT))