diff --git a/Sistemas/models.py b/Sistemas/models.py index a22b824..aeba84d 100644 --- a/Sistemas/models.py +++ b/Sistemas/models.py @@ -71,9 +71,9 @@ class Device(models.Model): username=username_ ) return obj + def save(self, *args, **kwargs): if not self.pk: - print(self.client,self.device_name, self.ip_address, self.macAddress) obj = self.generate_unique_username(self.client,self.device_name, self.ip_address, self.macAddress) self.username= obj token= Token.objects.create(user=obj) diff --git a/Sistemas/urls.py b/Sistemas/urls.py index 9c35cc1..5bb14d5 100644 --- a/Sistemas/urls.py +++ b/Sistemas/urls.py @@ -5,6 +5,7 @@ from .views import ( #CVB SistemasXCliente_ListView, SistemasXCliente_DetailView, + UsersConnectedList, #DRF APIViews RegisterDeviceView, @@ -17,4 +18,5 @@ urlpatterns = [ path('registerPC/',RegisterDeviceView.as_view(),name='register_PC'), path('authenticatePC/',AuthenticateDeviceView.as_view(), name="authenticateDevice"), path('logout/', LogoutView.as_view(), name='logout_sistemas'), + path('usuariosConectados/', UsersConnectedList.as_view(), name='lista_usuarios'), ] \ No newline at end of file diff --git a/Sistemas/views.py b/Sistemas/views.py index 7878293..ee7b2a6 100644 --- a/Sistemas/views.py +++ b/Sistemas/views.py @@ -8,22 +8,76 @@ from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated from rest_framework import status, permissions from django.contrib.auth.models import User +from django.contrib import messages +from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from .models import sistemas_por_cliente, DeviceHistory,Device from .serializers import DeviceSerializer from .permissions import HasAuthorizationHeader from django.utils import timezone import re -class SistemasXCliente_ListView(ListView): +from rest_framework.authtoken.models import Token +from django.utils import timezone +from datetime import timedelta + +from django.contrib.sessions.models import Session + +def get_logged_in_users(): + sessions = Session.objects.filter(expire_date__gte=timezone.now()) + + # Get all non-expired tokens + #tokens = Token.objects.filter(created__gte=timezone.now() - timedelta(hours=1)) + tokens = Token.objects.all() + + # Get a list of logged-in user ids + uid_list = [token.user_id for token in tokens] + + # Get the logged-in users + users = User.objects.filter(id__in=uid_list) + for user,session in zip(users,sessions): + user.session_data = session.get_decoded() + user.session_expire = session.expire_date + return users + +class UsersConnectedList(UserPassesTestMixin,LoginRequiredMixin,ListView): + model = User + template_name= 'Sistemas/Usuarios/lista.html' + + def get_queryset(self): + return get_logged_in_users() + + def test_func(self): + res = self.request.user.groups.filter(name= 'admin_soft') + if not res: + messages.error(self.request, f'Lo sentimos. La página que buscas no está disponible, no cuentas con los permisos.') + return res + +class SistemasXCliente_ListView(UserPassesTestMixin,LoginRequiredMixin, ListView): model = sistemas_por_cliente paginate_by = 5 template_name = 'Sistemas/Xclientes/lista.html' + def test_func(self): + res = self.request.user.groups.filter(name= 'admin_soft') + if not res: + messages.error(self.request, f'Lo sentimos. La página que buscas no está disponible, no cuentas con los permisos.') + return res -class SistemasXCliente_DetailView(DetailView): +class SistemasXCliente_DetailView(UserPassesTestMixin,LoginRequiredMixin, DetailView): model = sistemas_por_cliente template_name= 'Sistemas/Xclientes/detail.html' + def test_func(self): + res = self.request.user.groups.filter(name= 'admin_soft') + if not res: + messages.error(self.request, f'Lo sentimos. La página que buscas no está disponible, no cuentas con los permisos.') + return res + + +''' +========================= API Views +''' + class RegisterDeviceView(APIView): permissions_classes = (permissions.AllowAny,) @@ -44,7 +98,7 @@ class RegisterDeviceView(APIView): class AuthenticateDeviceView(APIView): authentication_classes= [TokenAuthentication] - permissions_classes=[IsAuthenticated] + permissions_classes=[IsAuthenticated, HasAuthorizationHeader] def get(self, request): try: @@ -66,6 +120,7 @@ class AuthenticateDeviceView(APIView): {'Error':f'{e}','isError':True} , status=status.HTTP_200_OK) + class LogoutView(APIView): authentication_classes = (TokenAuthentication,) permission_classes = (IsAuthenticated,HasAuthorizationHeader,) diff --git a/Templates/Sistemas/Usuarios/lista.html b/Templates/Sistemas/Usuarios/lista.html new file mode 100644 index 0000000..fba628d --- /dev/null +++ b/Templates/Sistemas/Usuarios/lista.html @@ -0,0 +1,33 @@ +{% extends 'base.html' %} + +{% block title %} +| Sistemas +{% endblock title %} + + +{% block content %} + + + + + + + + + + + + + {% for user in object_list %} + + + + + + + {% endfor %} + +
UsuarioExpira
{{user.username}}Session expire at: {{ user.session_expire }}-Detalles
+ + +{% endblock content %} \ No newline at end of file diff --git a/Templates/Sistemas/Xclientes/detail.html b/Templates/Sistemas/Xclientes/detail.html index 3517dae..a56c927 100644 --- a/Templates/Sistemas/Xclientes/detail.html +++ b/Templates/Sistemas/Xclientes/detail.html @@ -6,8 +6,84 @@ {% block content %} -

{{object.cliente}}

- {{object.id_sistema}}
- {{object.num_licencias}} + + + + +

{{object.cliente}}

+ +
+ + + + + + + + + + + + + + + + + + + + + + + {% for sistema in object.id_sistema.device_set.all %} + + + + + + + + {% endfor %} + +
Num. Licencias contratadasSistema-Estatus--
{{object.num_licencias}}{{object.id_sistema}}-{% if object.cliente.Activo %}Activo{%else%}Inactivo{% endif %}-click me
Dispositivo: {{sistema}} --
+
{% endblock content %} diff --git a/Templates/base.html b/Templates/base.html index 0f2eac8..048ea0b 100644 --- a/Templates/base.html +++ b/Templates/base.html @@ -40,6 +40,7 @@ +