serializers.py 24.5 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
        fields = ('service', 'protocole', 'extension', 'ttl', 'priority',
                  'weight', 'port', 'target', 'api_url')

225 226 227 228 229 230 231
class SshFpSerializer(NamespacedHMSerializer):
    """Serialize `machines.models.SSHFP` objects.
    """
    class Meta:
        model = machines.SshFp
        field = ('machine', 'pub_key_entry', 'algo', 'comment', 'api_url')

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

Maël Kervella's avatar
Maël Kervella committed
233
class InterfaceSerializer(NamespacedHMSerializer):
234 235
    """Serialize `machines.models.Interface` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
236
    mac_address = serializers.CharField()
Maël Kervella's avatar
Maël Kervella committed
237 238 239
    active = serializers.BooleanField(source='is_active')

    class Meta:
Maël Kervella's avatar
Maël Kervella committed
240
        model = machines.Interface
Maël Kervella's avatar
Maël Kervella committed
241 242 243 244
        fields = ('ipv4', 'mac_address', 'machine', 'type', 'details',
                  'port_lists', 'active', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
245
class Ipv6ListSerializer(NamespacedHMSerializer):
246 247
    """Serialize `machines.models.Ipv6List` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
248
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
249
        model = machines.Ipv6List
250
        fields = ('ipv6', 'interface', 'slaac_ip', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
251 252


Maël Kervella's avatar
Maël Kervella committed
253
class DomainSerializer(NamespacedHMSerializer):
254 255
    """Serialize `machines.models.Domain` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
256
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
257
        model = machines.Domain
Maël Kervella's avatar
Maël Kervella committed
258 259 260 261
        fields = ('interface_parent', 'name', 'extension', 'cname',
                  'api_url')


Maël Kervella's avatar
Maël Kervella committed
262
class IpListSerializer(NamespacedHMSerializer):
263 264
    """Serialize `machines.models.IpList` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
265
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
266
        model = machines.IpList
Maël Kervella's avatar
Maël Kervella committed
267 268 269
        fields = ('ipv4', 'ip_type', 'need_infra', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
270
class ServiceSerializer(NamespacedHMSerializer):
271 272
    """Serialize `machines.models.Service` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
273
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
274
        model = machines.Service
Maël Kervella's avatar
Maël Kervella committed
275 276 277 278
        fields = ('service_type', 'min_time_regen', 'regular_time_regen',
                  'servers', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
279
class ServiceLinkSerializer(NamespacedHMSerializer):
280 281
    """Serialize `machines.models.Service_link` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
282
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
283
        model = machines.Service_link
Maël Kervella's avatar
Maël Kervella committed
284 285
        fields = ('service', 'server', 'last_regen', 'asked_regen',
                  'need_regen', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
286 287 288
        extra_kwargs = {
            'api_url': {'view_name': 'servicelink-detail'}
        }
Maël Kervella's avatar
Maël Kervella committed
289 290


Maël Kervella's avatar
Maël Kervella committed
291
class OuverturePortListSerializer(NamespacedHMSerializer):
292 293
    """Serialize `machines.models.OuverturePortList` objects.
    """
294 295 296 297 298
    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
299
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
300
        model = machines.OuverturePortList
Maël Kervella's avatar
Maël Kervella committed
301 302 303 304
        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
305
class OuverturePortSerializer(NamespacedHMSerializer):
306 307
    """Serialize `machines.models.OuverturePort` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
308
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
309
        model = machines.OuverturePort
Maël Kervella's avatar
Maël Kervella committed
310 311 312
        fields = ('begin', 'end', 'port_list', 'protocole', 'io', 'api_url')


313
# PREFERENCES
314 315


Maël Kervella's avatar
Maël Kervella committed
316
class OptionalUserSerializer(NamespacedHMSerializer):
317 318
    """Serialize `preferences.models.OptionalUser` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
319 320 321 322 323 324 325 326 327 328
    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):
329 330
    """Serialize `preferences.models.OptionalMachine` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
331 332 333 334 335 336 337 338
    class Meta:
        model = preferences.OptionalMachine
        fields = ('password_machine', 'max_lambdauser_interfaces',
                  'max_lambdauser_aliases', 'ipv6_mode', 'create_machine',
                  'ipv6')


class OptionalTopologieSerializer(NamespacedHMSerializer):
339 340
    """Serialize `preferences.models.OptionalTopologie` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
341 342 343 344 345 346 347
    class Meta:
        model = preferences.OptionalTopologie
        fields = ('radius_general_policy', 'vlan_decision_ok',
                  'vlan_decision_nok')


class GeneralOptionSerializer(NamespacedHMSerializer):
348 349
    """Serialize `preferences.models.GeneralOption` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
350 351 352 353 354 355 356 357
    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')


358
class HomeServiceSerializer(NamespacedHMSerializer):
359 360
    """Serialize `preferences.models.Service` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
361 362 363
    class Meta:
        model = preferences.Service
        fields = ('name', 'url', 'description', 'image', 'api_url')
364 365 366
        extra_kwargs = {
            'api_url': {'view_name': 'homeservice-detail'}
        }
Maël Kervella's avatar
Maël Kervella committed
367 368 369


class AssoOptionSerializer(NamespacedHMSerializer):
370 371
    """Serialize `preferences.models.AssoOption` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
372 373 374 375 376 377 378 379
    class Meta:
        model = preferences.AssoOption
        fields = ('name', 'siret', 'adresse1', 'adresse2', 'contact',
                  'telephone', 'pseudo', 'utilisateur_asso', 'payment',
                  'payment_id', 'payment_pass', 'description')


class HomeOptionSerializer(NamespacedHMSerializer):
380 381
    """Serialize `preferences.models.HomeOption` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
382 383 384 385 386 387
    class Meta:
        model = preferences.HomeOption
        fields = ('facebook_url', 'twitter_url', 'twitter_account_name')


class MailMessageOptionSerializer(NamespacedHMSerializer):
388 389
    """Serialize `preferences.models.MailMessageOption` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
390 391 392
    class Meta:
        model = preferences.MailMessageOption
        fields = ('welcome_mail_fr', 'welcome_mail_en')
393 394


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

396
# TOPOLOGIE
Maël Kervella's avatar
Maël Kervella committed
397 398


Maël Kervella's avatar
Maël Kervella committed
399
class StackSerializer(NamespacedHMSerializer):
400 401
    """Serialize `topologie.models.Stack` objects
    """
Maël Kervella's avatar
Maël Kervella committed
402
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
403
        model = topologie.Stack
Maël Kervella's avatar
Maël Kervella committed
404 405 406 407
        fields = ('name', 'stack_id', 'details', 'member_id_min',
                  'member_id_max', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
408
class AccessPointSerializer(NamespacedHMSerializer):
409 410
    """Serialize `topologie.models.AccessPoint` objects
    """
Maël Kervella's avatar
Maël Kervella committed
411
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
412
        model = topologie.AccessPoint
Maël Kervella's avatar
Maël Kervella committed
413 414 415
        fields = ('user', 'name', 'active', 'location', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
416
class SwitchSerializer(NamespacedHMSerializer):
417 418
    """Serialize `topologie.models.Switch` objects
    """
Maël Kervella's avatar
Maël Kervella committed
419 420
    port_amount = serializers.IntegerField(source='number')
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
421
        model = topologie.Switch
Maël Kervella's avatar
Maël Kervella committed
422 423
        fields = ('user', 'name', 'active', 'port_amount', 'stack',
                  'stack_member_id', 'model', 'switchbay', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
424 425


426 427 428 429 430 431 432 433
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
434
class ModelSwitchSerializer(NamespacedHMSerializer):
435 436
    """Serialize `topologie.models.ModelSwitch` objects
    """
Maël Kervella's avatar
Maël Kervella committed
437
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
438
        model = topologie.ModelSwitch
Maël Kervella's avatar
Maël Kervella committed
439 440 441
        fields = ('reference', 'constructor', 'api_url')


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


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


Maël Kervella's avatar
Maël Kervella committed
458
class BuildingSerializer(NamespacedHMSerializer):
459 460
    """Serialize `topologie.models.Building` objects
    """
Maël Kervella's avatar
Maël Kervella committed
461
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
462
        model = topologie.Building
Maël Kervella's avatar
Maël Kervella committed
463 464 465
        fields = ('name', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
466
class SwitchPortSerializer(NamespacedHMSerializer):
467 468
    """Serialize `topologie.models.Port` objects
    """
Maël Kervella's avatar
Maël Kervella committed
469
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
470
        model = topologie.Port
Maël Kervella's avatar
Maël Kervella committed
471 472
        fields = ('switch', 'port', 'room', 'machine_interface', 'related',
                  'radius', 'vlan_force', 'details', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
473 474 475 476
        extra_kwargs = {
            'related': {'view_name': 'switchport-detail'},
            'api_url': {'view_name': 'switchport-detail'}
        }
Maël Kervella's avatar
Maël Kervella committed
477 478


Maël Kervella's avatar
Maël Kervella committed
479
class RoomSerializer(NamespacedHMSerializer):
480 481
    """Serialize `topologie.models.Room` objects
    """
Maël Kervella's avatar
Maël Kervella committed
482
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
483
        model = topologie.Room
Maël Kervella's avatar
Maël Kervella committed
484 485 486
        fields = ('name', 'details', 'api_url')


487
# USERS
488

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

Maël Kervella's avatar
Maël Kervella committed
490
class UserSerializer(NamespacedHMSerializer):
491 492
    """Serialize `users.models.User` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
493 494
    access = serializers.BooleanField(source='has_access')
    uid = serializers.IntegerField(source='uid_number')
Maël Kervella's avatar
Maël Kervella committed
495 496

    class Meta:
Maël Kervella's avatar
Maël Kervella committed
497
        model = users.User
Maël Kervella's avatar
Maël Kervella committed
498
        fields = ('name', 'pseudo', 'email', 'school', 'shell', 'comment',
Maël Kervella's avatar
Maël Kervella committed
499 500 501 502 503
                  '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
504

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

Maël Kervella's avatar
Maël Kervella committed
506
class ClubSerializer(NamespacedHMSerializer):
507 508
    """Serialize `users.models.Club` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
509 510 511
    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
512 513

    class Meta:
Maël Kervella's avatar
Maël Kervella committed
514
        model = users.Club
Maël Kervella's avatar
Maël Kervella committed
515
        fields = ('name', 'pseudo', 'email', 'school', 'shell', 'comment',
Maël Kervella's avatar
Maël Kervella committed
516
                  'state', 'registered', 'telephone', 'solde', 'room',
Maël Kervella's avatar
Maël Kervella committed
517 518
                  'access', 'end_access', 'administrators', 'members',
                  'mailing', 'uid', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
519 520 521
        extra_kwargs = {
            'shell': {'view_name': 'shell-detail'}
        }
Maël Kervella's avatar
Maël Kervella committed
522 523


Maël Kervella's avatar
Maël Kervella committed
524
class AdherentSerializer(NamespacedHMSerializer):
525 526
    """Serialize `users.models.Adherent` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
527 528
    access = serializers.BooleanField(source='has_access')
    uid = serializers.IntegerField(source='uid_number')
Maël Kervella's avatar
Maël Kervella committed
529

Maël Kervella's avatar
Maël Kervella committed
530
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
531
        model = users.Adherent
Maël Kervella's avatar
Maël Kervella committed
532
        fields = ('name', 'surname', 'pseudo', 'email', 'school', 'shell',
Maël Kervella's avatar
Maël Kervella committed
533
                  'comment', 'state', 'registered', 'telephone', 'room',
Maël Kervella's avatar
Maël Kervella committed
534
                  'solde', 'access', 'end_access', 'uid', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
535 536 537
        extra_kwargs = {
            'shell': {'view_name': 'shell-detail'}
        }
Maël Kervella's avatar
Maël Kervella committed
538 539


Maël Kervella's avatar
Maël Kervella committed
540
class ServiceUserSerializer(NamespacedHMSerializer):
541 542
    """Serialize `users.models.ServiceUser` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
543
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
544
        model = users.ServiceUser
Maël Kervella's avatar
Maël Kervella committed
545
        fields = ('pseudo', 'access_group', 'comment', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
546 547


Maël Kervella's avatar
Maël Kervella committed
548
class SchoolSerializer(NamespacedHMSerializer):
549 550
    """Serialize `users.models.School` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
551
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
552
        model = users.School
Maël Kervella's avatar
Maël Kervella committed
553
        fields = ('name', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
554 555


Maël Kervella's avatar
Maël Kervella committed
556
class ListRightSerializer(NamespacedHMSerializer):
557 558
    """Serialize `users.models.ListRight` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
559
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
560
        model = users.ListRight
Maël Kervella's avatar
Maël Kervella committed
561
        fields = ('unix_name', 'gid', 'critical', 'details', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
562 563


Maël Kervella's avatar
Maël Kervella committed
564
class ShellSerializer(NamespacedHMSerializer):
565 566
    """Serialize `users.models.ListShell` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
567
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
568
        model = users.ListShell
Maël Kervella's avatar
Maël Kervella committed
569
        fields = ('shell', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
570 571 572
        extra_kwargs = {
            'api_url': {'view_name': 'shell-detail'}
        }
Maël Kervella's avatar
Maël Kervella committed
573 574


Maël Kervella's avatar
Maël Kervella committed
575
class BanSerializer(NamespacedHMSerializer):
576 577
    """Serialize `users.models.Ban` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
578
    active = serializers.BooleanField(source='is_active')
Maël Kervella's avatar
Maël Kervella committed
579 580

    class Meta:
Maël Kervella's avatar
Maël Kervella committed
581
        model = users.Ban
Maël Kervella's avatar
Maël Kervella committed
582 583
        fields = ('user', 'raison', 'date_start', 'date_end', 'state',
                  'active', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
584 585


Maël Kervella's avatar
Maël Kervella committed
586
class WhitelistSerializer(NamespacedHMSerializer):
587 588
    """Serialize `users.models.Whitelist` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
589
    active = serializers.BooleanField(source='is_active')
Maël Kervella's avatar
Maël Kervella committed
590 591

    class Meta:
Maël Kervella's avatar
Maël Kervella committed
592
        model = users.Whitelist
Maël Kervella's avatar
Maël Kervella committed
593
        fields = ('user', 'raison', 'date_start', 'date_end', 'active', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
594 595


596
# SERVICE REGEN
597 598 599


class ServiceRegenSerializer(NamespacedHMSerializer):
600 601
    """Serialize the data about the services to regen.
    """
602 603
    hostname = serializers.CharField(source='server.domain.name', read_only=True)
    service_name = serializers.CharField(source='service.service_type', read_only=True)
604
    need_regen = serializers.BooleanField()
605 606 607 608 609

    class Meta:
        model = machines.Service_link
        fields = ('hostname', 'service_name', 'need_regen', 'api_url')
        extra_kwargs = {
610
            'api_url': {'view_name': 'serviceregen-detail'}
611 612 613
        }


Maël Kervella's avatar
Maël Kervella committed
614 615 616 617
# DHCP


class HostMacIpSerializer(serializers.ModelSerializer):
618 619 620
    """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
621 622
    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
623
    mac_address = serializers.CharField(read_only=True)
Maël Kervella's avatar
Maël Kervella committed
624 625 626 627 628
    ipv4 = serializers.CharField(source='ipv4.ipv4', read_only=True)

    class Meta:
        model = machines.Interface
        fields = ('hostname', 'extension', 'mac_address', 'ipv4')
629 630 631 632 633 634


# DNS


class SOARecordSerializer(SOASerializer):
635 636 637
    """Serialize `machines.models.SOA` objects with the data needed to
    generate a SOA DNS record.
    """
638 639 640 641 642 643
    class Meta:
        model = machines.SOA
        fields = ('name', 'mail', 'refresh', 'retry', 'expire', 'ttl')


class OriginV4RecordSerializer(IpListSerializer):
644 645 646
    """Serialize `machines.models.IpList` objects with the data needed to
    generate an IPv4 Origin DNS record.
    """
647 648 649 650 651
    class Meta(IpListSerializer.Meta):
        fields = ('ipv4',)


class NSRecordSerializer(NsSerializer):
652 653 654
    """Serialize `machines.models.Ns` objects with the data needed to
    generate a NS DNS record.
    """
655 656 657 658 659 660 661
    target = serializers.CharField(source='ns.name', read_only=True)

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


class MXRecordSerializer(MxSerializer):
662 663 664
    """Serialize `machines.models.Mx` objects with the data needed to
    generate a MX DNS record.
    """
665 666 667 668 669 670 671
    target = serializers.CharField(source='name.name', read_only=True)

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


class TXTRecordSerializer(TxtSerializer):
672 673 674
    """Serialize `machines.models.Txt` objects with the data needed to
    generate a TXT DNS record.
    """
675 676 677 678 679
    class Meta(TxtSerializer.Meta):
        fields = ('field1', 'field2')


class SRVRecordSerializer(SrvSerializer):
680 681 682
    """Serialize `machines.models.Srv` objects with the data needed to
    generate a SRV DNS record.
    """
683 684 685 686 687 688
    target = serializers.CharField(source='target.name', read_only=True)

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


689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708
class SSHFPRecordSerializer(SshFpSerializer):
    """Serialize `machines.models.SshFp` objects with the data needed to
    generate a SSHFP DNS record.
    """
    class Meta(SshFpSerializer.Meta):
        fields = ('algo_id', 'hash')


class SSHFPInterfaceSerializer(serializers.ModelSerializer):
    """Serialize `machines.models.Domain` objects with the data needed to
    generate a CNAME DNS record.
    """
    hostname = serializers.CharField(source='domain.name', read_only=True)
    sshfp = SSHFPRecordSerializer(source='machine.sshfp_set', many=True, read_only=True)

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


709
class ARecordSerializer(serializers.ModelSerializer):
710 711 712
    """Serialize `machines.models.Interface` objects with the data needed to
    generate a A DNS record.
    """
713 714 715 716 717 718 719 720 721
    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):
722 723 724
    """Serialize `machines.models.Interface` objects with the data needed to
    generate a AAAA DNS record.
    """
725
    hostname = serializers.CharField(source='domain.name', read_only=True)
726
    ipv6 = Ipv6ListSerializer(many=True, read_only=True)
727 728 729 730 731 732 733

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


class CNAMERecordSerializer(serializers.ModelSerializer):
734 735 736
    """Serialize `machines.models.Domain` objects with the data needed to
    generate a CNAME DNS record.
    """
737 738
    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
739
    extension = serializers.CharField(source='extension.name', read_only=True)
740 741 742

    class Meta:
        model = machines.Domain
Maël Kervella's avatar
Maël Kervella committed
743
        fields = ('alias', 'hostname', 'extension')
744 745


746
class DNSZonesSerializer(serializers.ModelSerializer):
747 748
    """Serialize the data about DNS Zones.
    """
749 750 751
    soa = SOARecordSerializer()
    ns_records = NSRecordSerializer(many=True, source='ns_set')
    originv4 = OriginV4RecordSerializer(source='origin')
752
    originv6 = serializers.CharField(source='origin_v6')
753 754 755 756 757 758
    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')
759
    sshfp_records = SSHFPInterfaceSerializer(many=True, source='get_associated_sshfp_records')
760 761 762 763 764

    class Meta:
        model = machines.Extension
        fields = ('name', 'soa', 'ns_records', 'originv4', 'originv6',
                  'mx_records', 'txt_records', 'srv_records', 'a_records',
765
                  'aaaa_records', 'cname_records', 'sshfp_records')
Maël Kervella's avatar
Maël Kervella committed
766 767


768
# MAILING
Maël Kervella's avatar
Maël Kervella committed
769 770 771


class MailingMemberSerializer(UserSerializer):
772 773
    """Serialize the data about a mailing member.
    """
Maël Kervella's avatar
Maël Kervella committed
774 775 776 777
    class Meta(UserSerializer.Meta):
        fields = ('name', 'pseudo', 'email')

class MailingSerializer(ClubSerializer):
778 779
    """Serialize the data about a mailing.
    """
Maël Kervella's avatar
Maël Kervella committed
780 781 782 783 784
    members = MailingMemberSerializer(many=True)
    admins = MailingMemberSerializer(source='administrators', many=True)

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