140500
This commit is contained in:
92
BACKEND/ACCOUNTS.md
Normal file
92
BACKEND/ACCOUNTS.md
Normal 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
35
BACKEND/ARTICLES.md
Normal 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
95
BACKEND/COMMENTS.md
Normal 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
111
BACKEND/CONTRACTS.md
Normal 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
115
BACKEND/GOODS.md
Normal 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
28
BACKEND/HISTORIES.md
Normal 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
38
BACKEND/MEDIA.md
Normal 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
213
BACKEND/PROPERTIES.md
Normal 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
72
BACKEND/TEAMS.md
Normal 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
123
BACKEND/TENANTS.md
Normal 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
103
BACKEND/TODOS.md
Normal 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` проверяет, что пользователь является автором задачи, соисполнителем, поставщиком, наблюдателем или избранным.
|
||||||
52
BACKEND/Заметки для решения задач.md
Normal file
52
BACKEND/Заметки для решения задач.md
Normal 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()),
|
||||||
|
]
|
||||||
|
```
|
||||||
51
BACKEND/Общие правила.md
Normal file
51
BACKEND/Общие правила.md
Normal 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**: Позволяет только чтение неаутентифицированным пользователям.
|
||||||
|
|
||||||
13
FRONTEND/API/ARTICLE.md
Normal file
13
FRONTEND/API/ARTICLE.md
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
Код представляет собой модуль для работы с API проекта, который использует константу `API_BASE_URL` из файла `constants` и пути API из файла `openapi.gen` для отправки запросов на сервер и обработки ответов.
|
||||||
|
|
||||||
|
**Импорт константы API_BASE_URL из файла constants**:
|
||||||
|
```
|
||||||
|
import { API_BASE_URL } from '~/constants'
|
||||||
|
```
|
||||||
|
**Импорт путей API из файла openapi.gen**:
|
||||||
|
```
|
||||||
|
import type { paths } from '~/openapi.gen'
|
||||||
|
```
|
||||||
|
**Типы ответов на запросы к API**
|
||||||
|
**Функции для отправки запросов к API**
|
||||||
|
**Функции для добавления и удаления статьи из избранного**
|
||||||
28
FRONTEND/API/AUTH.md
Normal file
28
FRONTEND/API/AUTH.md
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
**Импорт константы API_BASE_URL из файла constants**:
|
||||||
|
```
|
||||||
|
import { API_BASE_URL } from '~/constants'
|
||||||
|
```
|
||||||
|
**Импорт путей API из файла openapi.gen**:
|
||||||
|
```
|
||||||
|
import type { paths } from '~/openapi.gen'
|
||||||
|
```
|
||||||
|
**Типы запроса и ответа для аутентификации пользователя**:
|
||||||
|
```
|
||||||
|
type LoginUserRequest =
|
||||||
|
paths['/users/login']['post']['requestBody']['content']['application/json'];
|
||||||
|
|
||||||
|
type LoginUserResponse =
|
||||||
|
paths['/users/login']['post']['responses']['200']['content']['application/json'];
|
||||||
|
```
|
||||||
|
**Функция для отправки запроса на аутентификацию пользователя**:
|
||||||
|
```
|
||||||
|
export const login = (user: LoginUserRequest) => {
|
||||||
|
return $fetch<LoginUserResponse>(`${API_BASE_URL}/users/login`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: user, // Передаем данные пользователя в теле запроса
|
||||||
|
});
|
||||||
|
};
|
||||||
|
```
|
||||||
10
FRONTEND/API/TAG.md
Normal file
10
FRONTEND/API/TAG.md
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
**Импорт путей API из файла openapi.gen**:
|
||||||
|
```
|
||||||
|
import type { paths } from '~/openapi.gen'
|
||||||
|
```
|
||||||
|
**Тип ответа на запрос получения тегов**:
|
||||||
|
```
|
||||||
|
export type GetTagsResponse =
|
||||||
|
paths['/tags']['get']['responses']['200']['content']['application/json'];
|
||||||
|
```
|
||||||
|
Кода определяется тип данных `GetTagsResponse`, который представляет собой ответ на запрос получения тегов из вашего API. Тип строится на основе структуры определенного пути `/tags` и кода состояния ответа 200 (успешный запрос) с типом содержимого `application/json`.
|
||||||
0
FRONTEND/API/TEAM.md
Normal file
0
FRONTEND/API/TEAM.md
Normal file
34
FRONTEND/API/TENANT.md
Normal file
34
FRONTEND/API/TENANT.md
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
**Импорт константы API_BASE_URL из файла constants**:
|
||||||
|
```
|
||||||
|
import { API_BASE_URL } from '~/constants'
|
||||||
|
```
|
||||||
|
**Импорт путей API из файла openapi.gen**:
|
||||||
|
```
|
||||||
|
import type { paths } from '~/openapi.gen'
|
||||||
|
```
|
||||||
|
**Типы ответов на запросы к API для получения арендаторов и арендатора по ID**:
|
||||||
|
```
|
||||||
|
export type GetTenantsResponse =
|
||||||
|
paths['/tenants']['get']['responses']['200']['content']['application/json'];
|
||||||
|
export type GetTenantResponse =
|
||||||
|
paths['/tenants/{id}']['get']['responses']['200']['content']['application/json'];
|
||||||
|
```
|
||||||
|
**Типы запросов для создания и обновления арендатора**:
|
||||||
|
```
|
||||||
|
type CreateTenantRequest =
|
||||||
|
paths['/tenants']['post']['requestBody']['content']['application/json'];
|
||||||
|
type UpdateTenantRequest =
|
||||||
|
paths['/tenants/{id}']['put']['requestBody']['content']['application/json'];
|
||||||
|
```
|
||||||
|
**Типы ответа при создании и обновлении арендатора**:
|
||||||
|
```
|
||||||
|
export type CreateTenantResponse =
|
||||||
|
paths['/tenants']['post']['responses']['201']['content']['application/json'];
|
||||||
|
export type UpdateTenantResponse =
|
||||||
|
paths['/tenants/{id}']['put']['responses']['200']['content']['application/json'];
|
||||||
|
```
|
||||||
|
**Функции для работы с арендаторами и их контактами**:
|
||||||
|
- `createTenant`: Функция для создания нового арендатора.
|
||||||
|
- `updateTenant`: Функция для обновления данных арендатора.
|
||||||
|
- `removeTenant`: Функция для удаления арендатора.
|
||||||
|
- `createTenantContact`: Функция для добавления контакта к арендатору.
|
||||||
32
FRONTEND/API/TODO.md
Normal file
32
FRONTEND/API/TODO.md
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
**Импорт константы API_BASE_URL из файла constants**:
|
||||||
|
```
|
||||||
|
import { API_BASE_URL } from '~/constants'
|
||||||
|
```
|
||||||
|
**Импорт путей API из файла openapi.gen**:
|
||||||
|
```
|
||||||
|
import type { paths } from '~/openapi.gen'
|
||||||
|
```
|
||||||
|
**Типы ответов на запросы к API для получения задач и комментариев**:
|
||||||
|
```
|
||||||
|
export type GetTodosResponse =
|
||||||
|
paths['/todos']['get']['responses']['200']['content']['application/json'];
|
||||||
|
export type GetTodoResponse =
|
||||||
|
paths['/todos/{id}']['get']['responses']['200']['content']['application/json'];
|
||||||
|
export type GetTodoCommentsResponse =
|
||||||
|
paths['/todos/{id}/comments']['get']['responses']['200']['content']['application/json'];
|
||||||
|
```
|
||||||
|
**Типы запросов для создания задачи и комментария к задаче**:
|
||||||
|
```
|
||||||
|
type CreateTodosRequest =
|
||||||
|
paths['/todos']['post']['requestBody']['content']['application/json'];
|
||||||
|
type CreateTodoCommentRequest =
|
||||||
|
paths['/todos/{id}/comments']['post']['requestBody']['content']['application/json'];
|
||||||
|
```
|
||||||
|
**Функции для работы с задачами и их комментариями**:
|
||||||
|
- `createTodo`: Функция для создания новой задачи.
|
||||||
|
- `updateTodo`: Функция для обновления данных задачи.
|
||||||
|
- `removeTodo`: Функция для удаления задачи.
|
||||||
|
- `createTodoComment`: Функция для добавления комментария к задаче.
|
||||||
|
**Функции для работы с избранными задачами**:
|
||||||
|
- `addTodoToFavorites`: Функция для добавления задачи в избранное.
|
||||||
|
- `removeTodoFromFavorites`: Функция для удаления задачи из избранного.
|
||||||
32
FRONTEND/API/USER.md
Normal file
32
FRONTEND/API/USER.md
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
**Импорт константы API_BASE_URL из файла constants**:
|
||||||
|
```
|
||||||
|
import { API_BASE_URL } from '~/constants'
|
||||||
|
```
|
||||||
|
**Импорт путей API из файла openapi.gen**:
|
||||||
|
```
|
||||||
|
import type { paths } from '~/openapi.gen'
|
||||||
|
```
|
||||||
|
**Типы запросов и ответов для обновления и создания пользователя**:
|
||||||
|
```
|
||||||
|
type UserSetting =
|
||||||
|
paths['/user']['put']['requestBody']['content']['application/json'];
|
||||||
|
type UpdateUserResponse =
|
||||||
|
paths['/user']['put']['responses']['200']['content']['application/json'];
|
||||||
|
type CreateUserResponse =
|
||||||
|
paths['/users']['post']['responses']['201']['content']['application/json'];
|
||||||
|
```
|
||||||
|
**Функции для работы с пользователями**:
|
||||||
|
- `updateUser`: Функция для обновления данных пользователя.
|
||||||
|
- `createUser`: Функция для создания нового пользователя.
|
||||||
|
- `getUser`: Функция для получения данных пользователя.
|
||||||
|
|
||||||
|
**Типы и функции для подписки и отписки от пользователя**:
|
||||||
|
```
|
||||||
|
export type FollowUserResponse =
|
||||||
|
paths['/profiles/{username}/follow']['post']['responses']['200']['content']['application/json'];
|
||||||
|
export type UnfollowUserResponse =
|
||||||
|
paths['/profiles/{username}/follow']['delete']['responses']['200']['content']['application/json'];
|
||||||
|
```
|
||||||
|
**Функции для подписки и отписки от пользователя**:
|
||||||
|
- `followUser`: Функция для подписки на пользователя.
|
||||||
|
- `unfollowUser`: Функция для отписки от пользователя.
|
||||||
7
FRONTEND/CONSTANTS.TS.md
Normal file
7
FRONTEND/CONSTANTS.TS.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
Код представляет собой файл конфигурации для приложения, где определены несколько констант, включая название приложения (`APP_NAME`) и базовый URL для взаимодействия с API (`API_BASE_URL`):
|
||||||
|
|
||||||
|
1. **`export const APP_NAME = 'We.PRO';`**: Здесь определена константа `APP_NAME`, которая содержит название приложения. Это полезно, если вам нужно использовать название приложения в различных частях вашего приложения, таких как заголовки, мета-теги и т.д.
|
||||||
|
|
||||||
|
3. **`export const API_BASE_URL = 'https://fipi.pro/api';`**: Это текущее значение константы `API_BASE_URL`, которое указывает на базовый URL для взаимодействия с вашим API.
|
||||||
|
|
||||||
|
Эти константы могут быть использованы в приложении для обращения к API с помощью Axios или другой библиотеки HTTP.
|
||||||
14
FRONTEND/OPENAPI.YML.md
Normal file
14
FRONTEND/OPENAPI.YML.md
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
1. **openapi: 3.0.1**: Это версия спецификации OpenAPI.
|
||||||
|
|
||||||
|
2. **info**: Здесь содержится информация о нашем API, такая как название, описание, контактная информация, лицензия и версия API.
|
||||||
|
|
||||||
|
3. **tags**: Теги используются для группировки различных эндпоинтов вашего API.
|
||||||
|
|
||||||
|
4. **servers**: Здесь указываются серверы, на которых размещено ваше API. В нашем случае, это `http://127.0.0.1:8001/api`.
|
||||||
|
|
||||||
|
5. **paths**: Здесь описываются пути к различным ресурсам вашего API, такие как CRUD операции для статей, комментариев, задач и других сущностей.
|
||||||
|
|
||||||
|
6. **components**: Здесь определены компоненты вашего API, такие как схемы данных (schemas), ответы (responses), тела запросов (requestBodies), параметры (parameters) и схемы безопасности (securitySchemes). Эти компоненты могут быть использованы в различных запросах и ответах вашего API.
|
||||||
|
|
||||||
|
|
||||||
|
В контексте проекта на Nuxt.js, мы можем использовать эту спецификацию OpenAPI для генерации типов TypeScript для взаимодействия с нашим API. Например, вы можете использовать инструменты, такие как Swagger Codegen, для автоматической генерации клиентских библиотек API на основе этой спецификации, что поможет вам упростить работу с вашим API внутри вашего приложения на Nuxt.js.
|
||||||
45
FRONTEND/STORE/AUTH.TS.md
Normal file
45
FRONTEND/STORE/AUTH.TS.md
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
**Импорт функции defineStore из библиотеки pinia для создания хранилища**:
|
||||||
|
```
|
||||||
|
import { defineStore } from 'pinia'
|
||||||
|
```
|
||||||
|
**Импорт типа User из файла с типами '@/types'**:
|
||||||
|
```
|
||||||
|
import { User } from '@/types'
|
||||||
|
```
|
||||||
|
**Определение типа состояния для хранилища auth**:
|
||||||
|
```
|
||||||
|
type authState = {
|
||||||
|
currentUser: User | undefined;
|
||||||
|
};
|
||||||
|
```
|
||||||
|
В этом блоке определяется тип `authState`, который представляет состояние хранилища. `currentUser` может быть типа `User` или `undefined`.
|
||||||
|
|
||||||
|
**Начальное состояние хранилища**:
|
||||||
|
```
|
||||||
|
const defaultState: authState = {
|
||||||
|
currentUser: undefined,
|
||||||
|
};
|
||||||
|
```
|
||||||
|
Здесь устанавливается начальное состояние хранилища `authStore`, в котором `currentUser` равен `undefined`.
|
||||||
|
|
||||||
|
**Экспорт хранилища authStore с использованием defineStore**:
|
||||||
|
```
|
||||||
|
export const authStore = defineStore({
|
||||||
|
id: 'auth',
|
||||||
|
state: () => defaultState,
|
||||||
|
getters: {
|
||||||
|
isAuthenticated: (state) => state.currentUser !== undefined,
|
||||||
|
jwtToken: (state) => state.currentUser?.token,
|
||||||
|
},
|
||||||
|
actions: {
|
||||||
|
signIn(user: User) {
|
||||||
|
this.currentUser = user;
|
||||||
|
},
|
||||||
|
signOut() {
|
||||||
|
this.currentUser = undefined;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
persist: true,
|
||||||
|
});
|
||||||
|
```
|
||||||
|
Здесь мы используем `defineStore` для создания хранилища `authStore` с определенными состоянием (`state`), геттерами (`getters`) для проверки аутентификации и получения токена, а также с действиями (`actions`) для входа и выхода пользователя. Флаг `persist: true` указывает, что состояние хранилища должно сохраняться между перезагрузками страницы.
|
||||||
50
FRONTEND/STORE/UI.TS.md
Normal file
50
FRONTEND/STORE/UI.TS.md
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
**Импорт функции defineStore из библиотеки pinia для создания хранилища**:
|
||||||
|
```
|
||||||
|
import { defineStore } from 'pinia';
|
||||||
|
```
|
||||||
|
**Определение типа данных ConfirmationModalDataType**:
|
||||||
|
```
|
||||||
|
type ConfirmationModalDataType = {
|
||||||
|
text: string,
|
||||||
|
action: () => any
|
||||||
|
};
|
||||||
|
```
|
||||||
|
Здесь определяется тип данных `ConfirmationModalDataType`, который содержит текст модального окна и функцию действия при подтверждении.
|
||||||
|
|
||||||
|
**Определение типа состояния для хранилища ui**:
|
||||||
|
```
|
||||||
|
type uiState = {
|
||||||
|
confirmationModalStatus: boolean;
|
||||||
|
confirmationModalData: ConfirmationModalDataType | undefined;
|
||||||
|
};
|
||||||
|
```
|
||||||
|
В этом блоке определяется тип состояния `uiState` для хранилища. `confirmationModalStatus` указывает на состояние модального окна (открыто или закрыто), а `confirmationModalData` содержит данные для модального окна подтверждения.
|
||||||
|
|
||||||
|
**Начальное состояние хранилища**:
|
||||||
|
```
|
||||||
|
const defaultState: uiState = {
|
||||||
|
confirmationModalStatus: false,
|
||||||
|
confirmationModalData: undefined,
|
||||||
|
};
|
||||||
|
```
|
||||||
|
Здесь устанавливается начальное состояние хранилища `uiStore`, в котором модальное окно подтверждения изначально закрыто и данные для него не определены.
|
||||||
|
|
||||||
|
**Экспорт хранилища uiStore с использованием defineStore**:
|
||||||
|
```
|
||||||
|
export const uiStore = defineStore({
|
||||||
|
id: 'ui',
|
||||||
|
state: () => defaultState,
|
||||||
|
actions: {
|
||||||
|
openConfirmationModal(text: string, action: () => any) {
|
||||||
|
this.confirmationModalData = { text, action };
|
||||||
|
this.confirmationModalStatus = true;
|
||||||
|
},
|
||||||
|
closeConfirmationModal() {
|
||||||
|
this.confirmationModalData = undefined;
|
||||||
|
this.confirmationModalStatus = false;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
persist: true,
|
||||||
|
});
|
||||||
|
```
|
||||||
|
Здесь мы используем `defineStore` для создания хранилища `uiStore` с определенным состоянием (`state`), действиями (`actions`) для открытия и закрытия модального окна подтверждения, а также флагом `persist: true`, чтобы сохранять состояние хранилища между перезагрузками страницы.
|
||||||
19
FRONTEND/TYPES.TS.md
Normal file
19
FRONTEND/TYPES.TS.md
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
|
||||||
|
**Импорт типов компонентов из сгенерированного файла OpenAPI**:
|
||||||
|
```
|
||||||
|
openapi.gen import { components } from '~/openapi.gen'
|
||||||
|
```
|
||||||
|
**Определение пользовательских типов на основе схем OpenAPI**:
|
||||||
|
- `User`, `Article`, `ArticleComment` - типы данных, соответствующие схемам `User`, `Article`, `Comment` из OpenAPI.
|
||||||
|
- `Todo`, `TodoComment` - типы данных для задачи и комментария к задаче соответственно.
|
||||||
|
- `Tenant`, `TenantContact` - типы данных для арендаторов и контактов к арендаторам.
|
||||||
|
- `Team` - тип данных для команды.
|
||||||
|
|
||||||
|
**Определение типа состояния Формы (CREATE | UPDATE):**
|
||||||
|
```
|
||||||
|
// Тип состояния Формы (создвть | изменить)
|
||||||
|
export enum FormMode {
|
||||||
|
CREATE,
|
||||||
|
UPDATE
|
||||||
|
}
|
||||||
|
```
|
||||||
94
WE.PRO.md
Normal file
94
WE.PRO.md
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
## Задачи для Frontend:
|
||||||
|
|
||||||
|
1. Создание гридов или контейнеров для ровной вёрстки:
|
||||||
|
- Эта задача включает в себя создание структуры для размещения элементов пользовательского интерфейса, таких как таблицы, сетки и контейнеры, чтобы обеспечить ровное и качественное отображение на различных устройствах и разрешениях экранов.
|
||||||
|
2. Реализация возможности смены тем пользователем:
|
||||||
|
- Здесь требуется добавить функционал, который позволит пользователям выбирать тему оформления приложения, что повысит комфорт использования и персонализацию опыта.
|
||||||
|
3. Внедрение переключателя для темной и светлой темы:
|
||||||
|
- Эта задача включает в себя создание интерфейса для переключения между тёмной и светлой цветовой схемой, что позволит пользователям выбирать наиболее подходящий внешний вид приложения.
|
||||||
|
4. Необходимо добавить редактор markdown файлов:
|
||||||
|
- Здесь требуется интегрировать редактор, который позволит пользователям создавать и редактировать текстовые файлы в формате Markdown, обеспечивая удобство и эффективность работы с содержимым.
|
||||||
|
## Задачи для Backend:
|
||||||
|
|
||||||
|
1. Разработка системы аутентификации:
|
||||||
|
- Эта задача заключается в создании механизмов аутентификации пользователей для обеспечения безопасного доступа к приложению.
|
||||||
|
2. Создание функционала для управления задачами:
|
||||||
|
- Здесь требуется реализовать функционал для создания, редактирования и управления задачами, что является одним из ключевых функциональных блоков приложения.
|
||||||
|
3. Реализация личного кабинета пользователя:
|
||||||
|
- Эта задача включает в себя создание страницы личного кабинета, где пользователи смогут управлять своими данными, настройками и просматривать персональную информацию.
|
||||||
|
4. Внедрение формы обратной связи:
|
||||||
|
- Здесь требуется добавить функционал, позволяющий пользователям отправлять обратную связь или сообщения администратору, что повысит взаимодействие и обратную связь с пользователем.
|
||||||
|
5. Создать генератор yml файлов:
|
||||||
|
- Все запросы с frontend делаются через openapi, нужно автоматизировать этот процесс.
|
||||||
|
## Модули на Backend:
|
||||||
|
|
||||||
|
1. **Accounts** - Управление пользователями.
|
||||||
|
2. **Media** - Файловое хранилище.
|
||||||
|
3. **Main** - Основное приложение.
|
||||||
|
4. **Articles** - Лента статей и новостей.
|
||||||
|
5. **Todos** - Ежедневник.
|
||||||
|
6. **Tenants** - Арендаторы.
|
||||||
|
7. **Goods** - Имущество.
|
||||||
|
8. **Properties** - Панель управления недвижимостью.
|
||||||
|
9. **Teams** - Команда (в процессе доработки).
|
||||||
|
10. **Documents Flow** - Документооборот (в разработке).
|
||||||
|
11. **Contracts** - Контракты.
|
||||||
|
12. **Techdoc** - Техническая документация (в разработке).
|
||||||
|
13. **Title Documents** - Правоустанавливающие документы (в разработке).
|
||||||
|
14. **Tech Features** - Технические особенности (в разработке).
|
||||||
|
15. **Histories** - Журналы обслуживания (в разработке).
|
||||||
|
16. **Comments** - Комментарии (модели заполняются по мере необходимости).
|
||||||
|
### В каждом модуле есть :
|
||||||
|
|
||||||
|
1. models - Модель таблиц базы данных
|
||||||
|
2. views - Контроллер запросов
|
||||||
|
3. serializers - Преобразовывать данные в наборы запросов
|
||||||
|
4. filters - Фильтр данных
|
||||||
|
5. urls - Маршрутизатор
|
||||||
|
## Модули на Backend в разработке:
|
||||||
|
|
||||||
|
1. **Teams** - Команда (в процессе доработки).
|
||||||
|
2. **Documents Flow** - Документооборот (в разработке).
|
||||||
|
1. Сериализатор
|
||||||
|
2. контроллер
|
||||||
|
3. маршрутизатор
|
||||||
|
4. модель
|
||||||
|
3. **Techdoc** - Техническая документация (в разработке).
|
||||||
|
1. Сериализатор
|
||||||
|
2. контроллер
|
||||||
|
3. маршрутизатор
|
||||||
|
4. **Title Documents** - Правоустанавливающие документы (в разработке).
|
||||||
|
1. Сериализатор
|
||||||
|
2. контроллер
|
||||||
|
3. маршрутизатор
|
||||||
|
4. модель
|
||||||
|
5. **Tech Features** - Технические особенности (в разработке).
|
||||||
|
1. Сериализатор
|
||||||
|
2. контроллер
|
||||||
|
3. маршрутизатор
|
||||||
|
4. модель
|
||||||
|
6. **Histories** - Журналы обслуживания (в разработке).
|
||||||
|
1. Сериализатор
|
||||||
|
2. контроллер
|
||||||
|
3. маршрутизатор
|
||||||
|
## Контроллер на Backend:
|
||||||
|
|
||||||
|
- Необходимо детальнее описать обработку ошибок для различных запросов. Произошёл случай, когда ошибка авторизации была связана с ограничениями прав на редактирование задачи.
|
||||||
|
- Сейчас режим строгого редактирования данных отключён, но правила ограничений прописаны.
|
||||||
|
## Описание для Frontend:
|
||||||
|
|
||||||
|
- Следует уточнить, является openapi составным ресурсом, определяющим и описывающим API и его элементы.
|
||||||
|
- Каждый запрос на Backend должен быть подробно описан на Frontend, чтобы избежать ошибок передачи данных.
|
||||||
|
## Типы данных на Frontend (которые уже можно обрабатывать):
|
||||||
|
|
||||||
|
1. **Accounts** - Управление пользователями.
|
||||||
|
2. **Articles** - Лента статей и новостей.
|
||||||
|
3. **Todos** - Ежедневник.
|
||||||
|
4. **Tenants** - Арендаторы.
|
||||||
|
5. **Teams** - Команда (в процессе доработки).
|
||||||
|
6. **Comments** - Комментарии.
|
||||||
|
## Особенности структуры данных:
|
||||||
|
|
||||||
|
- Связь между таблицами осуществляется по идентификаторам (id ключам).
|
||||||
|
- Любые небольшие заполненные данные имеют отдельную таблицу и связываются по идентификаторам.
|
||||||
|
- Запросы на сервер обрабатываются через fetch и передаются в формате JSON.
|
||||||
Reference in New Issue
Block a user