partner.py 6.5 KB

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