Scott Baker | 09cb418 | 2016-05-02 17:21:54 -0700 | [diff] [blame] | 1 | from rest_framework.decorators import api_view |
| 2 | from rest_framework.response import Response |
| 3 | from rest_framework.reverse import reverse |
| 4 | from rest_framework import serializers |
| 5 | from rest_framework import generics |
| 6 | from rest_framework.views import APIView |
| 7 | from core.models import * |
| 8 | from django.forms import widgets |
| 9 | from django.core.exceptions import PermissionDenied |
| 10 | from xos.exceptions import XOSNotFound |
| 11 | from api.xosapi_helpers import PlusModelSerializer, XOSViewSet, ReadOnlyField |
| 12 | from django.db.models import Q |
| 13 | |
Scott Baker | 09cb418 | 2016-05-02 17:21:54 -0700 | [diff] [blame] | 14 | class PortForwardingSerializer(serializers.Serializer): |
Scott Baker | 7a8ee26 | 2016-05-02 21:09:50 -0700 | [diff] [blame] | 15 | id = serializers.IntegerField(read_only=True) |
Scott Baker | 09cb418 | 2016-05-02 17:21:54 -0700 | [diff] [blame] | 16 | ip = serializers.CharField(read_only=True) |
| 17 | ports = serializers.CharField(read_only=True, source="network.ports") |
| 18 | hostname = serializers.CharField(read_only=True, source="instance.node.name") |
| 19 | |
| 20 | class Meta: |
Scott Baker | 7a8ee26 | 2016-05-02 21:09:50 -0700 | [diff] [blame] | 21 | model = Port |
Scott Baker | 09cb418 | 2016-05-02 17:21:54 -0700 | [diff] [blame] | 22 | fields = ('id', 'ip', 'ports', 'hostname') |
| 23 | |
| 24 | class PortForwardingViewSet(XOSViewSet): |
Scott Baker | e8d7247 | 2016-05-02 21:04:44 -0700 | [diff] [blame] | 25 | base_name = "portforwarding" |
Scott Baker | 09cb418 | 2016-05-02 17:21:54 -0700 | [diff] [blame] | 26 | method_name = "portforwarding" |
| 27 | method_kind = "viewset" |
| 28 | serializer_class = PortForwardingSerializer |
| 29 | |
| 30 | def get_queryset(self): |
Scott Baker | e8d7247 | 2016-05-02 21:04:44 -0700 | [diff] [blame] | 31 | queryset=Port.objects.exclude(Q(network__isnull=True) | |
| 32 | Q(instance__isnull=True) | |
| 33 | Q(instance__node__isnull=True) | |
| 34 | Q(network__ports__isnull=True) | Q(network__ports__exact='') | |
| 35 | Q(ip__isnull=True)) |
Scott Baker | 09cb418 | 2016-05-02 17:21:54 -0700 | [diff] [blame] | 36 | |
| 37 | node_name = self.request.query_params.get('node_name', None) |
| 38 | if node_name is not None: |
| 39 | queryset = queryset.filter(instance__node__name = node_name) |
| 40 | |
Scott Baker | e8d7247 | 2016-05-02 21:04:44 -0700 | [diff] [blame] | 41 | if "" in [q.ip for q in list(queryset)]: |
| 42 | # Q(ip__exact=='') does not work right, so let's filter the hard way |
| 43 | queryset = [q for q in list(queryset) if q.ip!=''] |
| 44 | queryset = [q.id for q in queryset] |
| 45 | queryset = Port.objects.filter(pk__in=queryset) |
| 46 | |
Scott Baker | 09cb418 | 2016-05-02 17:21:54 -0700 | [diff] [blame] | 47 | return queryset |
| 48 | |
| 49 | |