From 509a102b155bed53adf4e0cbc0b11ab04ca232c1 Mon Sep 17 00:00:00 2001 From: DJ Gillespie Date: Wed, 10 Feb 2021 18:37:15 -0700 Subject: [PATCH 1/4] Fixed transactionserializer invalid field references. --- api/serializers.py | 4 +++- qrtr_account/models.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/api/serializers.py b/api/serializers.py index 7abbb74..3ff3623 100755 --- a/api/serializers.py +++ b/api/serializers.py @@ -113,7 +113,9 @@ class InstitutionSerializer(serializers.HyperlinkedModelSerializer): class TransactionSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Transaction - fields = ['url', 'datetime', 'Bank', 'details'] + fields = ['url', 'authorized_date', + 'bank', 'name','details','slice','trans_id', + 'updated_at','created_at'] class SliceSerializer(serializers.HyperlinkedModelSerializer): diff --git a/qrtr_account/models.py b/qrtr_account/models.py index f625ca0..8591c06 100644 --- a/qrtr_account/models.py +++ b/qrtr_account/models.py @@ -117,7 +117,7 @@ class Transaction(models.Model): related_name='transactions') name = models.CharField(max_length=255) details = models.JSONField() - Slice = models.ForeignKey(Slice, on_delete=models.SET_NULL, null=True) + slice = models.ForeignKey(Slice, on_delete=models.SET_NULL, null=True) trans_id = models.CharField(max_length=255) updated_at = models.DateTimeField(auto_now=True) created_at = models.DateTimeField(auto_now_add=True) From d9f56196f2a794d4e655aff75a8eaa285c43bbb9 Mon Sep 17 00:00:00 2001 From: DJ Gillespie Date: Wed, 10 Feb 2021 18:37:33 -0700 Subject: [PATCH 2/4] migration fixing typo on slice fk --- .../migrations/0008_auto_20210211_0136.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 qrtr_account/migrations/0008_auto_20210211_0136.py diff --git a/qrtr_account/migrations/0008_auto_20210211_0136.py b/qrtr_account/migrations/0008_auto_20210211_0136.py new file mode 100644 index 0000000..6842203 --- /dev/null +++ b/qrtr_account/migrations/0008_auto_20210211_0136.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.3 on 2021-02-11 01:36 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('qrtr_account', '0007_auto_20210128_0325'), + ] + + operations = [ + migrations.RenameField( + model_name='transaction', + old_name='Slice', + new_name='slice', + ), + ] From e19e0fe659123f0dee4afa3d83f5e0c6b30ec772 Mon Sep 17 00:00:00 2001 From: DJ Gillespie Date: Mon, 17 May 2021 18:33:02 -0600 Subject: [PATCH 3/4] Updates to new slice backend, and updated access permissions. --- .../migrations/0009_auto_20210211_0202.py | 20 +++++++++++++++++++ .../migrations/0010_auto_20210211_0202.py | 20 +++++++++++++++++++ .../migrations/0011_auto_20210211_0203.py | 18 +++++++++++++++++ .../migrations/0012_slice_description.py | 18 +++++++++++++++++ qrtr_account/models.py | 5 +++-- qrtr_account/views.py | 17 ++++++++-------- 6 files changed, 88 insertions(+), 10 deletions(-) create mode 100644 qrtr_account/migrations/0009_auto_20210211_0202.py create mode 100644 qrtr_account/migrations/0010_auto_20210211_0202.py create mode 100644 qrtr_account/migrations/0011_auto_20210211_0203.py create mode 100644 qrtr_account/migrations/0012_slice_description.py diff --git a/qrtr_account/migrations/0009_auto_20210211_0202.py b/qrtr_account/migrations/0009_auto_20210211_0202.py new file mode 100644 index 0000000..74074bb --- /dev/null +++ b/qrtr_account/migrations/0009_auto_20210211_0202.py @@ -0,0 +1,20 @@ +# Generated by Django 3.1.3 on 2021-02-11 02:02 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('qrtr_account', '0008_auto_20210211_0136'), + ] + + operations = [ + migrations.AlterField( + model_name='slice', + name='parent_type', + field=models.ForeignKey(limit_choices_to=models.Q(models.Q(('app_label', 'qrtr_account'), ('model', 'bank')), models.Q(('app_label', 'qrtr_account'), ('model', 'slice')), _connector='OR'), null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype'), + ), + ] diff --git a/qrtr_account/migrations/0010_auto_20210211_0202.py b/qrtr_account/migrations/0010_auto_20210211_0202.py new file mode 100644 index 0000000..ae70c39 --- /dev/null +++ b/qrtr_account/migrations/0010_auto_20210211_0202.py @@ -0,0 +1,20 @@ +# Generated by Django 3.1.3 on 2021-02-11 02:02 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('qrtr_account', '0009_auto_20210211_0202'), + ] + + operations = [ + migrations.AlterField( + model_name='slice', + name='parent_type', + field=models.ForeignKey(blank=True, limit_choices_to=models.Q(models.Q(('app_label', 'qrtr_account'), ('model', 'bank')), models.Q(('app_label', 'qrtr_account'), ('model', 'slice')), _connector='OR'), null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype'), + ), + ] diff --git a/qrtr_account/migrations/0011_auto_20210211_0203.py b/qrtr_account/migrations/0011_auto_20210211_0203.py new file mode 100644 index 0000000..469c9e9 --- /dev/null +++ b/qrtr_account/migrations/0011_auto_20210211_0203.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.3 on 2021-02-11 02:03 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('qrtr_account', '0010_auto_20210211_0202'), + ] + + operations = [ + migrations.AlterField( + model_name='slice', + name='parent_id', + field=models.PositiveIntegerField(null=True), + ), + ] diff --git a/qrtr_account/migrations/0012_slice_description.py b/qrtr_account/migrations/0012_slice_description.py new file mode 100644 index 0000000..c2ec032 --- /dev/null +++ b/qrtr_account/migrations/0012_slice_description.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.3 on 2021-02-11 02:35 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('qrtr_account', '0011_auto_20210211_0203'), + ] + + operations = [ + migrations.AddField( + model_name='slice', + name='description', + field=models.TextField(blank=True, max_length=255, null=True), + ), + ] diff --git a/qrtr_account/models.py b/qrtr_account/models.py index 8591c06..01fe781 100644 --- a/qrtr_account/models.py +++ b/qrtr_account/models.py @@ -60,6 +60,7 @@ class Slice(models.Model): name = models.CharField(max_length=250) icon = models.CharField(max_length=250) budget = models.DecimalField(decimal_places=3, max_digits=100) + description = models.TextField(max_length=255, null=True, blank=True) avail_parents = models.Q( app_label='qrtr_account', model='bank') | models.Q( @@ -68,8 +69,8 @@ class Slice(models.Model): parent_type = models.ForeignKey( ContentType, limit_choices_to=avail_parents, - on_delete=models.CASCADE) - parent_id = models.PositiveIntegerField() + on_delete=models.CASCADE, null=True, blank=True) + parent_id = models.PositiveIntegerField(null=True) is_unsliced = models.BooleanField(default=False) slice_of = GenericForeignKey('parent_type', 'parent_id') diff --git a/qrtr_account/views.py b/qrtr_account/views.py index c6f6322..0fc68e0 100644 --- a/qrtr_account/views.py +++ b/qrtr_account/views.py @@ -1,6 +1,7 @@ from django.shortcuts import render from rest_framework import viewsets, mixins from .models import Account, Bank, Institution, Transaction, Slice, Rule +from rest_framework.permissions import IsAuthenticated from connection.models import Connection, ConnectionType from api.serializers import (AccountReadSerializer, AccountWriteSerializer, BankSerializer, BankSerializerPOST, @@ -46,6 +47,13 @@ class BankViewSet(viewsets.ModelViewSet): return BankSerializer +class SliceViewSet(viewsets.ModelViewSet): + """API endpoint that allows Banks to be viewed. + """ + queryset = Slice.objects.all() + serializer_class = SliceSerializer + + class InstitutionViewSet(viewsets.ReadOnlyModelViewSet): """API endpoint that allows Banks to be viewed. """ @@ -53,20 +61,13 @@ class InstitutionViewSet(viewsets.ReadOnlyModelViewSet): serializer_class = InstitutionSerializer -class TransactionViewSet(viewsets.ReadOnlyModelViewSet): +class TransactionViewSet(viewsets.ModelViewSet): """API endpoint that allows Banks to be viewed. """ queryset = Transaction.objects.all() serializer_class = TransactionSerializer -class SliceViewSet(viewsets.ReadOnlyModelViewSet): - """API endpoint that allows Banks to be viewed. - """ - queryset = Slice.objects.all() - serializer_class = SliceSerializer - - class RuleViewSet(viewsets.ReadOnlyModelViewSet): """API endpoint that allows Banks to be viewed. """ From d00fb4b5a15803c23bd0dd6586a9f88404dfe2a7 Mon Sep 17 00:00:00 2001 From: DJ Gillespie Date: Mon, 17 May 2021 20:13:31 -0600 Subject: [PATCH 4/4] [QRTR-110] Added Filtering options, and adjusted for Django 3.2 updates. --- core/settings/__init__.py | 7 ++++++- qrtr_account/apps.py | 2 +- qrtr_account/views.py | 7 +++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/core/settings/__init__.py b/core/settings/__init__.py index d473630..49e17de 100644 --- a/core/settings/__init__.py +++ b/core/settings/__init__.py @@ -47,6 +47,7 @@ INSTALLED_APPS = [ 'qrtr_account', 'corsheaders', 'rest_framework_simplejwt.token_blacklist', + 'django_filters', ] EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' @@ -92,6 +93,7 @@ TEMPLATES = [ WSGI_APPLICATION = 'core.wsgi.application' +DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' # Database # https://docs.djangoproject.com/en/2.2/ref/settings/#databases @@ -102,7 +104,10 @@ REST_FRAMEWORK = { 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.TokenAuthentication', 'dj_rest_auth.jwt_auth.JWTCookieAuthentication' - ] + ], + 'DEFAULT_FILTER_BACKENDS': ( + 'django_filters.rest_framework.DjangoFilterBackend', + ) } REST_USE_JWT = True diff --git a/qrtr_account/apps.py b/qrtr_account/apps.py index 527dfe7..8888794 100644 --- a/qrtr_account/apps.py +++ b/qrtr_account/apps.py @@ -2,4 +2,4 @@ from django.apps import AppConfig class QrtrAccountConfig(AppConfig): - name = 'QRTR Account' + name = 'qrtr_account' diff --git a/qrtr_account/views.py b/qrtr_account/views.py index 0fc68e0..fce799e 100644 --- a/qrtr_account/views.py +++ b/qrtr_account/views.py @@ -67,6 +67,13 @@ class TransactionViewSet(viewsets.ModelViewSet): queryset = Transaction.objects.all() serializer_class = TransactionSerializer + filterset_fields = { + 'authorized_date': ['exact', 'lte', 'gte', 'isnull'], + 'updated_at': ['exact', 'lte', 'gte', 'isnull'], + 'created_at': ['exact', 'lte', 'gte', 'isnull'], + 'trans_id': ['exact', 'lte', 'gte', 'isnull'], + } + class RuleViewSet(viewsets.ReadOnlyModelViewSet): """API endpoint that allows Banks to be viewed.