commit 2762ac794a75286c538cff380b1e91d6b52296dc Author: krasi Date: Tue May 14 11:39:33 2024 +0300 140500 diff --git a/BACKEND/ACCOUNTS.md b/BACKEND/ACCOUNTS.md new file mode 100644 index 0000000..8b92108 --- /dev/null +++ b/BACKEND/ACCOUNTS.md @@ -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/` + - Описание: Выход пользователя из учетной записи и перенаправление на главную страницу. \ No newline at end of file diff --git a/BACKEND/ARTICLES.md b/BACKEND/ARTICLES.md new file mode 100644 index 0000000..6e6fd39 --- /dev/null +++ b/BACKEND/ARTICLES.md @@ -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`: Удаляет конкретную статью. diff --git a/BACKEND/COMMENTS.md b/BACKEND/COMMENTS.md new file mode 100644 index 0000000..5cb4af9 --- /dev/null +++ b/BACKEND/COMMENTS.md @@ -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//comments` + - `views.CommentView.as_view()` + - `name='comment-article'` + +1. **comment-delete:** URL для удаления комментариев к статьям по их идентификатору. + - `articles//comments/` + - `views.DeleteCommentView.as_view()` + - `name='comment-delete'` + +1. **comment-todo-article:** URL для создания и получения комментариев к задачам. + - `todos//comments` + - `views.CommentTodoView.as_view()` + - `name='comment-todo-article'` + +1. **comment-todo-delete:** URL для удаления комментариев к задачам по их идентификатору. + - `todos//comments//` + - `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`: Удаление комментария по его идентификатору и идентификатору задачи. diff --git a/BACKEND/CONTRACTS.md b/BACKEND/CONTRACTS.md new file mode 100644 index 0000000..722e1aa --- /dev/null +++ b/BACKEND/CONTRACTS.md @@ -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//payments`: Этот URL позволяет получить список платежей для определенного договора с идентификатором `id`. Он связан с представлением `PaymentContractViewSet`. + +3. **URL для удаления платежа по договору:** + - `contracts//payments//`: Этот 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`: Удаляет указанный платеж по указанному договору. \ No newline at end of file diff --git a/BACKEND/GOODS.md b/BACKEND/GOODS.md new file mode 100644 index 0000000..30ccb34 --- /dev/null +++ b/BACKEND/GOODS.md @@ -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:** Удаляет расходуемый товар. + - **Права доступа:** Только аутентифицированные пользователи могут управлять расходуемыми товарами. \ No newline at end of file diff --git a/BACKEND/HISTORIES.md b/BACKEND/HISTORIES.md new file mode 100644 index 0000000..f801482 --- /dev/null +++ b/BACKEND/HISTORIES.md @@ -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, связь с фотографиями показаний прибора учета. +## Сериализатор +## Маршрутизатор + +## Контроллер \ No newline at end of file diff --git a/BACKEND/MEDIA.md b/BACKEND/MEDIA.md new file mode 100644 index 0000000..326beb8 --- /dev/null +++ b/BACKEND/MEDIA.md @@ -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` с соответствующим сообщением об ошибке. +## Сериализатор + +## Маршрутизатор + +## Контроллер diff --git a/BACKEND/PROPERTIES.md b/BACKEND/PROPERTIES.md new file mode 100644 index 0000000..7550ae5 --- /dev/null +++ b/BACKEND/PROPERTIES.md @@ -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. \ No newline at end of file diff --git a/BACKEND/TEAMS.md b/BACKEND/TEAMS.md new file mode 100644 index 0000000..57b431f --- /dev/null +++ b/BACKEND/TEAMS.md @@ -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-запросов (список, создание, получение, обновление, удаление) с соответствующей логикой обработки данных и проверкой прав доступа. + diff --git a/BACKEND/TENANTS.md b/BACKEND/TENANTS.md new file mode 100644 index 0000000..b312f6a --- /dev/null +++ b/BACKEND/TENANTS.md @@ -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 для контактов арендаторов:** + - `'/contacts'`: Этот URL позволяет получить список контактов для определенного арендатора с идентификатором `id`. Он ссылается на представление `ContactTenantViewSet`. +3. **URL для удаления контакта арендатора:** + - `'/contacts//'`: Этот 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'. \ No newline at end of file diff --git a/BACKEND/TODOS.md b/BACKEND/TODOS.md new file mode 100644 index 0000000..2806465 --- /dev/null +++ b/BACKEND/TODOS.md @@ -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` проверяет, что пользователь является автором задачи, соисполнителем, поставщиком, наблюдателем или избранным. \ No newline at end of file diff --git a/BACKEND/Заметки для решения задач.md b/BACKEND/Заметки для решения задач.md new file mode 100644 index 0000000..3e30ffb --- /dev/null +++ b/BACKEND/Заметки для решения задач.md @@ -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()), +] +``` \ No newline at end of file diff --git a/BACKEND/Общие правила.md b/BACKEND/Общие правила.md new file mode 100644 index 0000000..0f67387 --- /dev/null +++ b/BACKEND/Общие правила.md @@ -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**: Позволяет только чтение неаутентифицированным пользователям. + diff --git a/FRONTEND/API/ARTICLE.md b/FRONTEND/API/ARTICLE.md new file mode 100644 index 0000000..1fdcf34 --- /dev/null +++ b/FRONTEND/API/ARTICLE.md @@ -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** +**Функции для добавления и удаления статьи из избранного** \ No newline at end of file diff --git a/FRONTEND/API/AUTH.md b/FRONTEND/API/AUTH.md new file mode 100644 index 0000000..1c9b2ab --- /dev/null +++ b/FRONTEND/API/AUTH.md @@ -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(`${API_BASE_URL}/users/login`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: user, // Передаем данные пользователя в теле запроса + }); +}; +``` \ No newline at end of file diff --git a/FRONTEND/API/TAG.md b/FRONTEND/API/TAG.md new file mode 100644 index 0000000..4726576 --- /dev/null +++ b/FRONTEND/API/TAG.md @@ -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`. \ No newline at end of file diff --git a/FRONTEND/API/TEAM.md b/FRONTEND/API/TEAM.md new file mode 100644 index 0000000..e69de29 diff --git a/FRONTEND/API/TENANT.md b/FRONTEND/API/TENANT.md new file mode 100644 index 0000000..16f399d --- /dev/null +++ b/FRONTEND/API/TENANT.md @@ -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`: Функция для добавления контакта к арендатору. diff --git a/FRONTEND/API/TODO.md b/FRONTEND/API/TODO.md new file mode 100644 index 0000000..292b2b4 --- /dev/null +++ b/FRONTEND/API/TODO.md @@ -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`: Функция для удаления задачи из избранного. \ No newline at end of file diff --git a/FRONTEND/API/USER.md b/FRONTEND/API/USER.md new file mode 100644 index 0000000..f4d43c8 --- /dev/null +++ b/FRONTEND/API/USER.md @@ -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`: Функция для отписки от пользователя. \ No newline at end of file diff --git a/FRONTEND/CONSTANTS.TS.md b/FRONTEND/CONSTANTS.TS.md new file mode 100644 index 0000000..e737df4 --- /dev/null +++ b/FRONTEND/CONSTANTS.TS.md @@ -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. \ No newline at end of file diff --git a/FRONTEND/OPENAPI.YML.md b/FRONTEND/OPENAPI.YML.md new file mode 100644 index 0000000..1c64460 --- /dev/null +++ b/FRONTEND/OPENAPI.YML.md @@ -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. \ No newline at end of file diff --git a/FRONTEND/STORE/AUTH.TS.md b/FRONTEND/STORE/AUTH.TS.md new file mode 100644 index 0000000..96338aa --- /dev/null +++ b/FRONTEND/STORE/AUTH.TS.md @@ -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` указывает, что состояние хранилища должно сохраняться между перезагрузками страницы. \ No newline at end of file diff --git a/FRONTEND/STORE/UI.TS.md b/FRONTEND/STORE/UI.TS.md new file mode 100644 index 0000000..15ed28d --- /dev/null +++ b/FRONTEND/STORE/UI.TS.md @@ -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`, чтобы сохранять состояние хранилища между перезагрузками страницы. \ No newline at end of file diff --git a/FRONTEND/TYPES.TS.md b/FRONTEND/TYPES.TS.md new file mode 100644 index 0000000..26ec5cd --- /dev/null +++ b/FRONTEND/TYPES.TS.md @@ -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 +} +``` \ No newline at end of file diff --git a/WE.PRO.md b/WE.PRO.md new file mode 100644 index 0000000..41ece41 --- /dev/null +++ b/WE.PRO.md @@ -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.