1
0

partner.py 6.3 KB

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