Files
Aerbim/BaseModels/api/base_api_views.py
2023-11-16 14:38:44 +03:00

356 lines
12 KiB
Python

# coding=utf-8
from rest_framework import generics
from rest_framework.authentication import BasicAuthentication, SessionAuthentication
from rest_framework.permissions import IsAuthenticated, DjangoObjectPermissions
from rest_framework.views import APIView
from rest_framework import viewsets
from rest_framework.renderers import JSONRenderer
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
from rest_framework.schemas import SchemaGenerator
from rest_framework_swagger import renderers
from BaseModels.api.base_api_permissions import *
from datetime import datetime
from GeneralApp.temp_data_funcs import add_element_in_tmp_data_list, check_exists_element_in_tmp_data_list, add_element_list_to_tmp_data
from rest_framework.utils.serializer_helpers import ReturnList
from rest_framework.decorators import action
from rest_framework import status
from django.contrib.contenttypes.models import ContentType
from BaseModels.mailSender import techSendMail
# from BaseModels.api.api_middlewares import APILogMiddleware
class SwaggerSchemaView(APIView):
permission_classes = [AllowAny]
renderer_classes = [
renderers.OpenAPIRenderer,
renderers.SwaggerUIRenderer
]
def get(self, request):
generator = SchemaGenerator()
schema = generator.get_schema(request=request)
return Response(schema)
JSONCustomRenderer = JSONRenderer
JSONCustomRenderer.charset = 'utf-8'
class APIBasePublicClass(APIView):
# authentication_classes = (SessionAuthentication, BasicAuthentication)
permission_classes = (AllowAny,)
# renderer_classes = [JSONCustomRenderer]
pagination_class = None
# def finalize_response(self, request, response, *args, **kwargs):
#
# res = super(APIBasePublicClass, self).finalize_response(request, response, *args, **kwargs)
#
# from CompaniesApp.models import Region
# regions = Region.objects.filter().values_list(
# 'id', 'domain'
# ).order_by('id')
# res.data.update({'regions': tuple(regions)})
#
# return res
# def get(self, request, *args, **kwargs):
#
# if not 'region_id' in request.headers:
# request.headers['region_id'] = '1'
#
# return super(APIBasePublicClass, self).get(request, *args, **kwargs)
class APIListBaseClass(generics.ListAPIView):
# authentication_classes = (SessionAuthentication, BasicAuthentication, )#
permission_classes = (IsAuthenticated,)
pagination_class = None
class APIBaseClass(generics.RetrieveAPIView):
# authentication_classes = (SessionAuthentication, BasicAuthentication, )#
permission_classes = (IsAuthenticated, )
# renderer_classes = [JSONCustomRenderer]
pagination_class = None
class APIBaseSimplaClass(generics.GenericAPIView):
# authentication_classes = (SessionAuthentication, BasicAuthentication)
permission_classes = (IsAuthenticated,)
# renderer_classes = [JSONCustomRenderer]
pagination_class = None
# ----------------------------
class APIViewSet_ModelReadOnlyClass(viewsets.ReadOnlyModelViewSet):
pass
# authentication_classes = (SessionAuthentication, BasicAuthentication, )#
permission_classes = (IsAuthenticated, )
# renderer_classes = [JSONCustomRenderer]
pagination_class = None
exclude_actions_for_logging = []
create_kwargs = [
'create', 'create_short', 'create_item',
'copy_item', 'create_short', 'create_reminder'
]
exclude_actions_for_logging.extend(create_kwargs)
exclude_actions_for_logging.extend([
'update', 'partial_update', 'destroy', 'update_items', 'update_item'
])
def log_save_cur_state_obj(query_data, response=None, init=False):
if query_data.basename == 'alert' or not query_data.action in exclude_actions_for_logging:
return None
if response and response.status_code > 299:
return None
data_Dict = {}
data_target = 'log_{0}'.format(str(query_data.basename))
obj_id = None
try:
if type(query_data.request.data) == list and query_data.request.data and len(query_data.request.data) > 0 and \
'id' in query_data.request.data[0]:
objs_list_ids = [obj['id'] for obj in query_data.request.data]
elif response and response.data and type(response.data) == dict and 'id' in response.data:
objs_list_ids = [response.data['id']]
elif response and response.data and getattr(response.data.serializer, 'instance', None):
objs_list_ids = [response.data.serializer.instance.id]
elif response and response.data and 'id' in response.data and response.data['id']:
objs_list_ids = [response.data['id']]
elif query_data.request.data and 'id' in query_data.request.data:
objs_list_ids = [query_data.request.data['id']]
elif 'pk' in query_data.kwargs:
objs_list_ids = [query_data.kwargs['pk']]
elif query_data.queryset:
objs_list_ids = query_data.queryset.values_list('id')
else:
return None
# if not objs_list_ids:
#
# serializer = query_data.serializer_class()
# data = serializer(data=query_data.request.data)
#
# data_Dict = {
# 'data': data,
# 'DT': str(datetime.now()),
# 'user': str(query_data.request.user),
# 'oper_type': query_data.action,
# 'init': init
# }
#
# add_element_in_tmp_data_list('log', data_target, obj_id, data_Dict)
objs_list = query_data.queryset.filter(id__in=objs_list_ids)
cur_action = query_data.action
query_data.action = 'retrieve'
serializer = query_data.get_serializer_class()
query_data.action = cur_action
obj_data_list = serializer(objs_list, many=True)
elements_list_for_add_to_tmp_data = []
for obj_data in obj_data_list.data:
obj_id = obj_data['id']
# фиксим json-неподходящие поля
for item_data in obj_data.keys():
if type(obj_data[item_data]) not in (str, int, float, dict, list, bool):
obj_data[item_data] = str(obj_data[item_data])
# if init:
# if check_exists_element_in_tmp_data_list('log', data_target, obj_id):
# continue
data_Dict = {
'id': obj_id,
'data': obj_data,
'DT': str(datetime.now()),
'user': str(query_data.request.user),
'oper_type': query_data.action,
'init': init
}
# add_element_in_tmp_data_list('log', data_target, obj_id, data_Dict)
elements_list_for_add_to_tmp_data.append(data_Dict)
add_element_list_to_tmp_data('log', data_target, init, elements_list_for_add_to_tmp_data)
except Exception as e:
response_data = ''
if response and response.data:
response_data = str(response.data)
msg = 'log_save_cur_state_obj fail save to log w data = {0}<br>{1}<br>{2}<br>response_data={3}'.format(
str(e),
'log - ' + str(data_target) + ' - ' + str(obj_id),
str(data_Dict),
response_data
)
techSendMail(msg)
return 'OK'
class APIViewSet_ModelClass(viewsets.ModelViewSet):
# pass
# # authentication_classes = (SessionAuthentication, BasicAuthentication, )#
# permission_classes = (IsAuthenticated, )
# # renderer_classes = [JSONCustomRenderer]
# pagination_class = None
def initial(self, request, *args, **kwargs):
res = super(APIViewSet_ModelClass, self).initial(request, *args, **kwargs)
if self.basename == 'alert' or not self.action in exclude_actions_for_logging:
return res
if not self.action in create_kwargs:
log_save_cur_state_obj(self, init=True)
return res
def finalize_response(self, request, response, *args, **kwargs):
res = super(APIViewSet_ModelClass, self).finalize_response(request, response, *args, **kwargs)
if self.basename == 'alert' or not self.action in exclude_actions_for_logging:
return res
log_save_cur_state_obj(self, response=response)
return res
def create(self, request, *args, **kwargs):
obj = super(APIViewSet_ModelClass, self).create(request, *args, **kwargs)
# data_Dict = {}
# try:
# data_Dict = {
# 'data': prepare_data_for_json(vars(obj)),
# 'DT': str(datetime.now()),
# 'user': str(request.user),
# 'oper_type': 'create'
# }
#
# add_element_in_tmp_data_list('log', 'properties_log', obj.id, data_Dict)
# except Exception as e:
# msg = 'fail save to log w data = {0}<br>{1}'.format(
# 'log - properties_log - ' + str(obj.id),
# str(data_Dict)
# )
# techSendMail(msg)
return obj
def partial_update(self, request, *args, **kwargs):
if request.data:
request.data['modifiedDT'] = datetime.now()
obj = super(APIViewSet_ModelClass, self).partial_update(request, *args, **kwargs)
# data_Dict = {}
# try:
# data_Dict = {
# 'data': prepare_data_for_json(vars(obj)),
# 'DT': str(datetime.now()),
# 'user': str(request.user),
# 'oper_type': 'create'
# }
#
# add_element_in_tmp_data_list('log', 'properties_log', obj.id, data_Dict)
# except Exception as e:
# msg = 'fail save to log w data = {0}<br>{1}'.format(
# 'log - properties_log - ' + str(obj.id),
# str(data_Dict)
# )
# techSendMail(msg)
return obj
class APIViewSet_ModelClass_w_Expenses(APIViewSet_ModelClass):
@action(methods=['GET'], detail=True)
def expenses_rates(self, request, *args, **kwargs):
from ExpensesApp.api.v1.expenses_rate.expenses_rate_api_serializers import ExpensesRate_get_Serializer
model = self.serializer_class.Meta.model
try:
obj = model.objects.get(id=kwargs['pk'])
except model.DoesNotExist:
return Response({'error': u'ошибка получения expenses_rates'},
status=status.HTTP_400_BAD_REQUEST)
expenses_rates = obj.expenses_rates.all()
serializer = ExpensesRate_get_Serializer(expenses_rates, many=True)
# if serializer.data:
# return Response(serializer.data)
return Response(serializer.data)
@action(methods=['GET'], detail=True)
def expenses_data(self, request, *args, **kwargs):
from ExpensesApp.api.v1.expenses_data.expenses_data_api_serializers import ExpensesData_get_Serializer
model = self.serializer_class.Meta.model
try:
obj = model.objects.get(id=kwargs['pk'])
except model.DoesNotExist:
return Response({'error': u'ошибка получения expenses_rates'},
status=status.HTTP_400_BAD_REQUEST)
expenses_data = obj.expenses_data.all()
serializer = ExpensesData_get_Serializer(expenses_data, many=True)
# if serializer.data:
# return Response(serializer.data)
return Response(serializer.data)
class APIViewSet_BaseClass(viewsets.ViewSet):
pass
# authentication_classes = (SessionAuthentication, BasicAuthentication,) #
permission_classes = (IsAuthenticated, )
# renderer_classes = [JSONCustomRenderer]
pagination_class = None
# class APIBaseClass(generics.RetrieveAPIView):
# authentication_classes = (SessionAuthentication, BasicAuthentication, )#
# permission_classes = (IsAuthenticated,)
# # renderer_classes = [JSONCustomRenderer]
# pagination_class = None
#
#
# class APIBaseSimplaClass(APIView):
# authentication_classes = (SessionAuthentication, BasicAuthentication)
# permission_classes = (IsAuthenticated,)
# # renderer_classes = [JSONCustomRenderer]
# pagination_class = None