From 346c3ff2dcb3656a46a1af32bf916d6eefb1c722 Mon Sep 17 00:00:00 2001 From: Sergey Date: Tue, 12 Jul 2022 19:00:03 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D1=81=D1=82=D0=BE=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BC=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../djando_hw/bank/cards/migrations/0001_initial.py | 10 +++++----- .../homeworks/djando_hw/bank/cards/models.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Shops/beauty_saloon/homeworks/djando_hw/bank/cards/migrations/0001_initial.py b/Shops/beauty_saloon/homeworks/djando_hw/bank/cards/migrations/0001_initial.py index cd9b5ef..071cef4 100644 --- a/Shops/beauty_saloon/homeworks/djando_hw/bank/cards/migrations/0001_initial.py +++ b/Shops/beauty_saloon/homeworks/djando_hw/bank/cards/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.0.5 on 2022-07-01 10:03 +# Generated by Django 4.0.5 on 2022-07-01 13:24 import datetime from django.db import migrations, models @@ -17,7 +17,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Account', fields=[ - ('iban', models.UUIDField(default=uuid.UUID('c52094dc-82ce-46f7-9618-54c285d4bd75'), primary_key=True, serialize=False)), + ('iban', models.UUIDField(default=uuid.UUID('198fb542-5ea9-4a3f-b82b-5ecc45664d72'), primary_key=True, serialize=False)), ('sum', models.PositiveIntegerField(default=0)), ], options={ @@ -29,7 +29,7 @@ class Migration(migrations.Migration): fields=[ ('name', models.CharField(max_length=255)), ('age', models.IntegerField()), - ('uuid', models.UUIDField(default=uuid.UUID('53bb4abc-4c2f-4c7f-9045-1c611c6eadfa'), primary_key=True, serialize=False)), + ('uuid', models.UUIDField(default=uuid.UUID('52e6c374-1d6d-4904-85ac-cdc04fc08780'), primary_key=True, serialize=False)), ], options={ 'db_table': 'users', @@ -39,9 +39,9 @@ class Migration(migrations.Migration): name='Card', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('number', models.PositiveBigIntegerField(max_length=16)), + ('number', models.PositiveBigIntegerField()), ('expiration_date', models.DateField(default=datetime.date(2025, 7, 1))), - ('cvv', models.IntegerField(max_length=3)), + ('cvv', models.IntegerField()), ('account', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cards.account')), ('user_name', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cards.user')), ], diff --git a/Shops/beauty_saloon/homeworks/djando_hw/bank/cards/models.py b/Shops/beauty_saloon/homeworks/djando_hw/bank/cards/models.py index f37eee5..8375a11 100644 --- a/Shops/beauty_saloon/homeworks/djando_hw/bank/cards/models.py +++ b/Shops/beauty_saloon/homeworks/djando_hw/bank/cards/models.py @@ -5,11 +5,11 @@ # Create your models here. class Card(models.Model): - number = models.PositiveBigIntegerField(max_length=16, null=False) + number = models.PositiveBigIntegerField(null=False) expiration_date = models.DateField(default=(date.today() + relativedelta(years=3))) user_name = models.ForeignKey('User', on_delete=models.CASCADE, null=False) account = models.ForeignKey('Account', on_delete=models.CASCADE, null=False) - cvv = models.IntegerField(null=False, max_length=3) + cvv = models.IntegerField(null=False) class Meta: db_table = 'cards' From 0565d9790212073bb2e334078e6bca33380f837a Mon Sep 17 00:00:00 2001 From: Sergey Date: Thu, 28 Jul 2022 15:21:39 +0300 Subject: [PATCH 2/2] [#H22].(adding an easy level) --- .../homeworks/djando_hw/todo/README.md | 18 +++ .../homeworks/djando_hw/todo/manage.py | 22 +++ .../homeworks/djando_hw/todo/plan/__init__.py | 0 .../homeworks/djando_hw/todo/plan/admin.py | 3 + .../homeworks/djando_hw/todo/plan/apps.py | 6 + .../homeworks/djando_hw/todo/plan/forms.py | 50 +++++++ .../todo/plan/migrations/0001_initial.py | 34 +++++ .../todo/plan/migrations/__init__.py | 0 .../homeworks/djando_hw/todo/plan/models.py | 31 +++++ .../homeworks/djando_hw/todo/plan/tests.py | 3 + .../homeworks/djando_hw/todo/plan/urls.py | 17 +++ .../homeworks/djando_hw/todo/plan/views.py | 47 +++++++ .../djando_hw/todo/templates/base.html | 31 +++++ .../todo/templates/plan/event_add.html | 51 +++++++ .../todo/templates/plan/event_delete.html | 21 +++ .../todo/templates/plan/event_detail.html | 48 +++++++ .../todo/templates/plan/event_list.html | 27 ++++ .../todo/templates/plan/event_update.html | 47 +++++++ .../homeworks/djando_hw/todo/todo/__init__.py | 0 .../homeworks/djando_hw/todo/todo/asgi.py | 16 +++ .../homeworks/djando_hw/todo/todo/settings.py | 126 ++++++++++++++++++ .../homeworks/djando_hw/todo/todo/urls.py | 23 ++++ .../homeworks/djando_hw/todo/todo/wsgi.py | 16 +++ 23 files changed, 637 insertions(+) create mode 100644 Shops/beauty_saloon/homeworks/djando_hw/todo/README.md create mode 100644 Shops/beauty_saloon/homeworks/djando_hw/todo/manage.py create mode 100644 Shops/beauty_saloon/homeworks/djando_hw/todo/plan/__init__.py create mode 100644 Shops/beauty_saloon/homeworks/djando_hw/todo/plan/admin.py create mode 100644 Shops/beauty_saloon/homeworks/djando_hw/todo/plan/apps.py create mode 100644 Shops/beauty_saloon/homeworks/djando_hw/todo/plan/forms.py create mode 100644 Shops/beauty_saloon/homeworks/djando_hw/todo/plan/migrations/0001_initial.py create mode 100644 Shops/beauty_saloon/homeworks/djando_hw/todo/plan/migrations/__init__.py create mode 100644 Shops/beauty_saloon/homeworks/djando_hw/todo/plan/models.py create mode 100644 Shops/beauty_saloon/homeworks/djando_hw/todo/plan/tests.py create mode 100644 Shops/beauty_saloon/homeworks/djando_hw/todo/plan/urls.py create mode 100644 Shops/beauty_saloon/homeworks/djando_hw/todo/plan/views.py create mode 100644 Shops/beauty_saloon/homeworks/djando_hw/todo/templates/base.html create mode 100644 Shops/beauty_saloon/homeworks/djando_hw/todo/templates/plan/event_add.html create mode 100644 Shops/beauty_saloon/homeworks/djando_hw/todo/templates/plan/event_delete.html create mode 100644 Shops/beauty_saloon/homeworks/djando_hw/todo/templates/plan/event_detail.html create mode 100644 Shops/beauty_saloon/homeworks/djando_hw/todo/templates/plan/event_list.html create mode 100644 Shops/beauty_saloon/homeworks/djando_hw/todo/templates/plan/event_update.html create mode 100644 Shops/beauty_saloon/homeworks/djando_hw/todo/todo/__init__.py create mode 100644 Shops/beauty_saloon/homeworks/djando_hw/todo/todo/asgi.py create mode 100644 Shops/beauty_saloon/homeworks/djando_hw/todo/todo/settings.py create mode 100644 Shops/beauty_saloon/homeworks/djando_hw/todo/todo/urls.py create mode 100644 Shops/beauty_saloon/homeworks/djando_hw/todo/todo/wsgi.py diff --git a/Shops/beauty_saloon/homeworks/djando_hw/todo/README.md b/Shops/beauty_saloon/homeworks/djando_hw/todo/README.md new file mode 100644 index 0000000..65e2eb5 --- /dev/null +++ b/Shops/beauty_saloon/homeworks/djando_hw/todo/README.md @@ -0,0 +1,18 @@ +# TODO приложение +Небольшое приложение, позволяющее следить за своей продуктивностью, однако в нем есть несколько мест, которые стоит исправить. Бэкэнд написан на Django, стили на фронтенд сделаны при помощи фреймворка Bootstrap 5, про него не принципиально читать, но для некоторых заданий надо будет погуглить, благо у него очень большая и понятная документация. + +### 1. EASY +1. Запустите приложение, создайте несколько событий с разными статусами. +2. Добавьте сохранение данных не в sqlite3, а в postrgesql. +3. Почему-то перестал работать метод удаления событий, надо что-то с этим сделать... + +### 2. MEDIUM +1. Есть возможность добавить дэдлайн события вчерашним днем, а также до старта события... Надо сделать, чтобы нельзя было. +2. Сделать так, чтобы нельзя было поставить дэдлайн позже чем старт более чем на 2 недели. Если пользователь например выбрал 10.08.2022 как старт, то максимальный дэдлайн, который он может поставить, должен быть 24.08.2022. +3. При создании события, когда выбираешь "зависит от", показаны какие-то цифры... Было бы круто если бы там были названия других событий. +4. Классно было бы подсвечивать в общем списке событий желтым те, что IN PROGRESS. +5. Было бы классно если бы над списком всех событий стояли кнопочки in progress, finished, is waiting, expired, blocked, при нажатии на которые показывались бы только события с этим статусом. + +### 3. HARD +1. Было бы классно иметь какую-то вкладку аналитики, где бы в процентном соотношении показывалось соотношение событий с разными статусами к общему количеству событий. Круто было бы еще иметь вверху, там где можно посмотреть все события и создать новое, кнопку "Аналитика" :) +2. Добавить логику, что если, событие, от которого зависит текущее, не в статусе FINISHED, то не позволять завершать и текущее. diff --git a/Shops/beauty_saloon/homeworks/djando_hw/todo/manage.py b/Shops/beauty_saloon/homeworks/djando_hw/todo/manage.py new file mode 100644 index 0000000..244b614 --- /dev/null +++ b/Shops/beauty_saloon/homeworks/djando_hw/todo/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'todo.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/__init__.py b/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/admin.py b/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/apps.py b/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/apps.py new file mode 100644 index 0000000..451b518 --- /dev/null +++ b/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class PlanConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'plan' diff --git a/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/forms.py b/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/forms.py new file mode 100644 index 0000000..301f8b0 --- /dev/null +++ b/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/forms.py @@ -0,0 +1,50 @@ +from datetime import date, timedelta + +from django import forms + +from .models import Event + + +class EventForm(forms.ModelForm): + class Meta: + model = Event + fields = [ + 'started_at', 'finished_at', 'title', + 'description', 'depends_on', 'status', + ] + widgets = { + 'title': forms.TextInput(attrs={ + 'class': 'form-control', + }), + 'description': forms.Textarea(attrs={ + 'class': 'form-control', + }), + 'finished_at': forms.DateInput(attrs={ + 'type': 'date', + 'class': 'form-control', + }), + 'started_at': forms.DateInput(attrs={ + 'type': 'date', + 'class': 'form-control', + }), + 'status': forms.Select(attrs={ + 'class': 'form-select', + }), + 'depends_on': forms.Select(attrs={ + 'class': 'form-select', + }) + } + + def clean_started_at(self): + started_at = self.cleaned_data['started_at'] + finished_at = self.cleaned_data['finished_at'] + + if started_at < date.today(): + raise forms.ValidationError("Вы не можете создать событие, которое начась в прошлом!") + elif finished_at < date.today(): + raise forms.ValidationError("Вы не можете создать событие, которое закончилось до начала!") + elif finished_at > date.today() + timedelta(days=14): + raise forms.ValidationError("Дедлайн не может быть дальше чем через 14 дней от начала события!") + + return started_at + diff --git a/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/migrations/0001_initial.py b/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/migrations/0001_initial.py new file mode 100644 index 0000000..7f779e3 --- /dev/null +++ b/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/migrations/0001_initial.py @@ -0,0 +1,34 @@ +# Generated by Django 4.0.6 on 2022-07-26 07:12 + +import datetime +from django.db import migrations, models +import django.db.models.deletion +import plan.models +import uuid + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Event', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), + ('created_at', models.DateField(default=datetime.date.today)), + ('started_at', models.DateField(default=datetime.date.today)), + ('finished_at', models.DateField(default=datetime.date.today)), + ('title', models.CharField(max_length=200)), + ('description', models.TextField()), + ('status', models.CharField(choices=[('is waiting', 'IS_WAITING'), ('in progress', 'IN_PROGRESS'), ('finished', 'FINISHED'), ('expired', 'EXPIRED'), ('blocked', 'BLOCKED')], default=plan.models.Status['IN_PROGRESS'], max_length=20)), + ('depends_on', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='plan.event')), + ], + options={ + 'db_table': 'events', + }, + ), + ] diff --git a/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/migrations/__init__.py b/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/models.py b/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/models.py new file mode 100644 index 0000000..ce0357a --- /dev/null +++ b/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/models.py @@ -0,0 +1,31 @@ +from turtle import color +from django.db import models +from datetime import date +from enum import Enum +from uuid import uuid4 + + +class Status(Enum): + IS_WAITING = "is waiting" + IN_PROGRESS = "in progress" + FINISHED = "finished" + EXPIRED = "expired" + BLOCKED = "blocked" + + @classmethod + def choices(cls): + return [(item.value, item.name) for item in cls] + + +class Event(models.Model): + id = models.UUIDField(primary_key=True, default=uuid4) + created_at = models.DateField(default=date.today) + started_at = models.DateField(default=date.today) + finished_at = models.DateField(default=date.today) + title = models.CharField(max_length=200, null=False, blank=False) + description = models.TextField() + depends_on = models.ForeignKey('Event', on_delete=models.CASCADE, null=True, blank=True) + status = models.CharField(max_length=20, choices=Status.choices(), default=Status.IN_PROGRESS) + + class Meta: + db_table = "events" diff --git a/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/tests.py b/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/urls.py b/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/urls.py new file mode 100644 index 0000000..ab801f5 --- /dev/null +++ b/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/urls.py @@ -0,0 +1,17 @@ +from django.urls import path +from .views import ( + EventCreateView, + EventListView, + EventDetailView, + EventDeleteView, + EventUpdateView, +) + +urlpatterns = [ + path("", view=EventCreateView.as_view(), name="event-add"), + path("add/", view=EventCreateView.as_view(), name="event-add"), + path("list/", view=EventListView.as_view(), name="event-list"), + path("/", view=EventDetailView.as_view(), name="event-detail"), + path("/delete", view=EventDeleteView.as_view(), name="event-delete"), + path("/update", view=EventUpdateView.as_view(), name="event-update"), +] diff --git a/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/views.py b/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/views.py new file mode 100644 index 0000000..194b99a --- /dev/null +++ b/Shops/beauty_saloon/homeworks/djando_hw/todo/plan/views.py @@ -0,0 +1,47 @@ +from django.views.generic import ( + CreateView, + DetailView, + DeleteView, + ListView, + UpdateView, +) +from django.urls import reverse + +from .forms import EventForm +from .models import Event + + +class EventCreateView(CreateView): + template_name: str = "plan/event_add.html" + form_class: type = EventForm + + def get_success_url(self): + return reverse('event-list') + + +class EventListView(ListView): + template_name: str = "plan/event_list.html" + model: type = Event + + +class EventDetailView(DetailView): + template_name: str = "plan/event_detail.html" + model: type = Event + + +class EventDeleteView(DeleteView): + template_name: str = "plan/event_delete.html" + model: type = Event + success_url: str = "#" + + def get_success_url(self): + return reverse('event-list') + + +class EventUpdateView(UpdateView): + template_name: str = "plan/event_update.html" + form_class: type = EventForm + model = Event + + def get_success_url(self): + return reverse('event-list') diff --git a/Shops/beauty_saloon/homeworks/djando_hw/todo/templates/base.html b/Shops/beauty_saloon/homeworks/djando_hw/todo/templates/base.html new file mode 100644 index 0000000..d211bb7 --- /dev/null +++ b/Shops/beauty_saloon/homeworks/djando_hw/todo/templates/base.html @@ -0,0 +1,31 @@ + + + + + + + + {% block title %}Base title{% endblock %} + + + + + + + +
+ + + + {% block sidebar %}{% endblock %} + {% block content %}{% endblock %} +
+ + \ No newline at end of file diff --git a/Shops/beauty_saloon/homeworks/djando_hw/todo/templates/plan/event_add.html b/Shops/beauty_saloon/homeworks/djando_hw/todo/templates/plan/event_add.html new file mode 100644 index 0000000..acaaff3 --- /dev/null +++ b/Shops/beauty_saloon/homeworks/djando_hw/todo/templates/plan/event_add.html @@ -0,0 +1,51 @@ +{% extends "base.html" %} + +{% block bar_add %}class="nav-link active" {% endblock %} + + +{% block content %} + +
+ {% csrf_token %} + +
+

Добавить событие

+ +
+ Название + {{ form.title }} +
+ +
+ Описание + {{ form.description }} +
+ +
+ Статус + {{ form.status }} +
+ +
+ Зависит от + {{ form.depends_on }} +
+ +
+ Старт + {{ form.started_at }} + Дэдлайн + {{ form.finished_at }} +
+ + {{form.started_at.errors}} + {{form.finished_at.errors}} + + + +
+
+ +{% endblock %} \ No newline at end of file diff --git a/Shops/beauty_saloon/homeworks/djando_hw/todo/templates/plan/event_delete.html b/Shops/beauty_saloon/homeworks/djando_hw/todo/templates/plan/event_delete.html new file mode 100644 index 0000000..214e40f --- /dev/null +++ b/Shops/beauty_saloon/homeworks/djando_hw/todo/templates/plan/event_delete.html @@ -0,0 +1,21 @@ +{% extends "base.html" %} +{% csrf_token %} + +{% block content %} + + +
+ {% csrf_token %} +
+

А ты уверен, что хочешь удалить событие "{{ object.title }}"?

+ + {{ form }} + + + +
+
+ +{% endblock %} \ No newline at end of file diff --git a/Shops/beauty_saloon/homeworks/djando_hw/todo/templates/plan/event_detail.html b/Shops/beauty_saloon/homeworks/djando_hw/todo/templates/plan/event_detail.html new file mode 100644 index 0000000..4a126e0 --- /dev/null +++ b/Shops/beauty_saloon/homeworks/djando_hw/todo/templates/plan/event_detail.html @@ -0,0 +1,48 @@ +{% extends "base.html" %} + +{% block content %} + +
+ +

{{ object.title }} ({{ object.status }})

+ + +
+
+
+

{{ object.description }}

+ +
+ + +
+
+
+
Старт: {{ object.started_at }}
+
+
+
Истекает: {{ object.finished_at }}
+
+
+
+ + {% if object.depends_on %} +
+

Зависит от {{ object.depends_on.title }}

+
+ {% endif %} +
+
+ + + +
+ +{% endblock %} \ No newline at end of file diff --git a/Shops/beauty_saloon/homeworks/djando_hw/todo/templates/plan/event_list.html b/Shops/beauty_saloon/homeworks/djando_hw/todo/templates/plan/event_list.html new file mode 100644 index 0000000..84c9396 --- /dev/null +++ b/Shops/beauty_saloon/homeworks/djando_hw/todo/templates/plan/event_list.html @@ -0,0 +1,27 @@ +{% extends "base.html" %} + +{% block bar_list %}class="nav-link active" {% endblock %} + +{% block content %} +
+ +

Твои события:

+ +
+ + {% for event in object_list %} + {% if event.status == "expired" %} + {{ event.title }} + {% elif event.status == "finished" %} + {{ event.title }} + {% else %} + {{ event.title }} + {% endif %} + {% empty %} + Попробуй добавь какое-нибудь событие... + {% endfor %} + +
+ +
+{% endblock %} \ No newline at end of file diff --git a/Shops/beauty_saloon/homeworks/djando_hw/todo/templates/plan/event_update.html b/Shops/beauty_saloon/homeworks/djando_hw/todo/templates/plan/event_update.html new file mode 100644 index 0000000..1ef945d --- /dev/null +++ b/Shops/beauty_saloon/homeworks/djando_hw/todo/templates/plan/event_update.html @@ -0,0 +1,47 @@ +{% extends "base.html" %} + +{% block bar_add %}class="nav-link active" {% endblock %} + + +{% block content %} + +
{% csrf_token %} + +
+ +

Обновить событие

+ +
+ Название + {{ form.title }} +
+ +
+ Описание + {{ form.description }} +
+ +
+ Статус + {{ form.status }} +
+ +
+ Зависит от + {{ form.depends_on }} +
+ +
+ Старт + {{ form.started_at }} + Дэдлайн + {{ form.finished_at }} +
+ + +
+
+ +{% endblock %} \ No newline at end of file diff --git a/Shops/beauty_saloon/homeworks/djando_hw/todo/todo/__init__.py b/Shops/beauty_saloon/homeworks/djando_hw/todo/todo/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Shops/beauty_saloon/homeworks/djando_hw/todo/todo/asgi.py b/Shops/beauty_saloon/homeworks/djando_hw/todo/todo/asgi.py new file mode 100644 index 0000000..54e3b5e --- /dev/null +++ b/Shops/beauty_saloon/homeworks/djando_hw/todo/todo/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for todo project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.0/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'todo.settings') + +application = get_asgi_application() diff --git a/Shops/beauty_saloon/homeworks/djando_hw/todo/todo/settings.py b/Shops/beauty_saloon/homeworks/djando_hw/todo/todo/settings.py new file mode 100644 index 0000000..468067c --- /dev/null +++ b/Shops/beauty_saloon/homeworks/djando_hw/todo/todo/settings.py @@ -0,0 +1,126 @@ +""" +Django settings for todo project. + +Generated by 'django-admin startproject' using Django 4.0.6. + +For more information on this file, see +https://docs.djangoproject.com/en/4.0/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/4.0/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-43!o6nwy5rckcbh-g(+2qvpumgt)gcsibvdnjhg-o)+obw8p17' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'plan', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'todo.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [BASE_DIR.joinpath('templates')], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'todo.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/4.0/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'NAME': 'tasks', + 'USER': 'admin', + 'PASSWORD': 'admin', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/4.0/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/4.0/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/4.0/howto/static-files/ + +STATIC_URL = 'static/' + +# Default primary key field type +# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/Shops/beauty_saloon/homeworks/djando_hw/todo/todo/urls.py b/Shops/beauty_saloon/homeworks/djando_hw/todo/todo/urls.py new file mode 100644 index 0000000..0f14666 --- /dev/null +++ b/Shops/beauty_saloon/homeworks/djando_hw/todo/todo/urls.py @@ -0,0 +1,23 @@ +"""todo URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/4.0/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path, include + +urlpatterns = [ + path("", include('plan.urls')), + path('admin/', admin.site.urls), + path('events/', include('plan.urls')), +] diff --git a/Shops/beauty_saloon/homeworks/djando_hw/todo/todo/wsgi.py b/Shops/beauty_saloon/homeworks/djando_hw/todo/todo/wsgi.py new file mode 100644 index 0000000..586f90b --- /dev/null +++ b/Shops/beauty_saloon/homeworks/djando_hw/todo/todo/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for todo project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.0/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'todo.settings') + +application = get_wsgi_application()