From 1e410d14e055f9581d2cda875dd7c782f241b5dc Mon Sep 17 00:00:00 2001 From: Danil Date: Sat, 16 Mar 2024 18:55:22 +0500 Subject: [PATCH 1/5] task 1 --- .../migrations/0002_job_full_description.py | 23 +++++++++++++++++++ src/jobs/models.py | 6 +++++ src/jobs/templates/jobs/job_detail.html | 8 +++---- src/jobs/templates/jobs/job_list.html | 7 +++--- src/jobs/urls.py | 7 ++++++ src/jobs/views.py | 6 ++++- src/portfolio/urls.py | 1 + 7 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 src/jobs/migrations/0002_job_full_description.py create mode 100644 src/jobs/urls.py diff --git a/src/jobs/migrations/0002_job_full_description.py b/src/jobs/migrations/0002_job_full_description.py new file mode 100644 index 0000000..ae1d37f --- /dev/null +++ b/src/jobs/migrations/0002_job_full_description.py @@ -0,0 +1,23 @@ +# Generated by Django 4.1.13 on 2024-03-16 11:05 + +import ckeditor_uploader.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("jobs", "0001_initial"), + ] + + operations = [ + migrations.AddField( + model_name="job", + name="full_description", + field=ckeditor_uploader.fields.RichTextUploadingField( + default="Подробное описание", + help_text="Подробное описание выполненной работы", + verbose_name="Подробное описание работы", + ), + ), + ] diff --git a/src/jobs/models.py b/src/jobs/models.py index a5525d1..7b2886d 100644 --- a/src/jobs/models.py +++ b/src/jobs/models.py @@ -5,6 +5,7 @@ from django.db import models from base.models import TimeStampMixin +from ckeditor_uploader.fields import RichTextUploadingField class Job(TimeStampMixin): @@ -22,6 +23,11 @@ class Job(TimeStampMixin): verbose_name="Описание", help_text="Краткое описание выполненной работы", ) + full_description = RichTextUploadingField( + verbose_name="Подробное описание работы", + help_text="Подробное описание выполненной работы", + default="Подробное описание", + ) class Meta: verbose_name = "Выполненная работа" diff --git a/src/jobs/templates/jobs/job_detail.html b/src/jobs/templates/jobs/job_detail.html index 6b40e3f..60038df 100644 --- a/src/jobs/templates/jobs/job_detail.html +++ b/src/jobs/templates/jobs/job_detail.html @@ -3,10 +3,10 @@ {% block content %}
-

{{ blog.title }}

-

{{ blog.pub_date }}

-

{{ blog.title }}

-

{{ blog.content }}

+

{{ job.description }}

+

{{ job.pub_date }}

+

{{ job.description }}

+

{{ job.full_description|safe }}

Вернуться в блог
diff --git a/src/jobs/templates/jobs/job_list.html b/src/jobs/templates/jobs/job_list.html index 5765bc2..ca8c1dc 100644 --- a/src/jobs/templates/jobs/job_list.html +++ b/src/jobs/templates/jobs/job_list.html @@ -8,9 +8,9 @@

Привет!

-

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

+

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

- Иван Иванов + Данил

Написать мне @@ -36,7 +36,8 @@

{{ job.description }}

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

diff --git a/src/jobs/urls.py b/src/jobs/urls.py new file mode 100644 index 0000000..aa08578 --- /dev/null +++ b/src/jobs/urls.py @@ -0,0 +1,7 @@ +from django.urls import path + +from jobs.views import IndexJobsDetailView + +urlpatterns = [ + path("/", IndexJobsDetailView.as_view(), name="job"), +] \ No newline at end of file diff --git a/src/jobs/views.py b/src/jobs/views.py index 17fb444..b286463 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 IndexJobsDetailView(DetailView): + model = Job diff --git a/src/portfolio/urls.py b/src/portfolio/urls.py index 11ab691..475e2ca 100644 --- a/src/portfolio/urls.py +++ b/src/portfolio/urls.py @@ -29,5 +29,6 @@ path("ckeditor/", include("ckeditor_uploader.urls")), path("", IndexJobsListView.as_view(), name="home"), path("blog/", include("blog.urls")), + path("jobs/", include("jobs.urls")), ] urlpatterns.extend(static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)) From c72a6577359b52e34f6db76f6736e3e0bbef7adb Mon Sep 17 00:00:00 2001 From: Danil Date: Sat, 16 Mar 2024 20:09:41 +0500 Subject: [PATCH 2/5] tasks 4-6 --- src/author/__init__.py | 0 src/author/admin.py | 24 +++++++++++++ src/author/apps.py | 7 ++++ src/author/context_processors.py | 9 +++++ src/author/migrations/0001_initial.py | 49 +++++++++++++++++++++++++++ src/author/migrations/__init__.py | 0 src/author/models.py | 19 +++++++++++ src/author/tests.py | 3 ++ src/author/views.py | 3 ++ src/portfolio/settings.py | 2 ++ src/portfolio/templates/base.html | 6 ++-- 11 files changed, 119 insertions(+), 3 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/author/tests.py create mode 100644 src/author/views.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..c22d7bd --- /dev/null +++ b/src/author/admin.py @@ -0,0 +1,24 @@ +""" +Функции панели управления для приложения "Автор". +""" + +from django.contrib import admin +from author.models import Author + + +@admin.register(Author) +class AuthorAdmin(admin.ModelAdmin): + list_display = ( + "cv_link", + "github_link", + "email", + "created_at", + "updated_at", + ) + + search_fields = ("email", "github_link") + + 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/context_processors.py b/src/author/context_processors.py new file mode 100644 index 0000000..9a5127a --- /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..1ddf666 --- /dev/null +++ b/src/author/migrations/0001_initial.py @@ -0,0 +1,49 @@ +# Generated by Django 4.1.13 on 2024-03-16 14:46 + +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="Время обновления записи" + ), + ), + ("cv_link", models.URLField(verbose_name="Ссылка на резюме")), + ("github_link", models.URLField(verbose_name="Ссылка на GitHub")), + ( + "email", + models.EmailField(max_length=254, verbose_name="Почтовый адрес"), + ), + ], + 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..3fe5fc3 --- /dev/null +++ b/src/author/models.py @@ -0,0 +1,19 @@ +from django.db import models +from base.models import TimeStampMixin + + +class Author(TimeStampMixin): + """ + Модель для хранения информации об авторе. + """ + + cv_link = models.URLField(verbose_name="Ссылка на резюме") + github_link = models.URLField(verbose_name="Ссылка на GitHub") + email = models.EmailField(verbose_name="Почтовый адрес") + + class Meta: + verbose_name = "Автор" + verbose_name_plural = "Авторы" + + def __str__(self) -> str: + return f'Объект "автор" (id={self.pk})' 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/views.py b/src/author/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/src/author/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. 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..a9838c6 100644 --- a/src/portfolio/templates/base.html +++ b/src/portfolio/templates/base.html @@ -36,9 +36,9 @@

Обо мне

Мои контакты

From fe9f4f17f48def49a747b7b92dd19849ea9070ea Mon Sep 17 00:00:00 2001 From: Danil Date: Sat, 16 Mar 2024 20:26:12 +0500 Subject: [PATCH 3/5] fix task 1 (add summary) --- src/jobs/models.py | 9 +++++++++ src/jobs/templates/jobs/job_list.html | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/jobs/models.py b/src/jobs/models.py index 7b2886d..1ee329c 100644 --- a/src/jobs/models.py +++ b/src/jobs/models.py @@ -35,3 +35,12 @@ class Meta: def __str__(self) -> str: return f'Объект "Выполненная работа" (id={self.pk})' + + def summary(self) -> str: + """ + Краткое содержание выполненной работы. + + :return: + """ + + return self.full_description[:100] + "..." diff --git a/src/jobs/templates/jobs/job_list.html b/src/jobs/templates/jobs/job_list.html index ca8c1dc..86b43a4 100644 --- a/src/jobs/templates/jobs/job_list.html +++ b/src/jobs/templates/jobs/job_list.html @@ -33,7 +33,8 @@ alt="job image"/>
-

{{ job.description }}

+

{{ job.description }}

+

{{ job.summary|safe }}

Date: Sat, 16 Mar 2024 20:37:05 +0500 Subject: [PATCH 4/5] task 7 --- src/jobs/tests.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/jobs/tests.py b/src/jobs/tests.py index e69de29..adfe3ec 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 JobTestCase(TestCase): + """ + Тестирование функций выполненных работ. + """ + + def setUp(self) -> None: + """ + Настройка перед тестированием. + + :return: + """ + + Job.objects.create( + image="Job №1 image path", + description="Job №1 description", + full_description="Job №1 full description. " * 100, + ) + + def test_job_creation(self) -> None: + """ + Тестирование моделей сообщений для выполненной работы. + + :return: + """ + + job = Job.objects.get(description="Job №1 description") + + content = "Job №1 full description. " * 100 + self.assertEqual(job.summary(), content[:100] + "...") + self.assertEqual(str(job), f'Объект "Выполненная работа" (id={job.pk})') From c870adc9a01e129fa95bd0d02b92abb9256931e0 Mon Sep 17 00:00:00 2001 From: Danil Date: Sat, 16 Mar 2024 20:41:08 +0500 Subject: [PATCH 5/5] formatting --- src/author/context_processors.py | 2 +- src/author/tests.py | 2 -- src/author/views.py | 2 -- src/jobs/models.py | 2 +- src/jobs/urls.py | 2 +- 5 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/author/context_processors.py b/src/author/context_processors.py index 9a5127a..989d912 100644 --- a/src/author/context_processors.py +++ b/src/author/context_processors.py @@ -6,4 +6,4 @@ def author(request: HttpRequest) -> dict: """ Контекстный процессор для информации об авторе """ - return {'author': Author.objects.last()} \ No newline at end of file + return {"author": Author.objects.last()} diff --git a/src/author/tests.py b/src/author/tests.py index 7ce503c..a39b155 100644 --- a/src/author/tests.py +++ b/src/author/tests.py @@ -1,3 +1 @@ -from django.test import TestCase - # Create your tests here. diff --git a/src/author/views.py b/src/author/views.py index 91ea44a..60f00ef 100644 --- a/src/author/views.py +++ b/src/author/views.py @@ -1,3 +1 @@ -from django.shortcuts import render - # Create your views here. diff --git a/src/jobs/models.py b/src/jobs/models.py index 1ee329c..6046114 100644 --- a/src/jobs/models.py +++ b/src/jobs/models.py @@ -4,8 +4,8 @@ from django.db import models -from base.models import TimeStampMixin from ckeditor_uploader.fields import RichTextUploadingField +from base.models import TimeStampMixin class Job(TimeStampMixin): diff --git a/src/jobs/urls.py b/src/jobs/urls.py index aa08578..c6236aa 100644 --- a/src/jobs/urls.py +++ b/src/jobs/urls.py @@ -4,4 +4,4 @@ urlpatterns = [ path("/", IndexJobsDetailView.as_view(), name="job"), -] \ No newline at end of file +]