qrtr-services/api/serializers.py

138 lines
4.6 KiB
Python
Executable File

from django.contrib.auth.models import Group
from django.contrib.auth import get_user_model
from rest_framework import serializers
from qrtr_account.models import Account, Bank, Institution, Transaction, Slice, Rule
from user.models import User
from connection.models import Connection, ConnectionType
from connection.serializers import ConnectionTypeSerializer, ConnectionSerializer
class UserAccountSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = get_user_model()
fields = ['pk', 'url', 'username', 'email', 'groups']
class AccountReadSerializer(serializers.HyperlinkedModelSerializer):
owner = UserAccountSerializer(read_only=True)
admin_users = UserAccountSerializer(many=True, read_only=True)
view_users = UserAccountSerializer(many=True, read_only=True)
class Meta:
model = Account
fields = ['pk', 'url', 'owner', 'name', 'admin_users', 'view_users']
class AccountWriteSerializer(serializers.HyperlinkedModelSerializer):
owner = serializers.SlugRelatedField(slug_field='pk', queryset=User.objects.all())
admin_users = serializers.SlugRelatedField(slug_field='pk', queryset=User.objects.all(), many=True)
view_users = serializers.SlugRelatedField(slug_field='pk', queryset=User.objects.all(), many=True)
class Meta:
model = Account
fields = ['pk', 'url', 'owner', 'name', 'admin_users', 'view_users']
class UserSerializer(serializers.HyperlinkedModelSerializer):
owned_accounts = AccountReadSerializer(many=True, read_only=True)
admin_accounts = AccountReadSerializer(many=True, read_only=True)
view_accounts = AccountReadSerializer(many=True, read_only=True)
class Meta:
model = get_user_model()
fields = ['pk', 'url', 'username', 'email', 'groups', 'owned_accounts',
'admin_accounts', 'view_accounts']
class GroupSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Group
fields = ['url', 'name']
class BankSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Bank
fields = [
'url',
'qrtr_account',
'connection',
'institution',
'nickname',
'balance',
'ac_type',
'ac_subtype',
]
extra_kwargs = {
'balance': {'read_only': True},
'connection': {'read_only': True},
'institution': {'read_only': True},
'ac_type': {'read_only': True},
'ac_subtype': {'read_only': True}
}
class BankSerializerPOST(BankSerializer):
"""Separate Serializer for POST requests to create a new bank. This adds
a new field called connection_details that is used to create a new
connection record to go with the new Bank. This field is only allowed on
POST because we don't want to expose this information to the user, or allow
them to change it b/c that could lead to an integrity problem, breaking
their bank functionality.
"""
# connection_details = serializers.JSONField(
# write_only=True,
# required=True,
# initial={
# "type": f"{' OR '.join(ConnectionType.objects.all().values_list('name', flat=True))}",
# "credentials": {}})
class Meta:
model = Bank
fields = [
'url',
'qrtr_account',
'connection',
'institution',
'nickname',
'balance',
'ac_type',
'ac_subtype',
# 'connection_details'
]
extra_kwargs = {
'balance': {'read_only': True},
# 'connection': {'read_only': True},
'institution': {'read_only': True},
'ac_type': {'read_only': True},
'ac_subtype': {'read_only': True}
}
class InstitutionSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Institution
fields = ['url', 'name']
class TransactionSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Transaction
fields = ['url', 'authorized_date',
'bank', 'name','details','slice','trans_id',
'updated_at','created_at']
class SliceSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Slice
fields = ['url', 'name', 'icon', 'budget', 'slice_of']
class RuleSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Rule
fields = [
'url',
'name',
'kind',
'when_to_run',
'amount',
'source',
'destination']