serializers.py 24.1 KB
Newer Older
Gabriel Detraz's avatar
Gabriel Detraz committed
1
# -*- mode: python; coding: utf-8 -*-
Maël Kervella's avatar
Maël Kervella committed
2 3 4 5
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il
# se veut agnostique au réseau considéré, de manière à être installable en
# quelques clics.
#
6
# Copyright © 2018 Maël Kervella
Maël Kervella's avatar
Maël Kervella committed
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

22
"""Defines the serializers of the API
Maël Kervella's avatar
Maël Kervella committed
23
"""
Maël Kervella's avatar
Maël Kervella committed
24 25

from rest_framework import serializers
26

Maël Kervella's avatar
Maël Kervella committed
27 28 29 30 31 32 33
import cotisations.models as cotisations
import machines.models as machines
import preferences.models as preferences
import topologie.models as topologie
import users.models as users


34 35
# The namespace used for the API. It must match the namespace used in the
# urlpatterns to include the API URLs.
Maël Kervella's avatar
Maël Kervella committed
36 37 38 39
API_NAMESPACE = 'api'


class NamespacedHRField(serializers.HyperlinkedRelatedField):
40 41 42
    """A `rest_framework.serializers.HyperlinkedRelatedField` subclass to
    automatically prefix view names with the API namespace.
    """
Maël Kervella's avatar
Maël Kervella committed
43 44 45 46 47 48 49
    def __init__(self, view_name=None, **kwargs):
        if view_name is not None:
            view_name = '%s:%s' % (API_NAMESPACE, view_name)
        super(NamespacedHRField, self).__init__(view_name=view_name, **kwargs)


class NamespacedHIField(serializers.HyperlinkedIdentityField):
50 51 52
    """A `rest_framework.serializers.HyperlinkedIdentityField` subclass to
    automatically prefix view names with teh API namespace.
    """
Maël Kervella's avatar
Maël Kervella committed
53 54 55 56 57 58 59
    def __init__(self, view_name=None, **kwargs):
        if view_name is not None:
            view_name = '%s:%s' % (API_NAMESPACE, view_name)
        super(NamespacedHIField, self).__init__(view_name=view_name, **kwargs)


class NamespacedHMSerializer(serializers.HyperlinkedModelSerializer):
60 61 62
    """A `rest_framework.serializers.HyperlinkedModelSerializer` subclass to
    automatically prefix view names with the API namespace.
    """
Maël Kervella's avatar
Maël Kervella committed
63 64
    serializer_related_field = NamespacedHRField
    serializer_url_field = NamespacedHIField
Maël Kervella's avatar
Maël Kervella committed
65

Maël Kervella's avatar
Maël Kervella committed
66

67
# COTISATIONS
68

Maël Kervella's avatar
Maël Kervella committed
69 70

class FactureSerializer(NamespacedHMSerializer):
71 72
    """Serialize `cotisations.models.Facture` objects.
    """
73
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
74
        model = cotisations.Facture
75 76 77 78
        fields = ('user', 'paiement', 'banque', 'cheque', 'date', 'valid',
                  'control', 'prix_total', 'name', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
79
class VenteSerializer(NamespacedHMSerializer):
80 81
    """Serialize `cotisations.models.Vente` objects.
    """
82
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
83
        model = cotisations.Vente
84 85 86 87
        fields = ('facture', 'number', 'name', 'prix', 'duration',
                  'type_cotisation', 'prix_total', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
88
class ArticleSerializer(NamespacedHMSerializer):
89 90
    """Serialize `cotisations.models.Article` objects.
    """
91
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
92
        model = cotisations.Article
93 94 95 96
        fields = ('name', 'prix', 'duration', 'type_user',
                  'type_cotisation', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
97
class BanqueSerializer(NamespacedHMSerializer):
98 99
    """Serialize `cotisations.models.Banque` objects.
    """
100
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
101
        model = cotisations.Banque
102 103 104
        fields = ('name', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
105
class PaiementSerializer(NamespacedHMSerializer):
106 107
    """Serialize `cotisations.models.Paiement` objects.
    """
108
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
109
        model = cotisations.Paiement
110 111 112
        fields = ('moyen', 'type_paiement', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
113
class CotisationSerializer(NamespacedHMSerializer):
114 115
    """Serialize `cotisations.models.Cotisation` objects.
    """
116
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
117
        model = cotisations.Cotisation
118 119 120 121
        fields = ('vente', 'type_cotisation', 'date_start', 'date_end',
                  'api_url')


122
# MACHINES
Maël Kervella's avatar
Maël Kervella committed
123 124


Maël Kervella's avatar
Maël Kervella committed
125
class MachineSerializer(NamespacedHMSerializer):
126 127
    """Serialize `machines.models.Machine` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
128
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
129
        model = machines.Machine
Maël Kervella's avatar
Maël Kervella committed
130 131 132
        fields = ('user', 'name', 'active', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
133
class MachineTypeSerializer(NamespacedHMSerializer):
134 135
    """Serialize `machines.models.MachineType` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
136
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
137
        model = machines.MachineType
Maël Kervella's avatar
Maël Kervella committed
138 139 140
        fields = ('type', 'ip_type', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
141
class IpTypeSerializer(NamespacedHMSerializer):
142 143
    """Serialize `machines.models.IpType` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
144
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
145
        model = machines.IpType
Maël Kervella's avatar
Maël Kervella committed
146 147 148 149 150
        fields = ('type', 'extension', 'need_infra', 'domaine_ip_start',
                  'domaine_ip_stop', 'prefix_v6', 'vlan', 'ouverture_ports',
                  'api_url')


Maël Kervella's avatar
Maël Kervella committed
151
class VlanSerializer(NamespacedHMSerializer):
152 153
    """Serialize `machines.models.Vlan` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
154
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
155
        model = machines.Vlan
Maël Kervella's avatar
Maël Kervella committed
156 157 158
        fields = ('vlan_id', 'name', 'comment', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
159
class NasSerializer(NamespacedHMSerializer):
160 161
    """Serialize `machines.models.Nas` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
162
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
163
        model = machines.Nas
Maël Kervella's avatar
Maël Kervella committed
164 165 166 167
        fields = ('name', 'nas_type', 'machine_type', 'port_access_mode',
                  'autocapture_mac', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
168
class SOASerializer(NamespacedHMSerializer):
169 170
    """Serialize `machines.models.SOA` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
171
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
172
        model = machines.SOA
Maël Kervella's avatar
Maël Kervella committed
173 174 175 176
        fields = ('name', 'mail', 'refresh', 'retry', 'expire', 'ttl',
                  'api_url')


Maël Kervella's avatar
Maël Kervella committed
177
class ExtensionSerializer(NamespacedHMSerializer):
178 179
    """Serialize `machines.models.Extension` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
180
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
181
        model = machines.Extension
Maël Kervella's avatar
Maël Kervella committed
182 183 184 185
        fields = ('name', 'need_infra', 'origin', 'origin_v6', 'soa',
                  'api_url')


Maël Kervella's avatar
Maël Kervella committed
186
class MxSerializer(NamespacedHMSerializer):
187 188
    """Serialize `machines.models.Mx` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
189
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
190
        model = machines.Mx
Maël Kervella's avatar
Maël Kervella committed
191 192 193
        fields = ('zone', 'priority', 'name', 'api_url')


Charlie Jacomme's avatar
Charlie Jacomme committed
194 195 196 197 198 199 200
class DNameSerializer(NamespacedHMSerializer):
    """Serialize `machines.models.DName` objects.
    """
    class Meta:
        model = machines.DName
        fields = ('zone', 'alias', 'api_url')

Maël Kervella's avatar
Maël Kervella committed
201
class NsSerializer(NamespacedHMSerializer):
202 203
    """Serialize `machines.models.Ns` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
204
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
205
        model = machines.Ns
Maël Kervella's avatar
Maël Kervella committed
206 207 208
        fields = ('zone', 'ns', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
209
class TxtSerializer(NamespacedHMSerializer):
210 211
    """Serialize `machines.models.Txt` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
212
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
213
        model = machines.Txt
Maël Kervella's avatar
Maël Kervella committed
214 215 216
        fields = ('zone', 'field1', 'field2', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
217
class SrvSerializer(NamespacedHMSerializer):
218 219
    """Serialize `machines.models.Srv` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
220
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
221
        model = machines.Srv
Maël Kervella's avatar
Maël Kervella committed
222 223 224 225
        fields = ('service', 'protocole', 'extension', 'ttl', 'priority',
                  'weight', 'port', 'target', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
226
class InterfaceSerializer(NamespacedHMSerializer):
227 228
    """Serialize `machines.models.Interface` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
229
    mac_address = serializers.CharField()
Maël Kervella's avatar
Maël Kervella committed
230 231 232
    active = serializers.BooleanField(source='is_active')

    class Meta:
Maël Kervella's avatar
Maël Kervella committed
233
        model = machines.Interface
Maël Kervella's avatar
Maël Kervella committed
234 235 236 237
        fields = ('ipv4', 'mac_address', 'machine', 'type', 'details',
                  'port_lists', 'active', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
238
class Ipv6ListSerializer(NamespacedHMSerializer):
239 240
    """Serialize `machines.models.Ipv6List` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
241
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
242
        model = machines.Ipv6List
243
        fields = ('ipv6', 'interface', 'slaac_ip', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
244 245


Maël Kervella's avatar
Maël Kervella committed
246
class DomainSerializer(NamespacedHMSerializer):
247 248
    """Serialize `machines.models.Domain` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
249
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
250
        model = machines.Domain
Maël Kervella's avatar
Maël Kervella committed
251 252 253 254
        fields = ('interface_parent', 'name', 'extension', 'cname',
                  'api_url')


Maël Kervella's avatar
Maël Kervella committed
255
class IpListSerializer(NamespacedHMSerializer):
256 257
    """Serialize `machines.models.IpList` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
258
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
259
        model = machines.IpList
Maël Kervella's avatar
Maël Kervella committed
260 261 262
        fields = ('ipv4', 'ip_type', 'need_infra', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
263
class ServiceSerializer(NamespacedHMSerializer):
264 265
    """Serialize `machines.models.Service` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
266
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
267
        model = machines.Service
Maël Kervella's avatar
Maël Kervella committed
268 269 270 271
        fields = ('service_type', 'min_time_regen', 'regular_time_regen',
                  'servers', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
272
class ServiceLinkSerializer(NamespacedHMSerializer):
273 274
    """Serialize `machines.models.Service_link` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
275
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
276
        model = machines.Service_link
Maël Kervella's avatar
Maël Kervella committed
277 278
        fields = ('service', 'server', 'last_regen', 'asked_regen',
                  'need_regen', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
279 280 281
        extra_kwargs = {
            'api_url': {'view_name': 'servicelink-detail'}
        }
Maël Kervella's avatar
Maël Kervella committed
282 283


Maël Kervella's avatar
Maël Kervella committed
284
class OuverturePortListSerializer(NamespacedHMSerializer):
285 286
    """Serialize `machines.models.OuverturePortList` objects.
    """
287 288 289 290 291
    tcp_ports_in = NamespacedHRField(view_name='ouvertureport-detail', many=True, read_only=True)
    udp_ports_in = NamespacedHRField(view_name='ouvertureport-detail', many=True, read_only=True)
    tcp_ports_out = NamespacedHRField(view_name='ouvertureport-detail', many=True, read_only=True)
    udp_ports_out = NamespacedHRField(view_name='ouvertureport-detail', many=True, read_only=True)

Maël Kervella's avatar
Maël Kervella committed
292
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
293
        model = machines.OuverturePortList
Maël Kervella's avatar
Maël Kervella committed
294 295 296 297
        fields = ('name', 'tcp_ports_in', 'udp_ports_in', 'tcp_ports_out',
                  'udp_ports_out', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
298
class OuverturePortSerializer(NamespacedHMSerializer):
299 300
    """Serialize `machines.models.OuverturePort` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
301
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
302
        model = machines.OuverturePort
Maël Kervella's avatar
Maël Kervella committed
303 304 305
        fields = ('begin', 'end', 'port_list', 'protocole', 'io', 'api_url')


306
# PREFERENCES
307 308


Maël Kervella's avatar
Maël Kervella committed
309
class OptionalUserSerializer(NamespacedHMSerializer):
310 311
    """Serialize `preferences.models.OptionalUser` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
312 313 314 315 316 317 318 319 320 321
    tel_mandatory = serializers.BooleanField(source='is_tel_mandatory')

    class Meta:
        model = preferences.OptionalUser
        fields = ('tel_mandatory', 'user_solde', 'solde_negatif', 'max_solde',
                  'min_online_payment', 'gpg_fingerprint',
                  'all_can_create_club', 'self_adhesion', 'shell_default')


class OptionalMachineSerializer(NamespacedHMSerializer):
322 323
    """Serialize `preferences.models.OptionalMachine` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
324 325 326 327 328 329 330 331
    class Meta:
        model = preferences.OptionalMachine
        fields = ('password_machine', 'max_lambdauser_interfaces',
                  'max_lambdauser_aliases', 'ipv6_mode', 'create_machine',
                  'ipv6')


class OptionalTopologieSerializer(NamespacedHMSerializer):
332 333
    """Serialize `preferences.models.OptionalTopologie` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
334 335 336 337 338 339 340
    class Meta:
        model = preferences.OptionalTopologie
        fields = ('radius_general_policy', 'vlan_decision_ok',
                  'vlan_decision_nok')


class GeneralOptionSerializer(NamespacedHMSerializer):
341 342
    """Serialize `preferences.models.GeneralOption` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
343 344 345 346 347 348 349 350
    class Meta:
        model = preferences.GeneralOption
        fields = ('general_message', 'search_display_page',
                  'pagination_number', 'pagination_large_number',
                  'req_expire_hrs', 'site_name', 'email_from', 'GTU_sum_up',
                  'GTU')


351
class HomeServiceSerializer(NamespacedHMSerializer):
352 353
    """Serialize `preferences.models.Service` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
354 355 356
    class Meta:
        model = preferences.Service
        fields = ('name', 'url', 'description', 'image', 'api_url')
357 358 359
        extra_kwargs = {
            'api_url': {'view_name': 'homeservice-detail'}
        }
Maël Kervella's avatar
Maël Kervella committed
360 361 362


class AssoOptionSerializer(NamespacedHMSerializer):
363 364
    """Serialize `preferences.models.AssoOption` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
365 366 367 368 369 370 371 372
    class Meta:
        model = preferences.AssoOption
        fields = ('name', 'siret', 'adresse1', 'adresse2', 'contact',
                  'telephone', 'pseudo', 'utilisateur_asso', 'payment',
                  'payment_id', 'payment_pass', 'description')


class HomeOptionSerializer(NamespacedHMSerializer):
373 374
    """Serialize `preferences.models.HomeOption` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
375 376 377 378 379 380
    class Meta:
        model = preferences.HomeOption
        fields = ('facebook_url', 'twitter_url', 'twitter_account_name')


class MailMessageOptionSerializer(NamespacedHMSerializer):
381 382
    """Serialize `preferences.models.MailMessageOption` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
383 384 385
    class Meta:
        model = preferences.MailMessageOption
        fields = ('welcome_mail_fr', 'welcome_mail_en')
386 387


Maël Kervella's avatar
Maël Kervella committed
388

389
# TOPOLOGIE
Maël Kervella's avatar
Maël Kervella committed
390 391


Maël Kervella's avatar
Maël Kervella committed
392
class StackSerializer(NamespacedHMSerializer):
393 394
    """Serialize `topologie.models.Stack` objects
    """
Maël Kervella's avatar
Maël Kervella committed
395
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
396
        model = topologie.Stack
Maël Kervella's avatar
Maël Kervella committed
397 398 399 400
        fields = ('name', 'stack_id', 'details', 'member_id_min',
                  'member_id_max', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
401
class AccessPointSerializer(NamespacedHMSerializer):
402 403
    """Serialize `topologie.models.AccessPoint` objects
    """
Maël Kervella's avatar
Maël Kervella committed
404
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
405
        model = topologie.AccessPoint
Maël Kervella's avatar
Maël Kervella committed
406 407 408
        fields = ('user', 'name', 'active', 'location', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
409
class SwitchSerializer(NamespacedHMSerializer):
410 411
    """Serialize `topologie.models.Switch` objects
    """
Maël Kervella's avatar
Maël Kervella committed
412 413
    port_amount = serializers.IntegerField(source='number')
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
414
        model = topologie.Switch
Maël Kervella's avatar
Maël Kervella committed
415 416
        fields = ('user', 'name', 'active', 'port_amount', 'stack',
                  'stack_member_id', 'model', 'switchbay', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
417 418


419 420 421 422 423 424 425 426
class ServerSerializer(NamespacedHMSerializer):
    """Serialize `topologie.models.Server` objects
    """
    class Meta:
        model = topologie.Server
        fields = ('user', 'name', 'active', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
427
class ModelSwitchSerializer(NamespacedHMSerializer):
428 429
    """Serialize `topologie.models.ModelSwitch` objects
    """
Maël Kervella's avatar
Maël Kervella committed
430
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
431
        model = topologie.ModelSwitch
Maël Kervella's avatar
Maël Kervella committed
432 433 434
        fields = ('reference', 'constructor', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
435
class ConstructorSwitchSerializer(NamespacedHMSerializer):
436 437
    """Serialize `topologie.models.ConstructorSwitch` objects
    """
Maël Kervella's avatar
Maël Kervella committed
438
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
439
        model = topologie.ConstructorSwitch
Maël Kervella's avatar
Maël Kervella committed
440 441 442
        fields = ('name', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
443
class SwitchBaySerializer(NamespacedHMSerializer):
444 445
    """Serialize `topologie.models.SwitchBay` objects
    """
Maël Kervella's avatar
Maël Kervella committed
446
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
447
        model = topologie.SwitchBay
Maël Kervella's avatar
Maël Kervella committed
448 449 450
        fields = ('name', 'building', 'info', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
451
class BuildingSerializer(NamespacedHMSerializer):
452 453
    """Serialize `topologie.models.Building` objects
    """
Maël Kervella's avatar
Maël Kervella committed
454
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
455
        model = topologie.Building
Maël Kervella's avatar
Maël Kervella committed
456 457 458
        fields = ('name', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
459
class SwitchPortSerializer(NamespacedHMSerializer):
460 461
    """Serialize `topologie.models.Port` objects
    """
Maël Kervella's avatar
Maël Kervella committed
462
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
463
        model = topologie.Port
Maël Kervella's avatar
Maël Kervella committed
464 465
        fields = ('switch', 'port', 'room', 'machine_interface', 'related',
                  'radius', 'vlan_force', 'details', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
466 467 468 469
        extra_kwargs = {
            'related': {'view_name': 'switchport-detail'},
            'api_url': {'view_name': 'switchport-detail'}
        }
Maël Kervella's avatar
Maël Kervella committed
470 471


Maël Kervella's avatar
Maël Kervella committed
472
class RoomSerializer(NamespacedHMSerializer):
473 474
    """Serialize `topologie.models.Room` objects
    """
Maël Kervella's avatar
Maël Kervella committed
475
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
476
        model = topologie.Room
Maël Kervella's avatar
Maël Kervella committed
477 478 479
        fields = ('name', 'details', 'api_url')


480
# USERS
481

Maël Kervella's avatar
Maël Kervella committed
482

Maël Kervella's avatar
Maël Kervella committed
483
class UserSerializer(NamespacedHMSerializer):
484 485
    """Serialize `users.models.User` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
486 487
    access = serializers.BooleanField(source='has_access')
    uid = serializers.IntegerField(source='uid_number')
Maël Kervella's avatar
Maël Kervella committed
488 489

    class Meta:
Maël Kervella's avatar
Maël Kervella committed
490
        model = users.User
Maël Kervella's avatar
Maël Kervella committed
491
        fields = ('name', 'pseudo', 'email', 'school', 'shell', 'comment',
Maël Kervella's avatar
Maël Kervella committed
492 493 494 495 496
                  'state', 'registered', 'telephone', 'solde', 'access',
                  'end_access', 'uid', 'class_name', 'api_url')
        extra_kwargs = {
            'shell': {'view_name': 'shell-detail'}
        }
Maël Kervella's avatar
Maël Kervella committed
497

Maël Kervella's avatar
Maël Kervella committed
498

Maël Kervella's avatar
Maël Kervella committed
499
class ClubSerializer(NamespacedHMSerializer):
500 501
    """Serialize `users.models.Club` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
502 503 504
    name = serializers.CharField(source='surname')
    access = serializers.BooleanField(source='has_access')
    uid = serializers.IntegerField(source='uid_number')
Maël Kervella's avatar
Maël Kervella committed
505 506

    class Meta:
Maël Kervella's avatar
Maël Kervella committed
507
        model = users.Club
Maël Kervella's avatar
Maël Kervella committed
508
        fields = ('name', 'pseudo', 'email', 'school', 'shell', 'comment',
Maël Kervella's avatar
Maël Kervella committed
509
                  'state', 'registered', 'telephone', 'solde', 'room',
Maël Kervella's avatar
Maël Kervella committed
510 511
                  'access', 'end_access', 'administrators', 'members',
                  'mailing', 'uid', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
512 513 514
        extra_kwargs = {
            'shell': {'view_name': 'shell-detail'}
        }
Maël Kervella's avatar
Maël Kervella committed
515 516


Maël Kervella's avatar
Maël Kervella committed
517
class AdherentSerializer(NamespacedHMSerializer):
518 519
    """Serialize `users.models.Adherent` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
520 521
    access = serializers.BooleanField(source='has_access')
    uid = serializers.IntegerField(source='uid_number')
Maël Kervella's avatar
Maël Kervella committed
522

Maël Kervella's avatar
Maël Kervella committed
523
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
524
        model = users.Adherent
Maël Kervella's avatar
Maël Kervella committed
525
        fields = ('name', 'surname', 'pseudo', 'email', 'school', 'shell',
Maël Kervella's avatar
Maël Kervella committed
526
                  'comment', 'state', 'registered', 'telephone', 'room',
Maël Kervella's avatar
Maël Kervella committed
527
                  'solde', 'access', 'end_access', 'uid', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
528 529 530
        extra_kwargs = {
            'shell': {'view_name': 'shell-detail'}
        }
Maël Kervella's avatar
Maël Kervella committed
531 532


Maël Kervella's avatar
Maël Kervella committed
533
class ServiceUserSerializer(NamespacedHMSerializer):
534 535
    """Serialize `users.models.ServiceUser` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
536
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
537
        model = users.ServiceUser
Maël Kervella's avatar
Maël Kervella committed
538
        fields = ('pseudo', 'access_group', 'comment', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
539 540


Maël Kervella's avatar
Maël Kervella committed
541
class SchoolSerializer(NamespacedHMSerializer):
542 543
    """Serialize `users.models.School` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
544
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
545
        model = users.School
Maël Kervella's avatar
Maël Kervella committed
546
        fields = ('name', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
547 548


Maël Kervella's avatar
Maël Kervella committed
549
class ListRightSerializer(NamespacedHMSerializer):
550 551
    """Serialize `users.models.ListRight` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
552
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
553
        model = users.ListRight
Maël Kervella's avatar
Maël Kervella committed
554
        fields = ('unix_name', 'gid', 'critical', 'details', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
555 556


Maël Kervella's avatar
Maël Kervella committed
557
class ShellSerializer(NamespacedHMSerializer):
558 559
    """Serialize `users.models.ListShell` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
560
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
561
        model = users.ListShell
Maël Kervella's avatar
Maël Kervella committed
562
        fields = ('shell', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
563 564 565
        extra_kwargs = {
            'api_url': {'view_name': 'shell-detail'}
        }
Maël Kervella's avatar
Maël Kervella committed
566 567


Maël Kervella's avatar
Maël Kervella committed
568
class BanSerializer(NamespacedHMSerializer):
569 570
    """Serialize `users.models.Ban` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
571
    active = serializers.BooleanField(source='is_active')
Maël Kervella's avatar
Maël Kervella committed
572 573

    class Meta:
Maël Kervella's avatar
Maël Kervella committed
574
        model = users.Ban
Maël Kervella's avatar
Maël Kervella committed
575 576
        fields = ('user', 'raison', 'date_start', 'date_end', 'state',
                  'active', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
577 578


Maël Kervella's avatar
Maël Kervella committed
579
class WhitelistSerializer(NamespacedHMSerializer):
580 581
    """Serialize `users.models.Whitelist` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
582
    active = serializers.BooleanField(source='is_active')
Maël Kervella's avatar
Maël Kervella committed
583 584

    class Meta:
Maël Kervella's avatar
Maël Kervella committed
585
        model = users.Whitelist
Maël Kervella's avatar
Maël Kervella committed
586
        fields = ('user', 'raison', 'date_start', 'date_end', 'active', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
587 588


589
# SERVICE REGEN
590 591 592


class ServiceRegenSerializer(NamespacedHMSerializer):
593 594
    """Serialize the data about the services to regen.
    """
595 596
    hostname = serializers.CharField(source='server.domain.name', read_only=True)
    service_name = serializers.CharField(source='service.service_type', read_only=True)
597
    need_regen = serializers.BooleanField()
598 599 600 601 602

    class Meta:
        model = machines.Service_link
        fields = ('hostname', 'service_name', 'need_regen', 'api_url')
        extra_kwargs = {
603
            'api_url': {'view_name': 'serviceregen-detail'}
604 605 606
        }


Maël Kervella's avatar
Maël Kervella committed
607 608 609 610
# DHCP


class HostMacIpSerializer(serializers.ModelSerializer):
611 612 613
    """Serialize the data about the hostname-ipv4-mac address association
    to build the DHCP lease files.
    """
Maël Kervella's avatar
Maël Kervella committed
614 615
    hostname = serializers.CharField(source='domain.name', read_only=True)
    extension = serializers.CharField(source='domain.extension.name', read_only=True)
Maël Kervella's avatar
Maël Kervella committed
616
    mac_address = serializers.CharField(read_only=True)
Maël Kervella's avatar
Maël Kervella committed
617 618 619 620 621
    ipv4 = serializers.CharField(source='ipv4.ipv4', read_only=True)

    class Meta:
        model = machines.Interface
        fields = ('hostname', 'extension', 'mac_address', 'ipv4')
622 623 624 625 626 627


# DNS


class SOARecordSerializer(SOASerializer):
628 629 630
    """Serialize `machines.models.SOA` objects with the data needed to
    generate a SOA DNS record.
    """
631 632 633 634 635 636
    class Meta:
        model = machines.SOA
        fields = ('name', 'mail', 'refresh', 'retry', 'expire', 'ttl')


class OriginV4RecordSerializer(IpListSerializer):
637 638 639
    """Serialize `machines.models.IpList` objects with the data needed to
    generate an IPv4 Origin DNS record.
    """
640 641 642 643 644
    class Meta(IpListSerializer.Meta):
        fields = ('ipv4',)


class NSRecordSerializer(NsSerializer):
645 646 647
    """Serialize `machines.models.Ns` objects with the data needed to
    generate a NS DNS record.
    """
648 649 650 651 652 653 654
    target = serializers.CharField(source='ns.name', read_only=True)

    class Meta(NsSerializer.Meta):
        fields = ('target',)


class MXRecordSerializer(MxSerializer):
655 656 657
    """Serialize `machines.models.Mx` objects with the data needed to
    generate a MX DNS record.
    """
658 659 660 661 662 663 664
    target = serializers.CharField(source='name.name', read_only=True)

    class Meta(MxSerializer.Meta):
        fields = ('target', 'priority')


class TXTRecordSerializer(TxtSerializer):
665 666 667
    """Serialize `machines.models.Txt` objects with the data needed to
    generate a TXT DNS record.
    """
668 669 670 671 672
    class Meta(TxtSerializer.Meta):
        fields = ('field1', 'field2')


class SRVRecordSerializer(SrvSerializer):
673 674 675
    """Serialize `machines.models.Srv` objects with the data needed to
    generate a SRV DNS record.
    """
676 677 678 679 680 681 682
    target = serializers.CharField(source='target.name', read_only=True)

    class Meta(SrvSerializer.Meta):
        fields = ('service', 'protocole', 'ttl', 'priority', 'weight', 'port', 'target')


class ARecordSerializer(serializers.ModelSerializer):
683 684 685
    """Serialize `machines.models.Interface` objects with the data needed to
    generate a A DNS record.
    """
686 687 688 689 690 691 692 693 694
    hostname = serializers.CharField(source='domain.name', read_only=True)
    ipv4 = serializers.CharField(source='ipv4.ipv4', read_only=True)

    class Meta:
        model = machines.Interface
        fields = ('hostname', 'ipv4')


class AAAARecordSerializer(serializers.ModelSerializer):
695 696 697
    """Serialize `machines.models.Interface` objects with the data needed to
    generate a AAAA DNS record.
    """
698
    hostname = serializers.CharField(source='domain.name', read_only=True)
699
    ipv6 = Ipv6ListSerializer(many=True, read_only=True)
700 701 702 703 704 705 706

    class Meta:
        model = machines.Interface
        fields = ('hostname', 'ipv6')


class CNAMERecordSerializer(serializers.ModelSerializer):
707 708 709
    """Serialize `machines.models.Domain` objects with the data needed to
    generate a CNAME DNS record.
    """
710 711
    alias = serializers.CharField(source='cname.name', read_only=True)
    hostname = serializers.CharField(source='name', read_only=True)
Maël Kervella's avatar
Maël Kervella committed
712
    extension = serializers.CharField(source='extension.name', read_only=True)
713 714 715

    class Meta:
        model = machines.Domain
Maël Kervella's avatar
Maël Kervella committed
716
        fields = ('alias', 'hostname', 'extension')
717 718


719 720 721 722 723 724 725 726 727 728 729 730 731 732 733
class SSHFPRRecordSerializer(serializers.ModelSerializer):
    class Meta:
        model = machines.SshFingerprint
        fields = ('algo_id', 'hash')


class SSHFPRInterfaceSerializer(serializers.ModelSerializer):
    hostname = serializers.CharField(source='domain.name', read_only=True)
    sshfpr = SSHFPRRecordSerializer(source='machine.sshfingerprint_set', many=True, read_only=True)

    class Meta:
        model = machines.Interface
        fields = ('hostname', 'sshfpr')


734
class DNSZonesSerializer(serializers.ModelSerializer):
735 736
    """Serialize the data about DNS Zones.
    """
737 738 739
    soa = SOARecordSerializer()
    ns_records = NSRecordSerializer(many=True, source='ns_set')
    originv4 = OriginV4RecordSerializer(source='origin')
740
    originv6 = serializers.CharField(source='origin_v6')
741 742 743 744 745 746
    mx_records = MXRecordSerializer(many=True, source='mx_set')
    txt_records = TXTRecordSerializer(many=True, source='txt_set')
    srv_records = SRVRecordSerializer(many=True, source='srv_set')
    a_records = ARecordSerializer(many=True, source='get_associated_a_records')
    aaaa_records = AAAARecordSerializer(many=True, source='get_associated_aaaa_records')
    cname_records = CNAMERecordSerializer(many=True, source='get_associated_cname_records')
747
    sshfpr_records = SSHFPRInterfaceSerializer(many=True, source='get_associated_sshfpr')
748 749 750 751 752

    class Meta:
        model = machines.Extension
        fields = ('name', 'soa', 'ns_records', 'originv4', 'originv6',
                  'mx_records', 'txt_records', 'srv_records', 'a_records',
753
                  'aaaa_records', 'cname_records', 'sshfpr_records')
Maël Kervella's avatar
Maël Kervella committed
754 755


756
# MAILING
Maël Kervella's avatar
Maël Kervella committed
757 758 759


class MailingMemberSerializer(UserSerializer):
760 761
    """Serialize the data about a mailing member.
    """
Maël Kervella's avatar
Maël Kervella committed
762 763 764 765
    class Meta(UserSerializer.Meta):
        fields = ('name', 'pseudo', 'email')

class MailingSerializer(ClubSerializer):
766 767
    """Serialize the data about a mailing.
    """
Maël Kervella's avatar
Maël Kervella committed
768 769 770 771 772
    members = MailingMemberSerializer(many=True)
    admins = MailingMemberSerializer(source='administrators', many=True)

    class Meta(ClubSerializer.Meta):
        fields = ('name', 'members', 'admins')