This commit is contained in:
2024-05-14 11:39:33 +03:00
commit 2762ac794a
26 changed files with 1506 additions and 0 deletions

92
BACKEND/ACCOUNTS.md Normal file
View File

@@ -0,0 +1,92 @@
## Кортежи статуса пола
GENDER_CHOICES = (
('n', 'Не указано'),
('m', 'Мужчина'),
('f', 'Женщина'),
)
## Модель пользователя
1. **`first_name`** (CharField): Имя пользователя (до 60 символов).
2. **`last_name`** (CharField): Фамилия пользователя (до 60 символов).
3. `**gender**` (CharField): Пол пользователя (выбор из предустановленных значений).
4. **`email`** (EmailField): Адрес электронной почты пользователя (уникальный).
5. **`username`** (CharField): Никнейм пользователя (до 60 символов).
6. **`bio`** (TextField): О себе (опционально, многострочное поле).
7. **`image`** (URLField): Ссылка на аватар пользователя.
8. **`followers`** (ManyToManyField): Подписчики пользователя.
9. **`address`** (CharField): Адрес пользователя (до 255 символов, опционально).
10. **`date_joined`** (DateTimeField): Дата регистрации пользователя (автоматически).
11. **`last_updated`** (DateTimeField): Время последнего обновления профиля.
12. **`last_login`** (DateTimeField): Время последней авторизации.
13. **`status`** (BooleanField): Статус активности пользователя.
## Сериализатор
1. **UserSerializer**:
- `username` (CharField): Никнейм пользователя.
- `email` (EmailField): Адрес электронной почты пользователя.
- `password` (CharField): Пароль пользователя (только для записи).
- `first_name` (CharField): Имя пользователя.
- `last_name` (CharField): Фамилия пользователя.
- `gender` (ChoiceField): Пол пользователя (выбор из предустановленных значений).
- `bio` (TextField): Биография пользователя.
- `image` (URLField): URL-адрес аватара пользователя.
- `status` (BooleanField): Статус активности пользователя.
- Метод `create`: Создание нового пользователя с установкой пароля.
- Метод `update`: Обновление информации о пользователе, включая пароль.
- Дополнительно: Возвращает JWT-токен при аутентификации пользователя.
## Маршрутизатор
1. **`/users/login`**:
- URL для входа в учетную запись.
- Обрабатывается функцией `account_login` из модуля `views` в приложении `config.accounts`.
- Имеет имя `account-login` для ссылок и представлений.
2. **`/users`**:
- URL для регистрации новой учетной записи пользователя.
- Обрабатывается функцией `account_registration` из модуля `views` в приложении `config.accounts`.
- Имеет имя `account-registration` для ссылок и представлений.
3. **`/user`**:
- URL для получения информации о текущем пользователе.
- Обрабатывается классом `UserView` как представление, используя методы GET и PUT.
- Имеет имя `user-account` для ссылок и представлений.
4. **`/logout/`**:
- URL для выхода из учетной записи.
- Обрабатывается функцией `signout` из модуля `views` в приложении `config.accounts`.
- Имеет имя `logout` для ссылок и представлений.
5. **`/profiles/`**:
- URL для работы с профилями пользователей.
- Используется вместе с DefaultRouter, который автоматически создает CRUD-маршруты для профилей.
- Имеет имя `profiledetailview-list`, `profiledetailview-detail` и т.д. для ссылок и представлений.
## Контроллер (Views и API)
1. **`account_registration`**:
- URL: `/users/registration/` (POST)
- Описание: Регистрация новой учетной записи пользователя.
- Входные данные: JSON объект с данными пользователя.
- Выходные данные: JSON объект с данными зарегистрированного пользователя.
2. **`account_login`**:
- URL: `/users/login/` (POST)
- Описание: Вход пользователя в учетную запись.
- Входные данные: JSON объект с email и паролем пользователя.
- Выходные данные: JSON объект с данными пользователя и JWT-токеном для аутентификации.
3. **`UserView`**:
- URL: `/user/` (GET, PUT)
- Описание: Получение информации о текущем пользователе и обновление данных пользователя.
- GET: Получение данных пользователя.
- PUT: Обновление данных пользователя.
4. **`ProfileDetailView`**:
- URL: `/profiles/` (GET, POST, DELETE)
- Описание: Управление профилями пользователей.
- GET: Получение данных профиля пользователя по его имени пользователя (username).
- POST: Добавление пользователя в список подписчиков (followers) или удаление из него.
- DELETE: Удаление пользователя из списка подписчиков (followers).
5. **`signout`**:
- URL: `/logout/`
- Описание: Выход пользователя из учетной записи и перенаправление на главную страницу.

35
BACKEND/ARTICLES.md Normal file
View File

@@ -0,0 +1,35 @@
## Модель статьи
1.1. **`author`** (ForeignKey): Связывает поле с моделью пользователя, который создал статью.
2. **`title`** (CharField): Название статьи.
3. **`summary`** (TextField): Краткое описание статьи.
4. **`content`** (TextField): Полное содержание статьи.
5. **`created`** (DateTimeField): Дата и время создания статьи.
6. **`updated`** (DateTimeField): Дата и время последнего обновления статьи.
7. **`tags`** (TaggableManager): Поле для управления тегами, используется для категоризации статей.
8. **`favorites`** (ManyToManyField): Связь многие ко многим с моделью пользователя, используется для отслеживания избранных статей пользователей.
9. `**slug**` (SlugField): Уникальный идентификатор для URL статьи, генерируется автоматически на основе названия статьи.
## Сериализатор
1. **ArticleSerializer**:
- Сериализатор для модели статей (Article).
- Поля: `slug`, `title`, `description`, `body`, `tagList`, `createdAt`, `updatedAt`, `favorited`, `favoritesCount`, `author`.
- `TaggitSerializer`: Используется для сериализации тегов статьи.
- Методы: `get_author`, `get_favorited`, `get_favoritesCount`, `create`, `update`.
## Маршрутизатор
- **`article_router.register('articles', views.ArticleView, basename='articles')`**: Регистрация маршрута для представления `ArticleView` из `views.py` под именем 'articles'. `basename='articles'` указывает базовое имя для ссылок.
## Контроллер
1. ArticleView:
- Представление для работы с моделью статей.
- Использует `ModelViewSet`, который предоставляет CRUD-функциональность и многое другое.
- Включает методы `list`, `create`, `retrieve`, `update`, `destroy` для обработки соответствующих HTTP-запросов.
- Содержит дополнительные действия (`favorite`, `feed`) с использованием декоратора `@action`.
- `get_permissions`: Определяет разрешения для доступа к методам на основе типа действия.
- `list`: Получает список всех статей.
- `create`: Создает новую статью.
- `favorite`: Добавляет или удаляет статью из избранного.
- `feed`: Возвращает ленту статей для текущего пользователя.
- `retrieve`: Получает информацию о конкретной статье.
- `update`: Обновляет информацию о конкретной статье.
- `destroy`: Удаляет конкретную статью.

95
BACKEND/COMMENTS.md Normal file
View File

@@ -0,0 +1,95 @@
## Модели
1. **Comment**:
- **`author`** (ForeignKey): Связывает поле с моделью пользователя, который создал комментарий.
- **`content`** (TextField): Текст комментария.
- **`created`** (DateTimeField): Дата и время создания комментария (автоматически добавляется).
- **`updated`** (DateTimeField): Дата и время последнего обновления комментария (автоматически).
2. **CommentArticles**:
- **`article`** (ForeignKey): Связь с моделью статьи (Article).
1. **CommentTodos**:
- **`todo`** (ForeignKey): Связь с моделью задачи (Todo).
1. **CommentTenant**:
- **`tenant`** (ForeignKey): Связь с моделью арендатора (Tenant).
1. **CommentGoods**:
- `**goods**` (ForeignKey): Связь с моделью имущества (Goods).
1. **CommentPropertyObject**:
- **`object`** (ForeignKey): Связь с моделью объекта (Object).
1. **CommentMaintenanceHistories**:
- `**maintenancehistory**` (ForeignKey): Связь с моделью истории обслуживания (MaintenanceHistory).
1. **CommentContract**:
- **`contract`** (ForeignKey): Связь с моделью контракта (Contract).
## Сериализатор
1. **CommentSerializer:**
- **`author`:** SerializerMethodField, который вызывает метод `get_author` для получения сериализованных данных об авторе комментария.
- **`createdAt`:** DateTimeField с форматированием даты и времени в ISO 8601.
- `**updatedAt`:** DateTimeField с форматированием даты и времени в ISO 8601.
- **`body`:** CharField, который использует поле content модели Comment.
- **Методы:**
- **`get_author`:** Получает сериализованные данные об авторе комментария.
- **`create`:** Создает новый комментарий с указанными данными, включая автора и связанный объект (article).
2. **CommentTodosSerializer:**
- `**author`:** SerializerMethodField, который вызывает метод `get_author` для получения сериализованных данных об авторе комментария.
- **`createdAt`:** DateTimeField с форматированием даты и времени в ISO 8601.
- **`updatedAt`:** DateTimeField с форматированием даты и времени в ISO 8601.
- **`body`:** CharField, который использует поле content модели CommentTodos.
- **Методы:**
- **`get_author`:** Получает сериализованные данные об авторе комментария.
- `**create`:** Создает новый комментарий для задачи с указанными данными, включая автора и связанную задачу (todo).
## Маршрутизатор
1. **comment-article:** URL для создания и получения комментариев к статьям.
- `articles/<str:slug>/comments`
- `views.CommentView.as_view()`
- `name='comment-article'`
1. **comment-delete:** URL для удаления комментариев к статьям по их идентификатору.
- `articles/<str:slug>/comments/<int:id>`
- `views.DeleteCommentView.as_view()`
- `name='comment-delete'`
1. **comment-todo-article:** URL для создания и получения комментариев к задачам.
- `todos/<int:id>/comments`
- `views.CommentTodoView.as_view()`
- `name='comment-todo-article'`
1. **comment-todo-delete:** URL для удаления комментариев к задачам по их идентификатору.
- `todos/<int:todo_id>/comments/<int:comment_id>/`
- `views.DeleteCommentTodoView.as_view()`
- `name='comment-todo-delete'`
## Контроллер
1. **CommentView:**
- Это представление позволяет создавать и получать комментарии к статьям.
- `generics.ListCreateAPIView`: Для списка и создания комментариев.
- `get_permissions`: Проверка прав доступа.
- `post`: Создание комментария.
- `list`: Получение списка комментариев.
- `DestroyAPIView` не используется здесь, поэтому удаление комментариев не поддерживается.
2. **DeleteCommentView:**
- Это представление предназначено для удаления комментариев к статьям.
- `generics.DestroyAPIView`: Для удаления комментариев.
- `destroy`: Удаление комментария по его идентификатору и слагу статьи.
3. **CommentTodoView:**
- Это представление позволяет создавать и получать комментарии к задачам.
- `generics.ListCreateAPIView`: Для списка и создания комментариев.
- `get_permissions`: Проверка прав доступа.
- `post`: Создание комментария.
- `list`: Получение списка комментариев.
- `DestroyAPIView` не используется здесь, поэтому удаление комментариев не поддерживается.
4. **DeleteCommentTodoView:**
- Это представление предназначено для удаления комментариев к задачам.
- `generics.DestroyAPIView`: Для удаления комментариев.
- `destroy`: Удаление комментария по его идентификатору и идентификатору задачи.

111
BACKEND/CONTRACTS.md Normal file
View File

@@ -0,0 +1,111 @@
## Модели
1. **Contract:**
- **`contract_type`** (CharField): выбор типа договора (аренда, продажа).
- **`number`** (CharField): уникальный номер договора.
- **`start_date`** (DateField): дата начала договора.
- **`end_date`** (DateField): дата окончания договора (может быть пустой).
- **`esignature`** (BooleanField): указывает на наличие ЭЦП в договоре.
- **`edo`** (BooleanField): указывает на наличие ЭДО в договоре.
- **`tenant`** (ForeignKey): связь с моделью арендатора.
- **`goods`** (ManyToManyField): связь с имуществом, связанным с договором.
- **`related_objects`** (ManyToManyField): связь с объектами, связанными с договором.
- **`contract_file`** (ManyToManyField): связь с файлами/сканами договора.
- **`contract_photo_pp`** (ManyToManyField): связь с фотографиями при приеме-передаче недвижимости.
2. **Payment:**
- **`payment_frequency`** (CharField): частота платежей (разовый, ежемесячно и т.д.).
- **`payment_method`** (CharField): метод оплаты (постоплата, предоплата).
- **`payment_type`** (CharField): тип оплаты (наличные, безналичные).
- **`rent_cost`** (DecimalField): стоимость аренды.
- **`rent_rate`** (DecimalField): арендная ставка.
- **`compensation`** (CharField): информация о компенсации.
- `**security_deposit**` (DecimalField): залог.
- `**payment_duration**` (DateField): дата окончания оплаты.
- **`is_paid`** (BooleanField): указывает на оплаченность платежа.
- **`contract`** (ForeignKey): связь с моделью договора.
## Сериализатор
1. **ContractSerializer:**
- `id`: Идентификатор договора.
- `contractContractType`: Тип договора.
- `contractnumber`: Номер договора.
- `contractStartDate`: Дата начала договора.
- `contractEndDate`: Дата окончания договора.
- `contractEsignature`: Наличие ЭЦП в договоре.
- `contractEdo`: Наличие ЭДО в договоре.
- `tenant`: Внешний ключ на модель арендатора.
- `goods`: Множественный внешний ключ на модель имущества.
- `related_objects`: Множественный внешний ключ на модель объектов.
- `contractFile`: Файл договора.
- `contractPhotoPp`: Фотография при приеме-передаче недвижимости.
- `author`: Информация об авторе (использует `AuthorSerializer`).
- `createdAt`: Дата создания.
- `updatedAt`: Дата обновления.
2. **PaymentSerializer:**
- `id`: Идентификатор платежа.
- `contract`: Внешний ключ на модель договора.
- `paymentFrequency`: Частота платежей.
- `paymentMethod`: Метод оплаты.
- `paymentType`: Тип оплаты.
- `paymentRentCost`: Стоимость аренды.
- `paymentRentRate`: Арендная ставка.
- `paymentCompensation`: Компенсация.
- `paymentSecurityDeposit`: Залог.
- `paymentPaymentDuration`: Дата окончания оплаты.
- `paymentIsPaid`: Оплачено ли.
- `author`: Информация об авторе (использует `AuthorSerializer`).
- `createdAt`: Дата создания.
- `updatedAt`: Дата обновления.
## Маршрутизатор
1. **URL для списка и деталей договоров:**
- `''`: Этот URL указывает на корневой URL вашего приложения.
- Включает все URL из `router`, который зарегистрирован для представления `ContractViewSet`.
2. **URL для списка платежей по договору и создания нового платежа:**
- `contracts/<int:id>/payments`: Этот URL позволяет получить список платежей для определенного договора с идентификатором `id`. Он связан с представлением `PaymentContractViewSet`.
3. **URL для удаления платежа по договору:**
- `contracts/<int:contract_id>/payments/<int:payment_id>/`: Этот URL используется для удаления конкретного платежа для договора с идентификатором `contract_id` и идентификатором платежа `payment_id`. Он связан с представлением `DeletePaymentContractView`.
## Контроллер
1. **ContractViewSet**:
- `queryset`: Получает все объекты договоров (`Contract`).
- `serializer_class`: Использует `ContractSerializer` для сериализации и десериализации данных.
- `permission_classes`: Позволяет доступ только аутентифицированным пользователям.
- `lookup_field`: Указывает поле, используемое для поиска объектов (в данном случае, идентификатор).
- `http_method_names`: Определяет доступные методы HTTP.
- **Методы**:
- `list`: Получает список договоров.
- `create`: Создает новый договор.
- `retrieve`: Получает детали конкретного договора.
- `update`: Обновляет данные договора.
- `destroy`: Удаляет договор.
2. **PaymentViewSet**:
- `queryset`: Получает все объекты платежей (`Payment`).
- `serializer_class`: Использует `PaymentSerializer` для сериализации и десериализации данных.
- `permission_classes`: Позволяет доступ только аутентифицированным пользователям.
- `lookup_field`: Указывает поле, используемое для поиска объектов (в данном случае, идентификатор).
- `http_method_names`: Определяет доступные методы HTTP.
- **Методы**:
- `list`: Получает список платежей.
- `create`: Создает новый платеж.
- `retrieve`: Получает детали конкретного платежа.
- `update`: Обновляет данные платежа.
- `destroy`: Удаляет платеж.
3. **PaymentContractViewSet**:
- Представление для списка и создания платежей по договору.
- `queryset`: Получает все объекты платежей (`Payment`).
- `serializer_class`: Использует `PaymentSerializer` для сериализации и десериализации данных.
- `permission_classes`: Позволяет доступ только аутентифицированным пользователям.
- **Методы**:
- `list`: Получает список платежей по конкретному договору.
- `post`: Создает новый платеж для указанного договора.
4. **DeletePaymentContractView**:
- Представление для удаления платежа по договору.
- `destroy`: Удаляет указанный платеж по указанному договору.

115
BACKEND/GOODS.md Normal file
View File

@@ -0,0 +1,115 @@
## Модель имущества
1. **GoodsType:**
- `name`: Название типа имущества.
2. **ConsumableType:**
- `name`: Название типа расходуемых ТМЦ.
3. **Goods:**
- `goods_type`: (ForeignKey) Связь с типом имущества (`GoodsType`).
- `goods_name`: (CharField) Название имущества.
- `inventory_number`: (CharField) Инвентарный номер имущества.
- `description`: (TextField) Описание имущества.
- `goods_photo`: (ManyToManyField) Фотографии имущества (связь с моделью `ImageGoods`).
- `condition_description`: (TextField) Описание состояния имущества.
- `damage_date_time`: (DateTimeField) Дата и время обнаружения порчи.
- `related_object`: (ForeignKey) Связь с объектом (`Object`), к которому относится имущество.
- `responsible_person`: (CharField) Ответственное лицо за имущество.
- `status`: (CharField) Статус состояния имущества (`good` - хорошее, `damaged` - поврежденное).
4. **Consumable:**
- `consumable_type`: (ForeignKey) Связь с типом расходуемых ТМЦ (`ConsumableType`).
- `name`: (CharField) Название расходуемого товара.
- `description`: (TextField) Описание товара.
- `consumable_photo`: (ManyToManyField) Фотографии товара (связь с моделью `ImageGoods`).
- `quantity`: (PositiveIntegerField) Количество товара.
- `quantity_unit`: (CharField) Единица измерения количества (выбор из предопределенных вариантов, например, шт., кг, л и т. д.).
- `related_object`: (ForeignKey) Связь с объектом (`Object`), к которому относится товар.
- `responsible_person`: (CharField) Ответственное лицо за товар.
## Сериализатор
1. **AuthorSerializer:**
- `username`: Имя пользователя.
- `bio`: Биография пользователя.
- `image`: Изображение пользователя.
- `following`: Подписка пользователя (булево значение).
2. **GoodsTypeSerializer:**
- `id`: Идентификатор типа имущества.
- `goodsTypeName`: Название типа имущества.
- `author`: Автор типа имущества (сериализатор `AuthorSerializer`).
- `createdAt`: Дата и время создания типа имущества.
- `updatedAt`: Дата и время последнего обновления типа имущества.
3. **ConsumableTypeSerializer:**
- `id`: Идентификатор типа расходуемых ТМЦ.
- `consumableTypeName`: Название типа расходуемых ТМЦ.
- `author`: Автор типа расходуемых ТМЦ (сериализатор `AuthorSerializer`).
- `createdAt`: Дата и время создания типа расходуемых ТМЦ.
- `updatedAt`: Дата и время последнего обновления типа расходуемых ТМЦ.
4. **GoodsSerializer:**
- `id`: Идентификатор имущества.
- `goods_type`: Тип имущества.
- `goodsName`: Название имущества.
- `goodsInventoryNumber`: Инвентарный номер имущества.
- `goodsDescription`: Описание имущества.
- `goodsPhoto`: Фотография имущества.
- `goodsConditionDescription`: Описание состояния имущества.
- `goodsDamageDateTime`: Дата и время обнаружения повреждения имущества.
- `goodsRelatedObject`: Объект, к которому относится имущество.
- `goodsResponsiblePerson`: Ответственное лицо за имущество.
- `goodsStatus`: Статус имущества.
- `author`: Автор имущества (сериализатор `AuthorSerializer`).
- `createdAt`: Дата и время создания имущества.
- `updatedAt`: Дата и время последнего обновления имущества.
5. **ConsumableSerializer:**
- `id`: Идентификатор расходуемого товара.
- `consumable_type`: Тип расходуемого товара.
- `consumableName`: Название расходуемого товара.
- `consumableDescription`: Описание расходуемого товара.
- `consumablePhoto`: Фотография расходуемого товара.
- `consumableQuantity`: Количество расходуемого товара.
- `consumableQuantityUnit`: Единица измерения количества товара.
- `consumableRelatedObject`: Объект, к которому относится товар.
- `consumableResponsiblePerson`: Ответственное лицо за товар.
- `author`: Автор расходуемого товара (сериализатор `AuthorSerializer`).
- `createdAt`: Дата и время создания расходуемого товара.
- `updatedAt`: Дата и время последнего обновления расходуемого товара.
## Маршрутизатор
1. `router.register('goods', GoodsView, basename='goods')`: Регистрация представления `GoodsView` в маршрутизаторе под именем `'goods'`, с указанием базового имени `'goods'`. Это создаст URL-адреса для операций CRUD (создание, чтение, обновление, удаление) имущества.
2. `router.register('goods-types', GoodsTypeView, basename='goods-types')`: Регистрация представления `GoodsTypeView` в маршрутизаторе под именем `'goods-types'`, с указанием базового имени `'goods-types'`. Это создаст URL-адреса для операций CRUD (создание, чтение, обновление, удаление) типов имущества.
3. `router.register('consumable-types', ConsumableTypeView, basename='consumable-types')`: Регистрация представления `ConsumableTypeView` в маршрутизаторе под именем `'consumable-types'`, с указанием базового имени `'consumable-types'`. Это создаст URL-адреса для операций CRUD (создание, чтение, обновление, удаление) типов расходуемых товаров.
4. `router.register('consumable', ConsumableView, basename='consumable')`: Регистрация представления `ConsumableView` в маршрутизаторе под именем `'consumable'`, с указанием базового имени `'consumable'`. Это создаст URL-адреса для операций CRUD (создание, чтение, обновление, удаление) расходуемых товаров.
## Контроллер
1. **GoodsView:**
- **Описание:** Это представление, использующее `ModelViewSet`, обрабатывает операции CRUD для имущества.
- **Методы:**
- **list:** Возвращает список имущества.
- **create:** Создает новое имущество.
- **retrieve:** Возвращает конкретное имущество по его идентификатору.
- **update:** Обновляет существующее имущество.
- **destroy:** Удаляет имущество.
- **Права доступа:** Только аутентифицированные пользователи имеют доступ к этим методам.
2. **GoodsTypeView:**
- **Описание:** Это представление, также использующее `ModelViewSet`, для операций CRUD с типами имущества.
- **Методы:**
- **list:** Возвращает список типов имущества.
- **create:** Создает новый тип имущества.
- **destroy:** Удаляет тип имущества.
- **Права доступа:** Только аутентифицированные пользователи могут выполнять действия с типами имущества.
3. **ConsumableTypeView:**
- **Описание:** Представление для операций CRUD с типами расходуемых товаров.
- **Методы:**
- **list:** Возвращает список типов расходуемых товаров.
- **create:** Создает новый тип расходуемого товара.
- **destroy:** Удаляет тип расходуемого товара.
- **Права доступа:** Только аутентифицированные пользователи имеют доступ к этим методам.
4. **ConsumableView:**
- **Описание:** Представление для операций CRUD с расходуемыми товарами.
- **Методы:**
- **list:** Возвращает список расходуемых товаров.
- **create:** Создает новый расходуемый товар.
- **destroy:** Удаляет расходуемый товар.
- **Права доступа:** Только аутентифицированные пользователи могут управлять расходуемыми товарами.

28
BACKEND/HISTORIES.md Normal file
View File

@@ -0,0 +1,28 @@
## Модель
1. **TimeStampedModel:**
- **created_at:** DateTimeField, автоматически устанавливает дату и время создания объекта.
- **updated_at:** DateTimeField, автоматически обновляется при каждом сохранении объекта.
- **author:** ForeignKey, связывает с моделью пользователя, который создал объект.
2. **MaintenanceHistory:**
- **object:** ForeignKey, связь с объектом, к которому относится история обслуживания.
- **start_time:** DateTimeField, дата начала обслуживания.
- **end_time:** DateTimeField, дата окончания обслуживания (может быть пустым).
- **maintenance_text:** TextField, текстовое описание обслуживания.
- **photo_history_maintenance:** ManyToManyField, связь с фотографиями отчета об обслуживании.
3. **TechnicalWorkHistory:**
- **object:** ForeignKey, связь с объектом, к которому относится история технических работ.
- **start_date:** DateField, дата начала технических работ.
- **end_date:** DateField, дата окончания технических работ.
- **description:** TextField, описание выполненных работ.
- **photo_history_technical_work:** ManyToManyField, связь с фотографиями отчета о технических работах.
4. **MeteringDevice:**
- **object:** ForeignKey, связь с объектом, к которому относится прибор учета.
- **start_time:** DateTimeField, дата начала обслуживания прибора учета.
- **end_time:** DateTimeField, дата окончания обслуживания прибора учета (может быть пустым).
- **maintenance_text:** TextField, текстовое описание обслуживания прибора учета.
- **[показания по различным видам учета]:** FloatField, поля для хранения показаний по различным видам учета.
- **photo_history_metering_device:** ManyToManyField, связь с фотографиями показаний прибора учета.
## Сериализатор
## Маршрутизатор
## Контроллер

38
BACKEND/MEDIA.md Normal file
View File

@@ -0,0 +1,38 @@
## Модель статьи
1. **TimeStampedModel:**
- Абстрактная базовая модель для добавления автора, полей времени создания и изменения к другим моделям.
- `created_at`: Дата и время создания объекта.
- `updated_at`: Дата и время последнего обновления объекта.
- `author`: Автор объекта.
- `file_name`: Имя файла объекта.
- Метод `save`: Переопределен для автоматической установки даты создания и обновления.
- Метод `generate_file_url`: Генерирует URL файла.
2. **Images:**
- Модель файлов изображений.
- `file`: Поле для загрузки изображения.
- `history`: Поле для хранения истории изменений.
- Метод `save`: Дополнительно устанавливает имя файла с префиксом "Image_".
- Метод `clean`: Проверяет допустимость формата изображения.
3. **Videos:**
- Модель файлов видео.
- `file`: Поле для загрузки видео.
- `history`: Поле для хранения истории изменений.
- Метод `save`: Дополнительно устанавливает имя файла с префиксом "Video_".
4. **OtherFiles:**
- Модель файлов всех типов документов.
- `file`: Поле для загрузки документа.
- `history`: Поле для хранения истории изменений.
- Метод `save`: Дополнительно устанавливает имя файла с префиксом "Document_".
## Валидатор данных
1. **validate_max_file_size:**
- Проверяет, что размер загружаемого файла не превышает максимально допустимый размер.
- `value`: Параметр, представляющий объект файла.
- `max_size`: Максимальный размер файла в байтах (здесь установлен на 200 МБ).
- Если размер файла больше `max_size`, вызывается исключение `ValidationError` с соответствующим сообщением об ошибке.
## Сериализатор
## Маршрутизатор
## Контроллер

213
BACKEND/PROPERTIES.md Normal file
View File

@@ -0,0 +1,213 @@
## Модель статьи
1. **ObjectTypeNew**:
- Представляет типы недвижимости.
- `object_type` (CharField): Тип недвижимости (выбор из предустановленных значений).
- `name` (CharField): Название подтипа объекта.
- Связь с `User` для автора объекта.
- Имеет поля времени создания и обновления.
2. **PurposePremises**:
- Представляет назначение объектов недвижимости.
- `name` (CharField): Название назначения объекта.
- Имеет поля времени создания и обновления.
3. **Room**:
- Представляет помещение на этаже.
- `room_number` (CharField): Номер помещения.
- `plan_number` (CharField): Номер на поэтажном плане.
- `entrance` (CharField): Тип входа (выбор из предустановленных значений).
- `area` (DecimalField): Площадь помещения.
- Связь с изображением помещения.
- Имеет поля времени создания и обновления.
4. **Floor**:
- Представляет этажи в подъезде.
- `floor_number` (IntegerField): Номер этажа.
- Связь с изображением плана этажа.
- Имеет поля времени создания и обновления.
5. **Entrance**:
- Представляет подъезды в здании.
- `entrance_number` (IntegerField): Номер подъезда.
- Связь с изображением плана подъезда.
- Имеет поля времени создания и обновления.
6. **Building**:
- Представляет здания.
- `nomber_building` (CharField): Номер дома.
- `building_name` (CharField): Название здания.
- `year_built` (YearField): Год постройки здания.
- Имеет поля времени создания и обновления.
7. **Territory**:
- Представляет территории.
- `district` (CharField): Район.
- `microdistrict` (CharField): Микрорайон.
- Имеет поля времени создания и обновления.
8. **Cluster**:
- Представляет кластеры.
- `region` (CharField): Регион.
- `city` (CharField): Город.
- Имеет поля времени создания и обновления.
9. **Object**:
- Представляет объект недвижимости.
- `address` (CharField): Адрес объекта.
- `cadastre_number` (CharField): Кадастровый номер.
- Связь с типом объекта, назначением объекта, помещениями, этажами, подъездами, зданиями, территориями, и кластерами.
- Имеет поля времени создания и обновления.
## Сериализатор
1. **ObjectTypeNewSerializer**
- objectType (CharField): Строковое представление типа объекта.
- nameObjectType (CharField): Название типа объекта.
- author (AuthorSerializer): Сериализатор для автора объекта.
- createdAt (DateTimeField): Дата и время создания объекта.
- updatedAt (DateTimeField): Дата и время последнего обновления объекта.
2. **PurposePremisesSerializer**
- namePurposePremises (CharField): Название назначения помещения.
- author (AuthorSerializer): Сериализатор для автора назначения помещения.
- createdAt (DateTimeField): Дата и время создания назначения помещения.
- updatedAt (DateTimeField): Дата и время последнего обновления назначения помещения.
3. **RoomSerializer**
- roomNumber (CharField): Номер помещения.
- roomEntrance (CharField): Вход помещения.
- roomArea (CharField): Площадь помещения.
- author (AuthorSerializer): Сериализатор для автора помещения.
- createdAt (DateTimeField): Дата и время создания помещения.
- updatedAt (DateTimeField): Дата и время последнего обновления помещения.
4. **FloorSerializer**
- floorNumber (IntegerField): Номер этажа.
- floor_plan_image (ImagePropirtiesFloorPlanSerializer): Сериализатор для изображений плана этажа.
- author (AuthorSerializer): Сериализатор для автора этажа.
- createdAt (DateTimeField): Дата и время создания этажа.
- updatedAt (DateTimeField): Дата и время последнего обновления этажа.
5. **EntranceSerializer**
- entranceNumber (IntegerField): Номер подъезда.
- entrancePlanImage (ImagePropirtiesEntrancePlanSerializer): Сериализатор для изображений плана подъезда.
- author (AuthorSerializer): Сериализатор для автора подъезда.
- createdAt (DateTimeField): Дата и время создания подъезда.
- updatedAt (DateTimeField): Дата и время последнего обновления подъезда.
6. **BuildingSerializer**
- nombeBuilding (CharField): Номер здания.
- buildingName (CharField): Название здания.
- yearBuilt (CharField): Год постройки здания.
- author (AuthorSerializer): Сериализатор для автора здания.
- createdAt (DateTimeField): Дата и время создания здания.
- updatedAt (DateTimeField): Дата и время последнего обновления здания.
7. **TerritorySerializer**
- territoryDistrict (CharField): Район территории.
- territoryMicrodistrict (CharField): Микрорайон территории.
- author (AuthorSerializer): Сериализатор для автора территории.
- createdAt (DateTimeField): Дата и время создания территории.
- updatedAt (DateTimeField): Дата и время последнего обновления территории.
8. **ClusterSerializer**
- clusterRegion (CharField): Регион кластера.
- clusterCity (CharField): Город кластера.
- author (AuthorSerializer): Сериализатор для автора кластера.
- createdAt (DateTimeField): Дата и время создания кластера.
- updatedAt (DateTimeField): Дата и время последнего обновления кластера.
9. **ObjectSerializer**
- objectAddress (CharField): Адрес объекта.
- cadastreNumber (CharField): Кадастровый номер объекта.
- purposePremises (CharField): Назначение помещения объекта.
- technicalFeatures (CharField): Технические особенности объекта.
- objectFiles (FileField): Файлы, связанные с объектом.
- objectImages (ImageField): Изображения объекта.
- objectVideos (FileField): Видео, связанные с объектом.
- room (PrimaryKeyRelatedField): Связанные помещения объекта.
- floor (PrimaryKeyRelatedField): Связанные этажи объекта.
- entrance (PrimaryKeyRelatedField): Связанные подъезды объекта.
- building (PrimaryKeyRelatedField): Связанные здания объекта.
- territory (PrimaryKeyRelatedField): Связанные территории объекта.
- cluster (PrimaryKeyRelatedField): Связанные кластеры объекта.
- author (AuthorSerializer): Сериализатор для автора объекта.
- createdAt (DateTimeField): Дата и время создания объекта.
- updatedAt (DateTimeField): Дата и время последнего обновления объекта.
## Маршрутизатор
1. **properties-objecttypenew/** - URL для работы с типами объектов:
- GET: Получить список всех типов объектов или создать новый тип объекта.
- POST: Создать новый тип объекта.
2. **properties-purposepremises/** - URL для работы с назначениями помещений:
- GET: Получить список всех назначений помещений или создать новое назначение помещения.
- POST: Создать новое назначение помещения.
3. **properties-room/** - URL для работы с помещениями:
- GET: Получить список всех помещений или создать новое помещение.
- POST: Создать новое помещение.
4. **properties-floor/** - URL для работы с этажами:
- GET: Получить список всех этажей или создать новый этаж.
- POST: Создать новый этаж.
5. **properties-entrance/** - URL для работы с подъездами:
- GET: Получить список всех подъездов или создать новый подъезд.
- POST: Создать новый подъезд.
6. **properties-building/** - URL для работы со зданиями:
- GET: Получить список всех зданий или создать новое здание.
- POST: Создать новое здание.
7. **properties-territory/** - URL для работы с территориями:
- GET: Получить список всех территорий или создать новую территорию.
- POST: Создать новую территорию.
8. **properties-cluster/** - URL для работы с кластерами:
- GET: Получить список всех кластеров или создать новый кластер.
- POST: Создать новый кластер.
9. **properties-object/** - URL для работы с объектами:
- GET: Получить список всех объектов или создать новый объект.
- POST: Создать новый объект.
## Контроллер
1. **ObjectTypeNewViewSet**:
- `list`: Получает список всех типов объектов или создает новый тип объекта.
- `create`: Создает новый тип объекта.
- `retrieve`: Получает конкретный тип объекта по его идентификатору.
- `update`: Обновляет данные о типе объекта.
- `destroy`: Удаляет тип объекта.
2. **PurposePremisesViewSet**:
- `list`: Получает список всех назначений помещений или создает новое назначение помещения.
- `create`: Создает новое назначение помещения.
- `retrieve`: Получает конкретное назначение помещения по его идентификатору.
- `update`: Обновляет данные о назначении помещения.
- `destroy`: Удаляет назначение помещения.
3. **RoomViewSet**:
- `list`: Получает список всех помещений или создает новое помещение.
- `create`: Создает новое помещение.
- `retrieve`: Получает конкретное помещение по его идентификатору.
- `update`: Обновляет данные о помещении.
- `destroy`: Удаляет помещение.
4. **FloorViewSet**:
- `list`: Получает список всех этажей или создает новый этаж.
- `create`: Создает новый этаж.
- `retrieve`: Получает конкретный этаж по его идентификатору.
- `update`: Обновляет данные об этаже.
- `destroy`: Удаляет этаж.
5. **EntranceViewSet**:
- `list`: Получает список всех подъездов или создает новый подъезд.
- `create`: Создает новый подъезд.
- `retrieve`: Получает конкретный подъезд по его идентификатору.
- `update`: Обновляет данные о подъезде.
- `destroy`: Удаляет подъезд.
6. **BuildingViewSet**:
- `list`: Получает список всех зданий или создает новое здание.
- `create`: Создает новое здание.
- `retrieve`: Получает конкретное здание по его идентификатору.
- `update`: Обновляет данные о здании.
- `destroy`: Удаляет здание.
7. **TerritoryViewSet**:
- `list`: Получает список всех территорий или создает новую территорию.
- `create`: Создает новую территорию.
- `retrieve`: Получает конкретную территорию по ее идентификатору.
- `update`: Обновляет данные о территории.
- `destroy`: Удаляет территорию.
8. **ClusterViewSet**:
- `list`: Получает список всех кластеров или создает новый кластер.
- `create`: Создает новый кластер.
- `retrieve`: Получает конкретный кластер по его идентификатору.
- `update`: Обновляет данные о кластере.
- `destroy`: Удаляет кластер.
9. **ObjectViewSet**:
- `list`: Получает список всех объектов или создает новый объект.
- `create`: Создает новый объект.
- `retrieve`: Получает конкретный объект по его идентификатору.
- `update`: Обновляет данные об объекте.
- `destroy`: Удаляет объект.
## Проверка введенных данных
1. **validate_year(value)**:
- Это функция-валидатор, которая принимает значение года в виде строки.
- Она проверяет, что длина значения равна 4 символам и что значение состоит только из цифр.
- Если условия не соблюдаются, функция поднимает исключение ValidationError с соответствующим сообщением об ошибке.
2. **YearField(models.CharField)**:
- Это класс, который определяет поле модели Django для хранения года.
- Он наследуется от CharField и добавляет к нему функциональность валидации года.
- В конструкторе класса YearField устанавливаются максимальная длина поля в 4 символа и добавляется список валидаторов, включая validate_year.

72
BACKEND/TEAMS.md Normal file
View File

@@ -0,0 +1,72 @@
## Кортежи статуса задачи
GENDER_CHOICES = (
('n', 'Не указано'),
('m', 'Мужчина'),
('f', 'Женщина'),
)
## Модель команда
1. **first_name** (CharField): Имя пользователя (до 60 символов).
2. **last_name** (CharField): Фамилия пользователя (до 60 символов).
3. **middle_name** (CharField): Фамилия пользователя (до 60 символов).
4. **position** (CharField): Должность участника команды
5. **work_start_time** (DateField): Дата начала работы участника
6. **work_end_time** (DateField): Дата окончания работы участника
7. **mobile** (CharField): Мобильный номер участника.
8. **work_phone** (CharField): Рабочий телефон участника.
9. **internal_number** (CharField): Внутренний номер участника.
10. **email** (EmailField): Адрес электронной почты пользователя (уникальный).
11. **personal_email** (EmailField): Персональный e-mail участника.
12. **birth_date** (DateField): Дата рождения участника.
13. website (URLField): Сайт участника.
## Модель зона ответственности
1. **object_related** (ForeignKey): Связь с объектом.
2. **team_related** (ManyToManyField): Связь с участниками команды.
## Сериализатор
1. **TeamSerializer**:
- `teamLastName`, `teamFirstName`, `teamMiddleName`: Поля для фамилии, имени и отчества команды.
- `teamBirthDate`: Поле для даты рождения команды.
- `teamPosition`: Поле для должности в команде.
- `teamWorkStartTime`, `teamWorkEndTime`: Поля для времени начала и окончания работы команды.
- `teamMobile`, `teamWorkPhone`, `teamInternalNumber`, `teamEmail`, `teamPersonalEmail`, `teamWebsite`: Поля для контактной информации команды.
- `author`: Ссылка на `AuthorSerializer` для получения информации об авторе команды.
- `createdAt`, `updatedAt`: Дата создания и последнего обновления команды.
- `create(self, validated_data)`: Метод для создания новой команды.
- `update(self, instance, validated_data)`: Метод для обновления существующей команды.
2. **WorkTeamZoneSerializer**:
- `object_related`: Связь с объектом через его идентификатор.
- `team_related`: Связь с командами через их идентификаторы (множественное).
- `author`: Ссылка на `AuthorSerializer` для получения информации об авторе зоны ответственности команды.
- `createdAt`, `updatedAt`: Дата создания и последнего обновления зоны ответственности команды.
- `create(self, validated_data)`: Метод для создания новой зоны ответственности команды.
- `update(self, instance, validated_data)`: Метод для обновления существующей зоны ответственности команды.
## Маршрутизатор
1. `router.register('teams', TeamViewSet, basename='teams')`: Регистрация представления `TeamViewSet` в маршрутизаторе под именем `'teams'`, с указанием базового имени `'teams'`. Это создаст URL-адреса для операций CRUD (создание, чтение, обновление, удаление) команд.
2. `router.register('work-team-zones', WorkTeamZoneViewSet, basename='work-team-zones')`: Регистрация представления `WorkTeamZoneViewSet` в маршрутизаторе под именем `'work-team-zones'`, с указанием базового имени `'work-team-zones'`. Это создаст URL-адреса для операций CRUD (создание, чтение, обновление, удаление) зон ответственности команд.
## Контроллер
### Views и API
1. Определение представления `TeamViewSet` как подкласса `viewsets.ModelViewSet`, который предоставляет стандартный набор операций CRUD для модели `Team`.
- `queryset = Team.objects.all()`: Получение всех объектов модели `Team` из базы данных.
- `serializer_class = TeamSerializer`: Использование сериализатора `TeamSerializer` для сериализации данных.
- `permission_classes = [IsAuthenticatedOrReadOnly]`: Определение разрешений доступа, требующих аутентификации для изменения данных и только чтения без аутентификации.
- `lookup_field = 'id'`: Использование поля 'id' для поиска объектов.
- `http_method_names = ['get', 'post', 'put', 'patch', 'delete']`: Разрешенные HTTP-методы для данного представления.
2. Определение методов для обработки различных HTTP-запросов:
- `get_permissions`: Переопределение метода для применения разных разрешений в зависимости от типа действия.
- `list`: Метод для получения списка всех команд.
- `create`: Метод для создания новой команды.
- `retrieve`: Метод для получения информации о конкретной команде.
- `update`: Метод для обновления информации о команде.
- `destroy`: Метод для удаления команды.
3. Аналогично определено представление `WorkTeamZoneViewSet` для модели `WorkTeamZone`.
- `queryset = WorkTeamZone.objects.all()`: Получение всех объектов модели `WorkTeamZone` из базы данных.
- `serializer_class = WorkTeamZoneSerializer`: Использование сериализатора `WorkTeamZoneSerializer`.
- `permission_classes = [IsAuthenticated]`: Определение разрешений доступа, требующих аутентификации для всех действий.
- Определены методы для обработки различных HTTP-запросов (список, создание, получение, обновление, удаление) с соответствующей логикой обработки данных и проверкой прав доступа.

123
BACKEND/TENANTS.md Normal file
View File

@@ -0,0 +1,123 @@
## Абстрактный класс `TimeStampedModel`:
Этот класс добавляет автоматические поля времени создания (`created_at`), времени обновления (`updated_at`) и ссылку на автора (`author`) ко всем моделям, которые наследуют его.
1. `created_at` (DateTimeField): Дата и время создания объекта.
2. `updated_at` (DateTimeField): Дата и время последнего обновления объекта.
3. `author` (ForeignKey): Ссылка на пользователя, создавшего объект.
## Кортеж типа организации
INDIVIDUAL = 'individual'
LEGAL_ENTITY = 'legal_entity'
TENANT_TYPES = [
(INDIVIDUAL, 'Физическое лицо'),
(LEGAL_ENTITY, 'Юридическое лицо'),
]
ORGANIZATION_SUBTYPE_CHOICES = (
('NULL', '-------'),
('llc', 'ООО (Общество с ограниченной ответственностью)'),
('jsc', 'ЗАО (Закрытое акционерное общество)'),
('ojsc', 'ОАО (Открытое акционерное общество)'),
('sole_proprietorship', 'ИП (Индивидуальный предприниматель)'),
('self_employed', 'Самозанятый'),
)
## Модель арендаторах
1. `tenant_type` (CharField): Тип арендатора (INDIVIDUAL, LEGAL_ENTITY).
2. `organization_type` (CharField): Тип организации (llc, jsc, ojsc, sole_proprietorship, self_employed).
3. `trade_name` (CharField): Торговое наименование арендатора.
4. Поля для физического лица:
1. `tenant_name` (CharField): Имя арендатора (максимум 255 символов).
2. `tenant_surname` (CharField): Фамилия арендатора (максимум 255 символов).
3. `tenant_patronymic` (CharField): Отчество арендатора (максимум 255 символов).
4. `tenant_passport_series` (CharField): Серия паспорта арендатора (4 символа, обязательное поле).
5. `tenant_passport_number` (CharField): Номер паспорта арендатора (6 символов, обязательное поле).
6. `tenant_passport_issued_by` (CharField): Кем выдан паспорт арендатора (максимум 255 символов).
7. `tenant_passport_issued_date` (DateField): Дата выдачи паспорта арендатора.
8. `tenant_registration` (TextField): Прописка арендатора (большой текстовый блок для детального описания).
5. Поля для юридического лица:
1. `tenant_company_name` (CharField): Название организации (максимум 255 символов).
2. `tenant_inn` (CharField): ИНН организации (12 символов, обязательное поле).
3. `kpp` (CharField): КПП организации (9 символов).
4. `tenant_ogrn` (CharField): ОГРН организации (15 символов).
5. `bank_details` (TextField): Реквизиты банка организации (большой текстовый блок для детального описания).
6. `additional_info` (TextField): Дополнительная информация об арендаторе.
7. `tenant_file` (ManyToManyField): Связь со сканами документов арендатора.
8. `history` (HistoricalRecords): История изменений модели.
## Модель контактной информации
1. `contact_type` (CharField): Тип контакта (email, phone).
2. `attitude_contact_type` (CharField): Атрибут контакта (Worker, private, Other_type).
3. `value` (CharField): Значение контакта.
4. `tenant` (ForeignKey): Ссылка на объект арендатора.
5. `first_name`, `last_name`, `organization`, `job_title`, `address` (CharField): Дополнительные данные контакта.
6. `history` (HistoricalRecords): История изменений модели.
## Сериализатор
1. **TenantSerializer**:
- `tenantType`: Поле, которое отображает тип арендатора.
- `organizationType`: Поле, которое отображает тип организации (юридического лица).
- `tradeName`: Название арендуемой организацией единицы недвижимости.
- `tenantName`, `tenantSurname`, `tenantPatronymic`: Имя, фамилия и отчество арендатора (физического лица).
- `tenantPassportSeries`, `tenantPassportNumber`, `tenantPassportIssuedBy`, `tenantPassportIssuedDate`: Серия и номер паспорта, кем выдан и дата выдачи (физического лица).
- `tenantRegistration`: Прописка арендатора (физического лица) или дополнительная информация (юридического лица).
- `tenantCompanyName`, `tenantInn`, `KPP`, `tenantOgrn`, `bankDetails`: Название организации, ИНН, КПП, ОГРН и реквизиты банка (юридического лица).
- `additionalInfo`: Дополнительная информация о арендаторе.
- `tenantFile`: Скан документов арендатора.
- `author`: Информация об авторе (сериализатор `AuthorSerializer`).
- `createdAt`, `updatedAt`: Дата создания и обновления записи.
1. **ContactSerializer**:
- `contactTypeTenant`: Тип контакта.
- `attitudeContactTypeTenant`: Атрибут контакта.
- `valueTenant`: Значение контакта.
- `firstNameTenant`, `lastNameTenant`, `organizationTenant`, `jobTitleTenant`, `addressTenant`: Имя, фамилия, организация, должность и адрес (контактные данные арендатора).
- `author`: Информация об авторе (сериализатор `AuthorSerializer`).
- `createdAt`, `updatedAt`: Дата создания и обновления записи.
## Маршрутизатор
1. **URL для списка и деталей арендаторов:**
- `''`: Пустая строка указывает на корневой URL приложения. Он включает в себя все URL из `tenant_router`.
2. **URL для контактов арендаторов:**
- `'<int:id>/contacts'`: Этот URL позволяет получить список контактов для определенного арендатора с идентификатором `id`. Он ссылается на представление `ContactTenantViewSet`.
3. **URL для удаления контакта арендатора:**
- `'<int:tenant_id>/contacts/<int:contact_id>/'`: Этот URL используется для удаления конкретного контакта для арендатора с идентификатором `tenant_id` и идентификатором контакта `contact_id`. Он ссылается на представление `DeleteContactTenantView`.
## Контроллер
1. **TenantView:**
- Основной `viewset` для модели `Tenant`.
- `queryset`: Устанавливает все объекты `Tenant` в качестве запроса по умолчанию.
- `serializer_class`: Использует `TenantSerializer` для сериализации и десериализации данных.
- `permission_classes`: Устанавливает разрешения для доступа к представлениям (в данном случае, только аутентифицированные пользователи с правами владельца и администратора).
- `lookup_field`: Поле, используемое для поиска объектов `Tenant`.
- `filterset_class`: Фильтры для списка арендаторов.
- `http_method_names`: Определяет доступные методы HTTP (GET, POST, PUT, DELETE).
2. **Методы TenantView:**
- `list`: Получает список арендаторов.
- `create`: Создает нового арендатора.
- `retrieve`: Получает детали конкретного арендатора.
- `update`: Обновляет данные арендатора.
- `destroy`: Удаляет арендатора.
3. **ContactTenantViewSet:**
- Представление для работы с контактами арендаторов.
- `queryset`: Устанавливает все объекты `Contact` в качестве запроса по умолчанию.
- `serializer_class`: Использует `ContactSerializer` для сериализации и десериализации данных.
- `permission_classes`: Устанавливает разрешения для доступа к представлениям (в данном случае, только аутентифицированные пользователи).
4. **Методы ContactTenantViewSet:**
- `list`: Получает список контактов для конкретного арендатора.
- `post`: Создает новый контакт для арендатора.
5. **DeleteContactTenantView:**
- Представление для удаления контакта арендатора.
- `destroy`: Удаляет контакт.
## Права доступа и разрешения
1. **IsOwnerOrCollaborator:**
- Разрешение для проверки доступа к объектам на основе их владельца или участника.
- `has_object_permission`: Метод, который проверяет разрешение на доступ к конкретному объекту.
- Разрешает доступ только для безопасных методов (GET, HEAD, OPTIONS) или если пользователь является владельцем объекта.
2. **IsOwnerAndAdmin:**
- Разрешение, позволяющее только авторам объектов Tenant и пользователям с группой 'admin' доступ к операциям CRUD.
- `has_permission`: Метод, который проверяет разрешение на доступ к представлению (view), основанное на группе пользователя.
- Разрешает доступ только для аутентифицированных пользователей с группой 'admin'.
- `has_object_permission`: Метод, который проверяет разрешение на доступ к конкретному объекту.
- Разрешает доступ для владельца объекта или для пользователя с группой 'admin'.

103
BACKEND/TODOS.md Normal file
View File

@@ -0,0 +1,103 @@
# Описание приложения
### Кортежи статуса задачи
TASK_STATUS = (
('New', 'Новая'),
('Deleted', 'Удалено'),
('Waiting', 'Ожидание'),
('Done', 'Выполнена'),
)
### Кортеж уровня важности
PRIORITY = (
('Low', 'Низкий'),
('Medium', 'Средний'),
('High', 'Высокий'),
)
## Модель задачи
1. **author** (ForeignKey): Ссылка на пользователя, который создал задачу.
2. **title** (CharField): Название задачи (до 150 символов).
3. **summary** (TextField): Краткое описание задачи.
4. **content** (TextField): Подробное описание задачи.
5. **is_active** (BooleanField): Флаг, указывающий на активность задачи.
6. **is_deleted** (BooleanField): Флаг, указывающий на удаление задачи.
7. **priority** (CharField): Приоритет задачи (выбор из предустановленных значений).
8. **status** (CharField): Статус задачи (выбор из предустановленных значений).
9. **is_complete** (BooleanField): Флаг, указывающий на завершение задачи.
10. **start_time** (DateTimeField): Дата и время начала задачи.
11. **end_time** (DateTimeField): Крайний срок выполнения задачи.
12. **created** (DateTimeField): Время создания задачи (автоматически заполняется при создании).
13. **updated** (DateTimeField): Время последнего обновления задачи (автоматически обновляется при изменениях).
14. **substacles** (ManyToManyField): Связь между задачами, представляющая подзадачи текущей задачи.
15. **favorites** (ManyToManyField): Пользователи, которые добавили задачу в избранное.
16. **suppliers** (ManyToManyField): Пользователи, ответственные за выполнение задачи.
17. **supporters** (ManyToManyField): Соисполнители задачи.
18. **observers** (ManyToManyField): Пользователи, наблюдающие за выполнением задачи.
19. **tags** (TaggableManager): Теги, связанные с задачей для удобной классификации.
## Сериализатор
1. **AuthorSerializer**:
- Сериализатор для пользователя (автора задачи).
- Содержит поля: `username`, `bio`, `image`, `following`.
- Поле `following` определяется методом `get_following`, который проверяет, подписан ли текущий пользователь на автора задачи.
2. **TodoSerializer**:
- Основной сериализатор для модели Todo.
- Поля:
- `id`, `title`, `description`, `body`, `tagList`, `is_complete`, `status`, `priority`, `is_deleted`, `is_active`, `createdAt`, `updatedAt`, `startTimedAt`, `endTimedAt`, `author`, `substacles`, `favorited`, `favoritesCount`, `supplierd`, `suppliersCount`, `supporterd`, `supportersCount`, `observerd`, `observersCount`.
- Некоторые поля (`description`, `body`, `tagList`, `createdAt`, `updatedAt`, `startTimedAt`, `endTimedAt`, `favorited`, `favoritesCount`, `supplierd`, `suppliersCount`, `supporterd`, `supportersCount`, `observerd`, `observersCount`) имеют методы `get_*`, которые определяют поведение для сериализации.
- Методы `create` и `update` определяют, как создавать и обновлять объекты Todo.
3. **TagSerializer**:
- Сериализатор для добавления тегов.
- Содержит единственное поле `tags`, которое является списком строк.
## Маршрутизатор
```
todo_router = DefaultRouter(trailing_slash=False)
todo_router.register('todos', views.TodoView, basename='todos') todo_router.register('tags', views.TagView)
```
Теперь давайте подробнее разберем каждую часть:
- `DefaultRouter` из библиотеки `rest_framework.routers` автоматически создает маршруты для представлений на основе их названий и методов (например, GET, POST, PUT, DELETE). За вас обрабатывается большая часть создания URL-путей, что делает код более модульным и менее подверженным ошибкам.
- `todo_router.register('todos', views.TodoView, basename='todos')` регистрирует представление `TodoView` для работы с задачами. Аргументы `basename='todos'` используются для создания имени маршрута, которое будет использоваться в генерации URL (например, `todos-list`, `todos-detail`, `todos-create` `todos-edit` `todos-delete`.).
- `todo_router.register('tags', views.TagView)` регистрирует представление `TagView` для работы с тегами. Аналогично создаются маршруты для работы с тегами (`tags-list`, `tags-detail`, `tags-create` `tags-edit` `tags-delete`).
## Контроллер
1. **TodoView**:
- Представление для работы с задачами (todos).
- Использует `ModelViewSet`, который предоставляет CRUD-функциональность и многое другое.
- Включает методы `list`, `create`, `retrieve`, `update`, `destroy` для обработки соответствующих HTTP-запросов.
- Содержит дополнительные действия (`favorite`, `feed`) с использованием декоратора `@action`.
2. **TagView**:
- Представление для работы с тегами.
- Использует `GenericViewSet` и `ListModelMixin` для обработки только GET-запросов.
- Включает метод `list` для получения списка тегов.
```
class TodoView(viewsets.ModelViewSet):
queryset = Todo.objects.all()
serializer_class = TodoSerializer
permission_classes = [CanViewTodoDetail]
lookup_field = 'id'
filterset_class = TodoFilter
http_method_names = ['get', 'post', 'put', 'delete']
```
```
class TagView(viewsets.GenericViewSet, mixins.ListModelMixin):
queryset = Tag.objects.all()
serializer_class = TagSerializer
http_method_names = ['get',]
```
## Права доступа
1. **IsOwnerOrCollaborator**:
- Позволяет редактирование задач только владельцу задачи или соисполнителям.
- Метод `has_object_permission` проверяет, что запросы на изменение (методы, отличные от GET, HEAD и OPTIONS) выполняются только для владельца задачи или соисполнителей.
2. **CanViewTodoDetail**:
- Позволяет просмотр деталей задачи автору, соисполнителям, поставщикам, наблюдателям и избранным.
- Метод `has_object_permission` проверяет, что пользователь является автором задачи, соисполнителем, поставщиком, наблюдателем или избранным.

View File

@@ -0,0 +1,52 @@
Для начала, установим необходимые библиотеки:
```
pip install drf-yasg pyyaml
```
После этого создайте файл `swagger_generator.py` и добавьте следующий код:
```
from rest_framework.schemas import SchemaGenerator
from rest_framework.permissions import AllowAny
from rest_framework.views import APIView
from drf_yasg import openapi
from drf_yasg.views import get_schema_view
import yaml
# Создаем схему Swagger для API
schema_view = get_schema_view(
openapi.Info(
title="Your API",
default_version='v1',
description="API Description",
terms_of_service="https://www.google.com/policies/terms/",
contact=openapi.Contact(email="contact@example.com"),
license=openapi.License(name="BSD License"),
),
public=True,
permission_classes=(AllowAny,),
)
# Создаем класс для генерации YAML-файла
class SwaggerYAMLGenerator(APIView):
def get(self, request):
generator = SchemaGenerator()
schema = generator.get_schema(request=request)
yaml_data = yaml.dump(schema.to_dict(),
default_flow_style=False)
return Response(yaml_data, content_type='application/yaml')
```
Затем добавьте URL для обработки запросов Swagger в файле `urls.py` вашего Django-приложения:
```
from django.urls import path
from .swagger_generator import SwaggerYAMLGenerator
urlpatterns = [
path('swagger.yaml', SwaggerYAMLGenerator.as_view()),
]
```

View File

@@ -0,0 +1,51 @@
## ## Модель
1. **TimeStampedModel:**
- **created_at:** DateTimeField, автоматически устанавливает дату и время создания объекта.
- **updated_at:** DateTimeField, автоматически обновляется при каждом сохранении объекта.
- **author:** ForeignKey, связывает с моделью пользователя, который создал объект.
## Сериализатор
1. **ProfileSerializer**:
- `username` (CharField): Никнейм пользователя.
- `bio` (TextField): Биография пользователя.
- `image` (URLField): URL-адрес аватара пользователя.
- `following` (SerializerMethodField): Показывает, подписан ли текущий пользователь на пользователя, представленного данным профилем.
- Метод `get_following`: Возвращает булево значение, указывающее, подписан ли текущий пользователь на пользователя профиля.
2. **TagSerializer**:
- Сериализатор для добавления тегов.
- Содержит единственное поле `tags`, которое является списком строк.
## Контроллер
1. **TagView**:
- Представление для работы с тегами.
- Использует `GenericViewSet` и `ListModelMixin` для обработки только GET-запросов.
- Включает метод `list` для получения списка тегов.
```
class TagView(viewsets.GenericViewSet, mixins.ListModelMixin):
queryset = Tag.objects.all()
serializer_class = TagSerializer
http_method_names = ['get',]
```
2. Метод `favorite` с декоратором `@action` для добавления/удаления статьи из избранного.
```
@action(detail=True, methods=['post'])
def favorite(self, request, id=None):
article = self.get_object()
if article.favorites.filter(id=request.user.id).exists():
article.favorites.remove(request.user)
else:
article.favorites.add(request.user)
article.save()
serializer = self.get_serializer(article)
return Response(serializer.data)
```
## Маршрутизатор
- `DefaultRouter` из библиотеки `rest_framework.routers` автоматически создает маршруты для представлений на основе их названий и методов (например, GET, POST, PUT, DELETE). За вас обрабатывается большая часть создания URL-путей, что делает код более модульным и менее подверженным ошибкам.
- **`register('tags', views.TagView)`**: Регистрация маршрута для представления `TagView` из `views.py` под именем 'tags'.
## Права доступа и разрешения
1. **IsAuthenticated**: Требует, чтобы пользователь был аутентифицирован для доступа к представлениям.
2. **IsAuthenticatedOrReadOnly**: Позволяет только чтение неаутентифицированным пользователям.