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 sharix_admin.forms import CompanyForm, DocumentUploadForm
  12. from sharix_admin.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 = 'sharix_admin/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 = 'sharix_admin/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 = 'sharix_admin/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 = 'sharix_admin/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