resource.py 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. from dbsynce.models import Resource
  2. from django.contrib.auth.decorators import login_required
  3. from django.contrib.auth.mixins import UserPassesTestMixin
  4. from django.http import JsonResponse
  5. from django.utils.translation import gettext as _
  6. from django_tables2 import SingleTableView
  7. from django.views.generic import DetailView
  8. from sharix_admin.tables import ResourcesTable
  9. from sharix_admin.utils import group_required
  10. from datetime import datetime, timedelta
  11. from dbsynce.lib.core import parse_requirements, get_admin_url
  12. from dbsynce.models import Documents
  13. from django.contrib import messages
  14. from django.db import transaction
  15. from django.urls import reverse_lazy
  16. from django.views.generic.edit import FormView
  17. from tickets.models import Ticket, TicketList
  18. from sharix_admin.forms import ResourceForm
  19. from sharix_admin.utils import *
  20. from dbsynce.lib.data import *
  21. from .base import BaseView
  22. from django.db.models import Q
  23. from dbsynce.docs.database.resource import Resource as ResourceHelpTexts
  24. from dbsynce.docs.verbose_names.resource import Resource as ResourceVerboseNames
  25. class ResourcesListView(BaseView, UserPassesTestMixin, SingleTableView):
  26. table_class = ResourcesTable
  27. queryset = Resource.objects.all()
  28. template_name = 'sharix_admin/resource_list.html'
  29. page_title = 'Ресурсы'
  30. page_name = 'resources'
  31. def get_context_data(self, **kwargs):
  32. context = super().get_context_data(**kwargs)
  33. context.update({
  34. 'title': _('Resources'),
  35. 'object_list': context['object_list'],
  36. })
  37. return context
  38. def get_queryset(self):
  39. queryset = super().get_queryset()
  40. search_query = self.request.GET.get('q', '').strip()
  41. if search_query:
  42. queryset = queryset.filter(
  43. Q(id__icontains=search_query) |
  44. Q(user__first_name__icontains=search_query) |
  45. Q(user__last_name__icontains=search_query) |
  46. Q(status__icontains=search_query)
  47. ).distinct()
  48. return queryset
  49. def test_func(self) -> bool or None:
  50. #group_names = ('PARTNER-ADMIN')
  51. #if bool(self.request.user.groups.filter(name=group_names)) or self.request.user.is_superuser:
  52. # return True
  53. #return False
  54. return True
  55. @login_required
  56. @group_required('PARTNER-ADMIN')
  57. def change_resource_status(request):
  58. if request.method == 'POST':
  59. resource = request.POST.get('resource')
  60. new_status = request.POST.get('new_status')
  61. resource = Resource.objects.get(pk=resource)
  62. resource.status = new_status
  63. resource.save()
  64. return JsonResponse({'status': 'success'})
  65. else:
  66. return JsonResponse({'status': 'error'})
  67. class ResourceEditView(BaseView, FormView):
  68. form_class = ResourceForm
  69. template_name = "sharix_admin/resource.html"
  70. success_url = reverse_lazy("sharix_admin:resource_list")
  71. page_title = 'Изменить ресурс'
  72. page_name = 'resource_edit'
  73. # Проверяем состояит ли текущий пользователь в группе PARTNER-ADMIN
  74. def test_func(self):
  75. return "PARTNER-ADMIN" in self.user_groups
  76. def form_valid(self, form):
  77. with transaction.atomic():
  78. # Сохраняем форму, чтобы получить объект ресурса
  79. instance = form.save(commit=False)
  80. # Присваиваем полю repr идентификатор текущего пользователя
  81. instance.repr = self.request.user
  82. # Создаем новую запись в БД, чтобы иметь доступ к ID
  83. instance.save()
  84. # Создание тикета на активацию ресурса.
  85. # Создаем объект тикета и присваиваем его полю ticket_status
  86. instance.ticket_status = create_ticket_resource_activation_by_metaservice_supervisor(self.request.user, instance)
  87. # Создание тикета на утверждение прав пользователя
  88. # create_ticket_role_activation_partner_admin(self.request.user, instance)
  89. # Сохраняем новые изменения
  90. instance.save()
  91. # Создаем необходимые объекты документов по requirements указанных в созданной company
  92. # Используем bulk_create для создания всех объектов одновременно
  93. doc_codes = parse_requirements(instance.requirements)
  94. Documents.objects.bulk_create([
  95. Documents(
  96. company=instance,
  97. user=self.request.user,
  98. doc_type=doc_code
  99. ) for doc_code in doc_codes
  100. ])
  101. # Отправляем пользователю уведомление на страницу о успехе операции
  102. messages.success(
  103. self.request,
  104. 'Ваша заявка на становление партнером успешно отправлена и теперь проходит проверку!'
  105. )
  106. return super().form_valid(form) # Возвращаем успешный ответ
  107. class ResourceCreate(BaseView, FormView):
  108. form_class = ResourceForm
  109. template_name = "sharix_admin/resource.html"
  110. success_url = reverse_lazy("sharix_admin:main")
  111. page_title = 'Добавить ресурс'
  112. page_name = 'resource/add/'
  113. # Проверяем не состояит ли текущий пользователь в группе PARTNER-ADMIN
  114. # def test_func(self):
  115. # return not "PARTNER-ADMIN" in self.user_groups
  116. def form_valid(self, form):
  117. with transaction.atomic():
  118. # Сохраняем форму, чтобы получить объект компании
  119. instance = form.save(commit=False)
  120. # Присваиваем полю repr идентификатор текущего пользователя
  121. instance.repr = self.request.user
  122. # Создаем новую запись в БД, чтобы иметь доступ к ID
  123. instance.save()
  124. # Создание тикета на активацию ресурса.
  125. # Создаем объект тикета и присваиваем его полю ticket_status
  126. instance.ticket_status = create_ticket_resource_activation_by_metaservice_supervisor(self.request.user, instance)
  127. # Создание тикета на утверждение прав пользователя
  128. create_ticket_resource_activation_by_partner_admin(self.request.user, instance)
  129. # Сохраняем новые изменения
  130. instance.save()
  131. # Создаем необходимые объекты документов по requirements указанных в созданной company
  132. # Используем bulk_create для создания всех объектов одновременно
  133. doc_codes = parse_requirements(instance.requirements)
  134. Documents.objects.bulk_create([
  135. Documents(
  136. #TODO add info about company
  137. resource=instance,
  138. user=self.request.user,
  139. doc_type=doc_code
  140. ) for doc_code in doc_codes
  141. ])
  142. # Отправляем пользователю уведомление на страницу о успехе операции
  143. messages.success(
  144. self.request,
  145. 'Ваша заявка на становление партнером успешно отправлена и теперь проходит проверку!'
  146. )
  147. return super().form_valid(form) # Возвращаем успешный ответ
  148. class ResourceDetailView(BaseView, DetailView):
  149. model = Resource
  150. template_name = 'sharix_admin/resource_detail.html'
  151. context_object_name = 'resource'
  152. page_title = 'О ресурсе'
  153. page_name = 'resource_detail'
  154. def detail_view(request, primary_key):
  155. try:
  156. resource = Resource.objects.get(pk=primary_key)
  157. except Resource.DoesNotExist:
  158. raise Http404('Provider does not exist')
  159. return render(request, template_name, context={
  160. 'help_texts': ResourceHelpTexts,
  161. 'captions': ResourceVerboseNames,
  162. })
  163. def get_context_data(self, **kwargs):
  164. context = super().get_context_data(**kwargs)
  165. context['help_texts'] = ResourceHelpTexts
  166. context['captions'] = ResourceVerboseNames
  167. return context