├── .gitignore ├── LICENSE.MD ├── README.md ├── additional01 ├── .gitignore ├── README.md ├── alch_app │ ├── __init__.py │ ├── db.py │ └── models.py ├── alembic.ini ├── migrations │ ├── env.py │ ├── script.py.mako │ └── versions │ │ └── d995061aeb75_add_age_field.py ├── my_database.db └── requirements.txt ├── lesson1 ├── my_first_flask.py └── repeat.py ├── lesson10 ├── app.py ├── config.py ├── forms.py ├── models.py ├── requirements.txt └── templates │ ├── 403.html │ ├── 404.html │ ├── index.html │ ├── towns.html │ └── users.html ├── lesson11 ├── app.py ├── config.py ├── forms.py ├── models.py ├── requirements.txt └── templates │ ├── 401.html │ ├── 403.html │ ├── 404.html │ ├── index.html │ ├── user_info.html │ └── users.html ├── lesson12 ├── app.py ├── config.py ├── models.py ├── my_client.py └── requirements.txt ├── lesson13 ├── analytics.py ├── app.py ├── client_test.py ├── config.py ├── models.py ├── posts_resources.py └── requirements.txt ├── lesson14 └── my_app │ ├── config.py │ ├── finances │ ├── __init__.py │ ├── forms.py │ ├── models.py │ └── routes.py │ ├── requirements.txt │ └── server.py ├── lesson15 ├── first_project │ ├── first_project │ │ ├── __init__.py │ │ ├── asgi.py │ │ ├── settings.py │ │ ├── urls.py │ │ └── wsgi.py │ ├── manage.py │ └── posts │ │ ├── __init__.py │ │ ├── apps.py │ │ ├── migrations │ │ └── __init__.py │ │ ├── templates │ │ ├── base.html │ │ └── index.html │ │ └── views.py └── requirements.txt ├── lesson16 └── my_proj_app │ ├── manage.py │ ├── media │ └── img │ │ └── cat.jpg │ ├── my_proj │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py │ ├── posts │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── forms.py │ ├── migrations │ │ └── __init__.py │ ├── urls.py │ └── views.py │ ├── static │ └── css │ │ └── style.css │ └── templates │ ├── form.html │ └── index.html ├── lesson17 └── my_proj_main │ ├── manage.py │ ├── my_proj │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py │ ├── posts │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ ├── urls.py │ └── views.py │ └── templates │ └── posts │ ├── posts_detail.html │ └── posts_list.html ├── lesson18 └── my_edu_project │ ├── manage.py │ ├── my_edu │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py │ ├── posts │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── forms.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_alter_post_author_alter_post_tags_alter_post_text_and_more.py │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ ├── urls.py │ └── views.py │ └── templates │ └── posts │ ├── posts_detail.html │ └── posts_list.html ├── lesson19 └── my_edu_project │ ├── manage.py │ ├── my_edu │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py │ ├── posts │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── forms.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_alter_post_options_alter_post_author_alter_post_tags_and_more.py │ │ ├── 0003_alter_post_options.py │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ ├── urls.py │ └── views.py │ └── templates │ └── posts │ ├── posts_detail.html │ └── posts_list.html ├── lesson2 ├── a_static_files.py ├── b_temp.html ├── c_news_pub.py ├── db │ └── database.db ├── repeat.py └── static │ ├── css │ └── style.css │ └── img │ └── cat.jpg ├── lesson20 └── my_edu_project │ ├── manage.py │ ├── my_edu │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py │ ├── posts │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_alter_post_text.py │ │ ├── 0003_alter_post_text.py │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ ├── urls.py │ └── views.py │ └── templates │ └── posts │ ├── posts_detail.html │ └── posts_list.html ├── lesson21 └── my_edu_project │ ├── manage.py │ ├── my_edu │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py │ ├── templates │ ├── registration │ │ ├── login.html │ │ └── register.html │ └── users │ │ └── index.html │ └── users │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── forms.py │ ├── migrations │ ├── 0001_initial.py │ ├── 0002_customuser_is_married.py │ ├── 0003_alter_customuser_birth_date.py │ └── __init__.py │ ├── models.py │ ├── urls.py │ └── views.py ├── lesson22 └── my_edu_project │ ├── manage.py │ ├── my_edu │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py │ ├── posts │ ├── __init__.py │ ├── apps.py │ ├── migrations │ │ ├── 0001_initial.py │ │ └── __init__.py │ ├── models.py │ ├── urls.py │ └── views.py │ └── templates │ └── posts │ ├── contacts.html │ ├── post_list.html │ └── post_list_new.html ├── lesson23 └── final_project │ ├── core │ ├── __init__.py │ ├── apps.py │ ├── migrations │ │ └── __init__.py │ └── views.py │ ├── final │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py │ ├── manage.py │ ├── posts │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_alter_post_options.py │ │ ├── 0003_alter_post_options_post_image.py │ │ ├── 0004_alter_post_text.py │ │ └── __init__.py │ ├── models.py │ ├── urls.py │ ├── validators.py │ └── views.py │ ├── templates │ ├── base.html │ ├── core │ │ └── 404.html │ ├── index.html │ ├── posts │ │ ├── post_detail.html │ │ ├── post_form.html │ │ └── post_list.html │ └── users │ │ ├── login.html │ │ └── register.html │ └── users │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── forms.py │ ├── migrations │ ├── 0001_initial.py │ └── __init__.py │ ├── models.py │ ├── urls.py │ └── views.py ├── lesson24 └── my_edu_project │ ├── manage.py │ ├── my_edu │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py │ └── posts │ ├── __init__.py │ ├── apps.py │ ├── migrations │ ├── 0001_initial.py │ └── __init__.py │ ├── models.py │ ├── serializers.py │ ├── urls.py │ └── views.py ├── lesson25 └── my_edu_project │ ├── manage.py │ ├── my_edu │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py │ └── posts │ ├── __init__.py │ ├── apps.py │ ├── migrations │ ├── 0001_initial.py │ ├── 0002_alter_post_pub_date.py │ └── __init__.py │ ├── models.py │ ├── serializers.py │ ├── urls.py │ └── views.py ├── lesson26 └── my_edu_project │ ├── manage.py │ ├── my_edu │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py │ └── posts │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ ├── 0001_initial.py │ ├── 0002_category_post_category.py │ ├── 0003_post_create_date.py │ └── __init__.py │ ├── models.py │ ├── serializers.py │ ├── urls.py │ └── views.py ├── lesson27 └── my_edu_project │ ├── manage.py │ ├── my_edu │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py │ └── posts │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ ├── 0001_initial.py │ └── __init__.py │ ├── models.py │ ├── serializers.py │ ├── urls.py │ └── views.py ├── lesson28 └── my_edu_project │ ├── manage.py │ ├── my_edu │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py │ ├── posts │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ ├── 0001_initial.py │ │ └── __init__.py │ ├── models.py │ ├── serializers.py │ ├── urls.py │ └── views.py │ └── users │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ ├── 0001_initial.py │ └── __init__.py │ ├── models.py │ ├── tests.py │ └── views.py ├── lesson29 └── my_edu_project │ ├── manage.py │ ├── my_edu │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py │ └── posts │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ ├── 0001_initial.py │ ├── 0002_post.py │ ├── 0003_alter_post_options.py │ └── __init__.py │ ├── models.py │ ├── pagination.py │ ├── serializers.py │ ├── urls.py │ └── views.py ├── lesson3 ├── main.py ├── repeat.py ├── static │ └── css │ │ └── style.css └── templates │ ├── about.html │ ├── base.html │ └── home.html ├── lesson30 └── my_edu_project │ ├── manage.py │ ├── my_edu │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py │ └── posts │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ ├── 0001_initial.py │ ├── 0002_post.py │ └── __init__.py │ ├── models.py │ ├── permissions.py │ ├── serializers.py │ ├── urls.py │ └── views.py ├── lesson31 ├── my_edu_project │ ├── manage.py │ ├── my_edu │ │ ├── __init__.py │ │ ├── asgi.py │ │ ├── settings.py │ │ ├── urls.py │ │ └── wsgi.py │ └── posts │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── filters.py │ │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_post.py │ │ └── __init__.py │ │ ├── models.py │ │ ├── serializers.py │ │ ├── urls.py │ │ └── views.py └── requirements.txt ├── lesson32 ├── final_project │ ├── final │ │ ├── __init__.py │ │ ├── asgi.py │ │ ├── settings.py │ │ ├── urls.py │ │ └── wsgi.py │ ├── manage.py │ ├── news │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── migrations │ │ │ ├── 0001_initial.py │ │ │ └── __init__.py │ │ ├── models.py │ │ ├── serializers.py │ │ ├── urls.py │ │ └── views.py │ ├── posts │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── migrations │ │ │ ├── 0001_initial.py │ │ │ ├── 0002_posttag_post_tag.py │ │ │ └── __init__.py │ │ ├── models.py │ │ ├── pagination.py │ │ ├── permissions.py │ │ ├── serializers.py │ │ ├── tests.py │ │ ├── urls.py │ │ └── views.py │ └── users │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── migrations │ │ ├── 0001_initial.py │ │ └── __init__.py │ │ └── models.py └── requirements.txt ├── lesson4 ├── .env ├── .gitignore ├── my_forms.py ├── repeat.py ├── static │ └── css │ │ └── style.css ├── templates │ ├── base.html │ ├── form_old.html │ ├── home.html │ └── success.html └── templates_old │ ├── base.html │ └── index.html ├── lesson5 ├── data │ └── instance │ │ └── my_db.db ├── main.py └── templates │ ├── index.html │ └── posts.html ├── lesson6 ├── config.py ├── instance │ └── my_db.db ├── main.py ├── models.py └── templates │ ├── index.html │ └── posts.html ├── lesson7 ├── app.py ├── config.py ├── forms.py ├── models.py ├── requirements.txt ├── templates │ ├── author_posts.html │ ├── authors.html │ ├── index.html │ ├── posts.html │ └── single_post.html └── venv_commands.py ├── lesson8 ├── app.py ├── config.py ├── forms.py ├── models.py ├── requirements.txt └── templates │ ├── index.html │ └── users.html └── lesson9 ├── app.py ├── config.py ├── forms.py ├── models.py ├── requirements.txt └── templates ├── index.html ├── towns.html └── users.html /README.md: -------------------------------------------------------------------------------- 1 | # Intense_IT 2 | ## Разработка на Python 3 | ## 3 модуль 2023 года 4 | 5 | Здесь содержатся материалы с занятий курсов Intense_IT 6 | 3 модуля (освоение Flask и Django) 7 | по направлению Бэкенд-разработка на Python. 8 | 9 | Блоки материалов выкладываются по мере проведения занятий. 10 | Каждое занятие в отдельной папке lesson 11 | с соответствующим порядковым номером. 12 | 13 | Код написан на Python 3.11.3, Flask 3.0, Django 5.0 14 | -------------------------------------------------------------------------------- /additional01/.gitignore: -------------------------------------------------------------------------------- 1 | *__pycache__ 2 | *venv 3 | *env 4 | -------------------------------------------------------------------------------- /additional01/alch_app/__init__.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from sqlalchemy import select 3 | 4 | from alch_app.db import session 5 | from alch_app.models import User 6 | 7 | 8 | app = Flask(__name__) 9 | 10 | 11 | @app.route('/') 12 | def index(): 13 | # CREATE 14 | new_user = User(username='user1', email='user1@mail.ru') 15 | session.add(new_user) 16 | session.commit() 17 | 18 | # READ 19 | user1 = session.get(User, 1) 20 | print(user1) 21 | user2 = session.execute( 22 | select(User).filter_by(username='user1')).scalar_one() 23 | print(user2) 24 | 25 | users = session.execute(select(User).order_by(User.username)).scalars() 26 | for elem in users: 27 | print(elem) 28 | 29 | # UPDATE 30 | user = session.execute( 31 | select(User).filter_by(username='user1')).scalar_one() 32 | user.email = 'user2@yandex.ru' 33 | session.commit() 34 | 35 | # DELETE 36 | user = session.execute( 37 | select(User).filter_by(username='user1')).scalar_one() 38 | session.delete(user) 39 | session.commit() 40 | 41 | return 'SQLAlchemy works!' 42 | -------------------------------------------------------------------------------- /additional01/alch_app/db.py: -------------------------------------------------------------------------------- 1 | from sqlalchemy import create_engine 2 | from sqlalchemy.orm import sessionmaker, declarative_base 3 | 4 | DATABASE_URL = 'sqlite:///my_database.db' 5 | engine = create_engine(DATABASE_URL) 6 | 7 | Session = sessionmaker(bind=engine) 8 | 9 | session = Session() 10 | 11 | Base = declarative_base() 12 | 13 | 14 | def init_db(): 15 | import alch_app.models 16 | Base.metadata.create_all(bind=engine) 17 | -------------------------------------------------------------------------------- /additional01/alch_app/models.py: -------------------------------------------------------------------------------- 1 | from sqlalchemy import Column, Integer, String 2 | 3 | from alch_app.db import Base 4 | 5 | 6 | class User(Base): 7 | __tablename__ = 'users' 8 | 9 | id = Column(Integer, primary_key=True) 10 | username = Column(String(100), nullable=False) 11 | email = Column(String(100), nullable=False) 12 | age = Column(Integer, nullable=True) 13 | 14 | def __repr__(self): 15 | return f'' 16 | -------------------------------------------------------------------------------- /additional01/migrations/script.py.mako: -------------------------------------------------------------------------------- 1 | """${message} 2 | 3 | Revision ID: ${up_revision} 4 | Revises: ${down_revision | comma,n} 5 | Create Date: ${create_date} 6 | 7 | """ 8 | from typing import Sequence, Union 9 | 10 | from alembic import op 11 | import sqlalchemy as sa 12 | ${imports if imports else ""} 13 | 14 | # revision identifiers, used by Alembic. 15 | revision: str = ${repr(up_revision)} 16 | down_revision: Union[str, None] = ${repr(down_revision)} 17 | branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)} 18 | depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)} 19 | 20 | 21 | def upgrade() -> None: 22 | ${upgrades if upgrades else "pass"} 23 | 24 | 25 | def downgrade() -> None: 26 | ${downgrades if downgrades else "pass"} 27 | -------------------------------------------------------------------------------- /additional01/migrations/versions/d995061aeb75_add_age_field.py: -------------------------------------------------------------------------------- 1 | """Add age field 2 | 3 | Revision ID: d995061aeb75 4 | Revises: 5 | Create Date: 2024-04-16 20:28:42.237408 6 | 7 | """ 8 | from typing import Sequence, Union 9 | 10 | from alembic import op 11 | import sqlalchemy as sa 12 | 13 | 14 | # revision identifiers, used by Alembic. 15 | revision: str = 'd995061aeb75' 16 | down_revision: Union[str, None] = None 17 | branch_labels: Union[str, Sequence[str], None] = None 18 | depends_on: Union[str, Sequence[str], None] = None 19 | 20 | 21 | def upgrade() -> None: 22 | # ### commands auto generated by Alembic - please adjust! ### 23 | op.add_column('users', sa.Column('age', sa.Integer(), nullable=True)) 24 | # ### end Alembic commands ### 25 | 26 | 27 | def downgrade() -> None: 28 | # ### commands auto generated by Alembic - please adjust! ### 29 | op.drop_column('users', 'age') 30 | # ### end Alembic commands ### 31 | -------------------------------------------------------------------------------- /additional01/my_database.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/additional01/my_database.db -------------------------------------------------------------------------------- /additional01/requirements.txt: -------------------------------------------------------------------------------- 1 | alembic==1.13.1 2 | blinker==1.7.0 3 | click==8.1.7 4 | colorama==0.4.6 5 | Flask==3.0.3 6 | greenlet==3.0.3 7 | itsdangerous==2.1.2 8 | Jinja2==3.1.3 9 | Mako==1.3.3 10 | MarkupSafe==2.1.5 11 | SQLAlchemy==2.0.29 12 | typing_extensions==4.11.0 13 | Werkzeug==3.0.2 14 | -------------------------------------------------------------------------------- /lesson1/repeat.py: -------------------------------------------------------------------------------- 1 | # Создаем декоратор 2 | def func_info(func): 3 | def _f(*args): 4 | print('Все аргументы функции:', *args) 5 | func(*args) 6 | print('Выполнение функции окончено.') 7 | return _f 8 | 9 | 10 | @func_info # применяем декоратор при создании функции 11 | def sum1(num1, num2): 12 | return num1 + num2 13 | 14 | 15 | sum1(5, 10) 16 | -------------------------------------------------------------------------------- /lesson10/config.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from flask_sqlalchemy import SQLAlchemy 3 | from flask_migrate import Migrate 4 | from flask_wtf.csrf import CSRFProtect 5 | from flask_login import LoginManager 6 | 7 | 8 | app = Flask(__name__) 9 | app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///my_db.db' 10 | 11 | db = SQLAlchemy(app=app) 12 | 13 | SECRET_KEY = 'Мой секретный ключ' 14 | app.config['SECRET_KEY'] = SECRET_KEY 15 | csrf = CSRFProtect(app) 16 | 17 | migrate = Migrate(app, db) 18 | 19 | # Создали и подключили менеджер логинов к приложению 20 | login_manager = LoginManager(app) 21 | -------------------------------------------------------------------------------- /lesson10/forms.py: -------------------------------------------------------------------------------- 1 | from flask_wtf import FlaskForm 2 | from wtforms import StringField, SubmitField, PasswordField 3 | from wtforms.validators import DataRequired 4 | 5 | 6 | # Добавили в форму пользователя пароль 7 | class UserForm(FlaskForm): 8 | username = StringField('Имя', validators=[DataRequired()]) 9 | password = PasswordField('Пароль', validators=[DataRequired()]) 10 | address = StringField('Город проживания', validators=[DataRequired()]) 11 | submit = SubmitField('Добавить') 12 | 13 | 14 | class AddressForm(FlaskForm): 15 | town_name = StringField('Название города', validators=[DataRequired()]) 16 | submit = SubmitField('Добавить город') 17 | -------------------------------------------------------------------------------- /lesson10/requirements.txt: -------------------------------------------------------------------------------- 1 | alembic==1.13.0 2 | blinker==1.7.0 3 | click==8.1.7 4 | colorama==0.4.6 5 | Flask==3.0.0 6 | Flask-Migrate==4.0.5 7 | Flask-SQLAlchemy==3.1.1 8 | Flask-WTF==1.2.1 9 | greenlet==3.0.1 10 | install==1.3.5 11 | itsdangerous==2.1.2 12 | Jinja2==3.1.2 13 | Mako==1.3.0 14 | MarkupSafe==2.1.3 15 | SQLAlchemy==2.0.23 16 | typing_extensions==4.8.0 17 | Werkzeug==3.0.1 18 | WTForms==3.1.1 19 | -------------------------------------------------------------------------------- /lesson10/templates/403.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 |

В доступе отказано.

11 |
{{ error }}
12 | Главная 13 | 14 | -------------------------------------------------------------------------------- /lesson10/templates/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 |

Такой страницы не существует.

11 |
{{ error }}
12 | Главная 13 | 14 | -------------------------------------------------------------------------------- /lesson10/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 |

Главная страница

10 | 11 | 19 | 20 | -------------------------------------------------------------------------------- /lesson10/templates/towns.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Towns 7 | 8 | 9 |
10 |
{{ form.hidden_tag() }}
11 | {% for field in form if field.name != 'csrf_token' %} 12 |
13 | {{ field.label() }} 14 | {{ field() }} 15 |
16 | {% endfor %} 17 |
18 | 19 | 26 | 27 | -------------------------------------------------------------------------------- /lesson10/templates/users.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 |
10 |
{{ form.hidden_tag() }}
11 | {% for field in form if field.name != 'csrf_token' %} 12 |
13 | {{ field.label() }} 14 | {{ field() }} 15 |
16 | {% endfor %} 17 |
18 | 19 | 27 | 28 | -------------------------------------------------------------------------------- /lesson11/config.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from flask_sqlalchemy import SQLAlchemy 3 | from flask_migrate import Migrate 4 | from flask_wtf.csrf import CSRFProtect 5 | from flask_login import LoginManager 6 | 7 | 8 | app = Flask(__name__) 9 | app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///my_db.db' 10 | 11 | db = SQLAlchemy(app) 12 | 13 | SECRET_KEY = 'Мой секретный ключ' 14 | app.config['SECRET_KEY'] = SECRET_KEY 15 | csrf = CSRFProtect(app) 16 | 17 | migrate = Migrate(app, db) 18 | 19 | # Создаем и подключаем менеджер логинов к приложению 20 | login_manager = LoginManager(app) 21 | -------------------------------------------------------------------------------- /lesson11/forms.py: -------------------------------------------------------------------------------- 1 | from flask_wtf import FlaskForm 2 | from wtforms import StringField, SubmitField, PasswordField 3 | from wtforms.validators import DataRequired 4 | 5 | 6 | class UserForm(FlaskForm): 7 | username = StringField('Имя', validators=[DataRequired()]) 8 | password = PasswordField('Пароль', validators=[DataRequired()]) 9 | submit = SubmitField('Добавить') 10 | 11 | 12 | # Добавили форму авторизации пользователя 13 | class LoginForm(FlaskForm): 14 | username = StringField('Имя', validators=[DataRequired()]) 15 | password = PasswordField('Пароль', validators=[DataRequired()]) 16 | submit = SubmitField('Авторизироваться') 17 | -------------------------------------------------------------------------------- /lesson11/models.py: -------------------------------------------------------------------------------- 1 | from flask_login import UserMixin 2 | 3 | from config import db 4 | 5 | 6 | # Добавили модели пользователя миксин для работы с авторизацией. 7 | class User(db.Model, UserMixin): 8 | __tablename__ = 'users' 9 | id = db.Column(db.Integer, primary_key=True) 10 | username = db.Column(db.Text, unique=True, nullable=False) 11 | # Вместо хранения обычного пароля реализовано хранение хешированного 12 | hashed_password = db.Column(db.Text, nullable=False) 13 | -------------------------------------------------------------------------------- /lesson11/requirements.txt: -------------------------------------------------------------------------------- 1 | alembic==1.13.0 2 | blinker==1.7.0 3 | click==8.1.7 4 | colorama==0.4.6 5 | Flask==3.0.0 6 | Flask-Migrate==4.0.5 7 | Flask-SQLAlchemy==3.1.1 8 | Flask-WTF==1.2.1 9 | greenlet==3.0.1 10 | install==1.3.5 11 | itsdangerous==2.1.2 12 | Jinja2==3.1.2 13 | Mako==1.3.0 14 | MarkupSafe==2.1.3 15 | SQLAlchemy==2.0.23 16 | typing_extensions==4.8.0 17 | Werkzeug==3.0.1 18 | WTForms==3.1.1 19 | -------------------------------------------------------------------------------- /lesson11/templates/401.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 |

Пользователь не авторизован.

11 |
{{ error }}
12 | Главная 13 | 14 | -------------------------------------------------------------------------------- /lesson11/templates/403.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 |

В доступе отказано.

11 |
{{ error }}
12 | Главная 13 | 14 | -------------------------------------------------------------------------------- /lesson11/templates/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 |

Такой страницы не существует.

11 |
{{ error }}
12 | Главная 13 | 14 | -------------------------------------------------------------------------------- /lesson11/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 |

Главная страница

10 | 11 |
12 |
{{ form.hidden_tag() }}
13 | {% for field in form if field.name != 'csrf_token' %} 14 |
15 | {{ field.label() }} 16 | {{ field() }} 17 |
18 | {% endfor %} 19 |
20 | 21 | {% if current_user.is_authenticated %} 22 | Выйти {{ current_user.username }} 23 | {% endif %} 24 | 25 | -------------------------------------------------------------------------------- /lesson11/templates/user_info.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 |

Главная страница

10 | 11 |
12 |

Текущий пользователь

13 | 14 |

{{ current_user.username }}

15 |
16 | 17 | -------------------------------------------------------------------------------- /lesson11/templates/users.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 |
10 |
{{ form.hidden_tag() }}
11 | {% for field in form if field.name != 'csrf_token' %} 12 |
13 | {{ field.label() }} 14 | {{ field() }} 15 |
16 | {% endfor %} 17 |
18 | 19 | 26 | 27 | -------------------------------------------------------------------------------- /lesson12/config.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from flask_sqlalchemy import SQLAlchemy 3 | from flask_restful import Api 4 | 5 | 6 | app = Flask(__name__) 7 | app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///my_db.db' 8 | 9 | db = SQLAlchemy(app) 10 | # Подключаем restful к нашему приложению. 11 | api = Api(app) 12 | -------------------------------------------------------------------------------- /lesson12/models.py: -------------------------------------------------------------------------------- 1 | from sqlalchemy_serializer import SerializerMixin 2 | 3 | from config import db 4 | 5 | 6 | # Добавляем миксин для возможности сериалиации записей модели. 7 | class Post(db.Model, SerializerMixin): 8 | __tablename__ = 'posts' 9 | id = db.Column(db.Integer, primary_key=True) 10 | text = db.Column(db.Text, nullable=False) 11 | -------------------------------------------------------------------------------- /lesson12/my_client.py: -------------------------------------------------------------------------------- 1 | # Делаем запросы к нашему приложению. 2 | from requests import get, post 3 | 4 | 5 | print(get('http://localhost:8080/posts').json()) 6 | print(post( 7 | 'http://localhost:8080/posts', 8 | json={'text': 'Текст публикации'}).json()) 9 | 10 | # print(get('http://localhost:8080/posts/1').json()) 11 | # print(put('http://localhost:8080/posts/1', json={'name': 'Saeed'}).json()) 12 | # print(delete('http://localhost:8080/posts/1').json()) 13 | -------------------------------------------------------------------------------- /lesson12/requirements.txt: -------------------------------------------------------------------------------- 1 | aniso8601==9.0.1 2 | blinker==1.7.0 3 | certifi==2023.11.17 4 | charset-normalizer==3.3.2 5 | click==8.1.7 6 | colorama==0.4.6 7 | Flask==3.0.0 8 | Flask-RESTful==0.3.10 9 | Flask-SQLAlchemy==3.1.1 10 | greenlet==3.0.3 11 | idna==3.6 12 | itsdangerous==2.1.2 13 | Jinja2==3.1.2 14 | MarkupSafe==2.1.3 15 | pytz==2023.3.post1 16 | requests==2.31.0 17 | six==1.16.0 18 | SQLAlchemy==2.0.23 19 | SQLAlchemy-serializer==1.4.1 20 | typing_extensions==4.9.0 21 | urllib3==2.1.0 22 | Werkzeug==3.0.1 23 | -------------------------------------------------------------------------------- /lesson13/analytics.py: -------------------------------------------------------------------------------- 1 | # Blueprint - независимый модуль, отделяемый от основного приложения. 2 | # Является инструментом для разделения логики, включает в себя 3 | # набор обработчиков адресов, объединенных общей логикой. 4 | from flask import Blueprint 5 | 6 | 7 | # Создаем экземпляр Blueprint 8 | analytics_blueprint = Blueprint( 9 | 'analytics', 10 | __name__, 11 | template_folder='templates' 12 | ) 13 | 14 | 15 | # Используем blueprint для создания обработчика адреса. 16 | @analytics_blueprint.route('/analytics') 17 | def get_analytics(): 18 | return 'Аналитика по данному сервису' 19 | -------------------------------------------------------------------------------- /lesson13/app.py: -------------------------------------------------------------------------------- 1 | from config import app, api, db 2 | from posts_resources import PostListResource, PostResource 3 | from analytics import analytics_blueprint 4 | 5 | api.add_resource(PostListResource, '/posts') 6 | api.add_resource(PostResource, '/posts/') 7 | # Регистрируем созданный blueprint в нашем приложении. 8 | app.register_blueprint(analytics_blueprint) 9 | 10 | 11 | if __name__ == '__main__': 12 | with app.app_context(): 13 | db.create_all() 14 | app.run('127.0.0.1', 8080) 15 | -------------------------------------------------------------------------------- /lesson13/client_test.py: -------------------------------------------------------------------------------- 1 | from requests import get, post, put, delete 2 | 3 | # Запросы к списку ресурсов 4 | # print(get('http://localhost:8080/posts').json()) 5 | # print(post( 6 | # 'http://localhost:8080/posts', 7 | # json={ 8 | # 'title': 'Заголовок 2', 9 | # 'text': 'Текст публикации 2', 10 | # 'author_id': 3 11 | # }).json()) 12 | 13 | 14 | # Запросы к отдельному ресурсу 15 | print(get('http://localhost:8080/posts/5').json()) 16 | # print(put( 17 | # 'http://localhost:8080/posts/1', 18 | # json={'title': 'Изм. заголовок', 19 | # 'text': 'Изм. текст', 20 | # 'author_id': 5} 21 | # ).json()) 22 | # print(delete('http://localhost:8080/posts/1').json()) 23 | -------------------------------------------------------------------------------- /lesson13/config.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from flask_sqlalchemy import SQLAlchemy 3 | from flask_restful import Api 4 | 5 | 6 | app = Flask(__name__) 7 | app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///my_db.db' 8 | 9 | db = SQLAlchemy(app) 10 | api = Api(app) 11 | -------------------------------------------------------------------------------- /lesson13/models.py: -------------------------------------------------------------------------------- 1 | from sqlalchemy_serializer import SerializerMixin 2 | 3 | from config import db 4 | 5 | 6 | class Post(db.Model, SerializerMixin): 7 | __tablename__ = 'posts' 8 | id = db.Column(db.Integer, primary_key=True) 9 | title = db.Column(db.Text, nullable=False) 10 | text = db.Column(db.Text, nullable=False) 11 | author_id = db.Column(db.Integer, nullable=False) 12 | -------------------------------------------------------------------------------- /lesson13/requirements.txt: -------------------------------------------------------------------------------- 1 | aniso8601==9.0.1 2 | blinker==1.7.0 3 | certifi==2023.11.17 4 | charset-normalizer==3.3.2 5 | click==8.1.7 6 | colorama==0.4.6 7 | Flask==3.0.0 8 | Flask-RESTful==0.3.10 9 | Flask-SQLAlchemy==3.1.1 10 | greenlet==3.0.3 11 | idna==3.6 12 | itsdangerous==2.1.2 13 | Jinja2==3.1.2 14 | MarkupSafe==2.1.3 15 | pytz==2023.3.post1 16 | requests==2.31.0 17 | six==1.16.0 18 | SQLAlchemy==2.0.23 19 | SQLAlchemy-serializer==1.4.1 20 | typing_extensions==4.9.0 21 | urllib3==2.1.0 22 | Werkzeug==3.0.1 23 | -------------------------------------------------------------------------------- /lesson14/my_app/config.py: -------------------------------------------------------------------------------- 1 | # import os 2 | from dotenv import load_dotenv 3 | 4 | load_dotenv() 5 | 6 | 7 | class Config: 8 | FLASK_APP = 'wsgi.py' 9 | # SECRET_KEY = os.getenv('SECRET_KEY') 10 | SECRET_KEY = 'MY_SECRET_KEY' 11 | 12 | SQLALCHEMY_DATABASE_URI = 'sqlite:///my_db.db' 13 | -------------------------------------------------------------------------------- /lesson14/my_app/finances/__init__.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from flask_sqlalchemy import SQLAlchemy 3 | from flask_wtf import CSRFProtect 4 | from flask_login import LoginManager 5 | 6 | 7 | db = SQLAlchemy() 8 | csrf = CSRFProtect() 9 | login_manager = LoginManager() 10 | 11 | 12 | def create_app(): 13 | app = Flask(__name__) 14 | 15 | app.config.from_object('config.Config') 16 | 17 | db.init_app(app) 18 | csrf.init_app(app) 19 | login_manager.init_app(app) 20 | 21 | with app.app_context(): 22 | from . import routes 23 | 24 | return app 25 | -------------------------------------------------------------------------------- /lesson14/my_app/finances/forms.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson14/my_app/finances/forms.py -------------------------------------------------------------------------------- /lesson14/my_app/finances/models.py: -------------------------------------------------------------------------------- 1 | from finances import db 2 | 3 | 4 | class Post(db.Model): 5 | __tablename__ = 'posts' 6 | id = db.Column(db.Integer, primary_key=True) 7 | title = db.Column(db.Text, nullable=False) 8 | text = db.Column(db.Text, nullable=False) 9 | author_id = db.Column(db.Integer, nullable=False) 10 | -------------------------------------------------------------------------------- /lesson14/my_app/finances/routes.py: -------------------------------------------------------------------------------- 1 | from flask import current_app as app 2 | 3 | 4 | @app.route('/') 5 | def index(): 6 | return 'Главная страница' 7 | -------------------------------------------------------------------------------- /lesson14/my_app/requirements.txt: -------------------------------------------------------------------------------- 1 | aniso8601==9.0.1 2 | blinker==1.7.0 3 | certifi==2023.11.17 4 | charset-normalizer==3.3.2 5 | click==8.1.7 6 | colorama==0.4.6 7 | Flask==3.0.0 8 | Flask-RESTful==0.3.10 9 | Flask-SQLAlchemy==3.1.1 10 | greenlet==3.0.3 11 | idna==3.6 12 | itsdangerous==2.1.2 13 | Jinja2==3.1.2 14 | MarkupSafe==2.1.3 15 | pytz==2023.3.post1 16 | requests==2.31.0 17 | six==1.16.0 18 | SQLAlchemy==2.0.23 19 | SQLAlchemy-serializer==1.4.1 20 | typing_extensions==4.9.0 21 | urllib3==2.1.0 22 | Werkzeug==3.0.1 23 | -------------------------------------------------------------------------------- /lesson14/my_app/server.py: -------------------------------------------------------------------------------- 1 | from finances import create_app 2 | 3 | app = create_app() 4 | 5 | if __name__ == '__main__': 6 | app.run('127.0.0.1', 8080) 7 | -------------------------------------------------------------------------------- /lesson15/first_project/first_project/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson15/first_project/first_project/__init__.py -------------------------------------------------------------------------------- /lesson15/first_project/first_project/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for first_project project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'first_project.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /lesson15/first_project/first_project/urls.py: -------------------------------------------------------------------------------- 1 | """Это файл, хранящий основные URL-ы проекта. 2 | Как правило, URL-ы приложений подключаются к данному файлу разом, 3 | сразу всем набором URL-ов отдельного приложения. 4 | """ 5 | 6 | from django.contrib import admin 7 | from django.urls import path 8 | from posts import views 9 | 10 | urlpatterns = [ 11 | path('admin/', admin.site.urls), 12 | path('', views.index, name='index'), 13 | # path('greet/', views.greet, name='greet') 14 | path('greet', views.greet, name='greet') 15 | ] 16 | -------------------------------------------------------------------------------- /lesson15/first_project/first_project/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for first_project project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'first_project.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /lesson15/first_project/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'first_project.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /lesson15/first_project/posts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson15/first_project/posts/__init__.py -------------------------------------------------------------------------------- /lesson15/first_project/posts/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PostsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'posts' 7 | -------------------------------------------------------------------------------- /lesson15/first_project/posts/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson15/first_project/posts/migrations/__init__.py -------------------------------------------------------------------------------- /lesson15/first_project/posts/templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {% block title %}Django project{% endblock %} 7 | 8 | 9 | {% block content %}{% endblock %} 10 | 11 | -------------------------------------------------------------------------------- /lesson15/first_project/posts/templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block title %}Главная{% endblock %} 4 | 5 | {# Однострочный комментарий #} 6 | {% comment %} 7 | Многострочные 8 | комментарии 9 | {% endcomment %} 10 | 11 | {% block content %} 12 | {% if username == 'Ruslan' %} 13 |

Руслан!

14 | {% else %} 15 | {% for letter in username %} 16 | {% if forloop.first %} 17 |
Первый!
18 | {% elif forloop.last %} 19 |
Последний!
20 | {% endif %} 21 |

{{ forloop.counter }} Hello, {{ letter }}

22 | {% endfor %} 23 | {% endif %} 24 | Приветствие 25 | {% endblock %} 26 | -------------------------------------------------------------------------------- /lesson15/first_project/posts/views.py: -------------------------------------------------------------------------------- 1 | """views.py это файл, хранящий функции-обработчики, 2 | вызываемые при обращении к конкретному, связанному с ними URL-у. 3 | Также мы тут применяем генерацию страниц по шаблону. 4 | В качестве шаблонизатора используется DTL (Django Template Lenguage). 5 | """ 6 | from django.shortcuts import render 7 | from django.http import HttpResponse 8 | 9 | 10 | def index(request): 11 | context = {'username': 'Ruslan1'} 12 | return render(request, 'index.html', context) 13 | 14 | 15 | # def greet(request, name): 16 | # return HttpResponse(f'Hello, {name}!') 17 | 18 | def greet(request): 19 | return HttpResponse('Hello, Saeed!') 20 | -------------------------------------------------------------------------------- /lesson15/requirements.txt: -------------------------------------------------------------------------------- 1 | asgiref==3.7.2 2 | Django==5.0.1 3 | sqlparse==0.4.4 4 | tzdata==2023.4 5 | -------------------------------------------------------------------------------- /lesson16/my_proj_app/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_proj.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /lesson16/my_proj_app/media/img/cat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson16/my_proj_app/media/img/cat.jpg -------------------------------------------------------------------------------- /lesson16/my_proj_app/my_proj/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson16/my_proj_app/my_proj/__init__.py -------------------------------------------------------------------------------- /lesson16/my_proj_app/my_proj/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for my_proj project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_proj.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /lesson16/my_proj_app/my_proj/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import path, include 3 | 4 | from django.conf import settings 5 | from django.conf.urls.static import static 6 | from django.contrib.staticfiles.urls import staticfiles_urlpatterns 7 | 8 | 9 | urlpatterns = [ 10 | path('', include('posts.urls', namespace='posts')), 11 | path('admin/', admin.site.urls), 12 | ] 13 | 14 | if settings.DEBUG: 15 | urlpatterns += static( 16 | settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 17 | else: 18 | urlpatterns += staticfiles_urlpatterns() 19 | -------------------------------------------------------------------------------- /lesson16/my_proj_app/my_proj/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for my_proj project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_proj.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /lesson16/my_proj_app/posts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson16/my_proj_app/posts/__init__.py -------------------------------------------------------------------------------- /lesson16/my_proj_app/posts/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /lesson16/my_proj_app/posts/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PostsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'posts' 7 | -------------------------------------------------------------------------------- /lesson16/my_proj_app/posts/forms.py: -------------------------------------------------------------------------------- 1 | # Создаем свою форму для отображении в шаблоне. 2 | from django import forms 3 | 4 | 5 | # Класс формы наследуюется от родительского класса forms.Form 6 | class PostForm(forms.Form): 7 | # Прописываем все поля, требуемые в форме. 8 | # В зависимости от типа поля будут накладываться разные проверки 9 | # на введеные данные. 10 | title = forms.CharField(label='Заголовок', max_length=100) 11 | text = forms.CharField(label='Текст статьи', widget=forms.Textarea) 12 | date = forms.DateField(label='Дата публикации') 13 | -------------------------------------------------------------------------------- /lesson16/my_proj_app/posts/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson16/my_proj_app/posts/migrations/__init__.py -------------------------------------------------------------------------------- /lesson16/my_proj_app/posts/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | 5 | # Указываем имя приложения, которое должно совпадать с пространством имен 6 | # в главном файле urls.py при подключении текущих URL-ов. 7 | app_name = 'posts' 8 | 9 | # Перечисляем все URL-ы нашего приложения posts. 10 | urlpatterns = [ 11 | path('', views.index), 12 | path('form/', views.form, name='posts_form'), 13 | path('posts/', views.posts_list, name='posts_list'), 14 | path('posts/', views.posts_detail, name='posts_detail') 15 | ] 16 | -------------------------------------------------------------------------------- /lesson16/my_proj_app/posts/views.py: -------------------------------------------------------------------------------- 1 | # Перечень всех функций-обработчиков. 2 | from django.shortcuts import render, HttpResponse 3 | from .forms import PostForm 4 | 5 | 6 | def index(request): 7 | context = {'username': 'Saeed'} 8 | return render(request, 'index.html', context) 9 | 10 | 11 | def posts_list(request): 12 | return HttpResponse("Список публикаций") 13 | 14 | 15 | def posts_detail(request, pk): 16 | return HttpResponse(f"Отдельная публикация {pk}") 17 | 18 | 19 | # Прописываем обработчик страницы формы. 20 | def form(request): 21 | if request.method == 'POST': 22 | form = PostForm(request.POST) 23 | if form.is_valid(): 24 | title = form.cleaned_data['title'] 25 | text = form.cleaned_data['text'] 26 | date = form.cleaned_data['date'] 27 | return HttpResponse(f'{title}, {text}, {date}') 28 | else: 29 | form = PostForm() 30 | context = {'form': form} 31 | return render(request, 'form.html', context) 32 | -------------------------------------------------------------------------------- /lesson16/my_proj_app/static/css/style.css: -------------------------------------------------------------------------------- 1 | div { 2 | color: red; 3 | } -------------------------------------------------------------------------------- /lesson16/my_proj_app/templates/form.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 |
11 | 12 | {% csrf_token %} 13 | 14 | {{ form.as_div }} 15 | 16 |
17 | 18 | -------------------------------------------------------------------------------- /lesson16/my_proj_app/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {% load static %} 4 | 5 | 6 | 7 | 8 | 9 | Document 10 | 11 | 12 | 13 | 14 |
{{ username }}
15 | 16 | картинка 17 | 18 | -------------------------------------------------------------------------------- /lesson17/my_proj_main/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_proj.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /lesson17/my_proj_main/my_proj/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson17/my_proj_main/my_proj/__init__.py -------------------------------------------------------------------------------- /lesson17/my_proj_main/my_proj/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for my_proj project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_proj.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /lesson17/my_proj_main/my_proj/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import path, include 3 | from posts import views 4 | 5 | 6 | urlpatterns = [ 7 | path('admin/', admin.site.urls), 8 | path('', views.index), 9 | path('posts/', include('posts.urls', namespace='posts')) 10 | ] 11 | -------------------------------------------------------------------------------- /lesson17/my_proj_main/my_proj/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for my_proj project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_proj.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /lesson17/my_proj_main/posts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson17/my_proj_main/posts/__init__.py -------------------------------------------------------------------------------- /lesson17/my_proj_main/posts/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /lesson17/my_proj_main/posts/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PostsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'posts' 7 | -------------------------------------------------------------------------------- /lesson17/my_proj_main/posts/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson17/my_proj_main/posts/migrations/__init__.py -------------------------------------------------------------------------------- /lesson17/my_proj_main/posts/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /lesson17/my_proj_main/posts/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | 5 | app_name = 'posts' 6 | 7 | urlpatterns = [ 8 | path('', views.posts_list, name='posts_list'), 9 | path('/', views.posts_detail, name='posts_detail') 10 | ] 11 | -------------------------------------------------------------------------------- /lesson17/my_proj_main/posts/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | from django.http import HttpResponse 3 | 4 | 5 | def index(request): 6 | return HttpResponse('Главная') 7 | 8 | 9 | def posts_list(request): 10 | context = {'current_id': 5} 11 | return render(request, 'posts/posts_list.html', context) 12 | 13 | 14 | def posts_detail(request, id): 15 | context = {'id': id} 16 | return render(request, 'posts/posts_detail.html', context) 17 | -------------------------------------------------------------------------------- /lesson17/my_proj_main/templates/posts/posts_detail.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 |

Отдельная публикация {{ id }}

10 | Список публикаций 11 | 12 | -------------------------------------------------------------------------------- /lesson17/my_proj_main/templates/posts/posts_list.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 |

Список публикаций

10 | Отдельная публикация 11 | 12 | -------------------------------------------------------------------------------- /lesson18/my_edu_project/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /lesson18/my_edu_project/my_edu/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson18/my_edu_project/my_edu/__init__.py -------------------------------------------------------------------------------- /lesson18/my_edu_project/my_edu/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for my_edu project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /lesson18/my_edu_project/my_edu/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import path, include 3 | from posts import views 4 | 5 | 6 | urlpatterns = [ 7 | path('admin/', admin.site.urls), 8 | path('', views.index), 9 | path('posts/', include('posts.urls', namespace='posts')) 10 | ] 11 | -------------------------------------------------------------------------------- /lesson18/my_edu_project/my_edu/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for my_edu project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /lesson18/my_edu_project/posts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson18/my_edu_project/posts/__init__.py -------------------------------------------------------------------------------- /lesson18/my_edu_project/posts/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import Post, Tag, Review, Comments 3 | 4 | # Добавляем наши модели в админку для возможности публикации записей. 5 | admin.site.register((Post, Tag, Review, Comments)) 6 | -------------------------------------------------------------------------------- /lesson18/my_edu_project/posts/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PostsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'posts' 7 | -------------------------------------------------------------------------------- /lesson18/my_edu_project/posts/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from .models import Post 3 | 4 | 5 | # Создаем форму на основе конкретной модели. 6 | class PostForm(forms.ModelForm): 7 | class Meta: 8 | # Указываем, на основе какой модели создавать форму. 9 | model = Post 10 | # Определяем список и порядок полей формы. 11 | fields = ['title', 'text', 'tags', 'author'] 12 | -------------------------------------------------------------------------------- /lesson18/my_edu_project/posts/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson18/my_edu_project/posts/migrations/__init__.py -------------------------------------------------------------------------------- /lesson18/my_edu_project/posts/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /lesson18/my_edu_project/posts/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | 5 | app_name = 'posts' 6 | 7 | urlpatterns = [ 8 | path('', views.posts_list, name='posts_list'), 9 | path('/', views.posts_detail, name='posts_detail') 10 | ] 11 | -------------------------------------------------------------------------------- /lesson18/my_edu_project/posts/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | from django.http import HttpResponse 3 | from .forms import PostForm 4 | 5 | 6 | def index(request): 7 | return HttpResponse('Главная') 8 | 9 | 10 | # Передаем нашу форму в шаблон. 11 | def posts_list(request): 12 | context = {'current_id': 5, 'form': PostForm} 13 | return render(request, 'posts/posts_list.html', context) 14 | 15 | 16 | def posts_detail(request, id): 17 | context = {'id': id} 18 | return render(request, 'posts/posts_detail.html', context) 19 | -------------------------------------------------------------------------------- /lesson18/my_edu_project/templates/posts/posts_detail.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 |

Отдельная публикация {{ id }}

10 | Список публикаций 11 | 12 | -------------------------------------------------------------------------------- /lesson18/my_edu_project/templates/posts/posts_list.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 |

Список публикаций

10 | Отдельная публикация 11 |
12 | {% csrf_token %} 13 | {% for field in form %} 14 |
15 | {{ field.label_tag }} {{ field }} 16 |
17 | {% endfor %} 18 | 19 |
20 | 21 | 22 | -------------------------------------------------------------------------------- /lesson19/my_edu_project/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /lesson19/my_edu_project/my_edu/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson19/my_edu_project/my_edu/__init__.py -------------------------------------------------------------------------------- /lesson19/my_edu_project/my_edu/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for my_edu project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /lesson19/my_edu_project/my_edu/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import path, include 3 | from posts import views 4 | 5 | 6 | urlpatterns = [ 7 | path('admin/', admin.site.urls), 8 | path('', views.index), 9 | path('posts/', include('posts.urls', namespace='posts')) 10 | ] 11 | -------------------------------------------------------------------------------- /lesson19/my_edu_project/my_edu/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for my_edu project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /lesson19/my_edu_project/posts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson19/my_edu_project/posts/__init__.py -------------------------------------------------------------------------------- /lesson19/my_edu_project/posts/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import Post, Tag, Review, Comments 3 | 4 | # Добавляем наши модели в админку для возможности публикации записей. 5 | admin.site.register((Post, Tag, Review, Comments)) 6 | -------------------------------------------------------------------------------- /lesson19/my_edu_project/posts/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PostsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'posts' 7 | -------------------------------------------------------------------------------- /lesson19/my_edu_project/posts/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from .models import Post 3 | 4 | 5 | # Создаем форму на основе конкретной модели. 6 | class PostForm(forms.ModelForm): 7 | class Meta: 8 | # Указываем, на основе какой модели создавать форму. 9 | model = Post 10 | # Определяем список и порядок полей формы. 11 | fields = ['title', 'text', 'tags', 'author'] 12 | # Явно обозначаем содержимое элементов label. 13 | labels = { 14 | 'title': 'Заг-к публ-ии' 15 | } 16 | -------------------------------------------------------------------------------- /lesson19/my_edu_project/posts/migrations/0003_alter_post_options.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.1 on 2024-01-30 16:31 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('posts', '0002_alter_post_options_alter_post_author_alter_post_tags_and_more'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterModelOptions( 14 | name='post', 15 | options={'ordering': ['-pub_date'], 'verbose_name': 'Публикация', 'verbose_name_plural': 'Публикации'}, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /lesson19/my_edu_project/posts/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson19/my_edu_project/posts/migrations/__init__.py -------------------------------------------------------------------------------- /lesson19/my_edu_project/posts/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /lesson19/my_edu_project/posts/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | 5 | app_name = 'posts' 6 | 7 | urlpatterns = [ 8 | path('', views.posts_list, name='posts_list'), 9 | path('/', views.posts_detail, name='posts_detail') 10 | ] 11 | -------------------------------------------------------------------------------- /lesson19/my_edu_project/templates/posts/posts_detail.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 |

Отдельная публикация {{ post.id }}

10 |
{{ post.title }}
11 |
{{ post.text }}
12 |
{{ post.pub_date }}
13 |
{{ post.author }}
14 | Список публикаций 15 | 16 | -------------------------------------------------------------------------------- /lesson19/my_edu_project/templates/posts/posts_list.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 |

Список публикаций

10 | Отдельная публикация 11 |
12 | {% csrf_token %} 13 | {% for field in form.visible_fields %} 14 |
15 | {{ field.label_tag }} {{ field }} 16 |
17 | {% endfor %} 18 | 19 |
20 | 21 | {% for post in posts %} 22 |

Публикация № {{ post.id }}

23 |
24 |
{{ post.title }}
25 |
{{ post.text }}
26 |
{{ post.pub_date }}
27 |
28 | {% endfor %} 29 | 30 | 31 | -------------------------------------------------------------------------------- /lesson2/b_temp.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /lesson2/db/database.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson2/db/database.db -------------------------------------------------------------------------------- /lesson2/repeat.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | 3 | app = Flask(__name__) 4 | 5 | 6 | @app.route('/', methods=['GET', 'POST']) 7 | def index(username): 8 | return f'Здравствуйте, {username}' 9 | 10 | 11 | if __name__ == '__main__': 12 | app.run(host='127.0.0.1', port=8000) 13 | -------------------------------------------------------------------------------- /lesson2/static/css/style.css: -------------------------------------------------------------------------------- 1 | div { 2 | background-color: burlywood; 3 | } 4 | .no_news { 5 | width: 600px; 6 | margin: 0 auto; 7 | padding: 10px; 8 | font-size: 24px; 9 | color: #fff; 10 | background-color: crimson; 11 | text-align: center; 12 | } 13 | .news { 14 | width: 600px; 15 | margin: 10px 0; 16 | padding: 10px; 17 | font-size: 24px; 18 | color: #000; 19 | background-color: rgb(110, 220, 224); 20 | } 21 | input, textarea { 22 | display: block; 23 | padding: 10px; 24 | margin: 10px 0; 25 | } 26 | input[type='submit'] { 27 | background-color: aliceblue; 28 | } 29 | input[type='submit']:hover { 30 | background-color: rgb(14, 14, 15); 31 | color: #fff; 32 | } -------------------------------------------------------------------------------- /lesson2/static/img/cat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson2/static/img/cat.jpg -------------------------------------------------------------------------------- /lesson20/my_edu_project/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /lesson20/my_edu_project/my_edu/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson20/my_edu_project/my_edu/__init__.py -------------------------------------------------------------------------------- /lesson20/my_edu_project/my_edu/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for my_edu project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /lesson20/my_edu_project/my_edu/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import path, include 3 | 4 | 5 | urlpatterns = [ 6 | path('admin/', admin.site.urls), 7 | path('posts/', include('posts.urls', namespace='posts')) 8 | ] 9 | -------------------------------------------------------------------------------- /lesson20/my_edu_project/my_edu/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for my_edu project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /lesson20/my_edu_project/posts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson20/my_edu_project/posts/__init__.py -------------------------------------------------------------------------------- /lesson20/my_edu_project/posts/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PostsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'posts' 7 | -------------------------------------------------------------------------------- /lesson20/my_edu_project/posts/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.1 on 2024-02-03 16:53 2 | 3 | import django.db.models.deletion 4 | from django.conf import settings 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name='Post', 19 | fields=[ 20 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 21 | ('title', models.CharField(max_length=100)), 22 | ('text', models.TextField()), 23 | ('pub_date', models.DateTimeField(auto_now_add=True)), 24 | ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='posts', to=settings.AUTH_USER_MODEL)), 25 | ], 26 | options={ 27 | 'ordering': ['-pub_date'], 28 | }, 29 | ), 30 | ] 31 | -------------------------------------------------------------------------------- /lesson20/my_edu_project/posts/migrations/0002_alter_post_text.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.1 on 2024-02-03 17:24 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('posts', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='post', 15 | name='text', 16 | field=models.TextField(null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /lesson20/my_edu_project/posts/migrations/0003_alter_post_text.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.1 on 2024-02-03 17:25 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('posts', '0002_alter_post_text'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='post', 15 | name='text', 16 | field=models.TextField(blank=True, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /lesson20/my_edu_project/posts/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson20/my_edu_project/posts/migrations/__init__.py -------------------------------------------------------------------------------- /lesson20/my_edu_project/posts/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.contrib.auth import get_user_model 3 | 4 | 5 | User = get_user_model() 6 | 7 | 8 | class Post(models.Model): 9 | title = models.CharField(max_length=100) 10 | text = models.TextField(null=True, blank=True) 11 | pub_date = models.DateTimeField(auto_now_add=True) 12 | author = models.ForeignKey( 13 | User, 14 | on_delete=models.CASCADE, 15 | related_name='posts' 16 | ) 17 | 18 | class Meta: 19 | ordering = ['-pub_date'] 20 | 21 | def __str__(self): 22 | return f'{self.title[:30]} -- {self.pub_date}' 23 | -------------------------------------------------------------------------------- /lesson20/my_edu_project/posts/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /lesson20/my_edu_project/posts/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | 5 | app_name = 'posts' 6 | 7 | urlpatterns = [ 8 | path('', views.posts_list, name='posts_list'), 9 | path('/', views.posts_detail, name='posts_detail') 10 | ] 11 | -------------------------------------------------------------------------------- /lesson20/my_edu_project/templates/posts/posts_detail.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 |

Отдельная публикация {{ post.id }}

10 |
{{ post.title }}
11 |
{{ post.text }}
12 |
{{ post.pub_date }}
13 |
{{ post.author }}
14 | 15 | -------------------------------------------------------------------------------- /lesson21/my_edu_project/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /lesson21/my_edu_project/my_edu/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson21/my_edu_project/my_edu/__init__.py -------------------------------------------------------------------------------- /lesson21/my_edu_project/my_edu/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for my_edu project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /lesson21/my_edu_project/my_edu/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import path, include 3 | from users.views import index 4 | 5 | 6 | urlpatterns = [ 7 | path('admin/', admin.site.urls), 8 | # Можно сделать доступными пользователю все встроенные пути 9 | # модуля django.contrib.auth.urls для обработки запросов авторизации. 10 | # path('auth/', include('django.contrib.auth.urls')), 11 | # Однако рекомендуетяс создание собственных обработчиков 12 | # на основе встроенных в django.contrib.auth.urls. 13 | path('', index, name='index'), 14 | # Подключаем все пути приложения users с префиксом auth/ 15 | path('auth/', include('users.urls', namespace='users')), 16 | ] 17 | -------------------------------------------------------------------------------- /lesson21/my_edu_project/my_edu/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for my_edu project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /lesson21/my_edu_project/templates/registration/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 |

Авторизация

11 | 12 |
13 | {% csrf_token %} 14 | 15 | 16 | 17 |
18 | 19 | -------------------------------------------------------------------------------- /lesson21/my_edu_project/templates/registration/register.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 |

Регистрация пользователя

11 | 12 |
13 | {% csrf_token %} 14 | {% for field in form %} 15 |
16 | {{ field.label_tag }} 17 | {{ field }} 18 |
19 | {% endfor %} 20 | 21 |
22 | 23 | -------------------------------------------------------------------------------- /lesson21/my_edu_project/templates/users/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 |

Главная

10 | {% if user.is_authenticated %} 11 |
12 | {% csrf_token %} 13 | 14 |
15 | {% endif %} 16 | 17 | -------------------------------------------------------------------------------- /lesson21/my_edu_project/users/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson21/my_edu_project/users/__init__.py -------------------------------------------------------------------------------- /lesson21/my_edu_project/users/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import CustomUser 3 | 4 | 5 | # Для возможности работать в админке с записями кастомной модели пользователей 6 | # необходимо явно ее добавить. 7 | admin.site.register(CustomUser) 8 | -------------------------------------------------------------------------------- /lesson21/my_edu_project/users/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class UsersConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'users' 7 | -------------------------------------------------------------------------------- /lesson21/my_edu_project/users/forms.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.forms import UserCreationForm 2 | from django.contrib.auth import get_user_model 3 | 4 | 5 | # Хоть мы и создали свой класс для объекта пользователя, 6 | # получаем его обычным способом - через метод get_user_model. 7 | User = get_user_model() 8 | 9 | 10 | # Форма авторизации создается на основе встроенного класса UserCreationForm. 11 | class MyForm(UserCreationForm): 12 | class Meta: 13 | model = User 14 | fields = ['username', 'birth_date', 'is_married'] 15 | -------------------------------------------------------------------------------- /lesson21/my_edu_project/users/migrations/0002_customuser_is_married.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.2 on 2024-02-06 16:35 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='customuser', 15 | name='is_married', 16 | field=models.BooleanField(null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /lesson21/my_edu_project/users/migrations/0003_alter_customuser_birth_date.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.2 on 2024-02-06 16:37 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0002_customuser_is_married'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='customuser', 15 | name='birth_date', 16 | field=models.DateField(null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /lesson21/my_edu_project/users/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson21/my_edu_project/users/migrations/__init__.py -------------------------------------------------------------------------------- /lesson21/my_edu_project/users/models.py: -------------------------------------------------------------------------------- 1 | # Своя модель пользователя 2 | from django.db import models 3 | # При создания своей модели пользователя необходимо воспользоваться 4 | # встроенным классом, AbstractUser или AbstractBaseUser. 5 | # Оба они импортируются из модели django.contrib.auth.models. 6 | from django.contrib.auth.models import AbstractUser 7 | 8 | 9 | # AbstractUser и AbstractBaseUser 10 | # Отличия классов заключаются в том, что в случае наследования от AbstractUser 11 | # мы добавляем свои поля к уже имеющися в модели User. 12 | # При наследовании от AbstractBaseUser поля модели User не передаются, 13 | # только система аутентификации встроенная в Django. 14 | class CustomUser(AbstractUser): 15 | birth_date = models.DateField(null=True) 16 | is_married = models.BooleanField(null=True) 17 | -------------------------------------------------------------------------------- /lesson21/my_edu_project/users/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | 5 | app_name = 'users' 6 | 7 | # Все пути приложения users. 8 | urlpatterns = [ 9 | path('register/', views.register, name='register'), 10 | path('login/', views.my_login, name='login'), 11 | path('logout/', views.my_logout, name='logout'), 12 | path('secret/', views.secret_page, name='secret_page'), 13 | ] 14 | -------------------------------------------------------------------------------- /lesson22/my_edu_project/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /lesson22/my_edu_project/my_edu/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson22/my_edu_project/my_edu/__init__.py -------------------------------------------------------------------------------- /lesson22/my_edu_project/my_edu/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for my_edu project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /lesson22/my_edu_project/my_edu/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import path, include 3 | 4 | urlpatterns = [ 5 | path('admin/', admin.site.urls), 6 | path('', include('posts.urls', namespace='posts')) 7 | ] 8 | -------------------------------------------------------------------------------- /lesson22/my_edu_project/my_edu/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for my_edu project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /lesson22/my_edu_project/posts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson22/my_edu_project/posts/__init__.py -------------------------------------------------------------------------------- /lesson22/my_edu_project/posts/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PostsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'posts' 7 | -------------------------------------------------------------------------------- /lesson22/my_edu_project/posts/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.2 on 2024-02-10 17:27 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | initial = True 9 | 10 | dependencies = [ 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Post', 16 | fields=[ 17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('title', models.CharField(max_length=255)), 19 | ('text', models.TextField()), 20 | ], 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /lesson22/my_edu_project/posts/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson22/my_edu_project/posts/migrations/__init__.py -------------------------------------------------------------------------------- /lesson22/my_edu_project/posts/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | 4 | # Простая модель для демонстрации работы CBV. 5 | class Post(models.Model): 6 | title = models.CharField(max_length=255) 7 | text = models.TextField() 8 | 9 | 10 | # Для добавления записей без применения админки сайта 11 | # вызовем в терминале оболочку Django (shell). 12 | # python manage.py shell 13 | 14 | # Сначала импортируем модель Post. 15 | # from posts.models import Post 16 | # Далее создаем нужное количество записей командой create. 17 | # Post.objects.create(title='Заголовок', text='Текст') 18 | -------------------------------------------------------------------------------- /lesson22/my_edu_project/templates/posts/contacts.html: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | Контакты 9 | 10 | 11 |

Наши контакты

12 |
13 |

Магомедов Магомед

14 |

Программист

15 |

8 888 888 88 88

16 |
17 | 18 | Список публикаций 19 | 20 | -------------------------------------------------------------------------------- /lesson22/my_edu_project/templates/posts/post_list.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Список публикаций 8 | 9 | 10 |

Список публикаций

11 |
    12 | {% for post in post_list %} 13 |
  • 14 |
    {{ post.title }}
    15 |
    {{ post.text }}
    16 |
  • 17 | {% endfor %} 18 |
19 | 20 | 21 | -------------------------------------------------------------------------------- /lesson22/my_edu_project/templates/posts/post_list_new.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Список публикаций 8 | 9 | 10 |

Список публикаций

11 |
    12 | {% for post in posts %} 13 |
  • 14 |
    {{ post.title }}
    15 |
    {{ post.text }}
    16 |
  • 17 | {% endfor %} 18 |
19 | 20 | 21 | -------------------------------------------------------------------------------- /lesson23/final_project/core/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson23/final_project/core/__init__.py -------------------------------------------------------------------------------- /lesson23/final_project/core/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CoreConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'core' 7 | -------------------------------------------------------------------------------- /lesson23/final_project/core/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson23/final_project/core/migrations/__init__.py -------------------------------------------------------------------------------- /lesson23/final_project/core/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | 4 | # Представление для пользовательской ошибки 404 5 | def page_not_found(request, exception): 6 | return render( 7 | request, 8 | 'core/404.html', 9 | {'path': request.path}, 10 | status=404 11 | ) 12 | -------------------------------------------------------------------------------- /lesson23/final_project/final/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson23/final_project/final/__init__.py -------------------------------------------------------------------------------- /lesson23/final_project/final/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for final project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'final.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /lesson23/final_project/final/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import path, include 3 | from django.views.generic import TemplateView 4 | from django.conf import settings 5 | from django.conf.urls.static import static 6 | 7 | 8 | urlpatterns = [ 9 | path('admin/', admin.site.urls), 10 | path('', TemplateView.as_view(template_name='index.html'), name='index'), 11 | path('auth/', include(('users.urls', 'users'), namespace='users')), 12 | path('posts/', include(('posts.urls', 'posts'), namespace='posts')), 13 | ] 14 | 15 | # Зададим правильное отображение медиа контента в режиме отладки. 16 | if settings.DEBUG: 17 | urlpatterns += static( 18 | settings.MEDIA_URL, document_root=settings.MEDIA_ROOT 19 | ) 20 | 21 | # Укажем пользовательский обработчик ошибки 404 как основной 22 | handler404 = 'core.views.page_not_found' 23 | -------------------------------------------------------------------------------- /lesson23/final_project/final/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for final project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'final.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /lesson23/final_project/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'final.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /lesson23/final_project/posts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson23/final_project/posts/__init__.py -------------------------------------------------------------------------------- /lesson23/final_project/posts/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import Post 3 | 4 | 5 | admin.site.register(Post) 6 | -------------------------------------------------------------------------------- /lesson23/final_project/posts/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PostsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'posts' 7 | -------------------------------------------------------------------------------- /lesson23/final_project/posts/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.2 on 2024-02-13 18:36 2 | 3 | import django.db.models.deletion 4 | from django.conf import settings 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name='Post', 19 | fields=[ 20 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 21 | ('title', models.CharField(max_length=255)), 22 | ('text', models.TextField()), 23 | ('pub_date', models.DateTimeField(auto_now_add=True)), 24 | ('is_visible', models.BooleanField(default=True)), 25 | ('author', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='posts', to=settings.AUTH_USER_MODEL)), 26 | ], 27 | ), 28 | ] 29 | -------------------------------------------------------------------------------- /lesson23/final_project/posts/migrations/0002_alter_post_options.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.2 on 2024-02-13 18:40 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('posts', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterModelOptions( 14 | name='post', 15 | options={'ordering': ['-pub_date']}, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /lesson23/final_project/posts/migrations/0003_alter_post_options_post_image.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.2 on 2024-02-17 16:24 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('posts', '0002_alter_post_options'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterModelOptions( 14 | name='post', 15 | options={'ordering': ['-pub_date'], 'verbose_name': 'Публикация', 'verbose_name_plural': 'Публикации'}, 16 | ), 17 | migrations.AddField( 18 | model_name='post', 19 | name='image', 20 | field=models.ImageField(blank=True, upload_to='posts/', verbose_name='Изображение'), 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /lesson23/final_project/posts/migrations/0004_alter_post_text.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.2 on 2024-02-17 17:02 2 | 3 | import posts.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('posts', '0003_alter_post_options_post_image'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='post', 16 | name='text', 17 | field=models.TextField(validators=[posts.validators.validate_long_value]), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /lesson23/final_project/posts/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson23/final_project/posts/migrations/__init__.py -------------------------------------------------------------------------------- /lesson23/final_project/posts/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | 5 | urlpatterns = [ 6 | path( 7 | 'post_detail//', 8 | views.PostDetailView.as_view(), 9 | name='post_detail' 10 | ), 11 | path('post_list/', views.PostListView.as_view(), name='post_list'), 12 | path('post_add/', views.PostAddView.as_view(), name='post_add'), 13 | ] 14 | -------------------------------------------------------------------------------- /lesson23/final_project/posts/validators.py: -------------------------------------------------------------------------------- 1 | # Файл для хранения функций-валидаторов 2 | from django import forms 3 | 4 | 5 | # Функция-валидатор, определяющая, много ли символов в поле 6 | def validate_long_value(value): 7 | if len(value) >= 50: 8 | raise forms.ValidationError( 9 | 'Слишком много символов.', 10 | params={'value': value}, 11 | ) 12 | -------------------------------------------------------------------------------- /lesson23/final_project/templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {% block title %}Базовый{% endblock %} 7 | 8 | 9 |
10 | {% comment %} 11 | Проходит проверка, авторизирован ли пользователь. 12 | Авторизированным пользователям отображается кнопка выхода. 13 | Неавторизированным кнопки регистрации и входа. 14 | {% endcomment %} 15 | {% if user.is_authenticated %} 16 |
17 | Пользователь {{ user.username }} 18 |
19 |
20 | {% csrf_token %} 21 | 22 |
23 | {% else %} 24 | Регистрация 25 | Войти 26 | {% endif %} 27 |
28 |
29 | {% block content %}{% endblock %} 30 |
31 |
32 | 33 | -------------------------------------------------------------------------------- /lesson23/final_project/templates/core/404.html: -------------------------------------------------------------------------------- 1 | {% comment %} Шаблон для пользовательской ошибки 404 {% endcomment %} 2 | {% extends "base.html" %} 3 | 4 | {% block title %}Ошибка 404{% endblock title %} 5 | {% block content %} 6 |

Страница не найдена

7 |

Адреса {{ path }} не существует.

8 | Возврат на главную 9 | {% endblock content %} -------------------------------------------------------------------------------- /lesson23/final_project/templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block title %}Главная{% endblock title %} 4 | {% block content %} 5 |

Главная страница

6 | {% endblock content %} -------------------------------------------------------------------------------- /lesson23/final_project/templates/posts/post_detail.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block title %}Отдельная публикация{% endblock title %} 4 | {% block content %} 5 |
6 |

{{ post.title }}

7 |

{{ post.text }}

8 |

Автор {{ post.author.username }}

9 |

{{ post.pub_date }}

10 | {% comment %} Отображение изображения публикации {% endcomment %} 11 |

12 |
13 | {% endblock content %} -------------------------------------------------------------------------------- /lesson23/final_project/templates/posts/post_form.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block title %}Добавление публикации{% endblock title %} 4 | {% block content %} 5 |
6 | {% csrf_token %} 7 | {% for field in form %} 8 |
9 | {{ field.label_tag }} 10 | {{ field }} 11 |
12 | {% endfor %} 13 | {% for error in form.errors %} 14 |

{{ error }}

15 | {% endfor %} 16 | 17 |
18 | {% endblock content %} -------------------------------------------------------------------------------- /lesson23/final_project/templates/posts/post_list.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block title %}Список публикаций{% endblock title %} 4 | {% block content %} 5 | {% for post in posts %} 6 |
7 | {{ post.title }} 8 | {{ post.text }} 9 |
10 | {% endfor %} 11 | {% endblock content %} -------------------------------------------------------------------------------- /lesson23/final_project/templates/users/login.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block title %}Авторизация{% endblock title %} 4 | {% block content %} 5 |

Авторизация пользователя

6 |
7 | {% csrf_token %} 8 | 9 | 10 | 11 |
12 | {% endblock content %} -------------------------------------------------------------------------------- /lesson23/final_project/templates/users/register.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block title %}Регистрация{% endblock title %} 4 | {% block content %} 5 |

Регистрация пользователя

6 |
7 | {% csrf_token %} 8 | {% for field in form %} 9 |
10 | {{ field.label_tag }} 11 | {{ field }} 12 |
13 | {% endfor %} 14 | {% comment %} Вывод ошибок, возникающих при валидации {% endcomment %} 15 | {% if form.errors%} 16 | {% for field in form %} 17 | {% for error in field.errors %} 18 |

{{ error }}

19 | {% endfor %} 20 | {% endfor %} 21 | {% endif %} 22 | 23 |
24 | {% endblock content %} -------------------------------------------------------------------------------- /lesson23/final_project/users/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson23/final_project/users/__init__.py -------------------------------------------------------------------------------- /lesson23/final_project/users/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import CustomUser 3 | 4 | 5 | admin.site.register(CustomUser) 6 | -------------------------------------------------------------------------------- /lesson23/final_project/users/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class UsersConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'users' 7 | -------------------------------------------------------------------------------- /lesson23/final_project/users/forms.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.forms import UserCreationForm 2 | from django.contrib.auth import get_user_model 3 | from django import forms 4 | 5 | User = get_user_model() 6 | 7 | 8 | # Форма регистрации пользователя, наследуется от встроенной. 9 | class MyUserForm(UserCreationForm): 10 | class Meta: 11 | model = User 12 | fields = ['email', 'username', 'first_name', 'last_name', 'birth_year'] 13 | 14 | # Валидатор-метод для отдельного поля 15 | # Проверяет, есть ли в имени (поле first_name) слово 'Руслан'. 16 | # В этом случае поднимается ошибка. 17 | def clean_first_name(self): 18 | data = self.cleaned_data['first_name'] 19 | if 'Руслан' in data: 20 | raise forms.ValidationError('Руслану регистрация запрещена!') 21 | return data 22 | -------------------------------------------------------------------------------- /lesson23/final_project/users/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson23/final_project/users/migrations/__init__.py -------------------------------------------------------------------------------- /lesson23/final_project/users/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.contrib.auth.models import AbstractUser 3 | 4 | 5 | class CustomUser(AbstractUser): 6 | '''Кастомная модель пользователя.''' 7 | birth_year = models.DateField( 8 | verbose_name='Год рождения', 9 | blank=False, 10 | null=True, 11 | ) 12 | 13 | class Meta: 14 | ordering = ['birth_year'] 15 | verbose_name = 'Пользователь' 16 | verbose_name_plural = 'Пользователи' 17 | 18 | def __str__(self): 19 | return self.username[:20] 20 | -------------------------------------------------------------------------------- /lesson23/final_project/users/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from django.contrib.auth.views import LoginView, LogoutView 3 | from . import views 4 | 5 | 6 | urlpatterns = [ 7 | path('register/', views.RegisterView.as_view(), name='register'), 8 | path( 9 | 'login/', 10 | LoginView.as_view(template_name='users/login.html'), 11 | name='login' 12 | ), 13 | path('logout/', LogoutView.as_view(), name='logout'), 14 | ] 15 | -------------------------------------------------------------------------------- /lesson23/final_project/users/views.py: -------------------------------------------------------------------------------- 1 | from django.views.generic import CreateView 2 | from django.urls import reverse_lazy 3 | from .forms import MyUserForm 4 | 5 | 6 | # CBV для регистрации пользователя. 7 | class RegisterView(CreateView): 8 | '''Представление на основе класса для регистрации пользователя.''' 9 | # Класс формы 10 | form_class = MyUserForm 11 | # Явно указаны путь и название используемого шаблона. 12 | template_name = 'users/register.html' 13 | # Адрес, куда будет переброшен пользователь после успешной авторизации. 14 | success_url = reverse_lazy('users:login') 15 | -------------------------------------------------------------------------------- /lesson24/my_edu_project/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /lesson24/my_edu_project/my_edu/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson24/my_edu_project/my_edu/__init__.py -------------------------------------------------------------------------------- /lesson24/my_edu_project/my_edu/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for my_edu project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /lesson24/my_edu_project/my_edu/urls.py: -------------------------------------------------------------------------------- 1 | """ 2 | URL configuration for my_edu project. 3 | 4 | The `urlpatterns` list routes URLs to views. For more information please see: 5 | https://docs.djangoproject.com/en/5.0/topics/http/urls/ 6 | Examples: 7 | Function views 8 | 1. Add an import: from my_app import views 9 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 10 | Class-based views 11 | 1. Add an import: from other_app.views import Home 12 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 13 | Including another URLconf 14 | 1. Import the include() function: from django.urls import include, path 15 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 16 | """ 17 | from django.contrib import admin 18 | from django.urls import path, include 19 | 20 | 21 | urlpatterns = [ 22 | path('admin/', admin.site.urls), 23 | path('posts/', include(('posts.urls', 'posts'), namespace='posts')), 24 | ] 25 | -------------------------------------------------------------------------------- /lesson24/my_edu_project/my_edu/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for my_edu project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /lesson24/my_edu_project/posts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson24/my_edu_project/posts/__init__.py -------------------------------------------------------------------------------- /lesson24/my_edu_project/posts/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PostsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'posts' 7 | -------------------------------------------------------------------------------- /lesson24/my_edu_project/posts/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.2 on 2024-02-17 18:05 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | initial = True 9 | 10 | dependencies = [ 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Post', 16 | fields=[ 17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('title', models.CharField(max_length=255)), 19 | ('text', models.TextField()), 20 | ('pub_date', models.DateTimeField(auto_now_add=True)), 21 | ], 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /lesson24/my_edu_project/posts/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson24/my_edu_project/posts/migrations/__init__.py -------------------------------------------------------------------------------- /lesson24/my_edu_project/posts/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | 4 | class Post(models.Model): 5 | title = models.CharField(max_length=255) 6 | text = models.TextField() 7 | pub_date = models.DateTimeField(auto_now_add=True) 8 | -------------------------------------------------------------------------------- /lesson24/my_edu_project/posts/serializers.py: -------------------------------------------------------------------------------- 1 | # Сериализаторы 2 | # Нужны для преобразования данных в JSON и обратно. 3 | from rest_framework import serializers 4 | from .models import Post 5 | 6 | 7 | class PostSerializer(serializers.ModelSerializer): 8 | class Meta: 9 | model = Post 10 | fields = ( 11 | 'title', 12 | 'text', 13 | ) 14 | -------------------------------------------------------------------------------- /lesson24/my_edu_project/posts/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | 5 | urlpatterns = [ 6 | path('/', views.PostDetail.as_view(), name='post_detail'), 7 | path('', views.PostList.as_view(), name='post_list'), 8 | ] 9 | -------------------------------------------------------------------------------- /lesson24/my_edu_project/posts/views.py: -------------------------------------------------------------------------------- 1 | # DRF-представления на основе классов 2 | from rest_framework import generics 3 | from rest_framework import permissions 4 | 5 | from .models import Post 6 | from .serializers import PostSerializer 7 | 8 | 9 | # Представление для списка ресурсов 10 | class PostList(generics.ListCreateAPIView): 11 | queryset = Post.objects.all() 12 | serializer_class = PostSerializer 13 | 14 | 15 | # Представление для отдельного ресурса 16 | class PostDetail(generics.RetrieveUpdateDestroyAPIView): 17 | queryset = Post.objects.all() 18 | serializer_class = PostSerializer 19 | permission_classes = (permissions.IsAuthenticated) 20 | -------------------------------------------------------------------------------- /lesson25/my_edu_project/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /lesson25/my_edu_project/my_edu/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson25/my_edu_project/my_edu/__init__.py -------------------------------------------------------------------------------- /lesson25/my_edu_project/my_edu/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for my_edu project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /lesson25/my_edu_project/my_edu/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import path, include 3 | 4 | 5 | urlpatterns = [ 6 | path('admin/', admin.site.urls), 7 | path('posts/', include(('posts.urls', 'posts'), namespace='posts')), 8 | ] 9 | -------------------------------------------------------------------------------- /lesson25/my_edu_project/my_edu/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for my_edu project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /lesson25/my_edu_project/posts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson25/my_edu_project/posts/__init__.py -------------------------------------------------------------------------------- /lesson25/my_edu_project/posts/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PostsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'posts' 7 | -------------------------------------------------------------------------------- /lesson25/my_edu_project/posts/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.2 on 2024-02-20 16:49 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | initial = True 9 | 10 | dependencies = [ 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Post', 16 | fields=[ 17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('title', models.CharField(max_length=150)), 19 | ('text', models.TextField()), 20 | ('pub_date', models.DateTimeField(auto_now_add=True)), 21 | ], 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /lesson25/my_edu_project/posts/migrations/0002_alter_post_pub_date.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.2 on 2024-02-23 11:07 2 | 3 | import django.utils.timezone 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('posts', '0001_initial'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='post', 16 | name='pub_date', 17 | field=models.DateTimeField(default=django.utils.timezone.now), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /lesson25/my_edu_project/posts/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson25/my_edu_project/posts/migrations/__init__.py -------------------------------------------------------------------------------- /lesson25/my_edu_project/posts/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.utils import timezone 3 | 4 | 5 | class Post(models.Model): 6 | title = models.CharField(max_length=150) 7 | text = models.TextField() 8 | # Вместо auto_now_add задаем значение даты по умолчанию через timezone.now, 9 | # работает схожим с datetime.now() образом, но с поправкой на часовой пояс. 10 | # Это дает нам возможность передавать свое или изменять значение даты в БД. 11 | pub_date = models.DateTimeField(default=timezone.now) 12 | -------------------------------------------------------------------------------- /lesson25/my_edu_project/posts/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | 5 | # Создаем простые адреса на основе представлений от классов. 6 | urlpatterns = [ 7 | # path('/', views.PostDetail.as_view(), name='post_detail'), 8 | # path('', views.PostList.as_view(), name='post_list'), 9 | path('', views.PostListAPIView.as_view(), name='post_list') 10 | ] 11 | -------------------------------------------------------------------------------- /lesson26/my_edu_project/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /lesson26/my_edu_project/my_edu/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson26/my_edu_project/my_edu/__init__.py -------------------------------------------------------------------------------- /lesson26/my_edu_project/my_edu/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for my_edu project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /lesson26/my_edu_project/my_edu/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import path, include 3 | 4 | urlpatterns = [ 5 | path('admin/', admin.site.urls), 6 | path('posts/', include(('posts.urls', 'posts'), namespace='posts')), 7 | ] 8 | -------------------------------------------------------------------------------- /lesson26/my_edu_project/my_edu/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for my_edu project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /lesson26/my_edu_project/posts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson26/my_edu_project/posts/__init__.py -------------------------------------------------------------------------------- /lesson26/my_edu_project/posts/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import Category, Post 3 | 4 | 5 | admin.site.register(Category) 6 | admin.site.register(Post) 7 | -------------------------------------------------------------------------------- /lesson26/my_edu_project/posts/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PostsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'posts' 7 | -------------------------------------------------------------------------------- /lesson26/my_edu_project/posts/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.2 on 2024-02-24 16:29 2 | 3 | import django.db.models.deletion 4 | import django.utils.timezone 5 | from django.conf import settings 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | initial = True 12 | 13 | dependencies = [ 14 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 15 | ] 16 | 17 | operations = [ 18 | migrations.CreateModel( 19 | name='Post', 20 | fields=[ 21 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 22 | ('title', models.CharField(max_length=150)), 23 | ('text', models.TextField()), 24 | ('pub_date', models.DateTimeField(default=django.utils.timezone.now)), 25 | ('author', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='posts', to=settings.AUTH_USER_MODEL)), 26 | ], 27 | ), 28 | ] 29 | -------------------------------------------------------------------------------- /lesson26/my_edu_project/posts/migrations/0002_category_post_category.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.2 on 2024-02-24 16:53 2 | 3 | import django.db.models.deletion 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('posts', '0001_initial'), 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Category', 16 | fields=[ 17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('title', models.CharField(max_length=150)), 19 | ], 20 | ), 21 | migrations.AddField( 22 | model_name='post', 23 | name='category', 24 | field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='posts', to='posts.category'), 25 | ), 26 | ] 27 | -------------------------------------------------------------------------------- /lesson26/my_edu_project/posts/migrations/0003_post_create_date.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.2 on 2024-02-24 17:53 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('posts', '0002_category_post_category'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='post', 15 | name='create_date', 16 | field=models.DateTimeField(auto_now_add=True, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /lesson26/my_edu_project/posts/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson26/my_edu_project/posts/migrations/__init__.py -------------------------------------------------------------------------------- /lesson26/my_edu_project/posts/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.utils import timezone 3 | from django.contrib.auth import get_user_model 4 | 5 | User = get_user_model() 6 | 7 | 8 | class Category(models.Model): 9 | title = models.CharField(max_length=150) 10 | 11 | 12 | class Post(models.Model): 13 | title = models.CharField(max_length=150) 14 | text = models.TextField() 15 | pub_date = models.DateTimeField(default=timezone.now) 16 | create_date = models.DateTimeField(auto_now_add=True, null=True) 17 | author = models.ForeignKey( 18 | User, 19 | on_delete=models.SET_NULL, 20 | related_name='posts', 21 | null=True, 22 | ) 23 | category = models.ForeignKey( 24 | Category, 25 | on_delete=models.SET_NULL, 26 | related_name='posts', 27 | null=True, 28 | ) 29 | 30 | def __str__(self) -> str: 31 | return self.title 32 | -------------------------------------------------------------------------------- /lesson26/my_edu_project/posts/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | 5 | urlpatterns = [ 6 | path('', views.PostList.as_view(), name='post_list'), 7 | path('/', views.PostDetail.as_view(), name='post_detail'), 8 | path('category//', views.CategoryDetail.as_view(), 9 | name='category_detail'), 10 | ] 11 | -------------------------------------------------------------------------------- /lesson26/my_edu_project/posts/views.py: -------------------------------------------------------------------------------- 1 | from rest_framework import generics 2 | from .models import Post, Category 3 | from .serializers import PostSerializer, CategorySerializer 4 | 5 | 6 | # Представление для списка ресурсов публикаций 7 | class PostList(generics.ListCreateAPIView): 8 | queryset = Post.objects.all() 9 | serializer_class = PostSerializer 10 | 11 | 12 | # Представление для отдельного ресурса публикаций 13 | class PostDetail(generics.RetrieveUpdateDestroyAPIView): 14 | queryset = Post.objects.all() 15 | serializer_class = PostSerializer 16 | 17 | 18 | # Представление для отдельного ресурса категорий 19 | class CategoryDetail(generics.RetrieveUpdateDestroyAPIView): 20 | queryset = Category.objects.all() 21 | serializer_class = CategorySerializer 22 | -------------------------------------------------------------------------------- /lesson27/my_edu_project/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /lesson27/my_edu_project/my_edu/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson27/my_edu_project/my_edu/__init__.py -------------------------------------------------------------------------------- /lesson27/my_edu_project/my_edu/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for my_edu project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /lesson27/my_edu_project/my_edu/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import path, include 3 | 4 | urlpatterns = [ 5 | path('admin/', admin.site.urls), 6 | path('', include(('posts.urls', 'posts'), namespace='posts')), 7 | ] 8 | -------------------------------------------------------------------------------- /lesson27/my_edu_project/my_edu/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for my_edu project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /lesson27/my_edu_project/posts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson27/my_edu_project/posts/__init__.py -------------------------------------------------------------------------------- /lesson27/my_edu_project/posts/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import Post 3 | 4 | 5 | admin.site.register(Post) 6 | -------------------------------------------------------------------------------- /lesson27/my_edu_project/posts/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PostsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'posts' 7 | -------------------------------------------------------------------------------- /lesson27/my_edu_project/posts/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.2 on 2024-02-27 16:28 2 | 3 | import django.db.models.deletion 4 | from django.conf import settings 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name='Post', 19 | fields=[ 20 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 21 | ('title', models.CharField(max_length=150)), 22 | ('text', models.TextField()), 23 | ('pub_date', models.DateTimeField(auto_now_add=True)), 24 | ('author', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='posts', to=settings.AUTH_USER_MODEL)), 25 | ], 26 | ), 27 | ] 28 | -------------------------------------------------------------------------------- /lesson27/my_edu_project/posts/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson27/my_edu_project/posts/migrations/__init__.py -------------------------------------------------------------------------------- /lesson27/my_edu_project/posts/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.contrib.auth import get_user_model 3 | 4 | User = get_user_model() 5 | 6 | 7 | class Post(models.Model): 8 | title = models.CharField(max_length=150) 9 | text = models.TextField() 10 | pub_date = models.DateTimeField(auto_now_add=True) 11 | author = models.ForeignKey( 12 | User, 13 | on_delete=models.SET_NULL, 14 | null=True, 15 | related_name='posts', 16 | ) 17 | 18 | def __str__(self) -> str: 19 | return self.title 20 | -------------------------------------------------------------------------------- /lesson27/my_edu_project/posts/serializers.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | from .models import Post 3 | 4 | 5 | class PostSerializer(serializers.ModelSerializer): 6 | author = serializers.StringRelatedField(read_only=True) 7 | 8 | class Meta: 9 | model = Post 10 | fields = ('title', 'text', 'pub_date', 'author') 11 | -------------------------------------------------------------------------------- /lesson27/my_edu_project/posts/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | urlpatterns = [ 5 | path('', views.index, name='index'), 6 | # path('posts/', views.post_list, name='post_list'), 7 | # path('posts//', views.post_detail, name='post_detail'), 8 | # path('posts/', views.APIPostList.as_view(), name='post_list'), 9 | # path('posts//', views.APIPostDetail.as_view(), 10 | # name='post_detail'), 11 | path('posts/', views.PostList.as_view(), name='post_list'), 12 | path('posts//', views.PostDetail.as_view(), name='post_detail'), 13 | ] 14 | -------------------------------------------------------------------------------- /lesson28/my_edu_project/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /lesson28/my_edu_project/my_edu/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson28/my_edu_project/my_edu/__init__.py -------------------------------------------------------------------------------- /lesson28/my_edu_project/my_edu/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for my_edu project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /lesson28/my_edu_project/my_edu/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import path, include 3 | 4 | urlpatterns = [ 5 | path('admin/', admin.site.urls), 6 | path('api/v1/', include(('posts.urls', 'posts'), namespace='posts')), 7 | ] 8 | -------------------------------------------------------------------------------- /lesson28/my_edu_project/my_edu/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for my_edu project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /lesson28/my_edu_project/posts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson28/my_edu_project/posts/__init__.py -------------------------------------------------------------------------------- /lesson28/my_edu_project/posts/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /lesson28/my_edu_project/posts/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PostsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'posts' 7 | -------------------------------------------------------------------------------- /lesson28/my_edu_project/posts/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.2 on 2024-03-02 16:22 2 | 3 | import django.db.models.deletion 4 | from django.conf import settings 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name='Post', 19 | fields=[ 20 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 21 | ('title', models.CharField(max_length=150)), 22 | ('text', models.TextField()), 23 | ('pub_date', models.DateTimeField(auto_now_add=True)), 24 | ('author', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='posts', to=settings.AUTH_USER_MODEL)), 25 | ], 26 | ), 27 | ] 28 | -------------------------------------------------------------------------------- /lesson28/my_edu_project/posts/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson28/my_edu_project/posts/migrations/__init__.py -------------------------------------------------------------------------------- /lesson28/my_edu_project/posts/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.contrib.auth import get_user_model 3 | 4 | User = get_user_model() 5 | 6 | 7 | class Post(models.Model): 8 | title = models.CharField(max_length=150) 9 | text = models.TextField() 10 | pub_date = models.DateTimeField(auto_now_add=True) 11 | author = models.ForeignKey( 12 | User, 13 | on_delete=models.SET_NULL, 14 | null=True, 15 | related_name='posts', 16 | ) 17 | 18 | def __str__(self) -> str: 19 | return self.title 20 | -------------------------------------------------------------------------------- /lesson28/my_edu_project/posts/serializers.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | from .models import Post 3 | 4 | 5 | # Сериализатор для отдельной записи 6 | class PostSerializer(serializers.ModelSerializer): 7 | author = serializers.StringRelatedField(read_only=True) 8 | 9 | class Meta: 10 | model = Post 11 | fields = ('title', 'text', 'pub_date', 'author') 12 | 13 | 14 | # Сериализатор для списка записей 15 | class PostListSerializer(serializers.ModelSerializer): 16 | class Meta: 17 | model = Post 18 | fields = ('title', 'author') 19 | -------------------------------------------------------------------------------- /lesson28/my_edu_project/posts/urls.py: -------------------------------------------------------------------------------- 1 | # URL-ы вьюсетов 2 | from django.urls import path, include 3 | from rest_framework.routers import DefaultRouter 4 | # from rest_framework.routers import SimpleRouter 5 | from . import views 6 | 7 | # Класс SimpleRouter генерирует эндпоинты списка ресурсов 8 | # и отдельного ресурса для зарегистрированного вьюсета. 9 | # router = SimpleRouter() 10 | 11 | # Класс DefaultRouter работает аналогично SimpleRouter, однако 12 | # дополнительно включает дефолтное корневое API представление, 13 | # возвращающее ответ с гиперссылками на все представления списка. 14 | router = DefaultRouter() 15 | 16 | # Все представления и эндпоинты регистрируются в роутере. 17 | # В качестве URL-адреса применяется регулярное выражение. 18 | router.register(r'posts', views.PostViewSet, basename='my_posts') 19 | 20 | urlpatterns = [ 21 | # Полученный router в итоге добавляется в urlpatterns. 22 | path('', include(router.urls)), 23 | ] 24 | -------------------------------------------------------------------------------- /lesson28/my_edu_project/users/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson28/my_edu_project/users/__init__.py -------------------------------------------------------------------------------- /lesson28/my_edu_project/users/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /lesson28/my_edu_project/users/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class UsersConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'users' 7 | -------------------------------------------------------------------------------- /lesson28/my_edu_project/users/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson28/my_edu_project/users/migrations/__init__.py -------------------------------------------------------------------------------- /lesson28/my_edu_project/users/models.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.models import AbstractUser 2 | 3 | 4 | class CustomUser(AbstractUser): 5 | pass 6 | -------------------------------------------------------------------------------- /lesson28/my_edu_project/users/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /lesson28/my_edu_project/users/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | # Create your views here. 4 | -------------------------------------------------------------------------------- /lesson29/my_edu_project/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /lesson29/my_edu_project/my_edu/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson29/my_edu_project/my_edu/__init__.py -------------------------------------------------------------------------------- /lesson29/my_edu_project/my_edu/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for my_edu project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /lesson29/my_edu_project/my_edu/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import path, include 3 | 4 | urlpatterns = [ 5 | path('admin/', admin.site.urls), 6 | path('api/v1/', include(('posts.urls', 'posts'), namespace='posts')), 7 | ] 8 | -------------------------------------------------------------------------------- /lesson29/my_edu_project/my_edu/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for my_edu project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /lesson29/my_edu_project/posts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson29/my_edu_project/posts/__init__.py -------------------------------------------------------------------------------- /lesson29/my_edu_project/posts/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /lesson29/my_edu_project/posts/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PostsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'posts' 7 | -------------------------------------------------------------------------------- /lesson29/my_edu_project/posts/migrations/0002_post.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.3 on 2024-03-05 17:50 2 | 3 | import django.db.models.deletion 4 | from django.conf import settings 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('posts', '0001_initial'), 12 | ] 13 | 14 | operations = [ 15 | migrations.CreateModel( 16 | name='Post', 17 | fields=[ 18 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 19 | ('title', models.CharField(max_length=150)), 20 | ('text', models.TextField()), 21 | ('pub_date', models.DateTimeField(auto_now_add=True)), 22 | ('author', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='posts', to=settings.AUTH_USER_MODEL)), 23 | ], 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /lesson29/my_edu_project/posts/migrations/0003_alter_post_options.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.3 on 2024-03-05 17:57 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('posts', '0002_post'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterModelOptions( 14 | name='post', 15 | options={'ordering': ['-pub_date']}, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /lesson29/my_edu_project/posts/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson29/my_edu_project/posts/migrations/__init__.py -------------------------------------------------------------------------------- /lesson29/my_edu_project/posts/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.contrib.auth.models import AbstractUser 3 | 4 | 5 | class CustomUser(AbstractUser): 6 | pass 7 | 8 | 9 | class Post(models.Model): 10 | title = models.CharField(max_length=150) 11 | text = models.TextField() 12 | pub_date = models.DateTimeField(auto_now_add=True) 13 | author = models.ForeignKey( 14 | CustomUser, 15 | on_delete=models.SET_NULL, 16 | null=True, 17 | related_name='posts', 18 | ) 19 | 20 | class Meta: 21 | ordering = ['-pub_date'] 22 | -------------------------------------------------------------------------------- /lesson29/my_edu_project/posts/pagination.py: -------------------------------------------------------------------------------- 1 | # Пагинация, Pagination 2 | 3 | from rest_framework.pagination import PageNumberPagination 4 | from rest_framework.response import Response 5 | 6 | # Классы пагинации: 7 | # 1. PageNumberPagination 8 | # http://127.0.0.1:8000/posts/?page=2 9 | 10 | # 2. LimitOffsetPagination 11 | # http://127.0.0.1:8000/posts/?limit=100&offset=400 12 | 13 | # 3. CursorPagination 14 | 15 | 16 | # Создание кастомной пагинации. 17 | class PostPagination(PageNumberPagination): 18 | # Количество объектов на одной странице. 19 | # Если установлено, переопределяет параметр PAGE_SIZE. 20 | page_size = 2 21 | # Имя параметра запроса, который позволяет клиенту устанавливать 22 | # количество объектов на странице для каждого запроса. 23 | page_size_query_param = 'page_size' 24 | # Максимальное количество объектов на одной странице 25 | # даже с учетом запроса от клиента. 26 | max_page_size = 100 27 | 28 | # Переопределение полей возвращаемого ответа пагинатора. 29 | def get_paginated_response(self, data): 30 | return Response({ 31 | 'number': self.page.paginator.count, 32 | 'data': data, 33 | }) 34 | -------------------------------------------------------------------------------- /lesson29/my_edu_project/posts/serializers.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | from .models import Post 3 | 4 | 5 | class PostSerializer(serializers.ModelSerializer): 6 | class Meta: 7 | model = Post 8 | fields = ('title', 'text', 'pub_date', 'author') 9 | -------------------------------------------------------------------------------- /lesson29/my_edu_project/posts/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path, include 2 | from rest_framework.routers import DefaultRouter 3 | 4 | from . import views 5 | 6 | 7 | router = DefaultRouter() 8 | 9 | router.register(r'posts', views.PostViewSet) 10 | 11 | urlpatterns = [ 12 | path('', include(router.urls)), 13 | ] 14 | -------------------------------------------------------------------------------- /lesson29/my_edu_project/posts/views.py: -------------------------------------------------------------------------------- 1 | from rest_framework.viewsets import ModelViewSet 2 | from rest_framework.pagination import LimitOffsetPagination 3 | 4 | from .models import Post 5 | from .serializers import PostSerializer 6 | 7 | 8 | class PostViewSet(ModelViewSet): 9 | queryset = Post.objects.all() 10 | serializer_class = PostSerializer 11 | # Задание класса пагинатора на уровне отдельного представления. 12 | pagination_class = LimitOffsetPagination 13 | 14 | # Отключение пагинации для отдельного вьюсета. 15 | # pagination_class = None 16 | -------------------------------------------------------------------------------- /lesson3/main.py: -------------------------------------------------------------------------------- 1 | # Шаблонизация, jinja2 2 | 3 | from flask import Flask 4 | # render_template позволяет рендерить html из шаблона 5 | from flask import render_template 6 | 7 | app = Flask(__name__) 8 | 9 | 10 | @app.route('/') 11 | def index(): 12 | # params - словарь, в который мы занесем все значения для передачи шаблону. 13 | # В самом шаблоне можно получить значение через точечную нотацию. 14 | # Например: params.name или params.surname 15 | params = {} 16 | params['name'] = 'Qwerty' 17 | params['surname'] = 'Амиров' 18 | # render_template принимает 1 позиционный аргумент, название шаблона, 19 | # и любое количество именованных аргументов. 20 | return render_template('home.html', params=params) 21 | 22 | 23 | @app.route('/about') 24 | def about(): 25 | # Функции render_template можно передавать и списки 26 | staff = ['Магомед', 'Патимат', 'Сидредин'] 27 | return render_template('about.html', staff=staff) 28 | 29 | 30 | if __name__ == '__main__': 31 | app.run(host='127.0.0.1', port=8000) 32 | -------------------------------------------------------------------------------- /lesson3/repeat.py: -------------------------------------------------------------------------------- 1 | # Повторение тем статические файлы и обработка форм 2 | from flask import Flask 3 | from flask import url_for, request 4 | 5 | 6 | app = Flask(__name__) 7 | 8 | 9 | @app.route('/', methods=['GET', 'POST']) 10 | def index(): 11 | if request.method == 'GET': 12 | return f''' 13 | 14 | 15 | 16 | 17 | Document 18 | 20 | 21 | 22 |
Lorem ipsum dolor sit amet, consectetur adipisicing elit. 23 | Vel earum, dolor libero dolores, in asperiores rerum repellendus 24 | voluptates deserunt ex molestias ab nesciunt! Corrupti tempore accusantium 25 | omnis, quos facere odit.
26 |
27 | 28 | 29 |
30 | 31 | ''' 32 | else: 33 | return f'{request.form.get("text")}' 34 | 35 | 36 | if __name__ == '__main__': 37 | app.run(host='127.0.0.1', port=8000) 38 | -------------------------------------------------------------------------------- /lesson3/static/css/style.css: -------------------------------------------------------------------------------- 1 | div { 2 | padding: 10px; 3 | background-color: rgb(0, 0, 83); 4 | color: #fff; 5 | } 6 | .worker_plate { 7 | width: 150px; 8 | height: 150px; 9 | background-color: wheat; 10 | text-align: center; 11 | } -------------------------------------------------------------------------------- /lesson3/templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 11 | {% block title %}{% endblock %} 12 | 13 | 14 | 15 | {% block content %}{% endblock %} 16 | 17 | 18 | -------------------------------------------------------------------------------- /lesson3/templates/home.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {% extends "base.html" %} 5 | 6 | {% block title %}Главная{% endblock %} 7 | 8 | {% block content %} 9 |

Главная страница

10 | 11 | 12 | 20 | 21 | {% if params.name == 'Саид' %} 22 | 23 |
{{ params.name }}, добро пожаловать!
24 | {% else %} 25 |
{{ params.name }}, я вас не знаю, покиньте сайт.
26 | 27 | {% endif %} 28 | 29 | {% endblock %} -------------------------------------------------------------------------------- /lesson30/my_edu_project/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /lesson30/my_edu_project/my_edu/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson30/my_edu_project/my_edu/__init__.py -------------------------------------------------------------------------------- /lesson30/my_edu_project/my_edu/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for my_edu project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /lesson30/my_edu_project/my_edu/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for my_edu project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /lesson30/my_edu_project/posts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson30/my_edu_project/posts/__init__.py -------------------------------------------------------------------------------- /lesson30/my_edu_project/posts/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.contrib.auth import get_user_model 3 | 4 | User = get_user_model() 5 | 6 | 7 | admin.site.register(User) 8 | -------------------------------------------------------------------------------- /lesson30/my_edu_project/posts/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PostsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'posts' 7 | -------------------------------------------------------------------------------- /lesson30/my_edu_project/posts/migrations/0002_post.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.3 on 2024-03-09 16:19 2 | 3 | import django.db.models.deletion 4 | from django.conf import settings 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('posts', '0001_initial'), 12 | ] 13 | 14 | operations = [ 15 | migrations.CreateModel( 16 | name='Post', 17 | fields=[ 18 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 19 | ('title', models.CharField(max_length=150)), 20 | ('text', models.TextField()), 21 | ('pub_date', models.DateTimeField(auto_now_add=True)), 22 | ('author', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='posts', to=settings.AUTH_USER_MODEL)), 23 | ], 24 | options={ 25 | 'ordering': ['-pub_date'], 26 | }, 27 | ), 28 | ] 29 | -------------------------------------------------------------------------------- /lesson30/my_edu_project/posts/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson30/my_edu_project/posts/migrations/__init__.py -------------------------------------------------------------------------------- /lesson30/my_edu_project/posts/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.contrib.auth.models import AbstractUser 3 | 4 | 5 | class CustomUser(AbstractUser): 6 | pass 7 | 8 | 9 | class Post(models.Model): 10 | title = models.CharField(max_length=150) 11 | text = models.TextField() 12 | pub_date = models.DateTimeField(auto_now_add=True) 13 | author = models.ForeignKey( 14 | CustomUser, 15 | on_delete=models.SET_NULL, 16 | null=True, 17 | related_name='posts', 18 | ) 19 | 20 | class Meta: 21 | ordering = ['-pub_date'] 22 | -------------------------------------------------------------------------------- /lesson30/my_edu_project/posts/permissions.py: -------------------------------------------------------------------------------- 1 | # Permissions, разрешения 2 | # Разрешения позволяют разграничить права доступа к операциям. 3 | # Собственные классы разрешений 4 | from rest_framework import permissions 5 | 6 | 7 | # Кастомные классы разрешений наследуются от базового класса BasePermission. 8 | # В нем определены два метода: 9 | # has_permission (разрешение на уровне запроса), 10 | # has_object_permission (разрешение на уровне объекта). 11 | class IsAdminOrReadOnly(permissions.BasePermission): 12 | def has_permission(self, request, view): 13 | if request.method in permissions.SAFE_METHODS: 14 | return True 15 | return request.user.is_staff 16 | 17 | 18 | class IsAuthorOrReadOnly(permissions.BasePermission): 19 | def has_permission(self, request, view): 20 | return bool(request.method in permissions.SAFE_METHODS or 21 | request.user.is_authenticated) 22 | 23 | def has_object_permission(self, request, view, obj): 24 | return obj.author == request.user or request.user.is_staff 25 | -------------------------------------------------------------------------------- /lesson30/my_edu_project/posts/serializers.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | from .models import Post 3 | 4 | 5 | class PostSerializer(serializers.ModelSerializer): 6 | class Meta: 7 | model = Post 8 | fields = ('title', 'text', 'pub_date', 'author') 9 | -------------------------------------------------------------------------------- /lesson30/my_edu_project/posts/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path, include 2 | from rest_framework.routers import DefaultRouter 3 | 4 | from .views import PostViewSet 5 | 6 | router = DefaultRouter() 7 | 8 | 9 | router.register(r'posts', PostViewSet, basename='post') 10 | 11 | urlpatterns = [ 12 | path('', include(router.urls)), 13 | ] 14 | -------------------------------------------------------------------------------- /lesson30/my_edu_project/posts/views.py: -------------------------------------------------------------------------------- 1 | from rest_framework import viewsets 2 | # from rest_framework.permissions import IsAuthenticated 3 | # from rest_framework.authentication import TokenAuthentication 4 | 5 | from .models import Post 6 | from .serializers import PostSerializer 7 | from .permissions import IsAdminOrReadOnly, IsAuthorOrReadOnly 8 | 9 | 10 | class PostViewSet(viewsets.ModelViewSet): 11 | queryset = Post.objects.all() 12 | serializer_class = PostSerializer 13 | # Задание класса разрешения на уровне представления. 14 | # Встроенный класс разрешения. 15 | # permission_classes = (IsAuthenticated,) 16 | # Кастомный класс разрешения. 17 | permission_classes = (IsAdminOrReadOnly,) 18 | # Задание класса аутентификации на уровне представления. 19 | # authentication_classes = (TokenAuthentication,) 20 | 21 | # get_permissions - метод, позволяющий применять различные разрешения 22 | # в рамках одного вьюсета. 23 | def get_permissions(self): 24 | if self.action == 'create': 25 | return (IsAuthorOrReadOnly(),) 26 | return super().get_permissions() 27 | -------------------------------------------------------------------------------- /lesson31/my_edu_project/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /lesson31/my_edu_project/my_edu/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson31/my_edu_project/my_edu/__init__.py -------------------------------------------------------------------------------- /lesson31/my_edu_project/my_edu/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for my_edu project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /lesson31/my_edu_project/my_edu/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import path, include 3 | 4 | urlpatterns = [ 5 | path('admin/', admin.site.urls), 6 | path('api/v1/', include(('posts.urls', 'posts'), namespace='posts')), 7 | ] 8 | -------------------------------------------------------------------------------- /lesson31/my_edu_project/my_edu/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for my_edu project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_edu.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /lesson31/my_edu_project/posts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson31/my_edu_project/posts/__init__.py -------------------------------------------------------------------------------- /lesson31/my_edu_project/posts/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from .models import Post 4 | 5 | 6 | admin.site.register(Post) 7 | -------------------------------------------------------------------------------- /lesson31/my_edu_project/posts/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PostsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'posts' 7 | -------------------------------------------------------------------------------- /lesson31/my_edu_project/posts/migrations/0002_post.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.3 on 2024-03-12 17:27 2 | 3 | import django.db.models.deletion 4 | from django.conf import settings 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('posts', '0001_initial'), 12 | ] 13 | 14 | operations = [ 15 | migrations.CreateModel( 16 | name='Post', 17 | fields=[ 18 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 19 | ('title', models.CharField(max_length=150)), 20 | ('text', models.TextField()), 21 | ('pub_date', models.DateTimeField(auto_now_add=True)), 22 | ('author', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='posts', to=settings.AUTH_USER_MODEL)), 23 | ], 24 | options={ 25 | 'ordering': ['-pub_date'], 26 | }, 27 | ), 28 | ] 29 | -------------------------------------------------------------------------------- /lesson31/my_edu_project/posts/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson31/my_edu_project/posts/migrations/__init__.py -------------------------------------------------------------------------------- /lesson31/my_edu_project/posts/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.contrib.auth.models import AbstractUser 3 | 4 | 5 | class CustomUser(AbstractUser): 6 | pass 7 | 8 | 9 | class Post(models.Model): 10 | title = models.CharField(max_length=150) 11 | text = models.TextField() 12 | pub_date = models.DateTimeField(auto_now_add=True) 13 | author = models.ForeignKey( 14 | CustomUser, 15 | on_delete=models.SET_NULL, 16 | null=True, 17 | related_name='posts', 18 | ) 19 | 20 | class Meta: 21 | ordering = ['-pub_date'] 22 | -------------------------------------------------------------------------------- /lesson31/my_edu_project/posts/serializers.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | from .models import Post 3 | 4 | 5 | class PostSerializer(serializers.ModelSerializer): 6 | # Задание значения по умолчанию для скрытого от пользователей поля author. 7 | author = serializers.HiddenField(default=serializers.CurrentUserDefault()) 8 | 9 | class Meta: 10 | model = Post 11 | fields = ('title', 'text', 'pub_date', 'author') 12 | -------------------------------------------------------------------------------- /lesson31/my_edu_project/posts/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from . import views 4 | 5 | 6 | urlpatterns = [ 7 | path('posts/', views.PostList.as_view(), name='post-list'), 8 | ] 9 | -------------------------------------------------------------------------------- /lesson31/requirements.txt: -------------------------------------------------------------------------------- 1 | asgiref==3.7.2 2 | Django==5.0.3 3 | django-filter==24.1 4 | djangorestframework==3.14.0 5 | pytz==2024.1 6 | sqlparse==0.4.4 7 | tzdata==2024.1 8 | -------------------------------------------------------------------------------- /lesson32/final_project/final/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson32/final_project/final/__init__.py -------------------------------------------------------------------------------- /lesson32/final_project/final/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for final project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'final.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /lesson32/final_project/final/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import path, include 3 | from rest_framework_simplejwt import views 4 | 5 | urlpatterns = [ 6 | path('admin/', admin.site.urls), 7 | path('', include(('news.urls', 'news'), namespace='news')), 8 | path('api/v1/', include(('posts.urls', 'posts'), namespace='posts')), 9 | path('token/', views.TokenObtainPairView.as_view(), name='token_obtain'), 10 | path('token/refresh/', views.TokenRefreshView.as_view(), 11 | name='token_refresh'), 12 | ] 13 | -------------------------------------------------------------------------------- /lesson32/final_project/final/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for final project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'final.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /lesson32/final_project/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'final.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /lesson32/final_project/news/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson32/final_project/news/__init__.py -------------------------------------------------------------------------------- /lesson32/final_project/news/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from .models import News 4 | 5 | 6 | admin.site.register(News) 7 | -------------------------------------------------------------------------------- /lesson32/final_project/news/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class NewsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'news' 7 | -------------------------------------------------------------------------------- /lesson32/final_project/news/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson32/final_project/news/migrations/__init__.py -------------------------------------------------------------------------------- /lesson32/final_project/news/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.contrib.auth import get_user_model 3 | from django.utils import timezone 4 | 5 | User = get_user_model() 6 | 7 | 8 | class News(models.Model): 9 | """Модель новостей.""" 10 | 11 | title = models.CharField('Заголовок статьи', max_length=155, blank=False) 12 | text = models.TextField('Текст статьи', blank=False) 13 | create_date = models.DateTimeField('Дата создания', auto_now_add=True) 14 | update_date = models.DateTimeField('Дата изменения', auto_now=True) 15 | pub_date = models.DateTimeField('Дата публикации', default=timezone.now) 16 | author = models.ForeignKey( 17 | User, 18 | on_delete=models.SET_NULL, 19 | null=True, 20 | related_name='news', 21 | verbose_name='Автор новости' 22 | ) 23 | 24 | class Meta: 25 | ordering = ['-pub_date'] 26 | verbose_name = 'Новость' 27 | verbose_name_plural = 'Новости' 28 | 29 | def __str__(self) -> str: 30 | return self.title[:20] 31 | -------------------------------------------------------------------------------- /lesson32/final_project/news/serializers.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | 3 | from .models import News 4 | 5 | 6 | class NewsSerializer(serializers.ModelSerializer): 7 | """Сериализатор модели News.""" 8 | 9 | class Meta: 10 | model = News 11 | fields = ['title', 'text', 'pub_date', 'author'] 12 | -------------------------------------------------------------------------------- /lesson32/final_project/news/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from . import views 4 | 5 | urlpatterns = [ 6 | path('', views.index, name='index'), 7 | path('news/', views.NewsList.as_view(), name='news-list'), 8 | path('news/', views.NewsDetail.as_view(), name='news-detail'), 9 | ] 10 | -------------------------------------------------------------------------------- /lesson32/final_project/posts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson32/final_project/posts/__init__.py -------------------------------------------------------------------------------- /lesson32/final_project/posts/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from .models import Post, Category, Tag 4 | 5 | 6 | @admin.register(Post) 7 | class PostAdmin(admin.ModelAdmin): 8 | list_display = ['title', 'pub_date'] 9 | list_filter = ['create_date'] 10 | search_fields = ['title', 'text'] 11 | empty_value_display = '-empty-' 12 | fields = ['title', 'text', 'pub_date', 'author', 'category', 13 | 'create_date', 'update_date'] 14 | readonly_fields = ['create_date', 'update_date'] 15 | 16 | 17 | admin.site.register(Category) 18 | admin.site.register(Tag) 19 | -------------------------------------------------------------------------------- /lesson32/final_project/posts/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PostsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'posts' 7 | -------------------------------------------------------------------------------- /lesson32/final_project/posts/migrations/0002_posttag_post_tag.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.3 on 2024-03-16 17:32 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('posts', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddConstraint( 14 | model_name='posttag', 15 | constraint=models.UniqueConstraint(fields=('post', 'tag'), name='post_tag'), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /lesson32/final_project/posts/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson32/final_project/posts/migrations/__init__.py -------------------------------------------------------------------------------- /lesson32/final_project/posts/pagination.py: -------------------------------------------------------------------------------- 1 | from rest_framework.pagination import PageNumberPagination 2 | from rest_framework.response import Response 3 | 4 | 5 | class PostPagination(PageNumberPagination): 6 | page_size = 4 7 | page_size_query_param = 'page_size' 8 | max_page_size = 6 9 | 10 | def get_paginated_response(self, data) -> Response: 11 | return Response({ 12 | 'post_count': self.page.paginator.count, 13 | 'posts': data 14 | }) 15 | -------------------------------------------------------------------------------- /lesson32/final_project/posts/permissions.py: -------------------------------------------------------------------------------- 1 | from rest_framework import permissions 2 | 3 | 4 | class IsAuthorOrReadOnly(permissions.BasePermission): 5 | def has_permission(self, request, view) -> bool: 6 | return bool(request.method in permissions.SAFE_METHODS or 7 | request.user.is_authenticated) 8 | 9 | def has_object_permission(self, request, view, obj) -> bool: 10 | return obj.author == request.user 11 | -------------------------------------------------------------------------------- /lesson32/final_project/posts/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /lesson32/final_project/posts/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path, include 2 | from rest_framework.routers import DefaultRouter 3 | 4 | from . import views 5 | 6 | router = DefaultRouter() 7 | 8 | 9 | router.register(r'posts', views.PostViewSet, basename='posts') 10 | 11 | urlpatterns = [ 12 | path('', include(router.urls)), 13 | path('categories/', views.CategoryList.as_view(), name='category-list'), 14 | path('categories/', views.CategoryDetail.as_view(), 15 | name='category-detail'), 16 | ] 17 | -------------------------------------------------------------------------------- /lesson32/final_project/users/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson32/final_project/users/__init__.py -------------------------------------------------------------------------------- /lesson32/final_project/users/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.contrib.auth import get_user_model 3 | 4 | User = get_user_model() 5 | 6 | 7 | admin.site.register(User) 8 | -------------------------------------------------------------------------------- /lesson32/final_project/users/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class UsersConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'users' 7 | -------------------------------------------------------------------------------- /lesson32/final_project/users/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson32/final_project/users/migrations/__init__.py -------------------------------------------------------------------------------- /lesson32/final_project/users/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.contrib.auth.models import AbstractUser 3 | 4 | 5 | class CustomUser(AbstractUser): 6 | """Кастомная модель пользователя.""" 7 | 8 | USER = 'u' 9 | MODERATOR = 'm' 10 | ADMINISTRATOR = 'a' 11 | ROLE_CHOICES = [ 12 | (USER, 'User'), 13 | (MODERATOR, 'Moderator'), 14 | (ADMINISTRATOR, 'Administrator') 15 | ] 16 | role = models.CharField( 17 | 'Роль пользователя', 18 | max_length=1, 19 | choices=ROLE_CHOICES, 20 | default=USER 21 | ) 22 | 23 | def __str__(self) -> str: 24 | return self.username 25 | -------------------------------------------------------------------------------- /lesson32/requirements.txt: -------------------------------------------------------------------------------- 1 | asgiref==3.7.2 2 | Django==5.0.3 3 | django-filter==24.1 4 | djangorestframework==3.14.0 5 | djangorestframework-jwt==1.11.0 6 | PyJWT==1.7.1 7 | pytz==2024.1 8 | sqlparse==0.4.4 9 | tzdata==2024.1 10 | -------------------------------------------------------------------------------- /lesson4/.env: -------------------------------------------------------------------------------- 1 | MY_SECRET_KEY=МОЙ_СЕКРЕТНЫЙ_КЛЮЧ 2 | MY_PASSWORD=123fafasdfvzx 3 | MY_LOGIN=Saeed -------------------------------------------------------------------------------- /lesson4/.gitignore: -------------------------------------------------------------------------------- 1 | # Файл, в котором прописываются названия и маски файлов, 2 | # которые не должны быть загружены через git на GitHub 3 | 4 | # .env - это файл, хранящий скрываемые от посторонних данные 5 | # в форме пар ключ = значение, каждая пара с новой строки 6 | # .env 7 | -------------------------------------------------------------------------------- /lesson4/repeat.py: -------------------------------------------------------------------------------- 1 | # Приложение на повторение темы шаблонизация 2 | from flask import Flask 3 | from flask import render_template 4 | 5 | app = Flask(__name__) 6 | 7 | 8 | @app.route('/') 9 | def index(): 10 | return render_template('index.html', username='Магомед') 11 | 12 | 13 | if __name__ == '__main__': 14 | app.run() 15 | -------------------------------------------------------------------------------- /lesson4/static/css/style.css: -------------------------------------------------------------------------------- 1 | /* Стили приложения */ 2 | 3 | .form_block { 4 | margin: 5px; 5 | padding: 10px; 6 | } 7 | .btn { 8 | width: 200px; 9 | height: 50px; 10 | background-color: cadetblue; 11 | } 12 | .btn:hover { 13 | background-color: rgb(38, 63, 63); 14 | color: #fff; 15 | } -------------------------------------------------------------------------------- /lesson4/templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {% block title %}{% endblock %} 8 | 9 | 10 | 11 | {% block content %}{% endblock %} 12 | 13 | -------------------------------------------------------------------------------- /lesson4/templates/form_old.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 |
11 | 12 |
13 | 14 |
15 | 16 |
17 | 18 |
19 | 20 | -------------------------------------------------------------------------------- /lesson4/templates/success.html: -------------------------------------------------------------------------------- 1 | 2 | {% extends 'base.html' %} 3 | 4 | {% block title %}Форма заполнена{% endblock %} 5 | 6 | {% block content %} 7 |
8 | Поздравляю. Форма успешно заполнена! 9 |
10 | {% endblock %} -------------------------------------------------------------------------------- /lesson4/templates_old/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {% block title %}{% endblock %} 8 | 9 | 10 | {% block content %}{% endblock %} 11 | 12 | -------------------------------------------------------------------------------- /lesson4/templates_old/index.html: -------------------------------------------------------------------------------- 1 | 2 | {% extends 'base.html' %} 3 | 4 | {% block title %} 5 | Главная 6 | {% endblock %} 7 | 8 | {% block content %} 9 |
{{ username }} Lorem ipsum dolor sit amet consectetur adipisicing elit. Rem, suscipit distinctio quasi vero officia accusantium beatae laborum optio ad tempore tempora id sunt, porro dolorem ratione ea possimus maxime cumque.
10 | {% endblock %} -------------------------------------------------------------------------------- /lesson5/data/instance/my_db.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson5/data/instance/my_db.db -------------------------------------------------------------------------------- /lesson5/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 |

Все пользователи

11 |
12 | 13 | 14 |
15 |
    16 | {% for user in users %} 17 |
  1. {{ user.username }}
  2. 18 | {% endfor %} 19 |
20 | 21 | 22 | -------------------------------------------------------------------------------- /lesson5/templates/posts.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 |

Все публикации

11 |
12 | 13 | 14 | 15 | 16 |
17 |
    18 | {% for post in posts %} 19 |
  • 20 |

    {{ post.title }}

    21 |

    {{ post.text }}

    22 |
  • 23 | {% endfor %} 24 |
25 | 26 | -------------------------------------------------------------------------------- /lesson6/config.py: -------------------------------------------------------------------------------- 1 | # Файл конфигурации приложения, куда вынесено создание 2 | # объектов Flask-приложения и SQLAlchemy. 3 | 4 | from flask import Flask 5 | from flask_sqlalchemy import SQLAlchemy 6 | from sqlalchemy import MetaData 7 | 8 | app = Flask(__name__) 9 | app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///my_db.db' 10 | 11 | # Метаданные именования различных контрукций в скриптах миграций. 12 | # Были добавлены, т.к. в ином случае возникала ошибка. 13 | metadata = MetaData( 14 | naming_convention={ 15 | "ix": 'ix_%(column_0_label)s', 16 | "uq": "uq_%(table_name)s_%(column_0_name)s", 17 | "ck": "ck_%(table_name)s_%(constraint_name)s", 18 | "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", 19 | "pk": "pk_%(table_name)s" 20 | } 21 | ) 22 | 23 | db = SQLAlchemy(app=app, metadata=metadata) 24 | -------------------------------------------------------------------------------- /lesson6/instance/my_db.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Intense-IT/Module3_Python2023/97a1a0ea0ea46bcf51ce3db31adb547a88e86378/lesson6/instance/my_db.db -------------------------------------------------------------------------------- /lesson6/models.py: -------------------------------------------------------------------------------- 1 | # Отдельный файл, в который были вынесены модели приложения. 2 | # В ходе разработки в эти модели вносились правки, что влекло за собой 3 | # проведение миграций базы данных. 4 | from config import db 5 | 6 | 7 | class User(db.Model): 8 | __tablename__ = 'all_users' 9 | id = db.Column(db.Integer, primary_key=True) 10 | username = db.Column(db.String(80), unique=True, nullable=False) 11 | usersurname = db.Column(db.String(80), unique=True, nullable=True) 12 | 13 | def __repr__(self): 14 | return f"" 15 | 16 | 17 | class Post(db.Model): 18 | __tablename__ = 'posts' 19 | id = db.Column(db.Integer, primary_key=True) 20 | title = db.Column(db.String(255), unique=True, nullable=False) 21 | text = db.Column(db.Text, nullable=False) 22 | author = db.Column(db.String(255)) 23 | -------------------------------------------------------------------------------- /lesson6/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 |

Все пользователи

10 |
11 | 12 | 13 | 14 |
15 |
    16 | {% for user in users %} 17 |
  1. {{ user.username }} {{ user.usersurname }}
  2. 18 | {% endfor %} 19 |
20 | 21 | 22 | -------------------------------------------------------------------------------- /lesson6/templates/posts.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 |

Все публикации

10 |
11 | 12 | 13 | 14 | 15 |
16 |
    17 | {% for post in posts %} 18 |
  • 19 |

    {{ post.title }}

    20 |

    {{ post.text }}

    21 |
  • 22 | {% endfor %} 23 |
24 | 25 | -------------------------------------------------------------------------------- /lesson7/config.py: -------------------------------------------------------------------------------- 1 | # Файл для конфигурации приложения 2 | from flask import Flask 3 | from flask_sqlalchemy import SQLAlchemy 4 | 5 | app = Flask(__name__) 6 | app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///my_db.db' 7 | 8 | db = SQLAlchemy(app=app) 9 | -------------------------------------------------------------------------------- /lesson7/forms.py: -------------------------------------------------------------------------------- 1 | # Файл с формами приложения 2 | from flask_wtf import FlaskForm 3 | from wtforms import StringField, SubmitField, IntegerField 4 | from wtforms.validators import DataRequired 5 | 6 | 7 | class PostForm(FlaskForm): 8 | title = StringField('Заголовок', validators=[DataRequired()]) 9 | text = StringField('Содержимое', validators=[DataRequired()]) 10 | author = StringField('Автор') 11 | submit = SubmitField('Опубликовать') 12 | 13 | 14 | class AuthorForm(FlaskForm): 15 | username = StringField('Имя', validators=[DataRequired()]) 16 | age = IntegerField('Возраст', validators=[DataRequired()]) 17 | bio = StringField('Биография') 18 | submit = SubmitField('Добавить') 19 | -------------------------------------------------------------------------------- /lesson7/models.py: -------------------------------------------------------------------------------- 1 | # Файл с моделями приложения 2 | from config import db 3 | 4 | 5 | class Post(db.Model): 6 | __tablename__ = 'posts' 7 | id = db.Column(db.Integer, primary_key=True) 8 | title = db.Column(db.String(255), unique=True, nullable=False) 9 | text = db.Column(db.Text, nullable=False) 10 | author = db.Column(db.Text, nullable=True) 11 | 12 | 13 | class Author(db.Model): 14 | __tablename__ = 'authors' 15 | id = db.Column(db.Integer, primary_key=True) 16 | username = db.Column(db.Text, unique=True, nullable=False) 17 | age = db.Column(db.Integer, nullable=False) 18 | bio = db.Column(db.Text, nullable=True) 19 | -------------------------------------------------------------------------------- /lesson7/requirements.txt: -------------------------------------------------------------------------------- 1 | alembic==1.13.0 2 | blinker==1.7.0 3 | click==8.1.7 4 | colorama==0.4.6 5 | Flask==3.0.0 6 | Flask-Migrate==4.0.5 7 | Flask-SQLAlchemy==3.1.1 8 | Flask-WTF==1.2.1 9 | greenlet==3.0.1 10 | install==1.3.5 11 | itsdangerous==2.1.2 12 | Jinja2==3.1.2 13 | Mako==1.3.0 14 | MarkupSafe==2.1.3 15 | SQLAlchemy==2.0.23 16 | typing_extensions==4.8.0 17 | Werkzeug==3.0.1 18 | WTForms==3.1.1 19 | -------------------------------------------------------------------------------- /lesson7/templates/author_posts.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 |

Все публикации автора

11 |
    12 | {% for post in posts %} 13 |
  • 14 |

    {{ post.title }}

    15 |

    {{ post.text }}

    16 |
  • 17 | {% endfor %} 18 |
19 | 20 | -------------------------------------------------------------------------------- /lesson7/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 |

Главная страница

11 | 12 | -------------------------------------------------------------------------------- /lesson7/templates/posts.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 |

Все публикации

11 |
12 | {{ form.hidden_tag() }} 13 | 14 |
15 | {{ form.title.label(class='form_input_label') }} 16 | {{ form.title(class='form_input') }} 17 |
18 |
19 | {{ form.text.label(class='form_input_label') }} 20 | {{ form.text(class='form_input') }} 21 |
22 |
23 | {{ form.author.label(class='form_input_label') }} 24 | {{ form.author(class='form_input') }} 25 |
26 | {{ form.submit(value='Отправить') }} 27 |
28 | 29 |
    30 | {% for post in posts %} 31 |
  • 32 |

    {{ post.title }}

    33 |

    {{ post.text }}

    34 |
  • 35 | {% endfor %} 36 |
37 | 38 | -------------------------------------------------------------------------------- /lesson7/templates/single_post.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 |

Отдельная публикация

11 | {% if post %} 12 |

{{ post.title }}

13 |
{{ post.text }}
14 | {% else %} 15 |
Публикации с таким id нет
16 | {% endif %} 17 | 18 | -------------------------------------------------------------------------------- /lesson7/venv_commands.py: -------------------------------------------------------------------------------- 1 | # Виртуальное окружение 2 | # Позволяет использовать для проекта отдельный набор установленных библиотек 3 | 4 | # Установка 5 | # Windows 6 | # python -m venv venv 7 | # source venv/Scripts/activate 8 | 9 | # Linux/MacOS 10 | # python -m venv venv 11 | # source venv/bin/activate 12 | -------------------------------------------------------------------------------- /lesson8/config.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from flask_sqlalchemy import SQLAlchemy 3 | 4 | from flask_wtf.csrf import CSRFProtect 5 | 6 | 7 | app = Flask(__name__) 8 | app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///my_db.db' 9 | 10 | db = SQLAlchemy(app=app) 11 | 12 | # Перенесли настройки csrf из app.pys 13 | SECRET_KEY = 'Мой секретный ключ' 14 | app.config['SECRET_KEY'] = SECRET_KEY 15 | csrf = CSRFProtect(app) 16 | -------------------------------------------------------------------------------- /lesson8/forms.py: -------------------------------------------------------------------------------- 1 | from flask_wtf import FlaskForm 2 | from wtforms import StringField, SubmitField, IntegerField 3 | from wtforms.validators import DataRequired 4 | 5 | 6 | class UserForm(FlaskForm): 7 | username = StringField('Имя', validators=[DataRequired()]) 8 | age = IntegerField('Возраст', validators=[DataRequired()]) 9 | address = StringField('Город проживания', validators=[DataRequired()]) 10 | submit = SubmitField('Добавить') 11 | -------------------------------------------------------------------------------- /lesson8/models.py: -------------------------------------------------------------------------------- 1 | from config import db 2 | 3 | 4 | class User(db.Model): 5 | __tablename__ = 'users' 6 | id = db.Column(db.Integer, primary_key=True) 7 | username = db.Column(db.Text, unique=True, nullable=False) 8 | age = db.Column(db.Integer, nullable=False) 9 | address = db.Column(db.Text, nullable=False) 10 | -------------------------------------------------------------------------------- /lesson8/requirements.txt: -------------------------------------------------------------------------------- 1 | alembic==1.13.0 2 | blinker==1.7.0 3 | click==8.1.7 4 | colorama==0.4.6 5 | Flask==3.0.0 6 | Flask-Migrate==4.0.5 7 | Flask-SQLAlchemy==3.1.1 8 | Flask-WTF==1.2.1 9 | greenlet==3.0.1 10 | install==1.3.5 11 | itsdangerous==2.1.2 12 | Jinja2==3.1.2 13 | Mako==1.3.0 14 | MarkupSafe==2.1.3 15 | SQLAlchemy==2.0.23 16 | typing_extensions==4.8.0 17 | Werkzeug==3.0.1 18 | WTForms==3.1.1 19 | -------------------------------------------------------------------------------- /lesson8/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 |

Главная страница

10 | 11 | -------------------------------------------------------------------------------- /lesson8/templates/users.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 |
10 |
{{ form.hidden_tag() }}
11 | 12 | 14 | {% for field in form if field.name != 'csrf_token' %} 15 |
16 | {{ field.label() }} 17 | {{ field() }} 18 |
19 | {% endfor %} 20 |
21 | 22 |
    23 | {% for user in users %} 24 |
  • 25 |

    {{ user.username }}

    26 |

    {{ user.age }}

    27 |

    {{ user.address }}

    28 |
  • 29 | {% endfor %} 30 |
31 | 32 | -------------------------------------------------------------------------------- /lesson9/config.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from flask_sqlalchemy import SQLAlchemy 3 | from flask_migrate import Migrate 4 | from flask_wtf.csrf import CSRFProtect 5 | 6 | 7 | app = Flask(__name__) 8 | app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///my_db.db' 9 | 10 | db = SQLAlchemy(app=app) 11 | 12 | # Перенесли настройки csrf из app.pys 13 | SECRET_KEY = 'Мой секретный ключ' 14 | app.config['SECRET_KEY'] = SECRET_KEY 15 | csrf = CSRFProtect(app) 16 | 17 | migrate = Migrate(app, db) 18 | -------------------------------------------------------------------------------- /lesson9/forms.py: -------------------------------------------------------------------------------- 1 | from flask_wtf import FlaskForm 2 | from wtforms import StringField, SubmitField 3 | from wtforms.validators import DataRequired 4 | 5 | 6 | class UserForm(FlaskForm): 7 | username = StringField('Имя', validators=[DataRequired()]) 8 | address = StringField('Город проживания', validators=[DataRequired()]) 9 | submit = SubmitField('Добавить') 10 | 11 | 12 | class AddressForm(FlaskForm): 13 | town_name = StringField('Название города', validators=[DataRequired()]) 14 | submit = SubmitField('Добавить город') 15 | -------------------------------------------------------------------------------- /lesson9/models.py: -------------------------------------------------------------------------------- 1 | from config import db 2 | 3 | 4 | class User(db.Model): 5 | __tablename__ = 'users' 6 | id = db.Column(db.Integer, primary_key=True) 7 | username = db.Column(db.Text, unique=True, nullable=False) 8 | # Внешний ключ, указывающий на первичный ключ таблицы Address 9 | address_id = db.Column( 10 | db.Integer, db.ForeignKey('addresses.id'), nullable=False) 11 | 12 | 13 | class Address(db.Model): 14 | __tablename__ = 'addresses' 15 | id = db.Column(db.Integer, primary_key=True) 16 | town_name = db.Column(db.Text, unique=True, nullable=False) 17 | # Поле, устанавливающее связь между объектами моделей User и Address, 18 | # посредством которого SQLAlchemy позволяет получать 19 | # объекты одной модели по полям другой, связанной с ней. 20 | users = db.relationship('User', backref='user_address') 21 | -------------------------------------------------------------------------------- /lesson9/requirements.txt: -------------------------------------------------------------------------------- 1 | alembic==1.13.0 2 | blinker==1.7.0 3 | click==8.1.7 4 | colorama==0.4.6 5 | Flask==3.0.0 6 | Flask-Migrate==4.0.5 7 | Flask-SQLAlchemy==3.1.1 8 | Flask-WTF==1.2.1 9 | greenlet==3.0.1 10 | install==1.3.5 11 | itsdangerous==2.1.2 12 | Jinja2==3.1.2 13 | Mako==1.3.0 14 | MarkupSafe==2.1.3 15 | SQLAlchemy==2.0.23 16 | typing_extensions==4.8.0 17 | Werkzeug==3.0.1 18 | WTForms==3.1.1 19 | -------------------------------------------------------------------------------- /lesson9/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 |

Главная страница

10 | 11 |
    12 | {% for user in users %} 13 |
  • 14 |

    {{ user.username }}

    15 |

    {{ user.user_address.town_name }}

    16 |
  • 17 | {% endfor %} 18 |
19 | 20 | -------------------------------------------------------------------------------- /lesson9/templates/towns.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Towns 7 | 8 | 9 |
10 |
{{ form.hidden_tag() }}
11 | {% for field in form if field.name != 'csrf_token' %} 12 |
13 | {{ field.label() }} 14 | {{ field() }} 15 |
16 | {% endfor %} 17 |
18 | 19 |
    20 | {% for town in towns %} 21 |
  • 22 |

    {{ town.town_name }}

    23 |
  • 24 | {% endfor %} 25 |
26 | 27 | -------------------------------------------------------------------------------- /lesson9/templates/users.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 |
10 |
{{ form.hidden_tag() }}
11 | {% for field in form if field.name != 'csrf_token' %} 12 |
13 | {{ field.label() }} 14 | {{ field() }} 15 |
16 | {% endfor %} 17 |
18 | 19 |
    20 | {% for user in users %} 21 |
  • 22 |

    {{ user.username }}

    23 |

    {{ user.address }}

    24 |
  • 25 | {% endfor %} 26 |
27 | 28 | --------------------------------------------------------------------------------