From 9d8ba9ab35f58d5644d2b95e05264231e184e4b9 Mon Sep 17 00:00:00 2001 From: Anastasiya Date: Fri, 29 Mar 2024 00:05:01 +0500 Subject: [PATCH] =?UTF-8?q?3=20=D0=BB=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/author/__init__.py | 0 src/author/apps.py | 11 +++++ src/author/author_admin.py | 28 +++++++++++ src/author/author_info.py | 9 ++++ src/author/migrations/0001_initial.py | 46 +++++++++++++++++++ src/author/migrations/__init__.py | 0 src/author/models.py | 19 ++++++++ .../0002_job_detailed_description.py | 25 ++++++++++ src/jobs/models.py | 12 +++++ src/jobs/templates/jobs/job_detail.html | 10 ++-- src/jobs/templates/jobs/job_list.html | 8 ++-- src/jobs/url.py | 7 +++ src/jobs/views.py | 5 +- src/portfolio/settings.py | 3 ++ src/portfolio/templates/base.html | 6 +-- src/portfolio/urls.py | 1 + 16 files changed, 177 insertions(+), 13 deletions(-) create mode 100644 src/author/__init__.py create mode 100644 src/author/apps.py create mode 100644 src/author/author_admin.py create mode 100644 src/author/author_info.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/migrations/0002_job_detailed_description.py create mode 100644 src/jobs/url.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/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/author_admin.py b/src/author/author_admin.py new file mode 100644 index 0000000..d1bfa27 --- /dev/null +++ b/src/author/author_admin.py @@ -0,0 +1,28 @@ +""" +Функции панели управления для приложения "Автор". +""" + +from django.contrib import author_admin +from author.models import Author + + +@author_admin.register(Author) +class AuthorAdmin(author_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/author_info.py b/src/author/author_info.py new file mode 100644 index 0000000..d0f12b6 --- /dev/null +++ b/src/author/author_info.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..cd04701 --- /dev/null +++ b/src/author/migrations/0001_initial.py @@ -0,0 +1,46 @@ +# Generated by Django 4.1.13 on 2024-03-28 16:58 + +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="Время обновления записи" + ), + ), + ("resume_url", models.URLField(verbose_name="Ссылка на резюме")), + ("github_url", models.URLField(verbose_name="Ссылка GitHub")), + ("email", models.EmailField(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..bbec400 --- /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/migrations/0002_job_detailed_description.py b/src/jobs/migrations/0002_job_detailed_description.py new file mode 100644 index 0000000..1c2f439 --- /dev/null +++ b/src/jobs/migrations/0002_job_detailed_description.py @@ -0,0 +1,25 @@ +# Generated by Django 4.1.13 on 2024-03-28 13:38 + +import ckeditor_uploader.fields +from django.db import migrations +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ("jobs", "0001_initial"), + ] + + operations = [ + migrations.AddField( + model_name="job", + name="detailed_description", + field=ckeditor_uploader.fields.RichTextUploadingField( + default=django.utils.timezone.now, + help_text="Подробное описание выполненной работы", + verbose_name="Подробное описание", + ), + preserve_default=False, + ), + ] diff --git a/src/jobs/models.py b/src/jobs/models.py index a5525d1..d6fb633 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,10 @@ class Job(TimeStampMixin): verbose_name="Описание", help_text="Краткое описание выполненной работы", ) + detailed_description = RichTextUploadingField( + verbose_name="Подробное описание", + help_text="Подробное описание выполненной работы", + ) class Meta: verbose_name = "Выполненная работа" @@ -29,3 +34,10 @@ class Meta: def __str__(self) -> str: return f'Объект "Выполненная работа" (id={self.pk})' + + def summary(self) -> str: + """ + Краткое подробное описание работы. + :return: + """ + return self.detailed_description[:70] + "..." \ No newline at end of file diff --git a/src/jobs/templates/jobs/job_detail.html b/src/jobs/templates/jobs/job_detail.html index 6b40e3f..b165b8c 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 }}

+

{{ 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..e68a796 100644 --- a/src/jobs/templates/jobs/job_list.html +++ b/src/jobs/templates/jobs/job_list.html @@ -8,9 +8,9 @@

Привет!

-

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

+

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

- Иван Иванов + Деменева Анастасия

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

-

{{ job.description }}

+

{{ job.summary|safe }}

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

diff --git a/src/jobs/url.py b/src/jobs/url.py new file mode 100644 index 0000000..5d079dd --- /dev/null +++ b/src/jobs/url.py @@ -0,0 +1,7 @@ +from django.urls import path +from jobs.views import IndexJobsListView, IndexJobDetailView + +urlpatterns = [ + path("", IndexJobsListView.as_view(), name='jobs'), + path("/", IndexJobDetailView.as_view(), name='job') +] \ No newline at end of file diff --git a/src/jobs/views.py b/src/jobs/views.py index 17fb444..3b60a10 100644 --- a/src/jobs/views.py +++ b/src/jobs/views.py @@ -1,7 +1,10 @@ -from django.views.generic import ListView +from django.views.generic import ListView, DetailView from jobs.models import Job class IndexJobsListView(ListView): model = Job + +class IndexJobDetailView(DetailView): + model = Job \ No newline at end of file diff --git a/src/portfolio/settings.py b/src/portfolio/settings.py index dbe6dbd..c9bd520 100644 --- a/src/portfolio/settings.py +++ b/src/portfolio/settings.py @@ -45,9 +45,11 @@ # созданные приложения "jobs.apps.JobsConfig", "blog.apps.BlogConfig", + "author.apps.AuthorConfig", # установленные приложения "ckeditor", "ckeditor_uploader", + ] MIDDLEWARE = [ @@ -73,6 +75,7 @@ "django.template.context_processors.request", "django.contrib.auth.context_processors.auth", "django.contrib.messages.context_processors.messages", + "author.author_info.author" ], }, }, diff --git a/src/portfolio/templates/base.html b/src/portfolio/templates/base.html index 42b2f67..9f10071 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..f3b1cd5 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("job/", include("jobs.url")), ] urlpatterns.extend(static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT))