resource_local.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. from dbsynce.models import Resource
  2. from webservice_running.models import ResourceLocal
  3. from django.contrib.auth.decorators import login_required
  4. from django.contrib.auth.mixins import UserPassesTestMixin
  5. from django.http import JsonResponse
  6. from django.utils.translation import gettext as _
  7. from django_tables2 import SingleTableView
  8. from django.views.generic import DetailView
  9. from django.shortcuts import render
  10. from webservice_running.tables import ResourcesLocalTable
  11. from sharix_admin.utils import group_required
  12. from datetime import datetime, timedelta
  13. from dbsynce.lib.core import parse_requirements, get_admin_url
  14. from dbsynce.models import Documents
  15. from django.contrib import messages
  16. from django.db import transaction
  17. from django.urls import reverse_lazy
  18. from django.views.generic.edit import FormView
  19. from django.views.generic.edit import CreateView
  20. from tickets.models import Ticket, TicketList
  21. from webservice_running.forms import ResourceLocalForm
  22. from sharix_admin.forms import ResourceForm
  23. from sharix_admin.utils import *
  24. from dbsynce.lib.data import *
  25. from sharix_admin.views.base import BaseView
  26. from webservice_running.views.base_local import BaseLocalView
  27. from django.db.models import Q
  28. from django import forms
  29. from django.shortcuts import redirect
  30. from dbsynce.docs.database.resource import Resource as ResourceHelpTexts
  31. from dbsynce.docs.verbose_names.resource import Resource as ResourceVerboseNames
  32. from webservice_running.docs.database.local import Local as HelpTextsLocal
  33. from webservice_running.docs.verbose_names.local import Local as VerboseNameLocal
  34. #def _get_form(request, formcls, prefix):
  35. def _get_form(request, formcls):
  36. data = request.POST
  37. #data = request.POST if prefix in request.POST else None
  38. return formcls(data)
  39. #return formcls(data, prefix=prefix)
  40. class ResourcesLocalListView(BaseView, UserPassesTestMixin, SingleTableView):
  41. table_class = ResourcesLocalTable
  42. queryset = ResourceLocal.objects.all()
  43. template_name = 'webservice_running/local/resource_local_list.html'
  44. page_title = 'Локальные данные ресурсов'
  45. page_name = 'resources'
  46. def get_context_data(self, **kwargs):
  47. context = super().get_context_data(**kwargs)
  48. context.update({
  49. 'title': self.page_title,
  50. 'object_list': context['object_list'],
  51. })
  52. return context
  53. def get_queryset(self):
  54. queryset = super().get_queryset()
  55. search_query = self.request.GET.get('q', '').strip()
  56. if search_query:
  57. queryset = queryset.filter(
  58. Q(id__icontains=search_query) |
  59. Q(user__first_name__icontains=search_query) |
  60. Q(user__last_name__icontains=search_query) |
  61. Q(status__icontains=search_query)
  62. ).distinct()
  63. return queryset
  64. def test_func(self) -> bool or None:
  65. #group_names = ('PARTNER-ADMIN')
  66. #if bool(self.request.user.groups.filter(name=group_names)) or self.request.user.is_superuser:
  67. # return True
  68. #return False
  69. return True
  70. @login_required
  71. @group_required('PARTNER-ADMIN')
  72. def change_resource_status(request):
  73. if request.method == 'POST':
  74. resource = request.POST.get('resource')
  75. new_status = request.POST.get('new_status')
  76. resource = Resource.objects.get(pk=resource)
  77. resource.status = new_status
  78. resource.save()
  79. return JsonResponse({'status': 'success'})
  80. else:
  81. return JsonResponse({'status': 'error'})
  82. class ResourceLocalEditView(BaseLocalView, FormView):
  83. resource_form = ResourceLocalForm
  84. resource_local_form = ResourceLocalForm
  85. template_name = "webservice_running/local/resource_local.html"
  86. success_url = reverse_lazy("webservice_running:resource_local_list")
  87. page_title = 'Изменить ресурс c локальными данными'
  88. page_name = 'resource_local_edit'
  89. # Проверяем состояит ли текущий пользователь в группе PARTNER-ADMIN
  90. def test_func(self):
  91. return "PARTNER-ADMIN" in self.user_groups
  92. def form_valid(self, form):
  93. with transaction.atomic():
  94. # Сохраняем форму, чтобы получить объект ресурса
  95. instance = form.save(commit=False)
  96. # Присваиваем полю repr идентификатор текущего пользователя
  97. instance.repr = self.request.user
  98. # Создаем новую запись в БД, чтобы иметь доступ к ID
  99. instance.save()
  100. # Создание тикета на активацию ресурса.
  101. # Создаем объект тикета и присваиваем его полю ticket_status
  102. instance.ticket_status = create_ticket_resource_activation_by_metaservice_supervisor(self.request.user, instance)
  103. # Создание тикета на утверждение прав пользователя
  104. # create_ticket_role_activation_partner_admin(self.request.user, instance)
  105. # Сохраняем новые изменения
  106. instance.save()
  107. # Создаем необходимые объекты документов по requirements указанных в созданной company
  108. # Используем bulk_create для создания всех объектов одновременно
  109. doc_codes = parse_requirements(instance.requirements)
  110. Documents.objects.bulk_create([
  111. Documents(
  112. company=instance,
  113. user=self.request.user,
  114. doc_type=doc_code
  115. ) for doc_code in doc_codes
  116. ])
  117. # Отправляем пользователю уведомление на страницу о успехе операции
  118. messages.success(
  119. self.request,
  120. 'Ваша заявка на становление партнером успешно отправлена и теперь проходит проверку!'
  121. )
  122. #return super().form_valid(form) # Возвращаем успешный ответ
  123. return super().form_valid(resource_form, resource_local_form) # Возвращаем успешный ответ
  124. class ResourceLocalCreate(BaseLocalView):
  125. resource_form = ResourceForm
  126. resource_local_form = ResourceLocalForm
  127. template_name = "webservice_running/local/resource_local.html"
  128. success_url = reverse_lazy("webservice_running:main_local")
  129. page_title = 'Добавить ресурс с локальными данными'
  130. page_name = 'resource_local/add/'
  131. def get(self, request, *args, **kwargs):
  132. context = self.get_context_data(**kwargs)
  133. context.update({'form_base': ResourceForm(prefix='form_base'), 'form_local': ResourceLocalForm(prefix='form_local')})
  134. return render(
  135. request,
  136. self.template_name,
  137. context,
  138. )
  139. #return self.render_to_response(context)
  140. def post(self, request, *args, **kwargs):
  141. form_base = _get_form(request, ResourceForm)
  142. form_local = _get_form(request, ResourceLocalForm)
  143. #if form_base.is_valid() and form_local.is_valid():
  144. #if form_local.is_valid():
  145. if form_local.is_valid() and form_base.is_valid():
  146. instance=form_base.save(commit=False)
  147. instance.user = self.request.user
  148. instance.save()
  149. instance.ticket_status = create_ticket_resource_activation_by_metaservice_supervisor(self.request.user, instance)
  150. create_ticket_resource_activation_by_partner_admin(self.request.user, instance)
  151. instance.save()
  152. doc_codes = parse_requirements(instance.requirements)
  153. Documents.objects.bulk_create([
  154. Documents(
  155. # #TODO add info about company
  156. resource=instance,
  157. user=self.request.user,
  158. doc_type=doc_code
  159. ) for doc_code in doc_codes
  160. ])
  161. messages.success(
  162. self.request,
  163. 'Ваша заявка на добавление ресурса успешно отправлена и теперь проходит проверку!'
  164. )
  165. instance_local=form_local.save(commit=False)
  166. instance_local.resource=instance
  167. form_local.save()
  168. return redirect(self.success_url)
  169. else:
  170. messages.error(
  171. self.request,
  172. 'Ошибка добавления, попробуйте снова!'
  173. )
  174. context = self.get_context_data(**kwargs)
  175. context.update({'form_base': form_base, 'form_local': form_local})
  176. return render(
  177. request,
  178. self.template_name,
  179. context,
  180. )
  181. class ResourceLocalDetailView(BaseView, DetailView):
  182. model = ResourceLocal
  183. template_name = 'webservice_running/local/resource_local_detail.html'
  184. context_object_name = 'resource_local'
  185. page_title = 'Локальная информация о ресурсе'
  186. page_name = 'resource_local_detail'
  187. def detail_view(self, request, primary_key):
  188. try:
  189. resource_local = ResourceLocal.objects.get(pk=primary_key)
  190. #docs = Documents.objects.filter(resource=self.object.resource)
  191. #context['docs'] = self.docs
  192. except ResourceLocal.DoesNotExist:
  193. #docs=[]
  194. raise Http404('Something does not exist')
  195. return render(request, self.template_name, context={
  196. })
  197. def get_context_data(self, **kwargs):
  198. try:
  199. docs = Documents.objects.filter(resource=self.object.resource)
  200. except Documents.DoesNotExist:
  201. docs=[]
  202. context = super().get_context_data(**kwargs)
  203. context['help_texts'] = ResourceHelpTexts
  204. context['captions'] = ResourceVerboseNames
  205. context['help_texts_local'] = HelpTextsLocal
  206. context['captions_local'] = VerboseNameLocal
  207. context['docs'] = docs
  208. return context