rest_urls.py
1 from django.db import models as model_fields 2 from django.conf import settings 3 from django.conf.urls import url, include 4 from django.contrib.auth import models as django_models 5 6 from polymorphic.models import PolymorphicModel 7 from cabot.cabotapp import models, alert 8 from rest_framework import routers, serializers, viewsets, mixins 9 import logging 10 11 logger = logging.getLogger(__name__) 12 router = routers.DefaultRouter() 13 14 15 def create_viewset(arg_model, arg_fields, arg_read_only_fields=(), readonly=False): 16 arg_read_only_fields = ('id',) + arg_read_only_fields 17 for field in arg_read_only_fields: 18 if field not in arg_fields: 19 arg_fields = arg_fields + (field,) 20 21 class Serializer(serializers.ModelSerializer): 22 class Meta: 23 model = arg_model 24 fields = arg_fields 25 read_only_fields = arg_read_only_fields 26 27 viewset_class = None 28 if readonly: 29 viewset_class = viewsets.ReadOnlyModelViewSet 30 else: 31 viewset_class = viewsets.ModelViewSet 32 33 class ViewSet(viewset_class): 34 queryset = arg_model.objects 35 serializer_class = Serializer 36 ordering = ['id'] 37 filter_fields = arg_fields 38 39 return ViewSet 40 41 check_group_mixin_fields = ( 42 'name', 43 'users_to_notify', 44 'alerts_enabled', 45 'status_checks', 46 'alerts', 47 'hackpad_id', 48 ) 49 50 router.register(r'services', create_viewset( 51 arg_model=models.Service, 52 arg_fields=check_group_mixin_fields + ( 53 'url', 54 'instances', 55 'overall_status', 56 'is_public', 57 ), 58 )) 59 60 router.register(r'instances', create_viewset( 61 arg_model=models.Instance, 62 arg_fields=check_group_mixin_fields + ( 63 'address', 64 'overall_status', 65 ), 66 )) 67 68 status_check_fields = ( 69 'name', 70 'active', 71 'importance', 72 'frequency', 73 'debounce', 74 'calculated_status', 75 ) 76 77 router.register(r'status_checks', create_viewset( 78 arg_model=models.StatusCheck, 79 arg_fields=status_check_fields, 80 readonly=True, 81 )) 82 83 router.register(r'icmp_checks', create_viewset( 84 arg_model=models.ICMPStatusCheck, 85 arg_fields=status_check_fields, 86 )) 87 88 router.register(r'graphite_checks', create_viewset( 89 arg_model=models.GraphiteStatusCheck, 90 arg_fields=status_check_fields + ( 91 'metric', 92 'check_type', 93 'value', 94 'expected_num_hosts', 95 'allowed_num_failures', 96 ), 97 )) 98 99 router.register(r'http_checks', create_viewset( 100 arg_model=models.HttpStatusCheck, 101 arg_fields=status_check_fields + ( 102 'endpoint', 103 'username', 104 'password', 105 'text_match', 106 'status_code', 107 'timeout', 108 'verify_ssl_certificate', 109 ), 110 )) 111 112 router.register(r'jenkins_checks', create_viewset( 113 arg_model=models.JenkinsStatusCheck, 114 arg_fields=status_check_fields + ( 115 'max_queued_build_time', 116 'jenkins_config', 117 ), 118 )) 119 120 # User API is off by default, could expose/allow modifying dangerous fields 121 if settings.EXPOSE_USER_API: 122 router.register(r'users', create_viewset( 123 arg_model=django_models.User, 124 arg_fields=( 125 'password', 126 'is_active', 127 'groups', 128 #'user_permissions', # Doesn't work, removing for now 129 'username', 130 'first_name', 131 'last_name', 132 'email', 133 ), 134 )) 135 136 router.register(r'user_profiles', create_viewset( 137 arg_model=models.UserProfile, 138 arg_fields=( 139 'user', 140 'fallback_alert_user', 141 ), 142 )) 143 144 145 router.register(r'shifts', create_viewset( 146 arg_model=models.Shift, 147 arg_fields=( 148 'start', 149 'end', 150 'user', 151 'uid', 152 'deleted', 153 ) 154 )) 155 156 router.register(r'alertplugins', create_viewset( 157 arg_model=alert.AlertPlugin, 158 arg_fields=( 159 'title', 160 ), 161 readonly=True 162 ))