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 %}
+
+
+
+ | Usuario |
+ Expira |
+ |
+ |
+ |
+
+
+
+
+ {% for user in object_list %}
+
+ | {{user.username}} |
+ Session expire at: {{ user.session_expire }} |
+ - |
+ Detalles |
+
+ {% endfor %}
+
+
+
+
+{% 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}}
+
+
+
+
+
+ | Num. Licencias contratadas |
+ Sistema |
+ - |
+ Estatus |
+ - |
+ - |
+ |
+
+
+
+
+ | {{object.num_licencias}} |
+ {{object.id_sistema}} |
+ - |
+ {% if object.cliente.Activo %}Activo{%else%}Inactivo{% endif %} |
+ - |
+ click me |
+ |
+
+ {% for sistema in object.id_sistema.device_set.all %}
+
+ |
+ Dispositivo: {{sistema}} |
+ |
+ - |
+ - |
+
+ {% endfor %}
+
+
+
{% 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 @@
+