serializers.py 23.2 KB
Newer Older
Maël Kervella's avatar
Maël Kervella committed
1 2 3 4
# 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.
#
5
# Copyright © 2018 Maël Kervella
Maël Kervella's avatar
Maël Kervella committed
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#
# 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.

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

from rest_framework import serializers
25

Maël Kervella's avatar
Maël Kervella committed
26 27 28 29 30 31 32
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


33 34
# 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
35 36 37 38
API_NAMESPACE = 'api'


class NamespacedHRField(serializers.HyperlinkedRelatedField):
39 40 41
    """A `rest_framework.serializers.HyperlinkedRelatedField` subclass to
    automatically prefix view names with the API namespace.
    """
Maël Kervella's avatar
Maël Kervella committed
42 43 44 45 46 47 48
    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):
49 50 51
    """A `rest_framework.serializers.HyperlinkedIdentityField` subclass to
    automatically prefix view names with teh API namespace.
    """
Maël Kervella's avatar
Maël Kervella committed
52 53 54 55 56 57 58
    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):
59 60 61
    """A `rest_framework.serializers.HyperlinkedModelSerializer` subclass to
    automatically prefix view names with the API namespace.
    """
Maël Kervella's avatar
Maël Kervella committed
62 63
    serializer_related_field = NamespacedHRField
    serializer_url_field = NamespacedHIField
Maël Kervella's avatar
Maël Kervella committed
64

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

66
# COTISATIONS
67

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

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


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


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


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


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


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


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


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


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


Maël Kervella's avatar
Maël Kervella committed
140
class IpTypeSerializer(NamespacedHMSerializer):
141 142
    """Serialize `machines.models.IpType` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
143
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
144
        model = machines.IpType
Maël Kervella's avatar
Maël Kervella committed
145 146 147 148 149
        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
150
class VlanSerializer(NamespacedHMSerializer):
151 152
    """Serialize `machines.models.Vlan` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
153
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
154
        model = machines.Vlan
Maël Kervella's avatar
Maël Kervella committed
155 156 157
        fields = ('vlan_id', 'name', 'comment', 'api_url')


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


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


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


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


Maël Kervella's avatar
Maël Kervella committed
193
class NsSerializer(NamespacedHMSerializer):
194 195
    """Serialize `machines.models.Ns` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
196
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
197
        model = machines.Ns
Maël Kervella's avatar
Maël Kervella committed
198 199 200
        fields = ('zone', 'ns', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
201
class TxtSerializer(NamespacedHMSerializer):
202 203
    """Serialize `machines.models.Txt` 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.Txt
Maël Kervella's avatar
Maël Kervella committed
206 207 208
        fields = ('zone', 'field1', 'field2', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
209
class SrvSerializer(NamespacedHMSerializer):
210 211
    """Serialize `machines.models.Srv` 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.Srv
Maël Kervella's avatar
Maël Kervella committed
214 215 216 217
        fields = ('service', 'protocole', 'extension', 'ttl', 'priority',
                  'weight', 'port', 'target', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
218
class InterfaceSerializer(NamespacedHMSerializer):
219 220
    """Serialize `machines.models.Interface` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
221
    mac_address = serializers.CharField()
Maël Kervella's avatar
Maël Kervella committed
222 223 224
    active = serializers.BooleanField(source='is_active')

    class Meta:
Maël Kervella's avatar
Maël Kervella committed
225
        model = machines.Interface
Maël Kervella's avatar
Maël Kervella committed
226 227 228 229
        fields = ('ipv4', 'mac_address', 'machine', 'type', 'details',
                  'port_lists', 'active', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
230
class Ipv6ListSerializer(NamespacedHMSerializer):
231 232
    """Serialize `machines.models.Ipv6List` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
233
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
234
        model = machines.Ipv6List
235
        fields = ('ipv6', 'interface', 'slaac_ip', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
236 237


Maël Kervella's avatar
Maël Kervella committed
238
class DomainSerializer(NamespacedHMSerializer):
239 240
    """Serialize `machines.models.Domain` 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.Domain
Maël Kervella's avatar
Maël Kervella committed
243 244 245 246
        fields = ('interface_parent', 'name', 'extension', 'cname',
                  'api_url')


Maël Kervella's avatar
Maël Kervella committed
247
class IpListSerializer(NamespacedHMSerializer):
248 249
    """Serialize `machines.models.IpList` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
250
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
251
        model = machines.IpList
Maël Kervella's avatar
Maël Kervella committed
252 253 254
        fields = ('ipv4', 'ip_type', 'need_infra', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
255
class ServiceSerializer(NamespacedHMSerializer):
256 257
    """Serialize `machines.models.Service` 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.Service
Maël Kervella's avatar
Maël Kervella committed
260 261 262 263
        fields = ('service_type', 'min_time_regen', 'regular_time_regen',
                  'servers', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
264
class ServiceLinkSerializer(NamespacedHMSerializer):
265 266
    """Serialize `machines.models.Service_link` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
267
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
268
        model = machines.Service_link
Maël Kervella's avatar
Maël Kervella committed
269 270
        fields = ('service', 'server', 'last_regen', 'asked_regen',
                  'need_regen', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
271 272 273
        extra_kwargs = {
            'api_url': {'view_name': 'servicelink-detail'}
        }
Maël Kervella's avatar
Maël Kervella committed
274 275


Maël Kervella's avatar
Maël Kervella committed
276
class OuverturePortListSerializer(NamespacedHMSerializer):
277 278
    """Serialize `machines.models.OuverturePortList` objects.
    """
279 280 281 282 283
    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
284
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
285
        model = machines.OuverturePortList
Maël Kervella's avatar
Maël Kervella committed
286 287 288 289
        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
290
class OuverturePortSerializer(NamespacedHMSerializer):
291 292
    """Serialize `machines.models.OuverturePort` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
293
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
294
        model = machines.OuverturePort
Maël Kervella's avatar
Maël Kervella committed
295 296 297
        fields = ('begin', 'end', 'port_list', 'protocole', 'io', 'api_url')


298
# PREFERENCES
299 300


Maël Kervella's avatar
Maël Kervella committed
301
class OptionalUserSerializer(NamespacedHMSerializer):
302 303
    """Serialize `preferences.models.OptionalUser` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
304 305 306 307 308 309 310 311 312 313
    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):
314 315
    """Serialize `preferences.models.OptionalMachine` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
316 317 318 319 320 321 322 323
    class Meta:
        model = preferences.OptionalMachine
        fields = ('password_machine', 'max_lambdauser_interfaces',
                  'max_lambdauser_aliases', 'ipv6_mode', 'create_machine',
                  'ipv6')


class OptionalTopologieSerializer(NamespacedHMSerializer):
324 325
    """Serialize `preferences.models.OptionalTopologie` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
326 327 328 329 330 331 332
    class Meta:
        model = preferences.OptionalTopologie
        fields = ('radius_general_policy', 'vlan_decision_ok',
                  'vlan_decision_nok')


class GeneralOptionSerializer(NamespacedHMSerializer):
333 334
    """Serialize `preferences.models.GeneralOption` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
335 336 337 338 339 340 341 342
    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')


343
class HomeServiceSerializer(NamespacedHMSerializer):
344 345
    """Serialize `preferences.models.Service` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
346 347 348
    class Meta:
        model = preferences.Service
        fields = ('name', 'url', 'description', 'image', 'api_url')
349 350 351
        extra_kwargs = {
            'api_url': {'view_name': 'homeservice-detail'}
        }
Maël Kervella's avatar
Maël Kervella committed
352 353 354


class AssoOptionSerializer(NamespacedHMSerializer):
355 356
    """Serialize `preferences.models.AssoOption` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
357 358 359 360 361 362 363 364
    class Meta:
        model = preferences.AssoOption
        fields = ('name', 'siret', 'adresse1', 'adresse2', 'contact',
                  'telephone', 'pseudo', 'utilisateur_asso', 'payment',
                  'payment_id', 'payment_pass', 'description')


class HomeOptionSerializer(NamespacedHMSerializer):
365 366
    """Serialize `preferences.models.HomeOption` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
367 368 369 370 371 372
    class Meta:
        model = preferences.HomeOption
        fields = ('facebook_url', 'twitter_url', 'twitter_account_name')


class MailMessageOptionSerializer(NamespacedHMSerializer):
373 374
    """Serialize `preferences.models.MailMessageOption` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
375 376 377
    class Meta:
        model = preferences.MailMessageOption
        fields = ('welcome_mail_fr', 'welcome_mail_en')
378 379


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

381
# TOPOLOGIE
Maël Kervella's avatar
Maël Kervella committed
382 383


Maël Kervella's avatar
Maël Kervella committed
384
class StackSerializer(NamespacedHMSerializer):
385 386
    """Serialize `topologie.models.Stack` objects
    """
Maël Kervella's avatar
Maël Kervella committed
387
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
388
        model = topologie.Stack
Maël Kervella's avatar
Maël Kervella committed
389 390 391 392
        fields = ('name', 'stack_id', 'details', 'member_id_min',
                  'member_id_max', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
393
class AccessPointSerializer(NamespacedHMSerializer):
394 395
    """Serialize `topologie.models.AccessPoint` objects
    """
Maël Kervella's avatar
Maël Kervella committed
396
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
397
        model = topologie.AccessPoint
Maël Kervella's avatar
Maël Kervella committed
398 399 400
        fields = ('user', 'name', 'active', 'location', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
401
class SwitchSerializer(NamespacedHMSerializer):
402 403
    """Serialize `topologie.models.Switch` objects
    """
Maël Kervella's avatar
Maël Kervella committed
404 405
    port_amount = serializers.IntegerField(source='number')
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
406
        model = topologie.Switch
Maël Kervella's avatar
Maël Kervella committed
407 408
        fields = ('user', 'name', 'active', 'port_amount', 'stack',
                  'stack_member_id', 'model', 'switchbay', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
409 410


411 412 413 414 415 416 417 418
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
419
class ModelSwitchSerializer(NamespacedHMSerializer):
420 421
    """Serialize `topologie.models.ModelSwitch` objects
    """
Maël Kervella's avatar
Maël Kervella committed
422
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
423
        model = topologie.ModelSwitch
Maël Kervella's avatar
Maël Kervella committed
424 425 426
        fields = ('reference', 'constructor', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
427
class ConstructorSwitchSerializer(NamespacedHMSerializer):
428 429
    """Serialize `topologie.models.ConstructorSwitch` 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.ConstructorSwitch
Maël Kervella's avatar
Maël Kervella committed
432 433 434
        fields = ('name', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
435
class SwitchBaySerializer(NamespacedHMSerializer):
436 437
    """Serialize `topologie.models.SwitchBay` 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.SwitchBay
Maël Kervella's avatar
Maël Kervella committed
440 441 442
        fields = ('name', 'building', 'info', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
443
class BuildingSerializer(NamespacedHMSerializer):
444 445
    """Serialize `topologie.models.Building` 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.Building
Maël Kervella's avatar
Maël Kervella committed
448 449 450
        fields = ('name', 'api_url')


Maël Kervella's avatar
Maël Kervella committed
451
class SwitchPortSerializer(NamespacedHMSerializer):
452 453
    """Serialize `topologie.models.Port` 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.Port
Maël Kervella's avatar
Maël Kervella committed
456 457
        fields = ('switch', 'port', 'room', 'machine_interface', 'related',
                  'radius', 'vlan_force', 'details', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
458 459 460 461
        extra_kwargs = {
            'related': {'view_name': 'switchport-detail'},
            'api_url': {'view_name': 'switchport-detail'}
        }
Maël Kervella's avatar
Maël Kervella committed
462 463


Maël Kervella's avatar
Maël Kervella committed
464
class RoomSerializer(NamespacedHMSerializer):
465 466
    """Serialize `topologie.models.Room` objects
    """
Maël Kervella's avatar
Maël Kervella committed
467
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
468
        model = topologie.Room
Maël Kervella's avatar
Maël Kervella committed
469 470 471
        fields = ('name', 'details', 'api_url')


472
# USERS
473

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

Maël Kervella's avatar
Maël Kervella committed
475
class UserSerializer(NamespacedHMSerializer):
476 477
    """Serialize `users.models.User` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
478 479
    access = serializers.BooleanField(source='has_access')
    uid = serializers.IntegerField(source='uid_number')
Maël Kervella's avatar
Maël Kervella committed
480 481

    class Meta:
Maël Kervella's avatar
Maël Kervella committed
482
        model = users.User
Maël Kervella's avatar
Maël Kervella committed
483
        fields = ('name', 'pseudo', 'email', 'school', 'shell', 'comment',
Maël Kervella's avatar
Maël Kervella committed
484 485 486 487 488
                  '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
489

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

Maël Kervella's avatar
Maël Kervella committed
491
class ClubSerializer(NamespacedHMSerializer):
492 493
    """Serialize `users.models.Club` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
494 495 496
    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
497 498

    class Meta:
Maël Kervella's avatar
Maël Kervella committed
499
        model = users.Club
Maël Kervella's avatar
Maël Kervella committed
500
        fields = ('name', 'pseudo', 'email', 'school', 'shell', 'comment',
Maël Kervella's avatar
Maël Kervella committed
501
                  'state', 'registered', 'telephone', 'solde', 'room',
Maël Kervella's avatar
Maël Kervella committed
502 503
                  'access', 'end_access', 'administrators', 'members',
                  'mailing', 'uid', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
504 505 506
        extra_kwargs = {
            'shell': {'view_name': 'shell-detail'}
        }
Maël Kervella's avatar
Maël Kervella committed
507 508


Maël Kervella's avatar
Maël Kervella committed
509
class AdherentSerializer(NamespacedHMSerializer):
510 511
    """Serialize `users.models.Adherent` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
512 513
    access = serializers.BooleanField(source='has_access')
    uid = serializers.IntegerField(source='uid_number')
Maël Kervella's avatar
Maël Kervella committed
514

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


Maël Kervella's avatar
Maël Kervella committed
525
class ServiceUserSerializer(NamespacedHMSerializer):
526 527
    """Serialize `users.models.ServiceUser` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
528
    class Meta:
Maël Kervella's avatar
Maël Kervella committed
529
        model = users.ServiceUser
Maël Kervella's avatar
Maël Kervella committed
530
        fields = ('pseudo', 'access_group', 'comment', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
531 532


Maël Kervella's avatar
Maël Kervella committed
533
class SchoolSerializer(NamespacedHMSerializer):
534 535
    """Serialize `users.models.School` 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.School
Maël Kervella's avatar
Maël Kervella committed
538
        fields = ('name', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
539 540


Maël Kervella's avatar
Maël Kervella committed
541
class ListRightSerializer(NamespacedHMSerializer):
542 543
    """Serialize `users.models.ListRight` 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.ListRight
Maël Kervella's avatar
Maël Kervella committed
546
        fields = ('unix_name', 'gid', 'critical', 'details', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
547 548


Maël Kervella's avatar
Maël Kervella committed
549
class ShellSerializer(NamespacedHMSerializer):
550 551
    """Serialize `users.models.ListShell` 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.ListShell
Maël Kervella's avatar
Maël Kervella committed
554
        fields = ('shell', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
555 556 557
        extra_kwargs = {
            'api_url': {'view_name': 'shell-detail'}
        }
Maël Kervella's avatar
Maël Kervella committed
558 559


Maël Kervella's avatar
Maël Kervella committed
560
class BanSerializer(NamespacedHMSerializer):
561 562
    """Serialize `users.models.Ban` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
563
    active = serializers.BooleanField(source='is_active')
Maël Kervella's avatar
Maël Kervella committed
564 565

    class Meta:
Maël Kervella's avatar
Maël Kervella committed
566
        model = users.Ban
Maël Kervella's avatar
Maël Kervella committed
567 568
        fields = ('user', 'raison', 'date_start', 'date_end', 'state',
                  'active', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
569 570


Maël Kervella's avatar
Maël Kervella committed
571
class WhitelistSerializer(NamespacedHMSerializer):
572 573
    """Serialize `users.models.Whitelist` objects.
    """
Maël Kervella's avatar
Maël Kervella committed
574
    active = serializers.BooleanField(source='is_active')
Maël Kervella's avatar
Maël Kervella committed
575 576

    class Meta:
Maël Kervella's avatar
Maël Kervella committed
577
        model = users.Whitelist
Maël Kervella's avatar
Maël Kervella committed
578
        fields = ('user', 'raison', 'date_start', 'date_end', 'active', 'api_url')
Maël Kervella's avatar
Maël Kervella committed
579 580


581
# SERVICE REGEN
582 583 584


class ServiceRegenSerializer(NamespacedHMSerializer):
585 586
    """Serialize the data about the services to regen.
    """
587 588
    hostname = serializers.CharField(source='server.domain.name', read_only=True)
    service_name = serializers.CharField(source='service.service_type', read_only=True)
589
    need_regen = serializers.BooleanField()
590 591 592 593 594

    class Meta:
        model = machines.Service_link
        fields = ('hostname', 'service_name', 'need_regen', 'api_url')
        extra_kwargs = {
595
            'api_url': {'view_name': 'serviceregen-detail'}
596 597 598
        }


Maël Kervella's avatar
Maël Kervella committed
599 600 601 602
# DHCP


class HostMacIpSerializer(serializers.ModelSerializer):
603 604 605
    """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
606 607
    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
608
    mac_address = serializers.CharField(read_only=True)
Maël Kervella's avatar
Maël Kervella committed
609 610 611 612 613
    ipv4 = serializers.CharField(source='ipv4.ipv4', read_only=True)

    class Meta:
        model = machines.Interface
        fields = ('hostname', 'extension', 'mac_address', 'ipv4')
614 615 616 617 618 619


# DNS


class SOARecordSerializer(SOASerializer):
620 621 622
    """Serialize `machines.models.SOA` objects with the data needed to
    generate a SOA DNS record.
    """
623 624 625 626 627 628
    class Meta:
        model = machines.SOA
        fields = ('name', 'mail', 'refresh', 'retry', 'expire', 'ttl')


class OriginV4RecordSerializer(IpListSerializer):
629 630 631
    """Serialize `machines.models.IpList` objects with the data needed to
    generate an IPv4 Origin DNS record.
    """
632 633 634 635 636
    class Meta(IpListSerializer.Meta):
        fields = ('ipv4',)


class NSRecordSerializer(NsSerializer):
637 638 639
    """Serialize `machines.models.Ns` objects with the data needed to
    generate a NS DNS record.
    """
640 641 642 643 644 645 646
    target = serializers.CharField(source='ns.name', read_only=True)

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


class MXRecordSerializer(MxSerializer):
647 648 649
    """Serialize `machines.models.Mx` objects with the data needed to
    generate a MX DNS record.
    """
650 651 652 653 654 655 656
    target = serializers.CharField(source='name.name', read_only=True)

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


class TXTRecordSerializer(TxtSerializer):
657 658 659
    """Serialize `machines.models.Txt` objects with the data needed to
    generate a TXT DNS record.
    """
660 661 662 663 664
    class Meta(TxtSerializer.Meta):
        fields = ('field1', 'field2')


class SRVRecordSerializer(SrvSerializer):
665 666 667
    """Serialize `machines.models.Srv` objects with the data needed to
    generate a SRV DNS record.
    """
668 669 670 671 672 673 674
    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):
675 676 677
    """Serialize `machines.models.Interface` objects with the data needed to
    generate a A DNS record.
    """
678 679 680 681 682 683 684 685 686
    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):
687 688 689
    """Serialize `machines.models.Interface` objects with the data needed to
    generate a AAAA DNS record.
    """
690
    hostname = serializers.CharField(source='domain.name', read_only=True)
691
    ipv6 = Ipv6ListSerializer(many=True, read_only=True)
692 693 694 695 696 697 698

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


class CNAMERecordSerializer(serializers.ModelSerializer):
699 700 701
    """Serialize `machines.models.Domain` objects with the data needed to
    generate a CNAME DNS record.
    """
702 703 704 705 706 707 708 709
    alias = serializers.CharField(source='cname.name', read_only=True)
    hostname = serializers.CharField(source='name', read_only=True)

    class Meta:
        model = machines.Domain
        fields = ('alias', 'hostname')


710
class DNSZonesSerializer(serializers.ModelSerializer):
711 712
    """Serialize the data about DNS Zones.
    """
713 714 715
    soa = SOARecordSerializer()
    ns_records = NSRecordSerializer(many=True, source='ns_set')
    originv4 = OriginV4RecordSerializer(source='origin')
716
    originv6 = serializers.CharField(source='origin_v6')
717 718 719 720 721 722 723 724 725 726 727
    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')

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


731
# MAILING
Maël Kervella's avatar
Maël Kervella committed
732 733 734


class MailingMemberSerializer(UserSerializer):
735 736
    """Serialize the data about a mailing member.
    """
Maël Kervella's avatar
Maël Kervella committed
737 738 739 740
    class Meta(UserSerializer.Meta):
        fields = ('name', 'pseudo', 'email')

class MailingSerializer(ClubSerializer):
741 742
    """Serialize the data about a mailing.
    """
Maël Kervella's avatar
Maël Kervella committed
743 744 745 746 747
    members = MailingMemberSerializer(many=True)
    admins = MailingMemberSerializer(source='administrators', many=True)

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