From 1007ce070cc980f4c6ed5ee453e29829b693044a Mon Sep 17 00:00:00 2001 From: DmitryZubarev Date: Fri, 22 Mar 2024 18:15:36 +0500 Subject: [PATCH 1/2] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=BF=D0=BE=D0=BB=D0=B5=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D1=80=D0=BE=D0=B1=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BE=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B2=20=D0=BC=D0=BE=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/jobs/models.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/jobs/models.py b/src/jobs/models.py index a5525d1..7098240 100644 --- a/src/jobs/models.py +++ b/src/jobs/models.py @@ -3,7 +3,7 @@ """ from django.db import models - +from ckeditor_uploader.fields import RichTextUploadingField from base.models import TimeStampMixin @@ -22,6 +22,10 @@ class Job(TimeStampMixin): verbose_name="Описание", help_text="Краткое описание выполненной работы", ) + detailed_description = RichTextUploadingField( + verbose_name="Подробное описание", + help_text="Подробное описание выполненной работы", + ) class Meta: verbose_name = "Выполненная работа" From 9e73026526f3f119bf8bfebf6419bb6673ddd1a0 Mon Sep 17 00:00:00 2001 From: DmitryZubarev Date: Fri, 22 Mar 2024 19:34:17 +0500 Subject: [PATCH 2/2] =?UTF-8?q?=D0=92=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/author/__init__.py | 0 src/author/admin.py | 28 ++++++++++++++++++++++ src/author/apps.py | 11 +++++++++ src/author/context_processors.py | 9 +++++++ src/author/migrations/0001_initial.py | 0 src/author/migrations/__init__.py | 0 src/author/models.py | 19 +++++++++++++++ src/jobs/models.py | 7 ++++++ src/jobs/templates/jobs/job_detail.html | 6 ++--- src/jobs/templates/jobs/job_list.html | 6 ++--- src/jobs/tests.py | 32 +++++++++++++++++++++++++ src/jobs/urls.py | 9 +++++++ src/jobs/views.py | 6 ++++- src/portfolio/settings.py | 2 ++ src/portfolio/templates/base.html | 6 ++--- src/portfolio/urls.py | 1 + 16 files changed, 132 insertions(+), 10 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/context_processors.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/jobs/urls.py 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..75f0284 --- /dev/null +++ b/src/author/admin.py @@ -0,0 +1,28 @@ +""" +Функции панели управления для приложения "Автор". +""" + +from django.contrib import admin +from author.models import Author + + +@admin.register(Author) +class AuthorAdmin(admin.ModelAdmin): + list_display = ( + "resume_url", + "github_url", + "email", + "created_at", + "updated_at", + ) + + search_fields = ( + "github_url", + "resume_url", + "email", + ) + + list_filter = ( + "created_at", + "updated_at", + ) \ No newline at end of file diff --git a/src/author/apps.py b/src/author/apps.py new file mode 100644 index 0000000..9606d38 --- /dev/null +++ b/src/author/apps.py @@ -0,0 +1,11 @@ +from django.apps import AppConfig + + +class AuthorConfig(AppConfig): + """ + Конфигурация приложения. + """ + + default_auto_field = "django.db.models.BigAutoField" + name = "author" + verbose_name = "Автор" \ No newline at end of file diff --git a/src/author/context_processors.py b/src/author/context_processors.py new file mode 100644 index 0000000..2f0a2da --- /dev/null +++ b/src/author/context_processors.py @@ -0,0 +1,9 @@ +from django.http import HttpRequest +from author.models import Author + + +def author(request: HttpRequest) -> dict: + """ + Контекстный процессор для информации об авторе + """ + return {"author": Author.objects.last()} \ No newline at end of file diff --git a/src/author/migrations/0001_initial.py b/src/author/migrations/0001_initial.py new file mode 100644 index 0000000..e69de29 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..0a23d86 --- /dev/null +++ b/src/author/models.py @@ -0,0 +1,19 @@ +from django.db import models +from base.models import TimeStampMixin + + +class Author(TimeStampMixin): + """ + Модель для хранения данных об авторе + """ + + resume_url = models.URLField(verbose_name="Ссылка на резюме") + github_url = models.URLField(verbose_name="Ссылка GitHub") + email = models.EmailField(verbose_name="Email автора") + + class Meta: + verbose_name = "Информация об авторе" + verbose_name_plural = "Информация об авторе" + + def __str__(self) -> str: + return f'Объект "автор" (id={self.pk})' \ No newline at end of file diff --git a/src/jobs/models.py b/src/jobs/models.py index 7098240..5d0fded 100644 --- a/src/jobs/models.py +++ b/src/jobs/models.py @@ -33,3 +33,10 @@ class Meta: def __str__(self) -> str: return f'Объект "Выполненная работа" (id={self.pk})' + + def summary(self) -> str: + """ + Представление подробного описания работы. + :return: + """ + return self.detailed_description[:50] + "..." diff --git a/src/jobs/templates/jobs/job_detail.html b/src/jobs/templates/jobs/job_detail.html index 6b40e3f..f62ac36 100644 --- a/src/jobs/templates/jobs/job_detail.html +++ b/src/jobs/templates/jobs/job_detail.html @@ -5,9 +5,9 @@

{{ blog.title }}

{{ blog.pub_date }}

-

{{ blog.title }}

-

{{ blog.content }}

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

{{ job.description }}

+

{{ job.detailed_description|safe }}

+ На главную
{% endblock %} diff --git a/src/jobs/templates/jobs/job_list.html b/src/jobs/templates/jobs/job_list.html index 5765bc2..8daa1fb 100644 --- a/src/jobs/templates/jobs/job_list.html +++ b/src/jobs/templates/jobs/job_list.html @@ -8,9 +8,9 @@

Привет!

-

Меня зовут Иван Иванов.
Я профессионально занимаюсь разработкой на Python.

+

Меня зовут Дмитрий Зубарев.
Я профессионально занимаюсь разработкой на Python.

- Иван Иванов + Дмитрий Зубарев

Написать мне @@ -33,7 +33,7 @@ alt="job image"/>

-

{{ job.description }}

+

{{ job.summary|safe }}

Подробнее diff --git a/src/jobs/tests.py b/src/jobs/tests.py index e69de29..41d81c1 100644 --- a/src/jobs/tests.py +++ b/src/jobs/tests.py @@ -0,0 +1,32 @@ +from django.test import TestCase +from jobs.models import Job + + +class JobTestCase(TestCase): + """ + Тестирование функций выполненной работы + """ + + def setUp(self) -> None: + """ + Настройка перед тестированием. + + :return: + """ + + Job.objects.create( + image="test", description="test", detailed_description="test" * 100 + ) + + def test_job_messages_creation(self) -> None: + """ + Тестирование моделей работы. + + :return: + """ + + job = Job.objects.get(description="test") + + detailed_description = "test" * 100 + self.assertEqual(job.summary(), detailed_description[:100] + "...") + self.assertEqual(str(job), f'Объект "Выполненная работа" (id={job.pk})') \ No newline at end of file diff --git a/src/jobs/urls.py b/src/jobs/urls.py new file mode 100644 index 0000000..ad951d1 --- /dev/null +++ b/src/jobs/urls.py @@ -0,0 +1,9 @@ +from django.urls import path +from jobs.views import IndexJobDetailedView + + +urlpatterns = [ + path("/", + IndexJobDetailedView.as_view(), + name="job"), +] diff --git a/src/jobs/views.py b/src/jobs/views.py index 17fb444..8424fc1 100644 --- a/src/jobs/views.py +++ b/src/jobs/views.py @@ -1,7 +1,11 @@ -from django.views.generic import ListView +from django.views.generic import ListView, DetailView from jobs.models import Job class IndexJobsListView(ListView): model = Job + + +class IndexJobDetailedView(DetailView): + model = Job diff --git a/src/portfolio/settings.py b/src/portfolio/settings.py index dbe6dbd..8d8d16a 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", @@ -73,6 +74,7 @@ "django.template.context_processors.request", "django.contrib.auth.context_processors.auth", "django.contrib.messages.context_processors.messages", + "author.context_processors.author", ], }, }, diff --git a/src/portfolio/templates/base.html b/src/portfolio/templates/base.html index 42b2f67..8d8629c 100644 --- a/src/portfolio/templates/base.html +++ b/src/portfolio/templates/base.html @@ -36,9 +36,9 @@

Обо мне

Мои контакты

diff --git a/src/portfolio/urls.py b/src/portfolio/urls.py index 11ab691..64a5ab5 100644 --- a/src/portfolio/urls.py +++ b/src/portfolio/urls.py @@ -28,6 +28,7 @@ path("admin/", admin.site.urls), path("ckeditor/", include("ckeditor_uploader.urls")), path("", IndexJobsListView.as_view(), name="home"), + path("job/", include("jobs.urls")), path("blog/", include("blog.urls")), ] urlpatterns.extend(static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT))