Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file added src/author/__init__.py
Empty file.
28 changes: 28 additions & 0 deletions src/author/admin.py
Original file line number Diff line number Diff line change
@@ -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",
)
11 changes: 11 additions & 0 deletions src/author/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from django.apps import AppConfig


class AuthorConfig(AppConfig):
"""
Конфигурация приложения.
"""

default_auto_field = "django.db.models.BigAutoField"
name = "author"
verbose_name = "Автор"
9 changes: 9 additions & 0 deletions src/author/context_processors.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from django.http import HttpRequest
from author.models import Author


def author(request: HttpRequest) -> dict:
"""
Контекстный процессор для информации об авторе
"""
return {"author": Author.objects.last()}
Empty file.
Empty file.
19 changes: 19 additions & 0 deletions src/author/models.py
Original file line number Diff line number Diff line change
@@ -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})'
13 changes: 12 additions & 1 deletion src/jobs/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"""

from django.db import models

from ckeditor_uploader.fields import RichTextUploadingField
from base.models import TimeStampMixin


Expand All @@ -22,10 +22,21 @@ class Job(TimeStampMixin):
verbose_name="Описание",
help_text="Краткое описание выполненной работы",
)
detailed_description = RichTextUploadingField(
verbose_name="Подробное описание",
help_text="Подробное описание выполненной работы",
)

class Meta:
verbose_name = "Выполненная работа"
verbose_name_plural = "Выполненные работы"

def __str__(self) -> str:
return f'Объект "Выполненная работа" (id={self.pk})'

def summary(self) -> str:
"""
Представление подробного описания работы.
:return:
"""
return self.detailed_description[:50] + "..."
6 changes: 3 additions & 3 deletions src/jobs/templates/jobs/job_detail.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
<div class="container">
<h1 class="text-center pt-3 display-4">{{ blog.title }}</h1>
<p class="text-center">{{ blog.pub_date }}</p>
<p><img src="{{ blog.image.url }}" class="img-fluid" alt="{{ blog.title }}"></p>
<p>{{ blog.content }}</p>
<a href="{% url 'blogs' %}" class="btn btn-light" role="button">Вернуться в блог</a>
<p><img src="{{ blog.image.url }}" class="img-fluid" alt="{{ job.description }}"></p>
<p>{{ job.detailed_description|safe }}</p>
<a href="{% url 'blogs' %}" class="btn btn-light" role="button">На главную</a>
</div>

{% endblock %}
6 changes: 3 additions & 3 deletions src/jobs/templates/jobs/job_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
<div class="row py-lg-5">
<div class="col-lg-6 col-md-8 mx-auto">
<p class="fw-light h1">Привет!</p>
<p class="lead text-muted">Меня зовут Иван Иванов. <br />Я профессионально занимаюсь разработкой на Python.</p>
<p class="lead text-muted">Меня зовут Дмитрий Зубарев. <br />Я профессионально занимаюсь разработкой на Python.</p>
<p>
<img src="{% static 'images/my_photo.jpeg' %}" height="300" alt="Иван Иванов"/>
<img src="{% static 'images/my_photo.jpeg' %}" height="300" alt="Дмитрий Зубарев"/>
</p>
<p>
<a href="mailto:username(att)somemailserver(dott)com" class="btn btn-primary my-2">Написать мне</a>
Expand All @@ -33,7 +33,7 @@
alt="job image"/>

<div class="card-body">
<p class="card-text">{{ job.description }}</p>
<p class="card-text">{{ job.summary|safe }}</p>
<div class="d-flex justify-content-between align-items-center">
<div class="btn-group">
<a href="#" type="button" class="btn btn-sm btn-outline-secondary">Подробнее</a>
Expand Down
32 changes: 32 additions & 0 deletions src/jobs/tests.py
Original file line number Diff line number Diff line change
@@ -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})')
9 changes: 9 additions & 0 deletions src/jobs/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from django.urls import path
from jobs.views import IndexJobDetailedView


urlpatterns = [
path("<int:pk>/",
IndexJobDetailedView.as_view(),
name="job"),
]
6 changes: 5 additions & 1 deletion src/jobs/views.py
Original file line number Diff line number Diff line change
@@ -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
2 changes: 2 additions & 0 deletions src/portfolio/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
# созданные приложения
"jobs.apps.JobsConfig",
"blog.apps.BlogConfig",
"author.apps.AuthorConfig",
# установленные приложения
"ckeditor",
"ckeditor_uploader",
Expand Down Expand Up @@ -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",
],
},
},
Expand Down
6 changes: 3 additions & 3 deletions src/portfolio/templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@ <h4 class="text-white">Обо мне</h4>
<div class="col-sm-4 offset-md-1 py-4">
<h4 class="text-white">Мои контакты</h4>
<ul class="list-unstyled">
<li><a href="#" class="text-white">Резюме</a></li>
<li><a href="https://github.com" target="_blank" class="text-white">GitHub</a></li>
<li><a href="mailto:username(att)somemailserver(dott)com" class="text-white">Email</a></li>
<li><a href="{{ author.resume_url }}" class="text-white">Резюме</a></li>
<li><a href="{{ author.github_url}}" target="_blank" class="text-white">GitHub</a></li>
<li><a href="mailto:{{ author.email }}" class="text-white">Email</a></li>
</ul>
</div>
</div>
Expand Down
1 change: 1 addition & 0 deletions src/portfolio/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -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))