8
0
Fork 0
mirror of https://gitlab2.federez.net/re2o/re2o synced 2024-11-26 22:52:26 +00:00

Allow update and quick check of need_regen info

This commit is contained in:
Maël Kervella 2018-05-26 21:08:03 +00:00
parent ed1284c06d
commit 4fe1be5d31
6 changed files with 60 additions and 10 deletions

View file

@ -1,4 +1,4 @@
from rest_framework import permissions from rest_framework import permissions, exceptions
from re2o.acl import can_create, can_edit, can_delete, can_view_all from re2o.acl import can_create, can_edit, can_delete, can_view_all
from . import acl from . import acl
@ -17,17 +17,17 @@ class DefaultACLPermission(permissions.BasePermission):
'OPTIONS': [can_see_api, lambda model: model.can_view_all], 'OPTIONS': [can_see_api, lambda model: model.can_view_all],
'HEAD': [can_see_api, lambda model: model.can_view_all], 'HEAD': [can_see_api, lambda model: model.can_view_all],
'POST': [can_see_api, lambda model: model.can_create], 'POST': [can_see_api, lambda model: model.can_create],
#'PUT': [], 'PUT': [], # No restrictions, apply to objects
#'PATCH': [], 'PATCH': [], # No restrictions, apply to objects
#'DELETE': [], 'DELETE': [], # No restrictions, apply to objects
} }
perms_obj_map = { perms_obj_map = {
'GET': [can_see_api, lambda obj: obj.can_view], 'GET': [can_see_api, lambda obj: obj.can_view],
'OPTIONS': [can_see_api, lambda obj: obj.can_view], 'OPTIONS': [can_see_api, lambda obj: obj.can_view],
'HEAD': [can_see_api, lambda obj: obj.can_view], 'HEAD': [can_see_api, lambda obj: obj.can_view],
#'POST': [], 'POST': [], # No restrictions, apply to models
'PUT': [can_see_api, lambda obj: obj.can_edit], 'PUT': [can_see_api, lambda obj: obj.can_edit],
#'PATCH': [], 'PATCH': [can_see_api, lambda obj: obj.can_edit],
'DELETE': [can_see_api, lambda obj: obj.can_delete], 'DELETE': [can_see_api, lambda obj: obj.can_delete],
} }

View file

@ -215,6 +215,8 @@ class ServiceSerializer(NamespacedHMSerializer):
class ServiceLinkSerializer(NamespacedHMSerializer): class ServiceLinkSerializer(NamespacedHMSerializer):
need_regen = serializers.BooleanField()
class Meta: class Meta:
model = machines.Service_link model = machines.Service_link
fields = ('service', 'server', 'last_regen', 'asked_regen', fields = ('service', 'server', 'last_regen', 'asked_regen',
@ -459,6 +461,21 @@ class WhitelistSerializer(NamespacedHMSerializer):
fields = ('user', 'raison', 'date_start', 'date_end', 'active', 'api_url') fields = ('user', 'raison', 'date_start', 'date_end', 'active', 'api_url')
# Services
class ServiceRegenSerializer(NamespacedHMSerializer):
hostname = serializers.CharField(source='server.domain.name', read_only=True)
service_name = serializers.CharField(source='service.service_type', read_only=True)
class Meta:
model = machines.Service_link
fields = ('hostname', 'service_name', 'need_regen', 'api_url')
extra_kwargs = {
'api_url': {'view_name': 'servicelink-detail'}
}
# DHCP # DHCP

View file

@ -90,5 +90,6 @@ router.register(r'users/whitelists', views.WhitelistViewSet)
urlpatterns = [ urlpatterns = [
url(r'^', include(router.urls)), url(r'^', include(router.urls)),
url(r'^dhcp/hostmacip', views.HostMacIpView.as_view()), url(r'^dhcp/hostmacip', views.HostMacIpView.as_view()),
url(r'^token-auth/', views.ObtainExpiringAuthToken.as_view()) url(r'^services/regen', views.ServiceRegenView.as_view()),
url(r'^token-auth', views.ObtainExpiringAuthToken.as_view())
] ]

View file

@ -31,7 +31,7 @@ from django.conf import settings
from rest_framework.authtoken.views import ObtainAuthToken from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.authtoken.models import Token from rest_framework.authtoken.models import Token
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework import viewsets, status, generics from rest_framework import viewsets, generics
import cotisations.models as cotisations import cotisations.models as cotisations
import machines.models as machines import machines.models as machines
@ -160,7 +160,7 @@ class ServiceViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = serializers.ServiceSerializer serializer_class = serializers.ServiceSerializer
class ServiceLinkViewSet(viewsets.ReadOnlyModelViewSet): class ServiceLinkViewSet(viewsets.ModelViewSet):
queryset = machines.Service_link.objects.all() queryset = machines.Service_link.objects.all()
serializer_class = serializers.ServiceLinkSerializer serializer_class = serializers.ServiceLinkSerializer
@ -313,6 +313,24 @@ class WhitelistViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = serializers.WhitelistSerializer serializer_class = serializers.WhitelistSerializer
# Services views
class ServiceRegenView(generics.ListAPIView):
serializer_class = serializers.ServiceRegenSerializer
def get_queryset(self):
queryset = machines.Service_link.objects.select_related(
'server__domain'
).select_related(
'service'
)
if 'hostname' in self.request.GET:
hostname = self.request.GET['hostname']
queryset = queryset.filter(server__domain__name__iexact=hostname)
return queryset
# DHCP views # DHCP views
class HostMacIpView(generics.ListAPIView): class HostMacIpView(generics.ListAPIView):

View file

@ -1399,6 +1399,7 @@ class Service_link(RevMixin, AclMixin, models.Model):
self.asked_regen = False self.asked_regen = False
self.save() self.save()
@property
def need_regen(self): def need_regen(self):
""" Décide si le temps minimal écoulé est suffisant pour provoquer une """ Décide si le temps minimal écoulé est suffisant pour provoquer une
régénération de service""" régénération de service"""
@ -1411,6 +1412,19 @@ class Service_link(RevMixin, AclMixin, models.Model):
) < timezone.now() ) < timezone.now()
) )
@need_regen.setter
def need_regen(self, value):
"""
Force to set the need_regen value. True means a regen is asked and False
means a regen has been done.
:param value: (bool) The value to set to
"""
if not value:
self.last_regen = timezone.now()
self.asked_regen = value
self.save()
def __str__(self): def __str__(self):
return str(self.server) + " " + str(self.service) return str(self.server) + " " + str(self.service)

View file

@ -376,7 +376,7 @@ class ServiceServersSerializer(serializers.ModelSerializer):
@staticmethod @staticmethod
def get_regen_status(obj): def get_regen_status(obj):
""" The string representation of the regen status """ """ The string representation of the regen status """
return obj.need_regen() return obj.need_regen
class OuverturePortsSerializer(serializers.Serializer): class OuverturePortsSerializer(serializers.Serializer):