serializers.py 25.3 KB
Newer Older
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
"""
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
65

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
123 124


Maël Kervella's avatar
Maël Kervella committed
125
class MachineSerializer(NamespacedHMSerializer):
126 127
    """Serialize `machines.models.Machine` objects.
    """
128
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
129
        model = machines.Machine
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.
    """
136
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
137
        model = machines.MachineType
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.
    """
144
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
145
        model = machines.IpType
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.
    """
154
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
155
        model = machines.Vlan
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.
    """
162
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
163
        model = machines.Nas
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.
    """
171
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
172
        model = machines.SOA
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.
    """
180
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
181
        model = machines.Extension
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.
    """
189
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
190
        model = machines.Mx
191 192 193
        fields = ('zone', 'priority', 'name', 'api_url')


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.
    """
204
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
205
        model = machines.Ns
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.
    """
212
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
213
        model = machines.Txt
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.
    """
220
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
221
        model = machines.Srv
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')

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()
237 238 239
    active = serializers.BooleanField(source='is_active')

    class Meta:
Maël Kervella's avatar
Maël Kervella committed
240
        model = machines.Interface
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.
    """
248
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
249
        model = machines.Ipv6List
250
        fields = ('ipv6', 'interface', 'slaac_ip', 'api_url')
251 252


Maël Kervella's avatar
Maël Kervella committed
253
class DomainSerializer(NamespacedHMSerializer):
254 255
    """Serialize `machines.models.Domain` objects.
    """
256
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
257
        model = machines.Domain
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.
    """
265
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
266
        model = machines.IpList
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.
    """
273
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
274
        model = machines.Service
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.
    """
282
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
283
        model = machines.Service_link
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'}
        }
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)

299
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
300
        model = machines.OuverturePortList
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.
    """
308
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
309
        model = machines.OuverturePort
310 311 312
        fields = ('begin', 'end', 'port_list', 'protocole', 'io', 'api_url')


313
# PREFERENCES
314 315


316
class OptionalUserSerializer(NamespacedHMSerializer):
317 318
    """Serialize `preferences.models.OptionalUser` objects.
    """
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.
    """
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.
    """
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.
    """
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.
    """
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'}
        }
367 368 369


class AssoOptionSerializer(NamespacedHMSerializer):
370 371
    """Serialize `preferences.models.AssoOption` objects.
    """
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.
    """
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.
    """
390 391 392
    class Meta:
        model = preferences.MailMessageOption
        fields = ('welcome_mail_fr', 'welcome_mail_en')
393 394


395

396
# TOPOLOGIE
397 398


Maël Kervella's avatar
Maël Kervella committed
399
class StackSerializer(NamespacedHMSerializer):
400 401
    """Serialize `topologie.models.Stack` objects
    """
402
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
403
        model = topologie.Stack
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
    """
411
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
412
        model = topologie.AccessPoint
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
    """
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')
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
    """
437
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
438
        model = topologie.ModelSwitch
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
    """
445
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
446
        model = topologie.ConstructorSwitch
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
    """
453
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
454
        model = topologie.SwitchBay
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
    """
461
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
462
        model = topologie.Building
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
    """
469
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
470
        model = topologie.Port
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'}
        }
477 478


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


487
# USERS
488

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')
495
    email = serializers.CharField(source='get_mail')
496 497

    class Meta:
Maël Kervella's avatar
Maël Kervella committed
498
        model = users.User
Maël Kervella's avatar
Maël Kervella committed
499
        fields = ('name', 'pseudo', 'email', 'school', 'shell', 'comment',
500
                  'external_mail', 'redirection', 'internal_address',
Maël Kervella's avatar
Maël Kervella committed
501 502 503 504 505
                  'state', 'registered', 'telephone', 'solde', 'access',
                  'end_access', 'uid', 'class_name', 'api_url')
        extra_kwargs = {
            'shell': {'view_name': 'shell-detail'}
        }
506

507

Maël Kervella's avatar
Maël Kervella committed
508
class ClubSerializer(NamespacedHMSerializer):
509 510
    """Serialize `users.models.Club` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
511 512 513
    name = serializers.CharField(source='surname')
    access = serializers.BooleanField(source='has_access')
    uid = serializers.IntegerField(source='uid_number')
514
    email = serializers.CharField(source='get_mail')
515 516

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


Maël Kervella's avatar
Maël Kervella committed
528
class AdherentSerializer(NamespacedHMSerializer):
529 530
    """Serialize `users.models.Adherent` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
531 532
    access = serializers.BooleanField(source='has_access')
    uid = serializers.IntegerField(source='uid_number')
533
    email = serializers.CharField(source='get_mail')
534

535
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
536
        model = users.Adherent
537 538
        fields = ('name', 'surname', 'pseudo', 'email', 'redirection', 'internal_address',
                  'external_mail', 'school', 'shell',
Maël Kervella's avatar
Maël Kervella committed
539
                  'comment', 'state', 'registered', 'telephone', 'room',
Maël Kervella's avatar
Maël Kervella committed
540
                  'solde', 'access', 'end_access', 'uid', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
541 542 543
        extra_kwargs = {
            'shell': {'view_name': 'shell-detail'}
        }
544 545


Maël Kervella's avatar
Maël Kervella committed
546
class ServiceUserSerializer(NamespacedHMSerializer):
547 548
    """Serialize `users.models.ServiceUser` objects.
    """
549
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
550
        model = users.ServiceUser
Maël Kervella's avatar
Maël Kervella committed
551
        fields = ('pseudo', 'access_group', 'comment', 'api_url')
552 553


Maël Kervella's avatar
Maël Kervella committed
554
class SchoolSerializer(NamespacedHMSerializer):
555 556
    """Serialize `users.models.School` objects.
    """
557
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
558
        model = users.School
Maël Kervella's avatar
Maël Kervella committed
559
        fields = ('name', 'api_url')
560 561


Maël Kervella's avatar
Maël Kervella committed
562
class ListRightSerializer(NamespacedHMSerializer):
563 564
    """Serialize `users.models.ListRight` objects.
    """
565
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
566
        model = users.ListRight
Maël Kervella's avatar
Maël Kervella committed
567
        fields = ('unix_name', 'gid', 'critical', 'details', 'api_url')
568 569


Maël Kervella's avatar
Maël Kervella committed
570
class ShellSerializer(NamespacedHMSerializer):
571 572
    """Serialize `users.models.ListShell` objects.
    """
573
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
574
        model = users.ListShell
Maël Kervella's avatar
Maël Kervella committed
575
        fields = ('shell', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
576 577 578
        extra_kwargs = {
            'api_url': {'view_name': 'shell-detail'}
        }
579 580


Maël Kervella's avatar
Maël Kervella committed
581
class BanSerializer(NamespacedHMSerializer):
582 583
    """Serialize `users.models.Ban` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
584
    active = serializers.BooleanField(source='is_active')
585 586

    class Meta:
Maël Kervella's avatar
Maël Kervella committed
587
        model = users.Ban
Maël Kervella's avatar
Maël Kervella committed
588 589
        fields = ('user', 'raison', 'date_start', 'date_end', 'state',
                  'active', 'api_url')
590 591


Maël Kervella's avatar
Maël Kervella committed
592
class WhitelistSerializer(NamespacedHMSerializer):
593 594
    """Serialize `users.models.Whitelist` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
595
    active = serializers.BooleanField(source='is_active')
596 597

    class Meta:
Maël Kervella's avatar
Maël Kervella committed
598
        model = users.Whitelist
Maël Kervella's avatar
Maël Kervella committed
599
        fields = ('user', 'raison', 'date_start', 'date_end', 'active', 'api_url')
600 601


602 603 604 605 606 607 608 609 610
class MailAliasSerializer(NamespacedHMSerializer):
    """Serialize `users.models.MailAlias` objects.
    """

    class Meta:
        model = users.MailAlias
        fields = ('user', 'valeur', 'complete_mail')


611 612 613



614
# SERVICE REGEN
615 616 617


class ServiceRegenSerializer(NamespacedHMSerializer):
618 619
    """Serialize the data about the services to regen.
    """
620 621
    hostname = serializers.CharField(source='server.domain.name', read_only=True)
    service_name = serializers.CharField(source='service.service_type', read_only=True)
622
    need_regen = serializers.BooleanField()
623 624 625 626 627

    class Meta:
        model = machines.Service_link
        fields = ('hostname', 'service_name', 'need_regen', 'api_url')
        extra_kwargs = {
628
            'api_url': {'view_name': 'serviceregen-detail'}
629
        }
630 631 632 633 634 635 636 637 638 639 640
        
# Configuration mail


class UserMailAliasSerializer(NamespacedHMSerializer): 
    get_mail_aliases = MailAliasSerializer(read_only=True, many=True)

    class Meta:
        model = users.User
        fields = ('pseudo', 'get_mail_aliases')

641 642


643 644 645 646
# DHCP


class HostMacIpSerializer(serializers.ModelSerializer):
647 648 649
    """Serialize the data about the hostname-ipv4-mac address association
    to build the DHCP lease files.
    """
650 651
    hostname = serializers.CharField(source='domain.name', read_only=True)
    extension = serializers.CharField(source='domain.extension.name', read_only=True)
652
    mac_address = serializers.CharField(read_only=True)
653 654 655 656 657
    ipv4 = serializers.CharField(source='ipv4.ipv4', read_only=True)

    class Meta:
        model = machines.Interface
        fields = ('hostname', 'extension', 'mac_address', 'ipv4')
658 659 660 661 662 663


# DNS


class SOARecordSerializer(SOASerializer):
664 665 666
    """Serialize `machines.models.SOA` objects with the data needed to
    generate a SOA DNS record.
    """
667 668 669 670 671 672
    class Meta:
        model = machines.SOA
        fields = ('name', 'mail', 'refresh', 'retry', 'expire', 'ttl')


class OriginV4RecordSerializer(IpListSerializer):
673 674 675
    """Serialize `machines.models.IpList` objects with the data needed to
    generate an IPv4 Origin DNS record.
    """
676 677 678 679 680
    class Meta(IpListSerializer.Meta):
        fields = ('ipv4',)


class NSRecordSerializer(NsSerializer):
681 682 683
    """Serialize `machines.models.Ns` objects with the data needed to
    generate a NS DNS record.
    """
684 685 686 687 688 689 690
    target = serializers.CharField(source='ns.name', read_only=True)

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


class MXRecordSerializer(MxSerializer):
691 692 693
    """Serialize `machines.models.Mx` objects with the data needed to
    generate a MX DNS record.
    """
694 695 696 697 698 699 700
    target = serializers.CharField(source='name.name', read_only=True)

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


class TXTRecordSerializer(TxtSerializer):
701 702 703
    """Serialize `machines.models.Txt` objects with the data needed to
    generate a TXT DNS record.
    """
704 705 706 707 708
    class Meta(TxtSerializer.Meta):
        fields = ('field1', 'field2')


class SRVRecordSerializer(SrvSerializer):
709 710 711
    """Serialize `machines.models.Srv` objects with the data needed to
    generate a SRV DNS record.
    """
712 713 714 715 716 717
    target = serializers.CharField(source='target.name', read_only=True)

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


718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737
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')


738
class ARecordSerializer(serializers.ModelSerializer):
739 740 741
    """Serialize `machines.models.Interface` objects with the data needed to
    generate a A DNS record.
    """
742 743 744 745 746 747 748 749 750
    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):
751 752 753
    """Serialize `machines.models.Interface` objects with the data needed to
    generate a AAAA DNS record.
    """
754
    hostname = serializers.CharField(source='domain.name', read_only=True)
755
    ipv6 = Ipv6ListSerializer(many=True, read_only=True)
756 757 758 759 760 761 762

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


class CNAMERecordSerializer(serializers.ModelSerializer):
763 764 765
    """Serialize `machines.models.Domain` objects with the data needed to
    generate a CNAME DNS record.
    """
766 767
    alias = serializers.CharField(source='cname.name', read_only=True)
    hostname = serializers.CharField(source='name', read_only=True)
768
    extension = serializers.CharField(source='extension.name', read_only=True)
769 770 771

    class Meta:
        model = machines.Domain
772
        fields = ('alias', 'hostname', 'extension')
773 774


775
class DNSZonesSerializer(serializers.ModelSerializer):
776 777
    """Serialize the data about DNS Zones.
    """
778 779 780
    soa = SOARecordSerializer()
    ns_records = NSRecordSerializer(many=True, source='ns_set')
    originv4 = OriginV4RecordSerializer(source='origin')
781
    originv6 = serializers.CharField(source='origin_v6')
782 783 784 785 786 787
    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')
788
    sshfp_records = SSHFPInterfaceSerializer(many=True, source='get_associated_sshfp_records')
789 790 791 792 793

    class Meta:
        model = machines.Extension
        fields = ('name', 'soa', 'ns_records', 'originv4', 'originv6',
                  'mx_records', 'txt_records', 'srv_records', 'a_records',
794
                  'aaaa_records', 'cname_records', 'sshfp_records')
795 796


797
# MAILING
798 799 800


class MailingMemberSerializer(UserSerializer):
801 802
    """Serialize the data about a mailing member.
    """
803 804 805 806
    class Meta(UserSerializer.Meta):
        fields = ('name', 'pseudo', 'email')

class MailingSerializer(ClubSerializer):
807 808
    """Serialize the data about a mailing.
    """
809 810 811 812 813
    members = MailingMemberSerializer(many=True)
    admins = MailingMemberSerializer(source='administrators', many=True)

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