123 lines
11 KiB
Markdown
123 lines
11 KiB
Markdown
## Абстрактный класс `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'. |