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, BankAccount, Institution, Transaction, Slice, Rule, SubscriptionPlan 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 = ['pk', 'url', 'name'] class SubscriptionPlanSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = SubscriptionPlan fields = ['pk', 'name', 'status'] class BankAccountSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = BankAccount fields = [ 'pk', 'url', 'qrtr_account', 'connection', 'institution', 'nickname', 'balance', 'ac_type', 'ac_subtype', 'connection_type', 'institution_name', 'plan', 'plan_name' ] 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 BankAccountSerializerPOST(BankAccountSerializer): """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 BankAccount. 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 = BankAccount fields = [ 'pk', '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 = ['pk', 'url', 'name'] class TransactionSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Transaction fields = ['pk', 'url', 'authorized_date', 'bank', 'name','details','slice','trans_id', 'updated_at','created_at'] class SliceSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Slice fields = ['pk', 'url', 'name', 'icon', 'description', 'balance', 'slice_of', 'bank_acc'] class SliceTransactionSerializer(serializers.ModelSerializer): transactions = TransactionSerializer(many=True, read_only=True) class Meta: model = Slice fields = ['pk', 'url', 'name', 'icon', 'description', 'balance', 'slice_of', 'transactions', 'bank_acc'] class RuleSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Rule fields = [ 'url', 'name', 'kind', 'when_to_run', 'amount', 'source', 'destination']