resource.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. from dbsynce.models import Resource
  2. from django.http import JsonResponse
  3. from django.http import Http404
  4. from django.shortcuts import render
  5. from django.contrib.auth.decorators import login_required
  6. from django.contrib.auth.mixins import UserPassesTestMixin
  7. from django.http import JsonResponse
  8. from django.utils.translation import gettext as _
  9. from django_tables2 import SingleTableView
  10. from django.views.generic import DetailView
  11. from sharix_admin.tables import ResourcesTable
  12. from sharix_admin.utils import group_required
  13. from datetime import datetime, timedelta
  14. from dbsynce.lib.core import parse_requirements, get_admin_url
  15. from dbsynce.models import Documents
  16. from django.contrib import messages
  17. from django.db import transaction
  18. from django.urls import reverse_lazy
  19. from django.views.generic.edit import FormView
  20. from django.views.generic.edit import UpdateView
  21. from tickets.models import Ticket, TicketList
  22. from sharix_admin.forms import ResourceForm
  23. from sharix_admin.utils import *
  24. from dbsynce.lib.data import *
  25. from .base import BaseView
  26. from django.db.models import Q
  27. from dbsynce.models import Documents, DocumentFile
  28. from sharix_admin.forms import DocumentUploadForm
  29. from django.shortcuts import get_object_or_404, redirect
  30. from django.core.files.storage import default_storage
  31. from dbsynce.docs.database.resource import Resource as ResourceHelpTexts
  32. from dbsynce.docs.verbose_names.resource import Resource as ResourceVerboseNames
  33. class ResourcesListView(BaseView, UserPassesTestMixin, SingleTableView):
  34. table_class = ResourcesTable
  35. queryset = Resource.objects.all()
  36. template_name = 'sharix_admin/resources.html'
  37. page_title = 'Ресурсы'
  38. page_name = 'resources'
  39. def get_context_data(self, **kwargs):
  40. context = super().get_context_data(**kwargs)
  41. context.update({
  42. 'title': _('Resources'),
  43. 'object_list': context['object_list'],
  44. })
  45. return context
  46. def get_queryset(self):
  47. queryset = super().get_queryset()
  48. search_query = self.request.GET.get('q', '').strip()
  49. if search_query:
  50. queryset = queryset.filter(
  51. Q(id__icontains=search_query) |
  52. Q(user__first_name__icontains=search_query) |
  53. Q(user__last_name__icontains=search_query) |
  54. Q(status__icontains=search_query)
  55. ).distinct()
  56. return queryset
  57. def test_func(self) -> bool or None:
  58. #group_names = ('PARTNER-ADMIN')
  59. #if bool(self.request.user.groups.filter(name=group_names)) or self.request.user.is_superuser:
  60. # return True
  61. #return False
  62. return True
  63. #@login_required
  64. #@group_required('PARTNER-ADMIN')
  65. def change_resource_status(request):
  66. if request.method == 'POST':
  67. resource_id = request.POST.get('resource_id')
  68. new_status = request.POST.get('new_status')
  69. resource = Resource.objects.get(pk=resource_id)
  70. resource.status = new_status
  71. resource.save()
  72. return JsonResponse({'status': 'success'})
  73. else:
  74. return JsonResponse({'status': 'error'})
  75. #class ResourceEditView(BaseView, FormView):
  76. class ResourceEditView(BaseView, UpdateView):
  77. form_class = ResourceForm
  78. model = Resource
  79. template_name = "sharix_admin/resource.html"
  80. success_url = reverse_lazy("sharix_admin:resources")
  81. page_title = 'Изменить ресурс'
  82. page_name = 'resource_edit'
  83. def get_context_data(self, **kwargs):
  84. context = super().get_context_data(**kwargs)
  85. try:
  86. docs = Documents.objects.filter(resource=self.object.id)
  87. except Documents.DoesNotExist:
  88. docs=[]
  89. context.update({
  90. 'title': self.page_title,
  91. 'object': self.object,
  92. "current_page": "sharix_admin:resources",
  93. })
  94. context['docs'] = docs
  95. return context
  96. def get_form_kwargs(self):
  97. kwargs = super().get_form_kwargs()
  98. #docs = Documents.objects.filter(resource=self.object.id)
  99. #kwargs['instance'] = get_object_or_404(Company, repr=self.request.user)
  100. kwargs['instance'] = get_object_or_404(Resource, id=self.object.id)
  101. return kwargs
  102. def form_valid(self, form):
  103. with transaction.atomic():
  104. # Сохраняем изменения
  105. form.save()
  106. # Получаем текущий объект компании и деактивируем ее
  107. current_resource = form.instance
  108. current_resource.deactivate()
  109. # Выполняем пересоздание тикета на активацию партнера
  110. current_resource.ticket_status.archive()
  111. current_resource.ticket_status = create_ticket_resource_activation_by_metaservice_supervisor(self.request.user, current_resource)
  112. # Отправляем полAьзователю уведомление на страницу об успехе операции
  113. messages.success(self.request, 'Данные успешно изменены и теперь проходят проверку!')
  114. return super().form_valid(form)
  115. # # Проверяем состояит ли текущий пользователь в группе PARTNER-ADMIN
  116. # def test_func(self):
  117. # return "PARTNER-ADMIN" in self.user_groups
  118. # def form_valid(self, form):
  119. # with transaction.atomic():
  120. # # Сохраняем форму, чтобы получить объект ресурса
  121. # instance = form.save(commit=False)
  122. # # Присваиваем полю user идентификатор текущего пользователя
  123. # instance.user = self.request.user
  124. # # Создаем новую запись в БД, чтобы иметь доступ к ID
  125. # instance.save()
  126. # # Создание тикета на активацию ресурса.
  127. # # Создаем объект тикета и присваиваем его полю ticket_status
  128. # instance.ticket_status = create_ticket_resource_activation_by_metaservice_supervisor(self.request.user, instance)
  129. # # Создание тикета на утверждение прав пользователя
  130. # # create_ticket_role_activation_partner_admin(self.request.user, instance)
  131. # # Сохраняем новые изменения
  132. # instance.save()
  133. # # Создаем необходимые объекты документов по requirements указанных в созданной company
  134. # # Используем bulk_create для создания всех объектов одновременно
  135. # doc_codes = parse_requirements(instance.requirements)
  136. # Documents.objects.bulk_create([
  137. # Documents(
  138. # resource=instance,
  139. # user=self.request.user,
  140. # doc_type=doc_code
  141. # ) for doc_code in doc_codes
  142. # ])
  143. # # Отправляем пользователю уведомление на страницу о успехе операции
  144. # messages.success(
  145. # self.request,
  146. # 'Ваша заявка на становление партнером успешно отправлена и теперь проходит проверку!'
  147. # )
  148. # return super().form_valid(form) # Возвращаем успешный ответ
  149. class ResourceCreate(BaseView, FormView):
  150. form_class = ResourceForm
  151. template_name = "sharix_admin/resource.html"
  152. success_url = reverse_lazy("sharix_admin:main")
  153. page_title = 'Добавить ресурс'
  154. page_name = 'resource/add/'
  155. # Проверяем не состояит ли текущий пользователь в группе PARTNER-ADMIN
  156. # def test_func(self):
  157. # return not "PARTNER-ADMIN" in self.user_groups
  158. def form_valid(self, form):
  159. with transaction.atomic():
  160. # Сохраняем форму, чтобы получить объект компании
  161. instance = form.save(commit=False)
  162. # Присваиваем полю user идентификатор текущего пользователя
  163. instance.user = self.request.user
  164. # Создаем новую запись в БД, чтобы иметь доступ к ID
  165. instance.save()
  166. # Создание тикета на активацию ресурса.
  167. # Создаем объект тикета и присваиваем его полю ticket_status
  168. instance.ticket_status = create_ticket_resource_activation_by_metaservice_supervisor(self.request.user, instance)
  169. # Создание тикета на утверждение прав пользователя
  170. create_ticket_resource_activation_by_partner_admin(self.request.user, instance)
  171. # Сохраняем новые изменения
  172. instance.save()
  173. # Создаем необходимые объекты документов по requirements указанных в созданной company
  174. # Используем bulk_create для создания всех объектов одновременно
  175. doc_codes = parse_requirements(instance.requirements)
  176. Documents.objects.bulk_create([
  177. Documents(
  178. #TODO add info about company
  179. resource=instance,
  180. user=self.request.user,
  181. doc_type=doc_code
  182. ) for doc_code in doc_codes
  183. ])
  184. # Отправляем пользователю уведомление на страницу о успехе операции
  185. messages.success(
  186. self.request,
  187. 'Ваша заявка на становление партнером успешно отправлена и теперь проходит проверку!'
  188. )
  189. return super().form_valid(form) # Возвращаем успешный ответ
  190. class ResourceDetailView(BaseView, DetailView):
  191. model = Resource
  192. template_name = 'sharix_admin/resource_detail.html'
  193. context_object_name = 'resource'
  194. page_title = 'О ресурсе'
  195. page_name = 'resource_detail'
  196. def detail_view(self, request, primary_key):
  197. try:
  198. resource = Resource.objects.get(pk=primary_key)
  199. except Resource.DoesNotExist:
  200. raise Http404('Provider does not exist')
  201. return render(request, self.template_name, context={
  202. 'help_texts': ResourceHelpTexts,
  203. 'captions': ResourceVerboseNames,
  204. })
  205. def get_context_data(self, **kwargs):
  206. context = super().get_context_data(**kwargs)
  207. context['help_texts'] = ResourceHelpTexts
  208. context['captions'] = ResourceVerboseNames
  209. return context
  210. class ResourceDocUploadView(BaseView, FormView):
  211. # FIXME: Загрузка новых документов должна деактивировать текущего партнера (предварительно это работа обработчиков)
  212. template_name = 'sharix_admin/include/doc_upload.html'
  213. form_class = DocumentUploadForm
  214. success_url = reverse_lazy('sharix_admin:resources')
  215. #success_url = reverse_lazy('resource_detail')
  216. page_name = 'Загрузка документа'
  217. def dispatch(self, request, *args, **kwargs):
  218. self.resource = Resource.objects.get(id=kwargs['pk'])
  219. #self.resource = get_object_or_404(id=kwargs['pk'])
  220. #self.resource = get_object_or_404(Resource, user=self.request.user)
  221. self.doc = Documents.objects.filter(
  222. user=self.request.user,
  223. resource=self.resource,
  224. doc_type=kwargs.get('doc_code')
  225. ).first()
  226. self.doc_name = self.doc.get_doc_type_display()
  227. self.page_title = "Изменение документа ресурса: " + self.doc_name
  228. return super().dispatch(request, *args, **kwargs)
  229. def form_valid(self, form):
  230. with transaction.atomic():
  231. # Удаляем существующие файлы и записи из базы данных
  232. existing_files = DocumentFile.objects.filter(document=self.doc)
  233. for existing_file in existing_files:
  234. # Удаляем файл с сервера
  235. if default_storage.exists(existing_file.file.path):
  236. default_storage.delete(existing_file.file.path)
  237. # Удаляем запись о файле из базы данных
  238. existing_file.delete()
  239. # Загрузка новых файлов
  240. doc_file = self.request.FILES.getlist("doc_file")
  241. for file in doc_file:
  242. DocumentFile.objects.create(
  243. document=self.doc,
  244. file=file
  245. )
  246. # Создание нового тикета и архивация старого
  247. if self.doc.ticket_status:
  248. self.doc.ticket_status.archive()
  249. self.doc.expire_date = self.request.POST.get('doc_expire_date') if self.request.POST[
  250. 'doc_expire_date'] else None
  251. self.doc.ticket_status = create_ticket_resource_docs_verification(self.request.user, self.resource, self.doc)
  252. self.doc.save()
  253. # Отправляем пользователю уведомление на страницу об успехе операции
  254. messages.success(self.request,
  255. f'Файлы документа "{self.doc_name}" успешно загружены и теперь проходят проверку!')
  256. return super().form_valid(form)
  257. class ResourceDocView(BaseView, DetailView):
  258. #class PartnerDocView(PartnerBaseView, DetailView):
  259. model = Documents
  260. template_name = 'sharix_admin/include/doc.html'
  261. context_object_name = 'doc'
  262. page_name = 'Просмотр документа'
  263. def dispatch(self, request, *args, **kwargs):
  264. self.resource = Resource.objects.get(id=kwargs['pk'])
  265. #self.resource = get_object_or_404(Resource, pk=self.request.id)
  266. #self.company = get_object_or_404(Resource, user=self.request.user)
  267. self.doc = Documents.objects.filter(
  268. user=self.request.user,
  269. resource=self.resource,
  270. doc_type=kwargs.get('doc_code')
  271. ).first()
  272. if not self.doc:
  273. return self.handle_no_permission()
  274. self.doc_name = self.doc.get_doc_type_display()
  275. self.page_title = _("Детали документа: ") + self.doc_name
  276. return super().dispatch(request, *args, **kwargs)
  277. def get_object(self, queryset=None):
  278. return self.doc
  279. def get_context_data(self, **kwargs):
  280. context = super().get_context_data(**kwargs)
  281. doc_files = DocumentFile.objects.filter(document=self.doc)
  282. context.update({"doc_files": doc_files})
  283. return context