partner.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. from django.core.files.storage import default_storage
  2. from django.views.generic import DetailView
  3. from django.views.generic.edit import FormView
  4. from django.urls import reverse_lazy
  5. from django.shortcuts import get_object_or_404, redirect
  6. from django.contrib import messages
  7. from django.db import transaction
  8. from dbsynce.models import Company, Documents, DocumentFile
  9. from sharix_admin.forms import CompanyForm, DocumentUploadForm
  10. from sharix_admin.utils import *
  11. from .base import BaseView
  12. class PartnerBaseView(BaseView):
  13. page_name = 'partner'
  14. # Проверяем состояит ли текущий пользователь в группе PARTNER-ADMIN
  15. def test_func(self):
  16. return "PARTNER-ADMIN" in self.user_groups
  17. class PartnerDetailView(PartnerBaseView, DetailView):
  18. model = Company
  19. template_name = 'sharix_admin/partner.html'
  20. context_object_name = 'company'
  21. page_title = 'О партнере'
  22. def get_object(self, queryset=None):
  23. return get_object_or_404(Company, repr_id=self.request.user)
  24. def get_context_data(self, **kwargs):
  25. context = super().get_context_data(**kwargs)
  26. docs = Documents.objects.filter(
  27. user_id=self.request.user,
  28. company_id=self.object
  29. ).prefetch_related('files').order_by('doc_type')
  30. context.update({ "docs": docs })
  31. return context
  32. class PartnerEditView(PartnerBaseView, FormView):
  33. template_name = 'sharix_admin/partner_edit.html'
  34. form_class = CompanyForm
  35. success_url = reverse_lazy('partner_detail')
  36. page_title = 'Изменение данных партнера'
  37. def get_form_kwargs(self):
  38. kwargs = super().get_form_kwargs()
  39. kwargs['instance'] = get_object_or_404(Company, repr_id=self.request.user)
  40. return kwargs
  41. def form_valid(self, form):
  42. with transaction.atomic():
  43. # Сохраняем изменения
  44. form.save()
  45. # Получаем текущий объект компании и деактивируем ее
  46. current_company = form.instance
  47. current_company.deactivate()
  48. # Выполняем пересоздание тикета на активацию партнера
  49. current_company.ticket_status.archive()
  50. create_ticket_partner_activation(self.request.user, current_company)
  51. # Отправляем полAьзователю уведомление на страницу об успехе операции
  52. messages.success(self.request, 'Данные успешно изменены и теперь проходят проверку!')
  53. return super().form_valid(form)
  54. class PartnerDocUploadView(PartnerBaseView, FormView):
  55. # FIXME: Загрузка новых документов должна деактивировать текущего партнера (предварительно это работа обработчиков)
  56. template_name = 'sharix_admin/partner/doc_upload.html'
  57. form_class = DocumentUploadForm
  58. success_url = reverse_lazy('partner_detail')
  59. def dispatch(self, request, *args, **kwargs):
  60. self.company = get_object_or_404(Company, repr_id=self.request.user)
  61. self.doc = Documents.objects.filter(
  62. user_id=self.request.user,
  63. company_id=self.company,
  64. doc_type=kwargs.get('doc_code')
  65. ).first()
  66. self.doc_name = self.doc.get_doc_type_display()
  67. self.page_title = "Изменение документа партнера: " + self.doc_name
  68. return super().dispatch(request, *args, **kwargs)
  69. def form_valid(self, form):
  70. with transaction.atomic():
  71. # Удаляем существующие файлы и записи из базы данных
  72. existing_files = DocumentFile.objects.filter(document=self.doc)
  73. for existing_file in existing_files:
  74. # Удаляем файл с сервера
  75. if default_storage.exists(existing_file.file.path):
  76. default_storage.delete(existing_file.file.path)
  77. # Удаляем запись о файле из базы данных
  78. existing_file.delete()
  79. # Загрузка новых файлов
  80. doc_file = self.request.FILES.getlist("doc_file")
  81. for file in doc_file:
  82. DocumentFile.objects.create(
  83. document=self.doc,
  84. file=file
  85. )
  86. # Создание нового тикета и архивация старого
  87. if self.doc.ticket_status:
  88. self.doc.ticket_status.archive()
  89. self.doc.expire_date = self.request.POST.get('doc_expire_date') if self.request.POST['doc_expire_date'] else None
  90. self.doc.ticket_status = create_ticket_partner_docs_verification(self.request.user, self.company, self.doc)
  91. self.doc.save()
  92. # Отправляем пользователю уведомление на страницу об успехе операции
  93. messages.success(self.request, f'Файлы документа "{self.doc_name}" успешно загружены и теперь проходят проверку!')
  94. return super().form_valid(form)
  95. class PartnerDocView(PartnerBaseView, DetailView):
  96. model = Documents
  97. template_name = 'sharix_admin/partner/doc.html'
  98. context_object_name = 'doc'
  99. def dispatch(self, request, *args, **kwargs):
  100. self.company = get_object_or_404(Company, repr_id=self.request.user)
  101. self.doc = Documents.objects.filter(
  102. user_id=self.request.user,
  103. company_id=self.company,
  104. doc_type=kwargs.get('doc_code')
  105. ).first()
  106. if not self.doc:
  107. return self.handle_no_permission()
  108. self.doc_name = self.doc.get_doc_type_display()
  109. self.page_title = _("Детали документа: ") + self.doc_name
  110. return super().dispatch(request, *args, **kwargs)
  111. def get_object(self, queryset=None):
  112. return self.doc
  113. def get_context_data(self, **kwargs):
  114. context = super().get_context_data(**kwargs)
  115. doc_files = DocumentFile.objects.filter(document=self.doc)
  116. context.update({ "doc_files": doc_files })
  117. return context