## Кортеж типа организации 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` (CharField): Тип арендатора. - `organizationType` (CharField): Тип организации (юридического лица). - `tradeName` (CharField): Название арендуемой организацией единицы недвижимости. - `tenantName` (CharField): Имя арендатора (физического лица). - `tenantSurname` (CharField): Фамилия арендатора (физического лица). - `tenantPatronymic` (CharField): Отчество арендатора (физического лица). - `tenantPassportSeries` (CharField): Серия паспорта арендатора (физического лица). - `tenantPassportNumber` (CharField): Номер паспорта арендатора (физического лица). - `tenantPassportIssuedBy` (CharField): Кем выдан паспорт арендатора (физического лица). - `tenantPassportIssuedDate` (DateField): Дата выдачи паспорта арендатора (физического лица). - `tenantRegistration` (TextField): Прописка арендатора (физического лица) или дополнительная информация (юридического лица). - `tenantCompanyName` (CharField): Название организации арендатора (юридического лица). - `tenantInn` (CharField): ИНН организации арендатора (юридического лица). - `KPP` (CharField): КПП организации арендатора (юридического лица). - `tenantOgrn` (CharField): ОГРН организации арендатора (юридического лица). - `bankDetails` (CharField): Реквизиты банка организации арендатора (юридического лица). - `additionalInfo` (TextField): Дополнительная информация о арендаторе. - `tenantFile` (FileField): Скан документов арендатора. - `author` (AuthorSerializer): Информация об авторе. - `createdAt` (DateTimeField): Дата создания записи. - `updatedAt` (DateTimeField): Дата обновления записи. 2. **ContactSerializer**: - `contactTypeTenant` (CharField): Тип контакта арендатора. - `attitudeContactTypeTenant` (CharField): Атрибут контакта арендатора. - `valueTenant` (CharField): Значение контакта арендатора. - `firstNameTenant` (CharField): Имя арендатора (физического лица). - `lastNameTenant` (CharField): Фамилия арендатора (физического лица). - `organizationTenant` (CharField): Название организации арендатора (юридического лица). - `jobTitleTenant` (CharField): Должность арендатора (юридического лица). - `addressTenant` (CharField): Адрес арендатора. - `author` (AuthorSerializer): Информация об авторе. - `createdAt` (DateTimeField): Дата создания записи. - `updatedAt` (DateTimeField): Дата обновления записи. ## Маршрутизатор 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'.