Pular para conteúdo

Serializers

AccountSerializer

Bases: ModelSerializer

Serializer para o modelo Account.

Atributos

Nenhum atributo específico nesta classe.

Métodos

validate: Valida os dados fornecidos durante a serialização.

Campos

Todos os campoos do modelo Account.

Source code in finances/serializers.py
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
class AccountSerializer(serializers.ModelSerializer):
    """
    Serializer para o modelo Account.

    Atributos:
        Nenhum atributo específico nesta classe.

    Métodos:
        validate: Valida os dados fornecidos durante a serialização.

    Campos:
        Todos os campoos do modelo Account.
    """
    class Meta:
        model = Account
        fields = '__all__'

    def validate(self, data):
        """
        Validação personalizada para o serializer Account.

        Parâmetros:
            data: Os dados a serem validados.

        Retorna:
            data: Os dados validados.
        """

        if data.get('balance') is not None and data['balance'] < 0:
            raise serializers.ValidationError(
                {'balance': ['The balance must not be negative.']}
            )

        request = self.context.get('request')
        if request and request.method == 'PATCH':
            if 'balance' in data:
                instance = self.instance
                balance_update = data['balance']
                instance.balance = balance_update

                instance.save()

                return {'balance': instance.balance}

        if not data.get('owner'):
            raise serializers.ValidationError(
                {'owner': ['Este campo é obrigatório.']}
            )

        return data

validate(data)

Validação personalizada para o serializer Account.

Parâmetros

data: Os dados a serem validados.

Retorna

data: Os dados validados.

Source code in finances/serializers.py
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
def validate(self, data):
    """
    Validação personalizada para o serializer Account.

    Parâmetros:
        data: Os dados a serem validados.

    Retorna:
        data: Os dados validados.
    """

    if data.get('balance') is not None and data['balance'] < 0:
        raise serializers.ValidationError(
            {'balance': ['The balance must not be negative.']}
        )

    request = self.context.get('request')
    if request and request.method == 'PATCH':
        if 'balance' in data:
            instance = self.instance
            balance_update = data['balance']
            instance.balance = balance_update

            instance.save()

            return {'balance': instance.balance}

    if not data.get('owner'):
        raise serializers.ValidationError(
            {'owner': ['Este campo é obrigatório.']}
        )

    return data

BudgetSerializer

Bases: ModelSerializer

Serializer para o modelo Budget.

Atributos

Nenhum atributo específico nesta classe.

Métodos

validate: Valida os dados fornecidos durante a serialização.

Campos

Todos os campos do modelo Budget.

Source code in finances/serializers.py
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
class BudgetSerializer(serializers.ModelSerializer):
    """
    Serializer para o modelo Budget.

    Atributos:
        Nenhum atributo específico nesta classe.

    Métodos:
        validate: Valida os dados fornecidos durante a serialização.

    Campos:
        Todos os campos do modelo Budget.
    """

    class Meta:
        model = Budget
        fields = '__all__'

    def validate(self, data):
        """
        Validação personalizada para o serializer Account.

        Parâmetros:
            data: Os dados a serem validados.

        Retorna:
            data: Os dados validados.
        """

        if not data.get('account'):
            raise serializers.ValidationError(
                {'account': ['Este campo é obrigatório.']}
            )
        if not data.get('category'):
            raise serializers.ValidationError(
                {'category': ['Este campo é obrigatório.']}
            )
        if not data.get('amount'):
            raise serializers.ValidationError(
                {'amount': ['Este campo é obrigatório.']}
            )

        existing_budgets = Budget.objects.filter(
            account=data.get('account'),
            category=data.get('category'),
            amount=data.get('amount'),
            start_date=data.get('start_date'),
            end_date=data.get('end_date')
        )

        if existing_budgets.exists():
            raise serializers.ValidationError('The budget already exists.')

        return data

    def update(self, instance, validated_data):
        """
        Atualiza uma transação existente e ajusta o gasto do orçamento, se
        necessário.

        Parâmetros:
            instance: A transação existente.
            validated_data: Dados validados para atualização.

        Retorna:
            Transaction: A transação atualizada.
        """

        request = self.context.get('request')
        if request and request.method == 'PUT':
            if 'amount' in validated_data:
                budget_amount = validated_data['amount']
                instance.amount = budget_amount

                if budget_amount < 0:
                    raise serializers.ValidationError(
                        {'amount': [
                            'The budget value must not be negative.'
                        ]
                        }
                    )

                instance.save()
                return instance

        instance.amount = validated_data.get('amount', instance.amount)
        instance.account = validated_data.get('account', instance.account)
        instance.category = validated_data.get('category', instance.category)
        instance.start_date = validated_data.get(
            'start_date', instance.start_date
        )
        instance.end_date = validated_data.get('end_date', instance.end_date)

        instance.save()
        return instance

update(instance, validated_data)

Atualiza uma transação existente e ajusta o gasto do orçamento, se necessário.

Parâmetros

instance: A transação existente. validated_data: Dados validados para atualização.

Retorna

Transaction: A transação atualizada.

Source code in finances/serializers.py
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
def update(self, instance, validated_data):
    """
    Atualiza uma transação existente e ajusta o gasto do orçamento, se
    necessário.

    Parâmetros:
        instance: A transação existente.
        validated_data: Dados validados para atualização.

    Retorna:
        Transaction: A transação atualizada.
    """

    request = self.context.get('request')
    if request and request.method == 'PUT':
        if 'amount' in validated_data:
            budget_amount = validated_data['amount']
            instance.amount = budget_amount

            if budget_amount < 0:
                raise serializers.ValidationError(
                    {'amount': [
                        'The budget value must not be negative.'
                    ]
                    }
                )

            instance.save()
            return instance

    instance.amount = validated_data.get('amount', instance.amount)
    instance.account = validated_data.get('account', instance.account)
    instance.category = validated_data.get('category', instance.category)
    instance.start_date = validated_data.get(
        'start_date', instance.start_date
    )
    instance.end_date = validated_data.get('end_date', instance.end_date)

    instance.save()
    return instance

validate(data)

Validação personalizada para o serializer Account.

Parâmetros

data: Os dados a serem validados.

Retorna

data: Os dados validados.

Source code in finances/serializers.py
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
def validate(self, data):
    """
    Validação personalizada para o serializer Account.

    Parâmetros:
        data: Os dados a serem validados.

    Retorna:
        data: Os dados validados.
    """

    if not data.get('account'):
        raise serializers.ValidationError(
            {'account': ['Este campo é obrigatório.']}
        )
    if not data.get('category'):
        raise serializers.ValidationError(
            {'category': ['Este campo é obrigatório.']}
        )
    if not data.get('amount'):
        raise serializers.ValidationError(
            {'amount': ['Este campo é obrigatório.']}
        )

    existing_budgets = Budget.objects.filter(
        account=data.get('account'),
        category=data.get('category'),
        amount=data.get('amount'),
        start_date=data.get('start_date'),
        end_date=data.get('end_date')
    )

    if existing_budgets.exists():
        raise serializers.ValidationError('The budget already exists.')

    return data

CategorySerializer

Bases: ModelSerializer

Serializer para o modelo Category.

Atributos

Nenhum atributo específico nesta classe.

Métodos

Nenhum método específico nesta classe.

Campos

Todos os campos do modelo Category.

Source code in finances/serializers.py
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
class CategorySerializer(serializers.ModelSerializer):
    """
    Serializer para o modelo Category.

    Atributos:
        Nenhum atributo específico nesta classe.

    Métodos:
        Nenhum método específico nesta classe.

    Campos:
        Todos os campos do modelo Category.
    """
    class Meta:
        model = Category
        fields = '__all__'

    def validate(self, data):
        existing_category = Category.objects.filter(
            name=data.get('name')
        )

        if existing_category.exists():
            raise serializers.ValidationError('The category already exists.')

        return data

OwnerSerializer

Bases: ModelSerializer

Serializer para o modelo Owner.

Atributos

Nenhum atributo específico nesta classe.

Métodos

validate: Valida os dados fornecidos durante a serialização. create: Cria uma nova instância de Owner.

Campos
  • id
  • username
  • first_name
  • last_name
  • email
  • password
Source code in finances/serializers.py
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
class OwnerSerializer(serializers.ModelSerializer):
    """
    Serializer para o modelo Owner.

    Atributos:
        Nenhum atributo específico nesta classe.

    Métodos:
        validate: Valida os dados fornecidos durante a serialização.
        create: Cria uma nova instância de Owner.

    Campos:
        - id
        - username
        - first_name
        - last_name
        - email
        - password
    """
    class Meta:
        model = User
        fields = (
            'id', 'username', 'first_name', 'last_name', 'email', 'password'
        )
        extra_kwargs = {
            'password': {'write_only': True}
        }

    def validate(self, data):
        """
        Validação personalizada para o serializer Onwer.

        Parâmetros:
            data: os dados a serem validados.

        Retorna:
            data: Os dados validados.
        """

        is_creation_request = self.context.get('is_creation_request', False)

        if is_creation_request:
            if not data.get('first_name'):
                raise serializers.ValidationError(
                    {'first_name': ['Este campo é obrigatório.']}
                )
            if not data.get('last_name'):
                raise serializers.ValidationError(
                    {'last_name': ['Este campo é obrigatório.']}
                )
            if not data.get('email'):
                raise serializers.ValidationError(
                    {'email': ['Este campo é obrigatório.']}
                )

        if 'password' in data:
            data['password'] = make_password(data['password'])

        return data

    def create(self, validated_data):
        """
        Cria uma nova instância de Owner.

        Parâmetros:
            validated_data: Os dados validados para criar o proprietário.

        Retorna:
            user: A instância de Owner criada.
        """

        owner = User.objects.create(**validated_data)

        return owner

create(validated_data)

Cria uma nova instância de Owner.

Parâmetros

validated_data: Os dados validados para criar o proprietário.

Retorna

user: A instância de Owner criada.

Source code in finances/serializers.py
381
382
383
384
385
386
387
388
389
390
391
392
393
394
def create(self, validated_data):
    """
    Cria uma nova instância de Owner.

    Parâmetros:
        validated_data: Os dados validados para criar o proprietário.

    Retorna:
        user: A instância de Owner criada.
    """

    owner = User.objects.create(**validated_data)

    return owner

validate(data)

Validação personalizada para o serializer Onwer.

Parâmetros

data: os dados a serem validados.

Retorna

data: Os dados validados.

Source code in finances/serializers.py
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
def validate(self, data):
    """
    Validação personalizada para o serializer Onwer.

    Parâmetros:
        data: os dados a serem validados.

    Retorna:
        data: Os dados validados.
    """

    is_creation_request = self.context.get('is_creation_request', False)

    if is_creation_request:
        if not data.get('first_name'):
            raise serializers.ValidationError(
                {'first_name': ['Este campo é obrigatório.']}
            )
        if not data.get('last_name'):
            raise serializers.ValidationError(
                {'last_name': ['Este campo é obrigatório.']}
            )
        if not data.get('email'):
            raise serializers.ValidationError(
                {'email': ['Este campo é obrigatório.']}
            )

    if 'password' in data:
        data['password'] = make_password(data['password'])

    return data

TransactionSerializer

Bases: ModelSerializer

Serializer para o modelo Transaction.

Campos
  • id: O identificador único da transação (somente leitura).
  • amount: O valor da transação.
  • description: A descrição da transação.
  • account: A conta associada à transação.
  • category: A categoria à qual a transação pertence.
Métodos
  • validate: Realiza validações personalizadas durante a serialização.
  • create: Cria uma nova instância de transação e atualiza os saldos da conta e orçamento, se aplicável.
  • update: Atualiza uma transação existente e ajusta o gasto do orçamento, se necessário.
Source code in finances/serializers.py
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
class TransactionSerializer(serializers.ModelSerializer):
    """
    Serializer para o modelo Transaction.

    Campos:
        - id: O identificador único da transação (somente leitura).
        - amount: O valor da transação.
        - description: A descrição da transação.
        - account: A conta associada à transação.
        - category: A categoria à qual a transação pertence.

    Métodos:
        - validate: Realiza validações personalizadas durante a serialização.
        - create: Cria uma nova instância de transação e atualiza os saldos da
        conta e orçamento, se aplicável.
        - update: Atualiza uma transação existente e ajusta o gasto do
        orçamento, se necessário.
    """
    class Meta:
        model = Transaction
        fields = ('id', 'amount', 'description', 'account', 'category')

    def validate(self, data):
        """
        Valida os dados fornecidos durante a serialização.

        Parâmetros:
            data: Os dados a serem validados.

        Retorna:
            data: Os dados validados.
        """

        if not data.get('amount'):
            raise serializers.ValidationError(
                {'amount': ['Este campo é obrigatório.']}
            )

        if not data.get('description'):
            raise serializers.ValidationError(
                {'description': ['Este campo é obrigatório.']}
            )

        if not data.get('account'):
            raise serializers.ValidationError(
                {'account': ['Este campo é obrigatório.']}
            )

        if not data.get('category'):
            raise serializers.ValidationError(
                {'category': ['Este campo é obrigatório.']}
            )

        account = data['account']
        if data.get('amount') > account.balance:
            raise serializers.ValidationError(
                'Insufficient balance for the transaction.'
            )

        category = data['category']

        if category.budget_set.exists():
            budget = category.budget_set.first()
            if data.get('amount') > budget.amount:
                raise serializers.ValidationError(
                    'The value of the transaction exceeds the budget for this category.'  # noqa: 501
                )

        return data

    def create(self, validated_data):
        """
        Cria uma nova transação e atualiza o saldo da conta e o gasto do
        orçamento, se aplicável.

        Parâmetros:
            validated_data: Dados validados da transação.

        Retorna:
            transaction: A transação recém-criada.
        """

        transaction_amount = validated_data['amount']
        account = validated_data['account']
        category = validated_data['category']
        budget = None

        if category.budget_set.exists():
            budget = category.budget_set.first()

        transaction = Transaction.objects.create(**validated_data)

        account.balance -= transaction_amount
        account.save()

        if budget:
            budget.spent += transaction_amount
            budget.save()

        return transaction

    def update(self, instance, validated_data):
        """
        Atualiza uma transação existente e ajusta o gasto do orçamento, se
        necessário.

        Parâmetros:
            instance: A transação existente.
            validated_data: Dados validados para atualização.

        Retorna:
            transaction: A transação atualizada.
        """

        old_amount = instance.amount
        new_amount = validated_data.get('amount', old_amount)
        account = instance.account
        category = instance.category

        if category.budget_set.exists():
            budget = category.budget_set.first()
            if new_amount != old_amount:
                difference = new_amount - old_amount
                budget.spent += difference
                budget.save()

        instance.amount = new_amount
        instance.description = validated_data.get(
            'description', instance.description
        )
        instance.category = validated_data.get('category', instance.category)
        instance.save()
        account.save()

        return instance

create(validated_data)

Cria uma nova transação e atualiza o saldo da conta e o gasto do orçamento, se aplicável.

Parâmetros

validated_data: Dados validados da transação.

Retorna

transaction: A transação recém-criada.

Source code in finances/serializers.py
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
def create(self, validated_data):
    """
    Cria uma nova transação e atualiza o saldo da conta e o gasto do
    orçamento, se aplicável.

    Parâmetros:
        validated_data: Dados validados da transação.

    Retorna:
        transaction: A transação recém-criada.
    """

    transaction_amount = validated_data['amount']
    account = validated_data['account']
    category = validated_data['category']
    budget = None

    if category.budget_set.exists():
        budget = category.budget_set.first()

    transaction = Transaction.objects.create(**validated_data)

    account.balance -= transaction_amount
    account.save()

    if budget:
        budget.spent += transaction_amount
        budget.save()

    return transaction

update(instance, validated_data)

Atualiza uma transação existente e ajusta o gasto do orçamento, se necessário.

Parâmetros

instance: A transação existente. validated_data: Dados validados para atualização.

Retorna

transaction: A transação atualizada.

Source code in finances/serializers.py
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
def update(self, instance, validated_data):
    """
    Atualiza uma transação existente e ajusta o gasto do orçamento, se
    necessário.

    Parâmetros:
        instance: A transação existente.
        validated_data: Dados validados para atualização.

    Retorna:
        transaction: A transação atualizada.
    """

    old_amount = instance.amount
    new_amount = validated_data.get('amount', old_amount)
    account = instance.account
    category = instance.category

    if category.budget_set.exists():
        budget = category.budget_set.first()
        if new_amount != old_amount:
            difference = new_amount - old_amount
            budget.spent += difference
            budget.save()

    instance.amount = new_amount
    instance.description = validated_data.get(
        'description', instance.description
    )
    instance.category = validated_data.get('category', instance.category)
    instance.save()
    account.save()

    return instance

validate(data)

Valida os dados fornecidos durante a serialização.

Parâmetros

data: Os dados a serem validados.

Retorna

data: Os dados validados.

Source code in finances/serializers.py
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
def validate(self, data):
    """
    Valida os dados fornecidos durante a serialização.

    Parâmetros:
        data: Os dados a serem validados.

    Retorna:
        data: Os dados validados.
    """

    if not data.get('amount'):
        raise serializers.ValidationError(
            {'amount': ['Este campo é obrigatório.']}
        )

    if not data.get('description'):
        raise serializers.ValidationError(
            {'description': ['Este campo é obrigatório.']}
        )

    if not data.get('account'):
        raise serializers.ValidationError(
            {'account': ['Este campo é obrigatório.']}
        )

    if not data.get('category'):
        raise serializers.ValidationError(
            {'category': ['Este campo é obrigatório.']}
        )

    account = data['account']
    if data.get('amount') > account.balance:
        raise serializers.ValidationError(
            'Insufficient balance for the transaction.'
        )

    category = data['category']

    if category.budget_set.exists():
        budget = category.budget_set.first()
        if data.get('amount') > budget.amount:
            raise serializers.ValidationError(
                'The value of the transaction exceeds the budget for this category.'  # noqa: 501
            )

    return data