From 32dd6940d1d60ff48731f0ea80f1dfe1cb4c85a4 Mon Sep 17 00:00:00 2001 From: joy Date: Tue, 16 Nov 2021 20:41:12 +0900 Subject: [PATCH 01/14] =?UTF-8?q?[feat#5]=20login=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- teeting_backend/teeting_backend/urls.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/teeting_backend/teeting_backend/urls.py b/teeting_backend/teeting_backend/urls.py index 1b6f776..7e4b34f 100644 --- a/teeting_backend/teeting_backend/urls.py +++ b/teeting_backend/teeting_backend/urls.py @@ -14,8 +14,15 @@ 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.urls import path +from django.urls import path, include +from rest_framework import urls +from rest_auth import urls +from django.conf import settings + urlpatterns = [ path('admin/', admin.site.urls), + path('api-auth/', include("rest_framework.urls")), + path('api/rest-auth/', include('rest_auth.urls')), + ] From e96b2b4114053b13c2b36000711c9f47db876ab6 Mon Sep 17 00:00:00 2001 From: joy Date: Thu, 18 Nov 2021 19:08:22 +0900 Subject: [PATCH 02/14] [feat#6] mission, achievement model --- teeting_backend/assignment/admin.py | 4 +- .../assignment/migrations/0001_initial.py | 41 +++++++++++++++++++ teeting_backend/assignment/models.py | 33 ++++++++++++++- teeting_backend/teeting_backend/urls.py | 1 - 4 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 teeting_backend/assignment/migrations/0001_initial.py diff --git a/teeting_backend/assignment/admin.py b/teeting_backend/assignment/admin.py index 8c38f3f..cd03b46 100644 --- a/teeting_backend/assignment/admin.py +++ b/teeting_backend/assignment/admin.py @@ -1,3 +1,5 @@ from django.contrib import admin - +from .models import Mission, Achievement # Register your models here. +admin.site.register(Mission) +admin.site.register(Achievement) \ No newline at end of file diff --git a/teeting_backend/assignment/migrations/0001_initial.py b/teeting_backend/assignment/migrations/0001_initial.py new file mode 100644 index 0000000..589ebfb --- /dev/null +++ b/teeting_backend/assignment/migrations/0001_initial.py @@ -0,0 +1,41 @@ +# Generated by Django 3.2.9 on 2021-11-18 09:40 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('ttAccount', '0002_family'), + ] + + operations = [ + migrations.CreateModel( + name='Mission', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('begDate', models.DateTimeField(default=datetime.datetime.now)), + ('expDate', models.DateTimeField(default=datetime.datetime.now)), + ('isFinished', models.BooleanField(default=False)), + ('content', models.CharField(max_length=200)), + ('reward', models.IntegerField()), + ('isTransferred', models.BooleanField(default=False)), + ('family', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='mission_family', to='ttAccount.family')), + ], + ), + migrations.CreateModel( + name='Achievement', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('level', models.IntegerField(choices=[(1, 'level1'), (2, 'level2'), (3, 'level3'), (4, 'level4'), (5, 'level5'), (6, 'level6'), (7, 'level7'), (8, 'level8'), (9, 'level9')])), + ('score', models.IntegerField()), + ('child', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='achievement_child', to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/teeting_backend/assignment/models.py b/teeting_backend/assignment/models.py index 71a8362..0ee65b5 100644 --- a/teeting_backend/assignment/models.py +++ b/teeting_backend/assignment/models.py @@ -1,3 +1,34 @@ from django.db import models - +from django.db.models.deletion import CASCADE +from django.urls.resolvers import _PATH_PARAMETER_COMPONENT_RE +from ttAccount.models import User, Family +from datetime import datetime # Create your models here. + +class Mission(models.Model): + family = models.ForeignKey(Family, on_delete=CASCADE, related_name='mission_family') + begDate = models.DateTimeField(default=datetime.now) + expDate = models.DateTimeField(default=datetime.now) + isFinished = models.BooleanField(default=False) + content = models.CharField(max_length=200) + reward = models.IntegerField() + isTransferred = models.BooleanField(default=False) + + def __str__(self): + return self.content + +class Achievement(models.Model): + LEVEL_CHOICES = ( + (1, 'level1'), + (2, 'level2'), + (3, 'level3'), + (4, 'level4'), + (5, 'level5'), + (6, 'level6'), + (7, 'level7'), + (8, 'level8'), + (9, 'level9') + ) + child = models.OneToOneField(User, on_delete=CASCADE, related_name='achievement_child') + level = models.IntegerField(choices=LEVEL_CHOICES) + score = models.IntegerField() diff --git a/teeting_backend/teeting_backend/urls.py b/teeting_backend/teeting_backend/urls.py index 7e4b34f..4e33dfe 100644 --- a/teeting_backend/teeting_backend/urls.py +++ b/teeting_backend/teeting_backend/urls.py @@ -19,7 +19,6 @@ from rest_auth import urls from django.conf import settings - urlpatterns = [ path('admin/', admin.site.urls), path('api-auth/', include("rest_framework.urls")), From d727daefa6c9729b86f8e2f225b4f132d1a2ef6e Mon Sep 17 00:00:00 2001 From: joy Date: Thu, 18 Nov 2021 20:56:33 +0900 Subject: [PATCH 03/14] =?UTF-8?q?[feat#14]=20=EB=AA=A8=EB=8D=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assignment/migrations/0001_initial.py | 24 ++---- .../assignment/migrations/0002_initial.py | 28 +++++++ .../0003_alter_achievement_score.py | 18 ++++ teeting_backend/assignment/models.py | 6 +- teeting_backend/assignment/serializers.py | 0 .../finance/migrations/0001_initial.py | 17 +--- .../finance/migrations/0002_analysis_child.py | 23 +++++ .../finance/migrations/0002_initial.py | 33 -------- .../migrations/0003_auto_20211117_1339.py | 83 ------------------- teeting_backend/finance/models.py | 1 - teeting_backend/teeting_backend/settings.py | 11 ++- teeting_backend/ttAccount/admin.py | 5 +- .../ttAccount/migrations/0001_initial.py | 12 +-- teeting_backend/ttAccount/models.py | 9 +- teeting_backend/ttAccount/serializers.py | 21 +++++ 15 files changed, 121 insertions(+), 170 deletions(-) create mode 100644 teeting_backend/assignment/migrations/0002_initial.py create mode 100644 teeting_backend/assignment/migrations/0003_alter_achievement_score.py create mode 100644 teeting_backend/assignment/serializers.py create mode 100644 teeting_backend/finance/migrations/0002_analysis_child.py delete mode 100644 teeting_backend/finance/migrations/0002_initial.py delete mode 100644 teeting_backend/finance/migrations/0003_auto_20211117_1339.py create mode 100644 teeting_backend/ttAccount/serializers.py diff --git a/teeting_backend/assignment/migrations/0001_initial.py b/teeting_backend/assignment/migrations/0001_initial.py index 589ebfb..5855200 100644 --- a/teeting_backend/assignment/migrations/0001_initial.py +++ b/teeting_backend/assignment/migrations/0001_initial.py @@ -1,9 +1,7 @@ -# Generated by Django 3.2.9 on 2021-11-18 09:40 +# Generated by Django 3.2.9 on 2021-11-18 11:31 import datetime -from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): @@ -11,11 +9,17 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('ttAccount', '0002_family'), ] operations = [ + migrations.CreateModel( + name='Achievement', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('level', models.IntegerField(choices=[(1, 'level1'), (2, 'level2'), (3, 'level3'), (4, 'level4'), (5, 'level5'), (6, 'level6'), (7, 'level7'), (8, 'level8'), (9, 'level9')])), + ('score', models.IntegerField()), + ], + ), migrations.CreateModel( name='Mission', fields=[ @@ -26,16 +30,6 @@ class Migration(migrations.Migration): ('content', models.CharField(max_length=200)), ('reward', models.IntegerField()), ('isTransferred', models.BooleanField(default=False)), - ('family', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='mission_family', to='ttAccount.family')), - ], - ), - migrations.CreateModel( - name='Achievement', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('level', models.IntegerField(choices=[(1, 'level1'), (2, 'level2'), (3, 'level3'), (4, 'level4'), (5, 'level5'), (6, 'level6'), (7, 'level7'), (8, 'level8'), (9, 'level9')])), - ('score', models.IntegerField()), - ('child', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='achievement_child', to=settings.AUTH_USER_MODEL)), ], ), ] diff --git a/teeting_backend/assignment/migrations/0002_initial.py b/teeting_backend/assignment/migrations/0002_initial.py new file mode 100644 index 0000000..b3cc941 --- /dev/null +++ b/teeting_backend/assignment/migrations/0002_initial.py @@ -0,0 +1,28 @@ +# Generated by Django 3.2.9 on 2021-11-18 11:31 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('assignment', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='mission', + name='child', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='mission', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='achievement', + name='child', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='achievement_child', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/teeting_backend/assignment/migrations/0003_alter_achievement_score.py b/teeting_backend/assignment/migrations/0003_alter_achievement_score.py new file mode 100644 index 0000000..8f0e17b --- /dev/null +++ b/teeting_backend/assignment/migrations/0003_alter_achievement_score.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.9 on 2021-11-18 11:37 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('assignment', '0002_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='achievement', + name='score', + field=models.IntegerField(default=0), + ), + ] diff --git a/teeting_backend/assignment/models.py b/teeting_backend/assignment/models.py index 0ee65b5..5567959 100644 --- a/teeting_backend/assignment/models.py +++ b/teeting_backend/assignment/models.py @@ -1,12 +1,12 @@ from django.db import models from django.db.models.deletion import CASCADE from django.urls.resolvers import _PATH_PARAMETER_COMPONENT_RE -from ttAccount.models import User, Family +from ttAccount.models import User from datetime import datetime # Create your models here. class Mission(models.Model): - family = models.ForeignKey(Family, on_delete=CASCADE, related_name='mission_family') + child = models.ForeignKey(User, on_delete=CASCADE, related_name='mission') begDate = models.DateTimeField(default=datetime.now) expDate = models.DateTimeField(default=datetime.now) isFinished = models.BooleanField(default=False) @@ -31,4 +31,4 @@ class Achievement(models.Model): ) child = models.OneToOneField(User, on_delete=CASCADE, related_name='achievement_child') level = models.IntegerField(choices=LEVEL_CHOICES) - score = models.IntegerField() + score = models.IntegerField(default=0) diff --git a/teeting_backend/assignment/serializers.py b/teeting_backend/assignment/serializers.py new file mode 100644 index 0000000..e69de29 diff --git a/teeting_backend/finance/migrations/0001_initial.py b/teeting_backend/finance/migrations/0001_initial.py index dbd72c4..8694bac 100644 --- a/teeting_backend/finance/migrations/0001_initial.py +++ b/teeting_backend/finance/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.9 on 2021-11-16 11:53 +# Generated by Django 3.2.9 on 2021-11-18 11:31 import django.core.validators from django.db import migrations, models @@ -14,20 +14,6 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( name='Analysis', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('category', models.CharField(max_length=200)), - ], - ), - migrations.CreateModel( - name='Balance', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('balance', models.IntegerField(default=0)), - ], - ), - migrations.CreateModel( - name='Transaction', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('trdd', models.CharField(max_length=8)), @@ -37,6 +23,7 @@ class Migration(migrations.Migration): ('aftrBlnc', models.IntegerField()), ('bnprCntn', models.TextField()), ('tuno', models.IntegerField()), + ('category', models.IntegerField(choices=[(0, '식비'), (1, '교통비'), (2, '문화생활비'), (3, '기타')], default=0)), ], ), ] diff --git a/teeting_backend/finance/migrations/0002_analysis_child.py b/teeting_backend/finance/migrations/0002_analysis_child.py new file mode 100644 index 0000000..122e250 --- /dev/null +++ b/teeting_backend/finance/migrations/0002_analysis_child.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.9 on 2021-11-18 11:31 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('finance', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='analysis', + name='child', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/teeting_backend/finance/migrations/0002_initial.py b/teeting_backend/finance/migrations/0002_initial.py deleted file mode 100644 index 949af71..0000000 --- a/teeting_backend/finance/migrations/0002_initial.py +++ /dev/null @@ -1,33 +0,0 @@ -# Generated by Django 3.2.9 on 2021-11-16 11:53 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('finance', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.AddField( - model_name='transaction', - name='user', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='balance', - name='currentUser', - field=models.OneToOneField(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='analysis', - name='transaction', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='finance.transaction'), - ), - ] diff --git a/teeting_backend/finance/migrations/0003_auto_20211117_1339.py b/teeting_backend/finance/migrations/0003_auto_20211117_1339.py deleted file mode 100644 index 296635f..0000000 --- a/teeting_backend/finance/migrations/0003_auto_20211117_1339.py +++ /dev/null @@ -1,83 +0,0 @@ -# Generated by Django 3.2.9 on 2021-11-17 04:39 - -from django.conf import settings -import django.core.validators -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('finance', '0002_initial'), - ] - - operations = [ - migrations.RemoveField( - model_name='transaction', - name='user', - ), - migrations.RemoveField( - model_name='analysis', - name='transaction', - ), - migrations.AddField( - model_name='analysis', - name='aftrBlnc', - field=models.IntegerField(default=1), - preserve_default=False, - ), - migrations.AddField( - model_name='analysis', - name='bnprCntn', - field=models.TextField(default=1), - preserve_default=False, - ), - migrations.AddField( - model_name='analysis', - name='child', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='analysis', - name='mnrcDrotDsnc', - field=models.IntegerField(default=1, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(4)]), - preserve_default=False, - ), - migrations.AddField( - model_name='analysis', - name='tram', - field=models.IntegerField(default=1, validators=[django.core.validators.MinValueValidator(0)]), - preserve_default=False, - ), - migrations.AddField( - model_name='analysis', - name='trdd', - field=models.CharField(default=1, max_length=8), - preserve_default=False, - ), - migrations.AddField( - model_name='analysis', - name='tuno', - field=models.IntegerField(default=1), - preserve_default=False, - ), - migrations.AddField( - model_name='analysis', - name='txtm', - field=models.CharField(default=1, max_length=6), - preserve_default=False, - ), - migrations.AlterField( - model_name='analysis', - name='category', - field=models.IntegerField(choices=[(0, '식비'), (1, '교통비'), (2, '문화생활비'), (3, '기타')], default=0), - ), - migrations.DeleteModel( - name='Balance', - ), - migrations.DeleteModel( - name='Transaction', - ), - ] diff --git a/teeting_backend/finance/models.py b/teeting_backend/finance/models.py index 141d793..48be509 100644 --- a/teeting_backend/finance/models.py +++ b/teeting_backend/finance/models.py @@ -9,7 +9,6 @@ # 분석 모델 class Analysis(models.Model) : - # family = models.ForeignKey(Family, on_delete=CASCADE, default=1) child = models.ForeignKey(User, on_delete=CASCADE, default=1) trdd = models.CharField(max_length=8) # 거래날짜 txtm = models.CharField(max_length=6) # 거래시간 diff --git a/teeting_backend/teeting_backend/settings.py b/teeting_backend/teeting_backend/settings.py index 3a25546..856acf3 100644 --- a/teeting_backend/teeting_backend/settings.py +++ b/teeting_backend/teeting_backend/settings.py @@ -133,4 +133,13 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' -AUTH_USER_MODEL = 'ttAccount.User' \ No newline at end of file +AUTH_USER_MODEL = 'ttAccount.User' + +REST_FRAMEWORK = { + 'DEFAULT_PERMISSION_CLASSES': ( + 'rest_framework.permissions.IsAuthenticated', + ), + 'DEFAULT_AUTHENTICATION_CLASSES': ( + 'rest_framework.authentication.TokenAuthentication', + ) +} \ No newline at end of file diff --git a/teeting_backend/ttAccount/admin.py b/teeting_backend/ttAccount/admin.py index 28a1201..779867f 100644 --- a/teeting_backend/ttAccount/admin.py +++ b/teeting_backend/ttAccount/admin.py @@ -1,6 +1,5 @@ from django.contrib import admin -from .models import User, Family +from .models import User # Register your models here. -admin.site.register(User) -admin.site.register(Family) +admin.site.register(User) \ No newline at end of file diff --git a/teeting_backend/ttAccount/migrations/0001_initial.py b/teeting_backend/ttAccount/migrations/0001_initial.py index f624b14..cde5f2e 100644 --- a/teeting_backend/ttAccount/migrations/0001_initial.py +++ b/teeting_backend/ttAccount/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.9 on 2021-11-16 11:53 +# Generated by Django 3.2.9 on 2021-11-18 11:31 from django.conf import settings import django.contrib.auth.models @@ -32,13 +32,13 @@ class Migration(migrations.Migration): ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), ('birthday', models.CharField(max_length=8)), - ('isParent', models.BooleanField(default=False)), ('finAcno', models.CharField(max_length=200)), ('finCard', models.CharField(max_length=200)), ('acno', models.CharField(max_length=100)), ('iscd', models.CharField(max_length=20)), ('accessToken', models.CharField(max_length=200)), ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_child', to=settings.AUTH_USER_MODEL)), ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), ], options={ @@ -50,12 +50,4 @@ class Migration(migrations.Migration): ('objects', django.contrib.auth.models.UserManager()), ], ), - migrations.CreateModel( - name='Family', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('child', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='family_child', to=settings.AUTH_USER_MODEL)), - ('parent', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='family_parent', to=settings.AUTH_USER_MODEL)), - ], - ), ] diff --git a/teeting_backend/ttAccount/models.py b/teeting_backend/ttAccount/models.py index d01f0b9..a368e69 100644 --- a/teeting_backend/ttAccount/models.py +++ b/teeting_backend/ttAccount/models.py @@ -1,17 +1,14 @@ from django.db import models from django.contrib.auth.models import AbstractUser +from django.db.models.deletion import CASCADE +from django.db.models.fields import related # Create your models here. class User(AbstractUser): + parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='user_child') birthday = models.CharField(max_length=8) - isParent = models.BooleanField(default=False) finAcno = models.CharField(max_length=200) finCard = models.CharField(max_length=200) acno = models.CharField(max_length=100) iscd =models.CharField(max_length=20) accessToken = models.CharField(max_length=200) - - -class Family(models.Model): - parent = models.ForeignKey(User, on_delete=models.CASCADE, related_name='family_parent') - child = models.ForeignKey(User, on_delete=models.CASCADE, related_name='family_child') \ No newline at end of file diff --git a/teeting_backend/ttAccount/serializers.py b/teeting_backend/ttAccount/serializers.py new file mode 100644 index 0000000..dcfb553 --- /dev/null +++ b/teeting_backend/ttAccount/serializers.py @@ -0,0 +1,21 @@ +from .models import User +from rest_framework import serializers + +class UserSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = ['email', 'username', 'password'] + extra_kwargs = { + 'password': { + 'write_only': True + } + } + + def create(self, validated_data): + user = User( + email = validated_data['email'], + username = validated_data['username'] + ) + user.set_password(validated_data['password']) + user.save() + return user \ No newline at end of file From 5154bac22628ba9c4ca19eb3edba3f48ad9871b5 Mon Sep 17 00:00:00 2001 From: joy Date: Fri, 19 Nov 2021 01:32:44 +0900 Subject: [PATCH 04/14] =?UTF-8?q?[feat#13]=20user=20model=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assignment/migrations/0001_initial.py | 25 +++++++++----- .../assignment/migrations/0002_initial.py | 28 ---------------- .../0003_alter_achievement_score.py | 18 ---------- teeting_backend/assignment/models.py | 10 ++++-- teeting_backend/assignment/serializers.py | 2 ++ .../finance/migrations/0001_initial.py | 2 +- .../finance/migrations/0002_analysis_child.py | 7 ++-- teeting_backend/finance/models.py | 7 ++-- teeting_backend/teeting_backend/settings.py | 1 + teeting_backend/ttAccount/admin.py | 5 +-- .../ttAccount/migrations/0001_initial.py | 16 +++++++-- .../migrations/0002_auto_20211119_0048.py | 33 +++++++++++++++++++ teeting_backend/ttAccount/models.py | 16 +++++++-- teeting_backend/ttAccount/serializers.py | 16 ++------- teeting_backend/ttAccount/views.py | 18 +++++++++- 15 files changed, 118 insertions(+), 86 deletions(-) delete mode 100644 teeting_backend/assignment/migrations/0002_initial.py delete mode 100644 teeting_backend/assignment/migrations/0003_alter_achievement_score.py create mode 100644 teeting_backend/ttAccount/migrations/0002_auto_20211119_0048.py diff --git a/teeting_backend/assignment/migrations/0001_initial.py b/teeting_backend/assignment/migrations/0001_initial.py index 5855200..e35beba 100644 --- a/teeting_backend/assignment/migrations/0001_initial.py +++ b/teeting_backend/assignment/migrations/0001_initial.py @@ -1,7 +1,9 @@ -# Generated by Django 3.2.9 on 2021-11-18 11:31 +# Generated by Django 3.2.9 on 2021-11-18 15:54 import datetime +from django.conf import settings from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): @@ -9,17 +11,11 @@ class Migration(migrations.Migration): initial = True dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('ttAccount', '0002_auto_20211119_0048'), ] operations = [ - migrations.CreateModel( - name='Achievement', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('level', models.IntegerField(choices=[(1, 'level1'), (2, 'level2'), (3, 'level3'), (4, 'level4'), (5, 'level5'), (6, 'level6'), (7, 'level7'), (8, 'level8'), (9, 'level9')])), - ('score', models.IntegerField()), - ], - ), migrations.CreateModel( name='Mission', fields=[ @@ -30,6 +26,17 @@ class Migration(migrations.Migration): ('content', models.CharField(max_length=200)), ('reward', models.IntegerField()), ('isTransferred', models.BooleanField(default=False)), + ('child', models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='mission', to='ttAccount.child')), + ('parent', models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Achievement', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('level', models.IntegerField(choices=[(1, 'level1'), (2, 'level2'), (3, 'level3'), (4, 'level4'), (5, 'level5'), (6, 'level6'), (7, 'level7'), (8, 'level8'), (9, 'level9')])), + ('score', models.IntegerField(default=0)), + ('child', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='achievement_child', to='ttAccount.child')), ], ), ] diff --git a/teeting_backend/assignment/migrations/0002_initial.py b/teeting_backend/assignment/migrations/0002_initial.py deleted file mode 100644 index b3cc941..0000000 --- a/teeting_backend/assignment/migrations/0002_initial.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 3.2.9 on 2021-11-18 11:31 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('assignment', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='mission', - name='child', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='mission', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='achievement', - name='child', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='achievement_child', to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/teeting_backend/assignment/migrations/0003_alter_achievement_score.py b/teeting_backend/assignment/migrations/0003_alter_achievement_score.py deleted file mode 100644 index 8f0e17b..0000000 --- a/teeting_backend/assignment/migrations/0003_alter_achievement_score.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.9 on 2021-11-18 11:37 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('assignment', '0002_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='achievement', - name='score', - field=models.IntegerField(default=0), - ), - ] diff --git a/teeting_backend/assignment/models.py b/teeting_backend/assignment/models.py index 5567959..a60c750 100644 --- a/teeting_backend/assignment/models.py +++ b/teeting_backend/assignment/models.py @@ -1,12 +1,13 @@ from django.db import models from django.db.models.deletion import CASCADE from django.urls.resolvers import _PATH_PARAMETER_COMPONENT_RE -from ttAccount.models import User +from ttAccount.models import User, Child from datetime import datetime # Create your models here. class Mission(models.Model): - child = models.ForeignKey(User, on_delete=CASCADE, related_name='mission') + parent = models.ForeignKey(User, on_delete=CASCADE, default=1) + child = models.ForeignKey(Child, on_delete=CASCADE, related_name='mission', default=1) begDate = models.DateTimeField(default=datetime.now) expDate = models.DateTimeField(default=datetime.now) isFinished = models.BooleanField(default=False) @@ -29,6 +30,9 @@ class Achievement(models.Model): (8, 'level8'), (9, 'level9') ) - child = models.OneToOneField(User, on_delete=CASCADE, related_name='achievement_child') + child = models.OneToOneField(Child, on_delete=CASCADE, related_name='achievement_child') level = models.IntegerField(choices=LEVEL_CHOICES) score = models.IntegerField(default=0) + + def __str__(self): + return self.child diff --git a/teeting_backend/assignment/serializers.py b/teeting_backend/assignment/serializers.py index e69de29..9e4b60a 100644 --- a/teeting_backend/assignment/serializers.py +++ b/teeting_backend/assignment/serializers.py @@ -0,0 +1,2 @@ +from rest_framework import serializers +from .models import Mission, Achievement diff --git a/teeting_backend/finance/migrations/0001_initial.py b/teeting_backend/finance/migrations/0001_initial.py index 8694bac..90786db 100644 --- a/teeting_backend/finance/migrations/0001_initial.py +++ b/teeting_backend/finance/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.9 on 2021-11-18 11:31 +# Generated by Django 3.2.9 on 2021-11-18 15:43 import django.core.validators from django.db import migrations, models diff --git a/teeting_backend/finance/migrations/0002_analysis_child.py b/teeting_backend/finance/migrations/0002_analysis_child.py index 122e250..520d872 100644 --- a/teeting_backend/finance/migrations/0002_analysis_child.py +++ b/teeting_backend/finance/migrations/0002_analysis_child.py @@ -1,6 +1,5 @@ -# Generated by Django 3.2.9 on 2021-11-18 11:31 +# Generated by Django 3.2.9 on 2021-11-18 15:43 -from django.conf import settings from django.db import migrations, models import django.db.models.deletion @@ -10,14 +9,14 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('finance', '0001_initial'), + ('ttAccount', '0001_initial'), ] operations = [ migrations.AddField( model_name='analysis', name='child', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='ttAccount.child'), ), ] diff --git a/teeting_backend/finance/models.py b/teeting_backend/finance/models.py index 48be509..aab4398 100644 --- a/teeting_backend/finance/models.py +++ b/teeting_backend/finance/models.py @@ -9,7 +9,7 @@ # 분석 모델 class Analysis(models.Model) : - child = models.ForeignKey(User, on_delete=CASCADE, default=1) + child = models.ForeignKey(Child, on_delete=CASCADE, default=1) trdd = models.CharField(max_length=8) # 거래날짜 txtm = models.CharField(max_length=6) # 거래시간 mnrcDrotDsnc = models.IntegerField(validators=[validators.MinValueValidator(1), validators.MaxValueValidator(4)]) # 1,2는 입금 / 3,4는 출금 @@ -23,4 +23,7 @@ class Analysis(models.Model) : (2, "문화생활비"), (3, "기타") ) - category = models.IntegerField(default=0, choices=CATEGORIIES) \ No newline at end of file + category = models.IntegerField(default=0, choices=CATEGORIIES) + + def __str__(self): + return self.tuno \ No newline at end of file diff --git a/teeting_backend/teeting_backend/settings.py b/teeting_backend/teeting_backend/settings.py index 856acf3..a7cd307 100644 --- a/teeting_backend/teeting_backend/settings.py +++ b/teeting_backend/teeting_backend/settings.py @@ -37,6 +37,7 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + #'django.contrib.sites' # app 추가 'ttAccount', diff --git a/teeting_backend/ttAccount/admin.py b/teeting_backend/ttAccount/admin.py index 779867f..3344b47 100644 --- a/teeting_backend/ttAccount/admin.py +++ b/teeting_backend/ttAccount/admin.py @@ -1,5 +1,6 @@ from django.contrib import admin -from .models import User +from .models import User, Child # Register your models here. -admin.site.register(User) \ No newline at end of file +admin.site.register(User) +admin.site.register(Child) \ No newline at end of file diff --git a/teeting_backend/ttAccount/migrations/0001_initial.py b/teeting_backend/ttAccount/migrations/0001_initial.py index cde5f2e..6f3a274 100644 --- a/teeting_backend/ttAccount/migrations/0001_initial.py +++ b/teeting_backend/ttAccount/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.9 on 2021-11-18 11:31 +# Generated by Django 3.2.9 on 2021-11-18 15:43 from django.conf import settings import django.contrib.auth.models @@ -38,7 +38,6 @@ class Migration(migrations.Migration): ('iscd', models.CharField(max_length=20)), ('accessToken', models.CharField(max_length=200)), ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), - ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_child', to=settings.AUTH_USER_MODEL)), ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), ], options={ @@ -50,4 +49,17 @@ class Migration(migrations.Migration): ('objects', django.contrib.auth.models.UserManager()), ], ), + migrations.CreateModel( + name='Child', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('birthday', models.CharField(max_length=8)), + ('finAcno', models.CharField(max_length=200)), + ('finCard', models.CharField(max_length=200)), + ('acno', models.CharField(max_length=100)), + ('iscd', models.CharField(max_length=20)), + ('accessToken', models.CharField(max_length=200)), + ('parent', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), ] diff --git a/teeting_backend/ttAccount/migrations/0002_auto_20211119_0048.py b/teeting_backend/ttAccount/migrations/0002_auto_20211119_0048.py new file mode 100644 index 0000000..b818962 --- /dev/null +++ b/teeting_backend/ttAccount/migrations/0002_auto_20211119_0048.py @@ -0,0 +1,33 @@ +# Generated by Django 3.2.9 on 2021-11-18 15:48 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ttAccount', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='child', + name='finCard', + ), + migrations.RemoveField( + model_name='user', + name='finCard', + ), + migrations.AddField( + model_name='child', + name='firstname', + field=models.CharField(default=1, max_length=20), + preserve_default=False, + ), + migrations.AddField( + model_name='child', + name='lastname', + field=models.CharField(default=1, max_length=20), + preserve_default=False, + ), + ] diff --git a/teeting_backend/ttAccount/models.py b/teeting_backend/ttAccount/models.py index a368e69..dc8771c 100644 --- a/teeting_backend/ttAccount/models.py +++ b/teeting_backend/ttAccount/models.py @@ -5,10 +5,22 @@ # Create your models here. class User(AbstractUser): - parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='user_child') + birthday = models.CharField(max_length=8) + finAcno = models.CharField(max_length=200) #핀어카운트 + acno = models.CharField(max_length=100) #계좌 + iscd =models.CharField(max_length=20) #기관번호 + accessToken = models.CharField(max_length=200) #토큰 + + +class Child(models.Model): + firstname = models.CharField(max_length=20) + lastname = models.CharField(max_length=20) + parent = models.ForeignKey(User, on_delete=CASCADE) birthday = models.CharField(max_length=8) finAcno = models.CharField(max_length=200) - finCard = models.CharField(max_length=200) acno = models.CharField(max_length=100) iscd =models.CharField(max_length=20) accessToken = models.CharField(max_length=200) + + def __str__(self): + return self.firstname \ No newline at end of file diff --git a/teeting_backend/ttAccount/serializers.py b/teeting_backend/ttAccount/serializers.py index dcfb553..d1ccae8 100644 --- a/teeting_backend/ttAccount/serializers.py +++ b/teeting_backend/ttAccount/serializers.py @@ -4,18 +4,6 @@ class UserSerializer(serializers.ModelSerializer): class Meta: model = User - fields = ['email', 'username', 'password'] - extra_kwargs = { - 'password': { - 'write_only': True - } - } + fields = '__all__' + - def create(self, validated_data): - user = User( - email = validated_data['email'], - username = validated_data['username'] - ) - user.set_password(validated_data['password']) - user.save() - return user \ No newline at end of file diff --git a/teeting_backend/ttAccount/views.py b/teeting_backend/ttAccount/views.py index 91ea44a..aa882c2 100644 --- a/teeting_backend/ttAccount/views.py +++ b/teeting_backend/ttAccount/views.py @@ -1,3 +1,19 @@ from django.shortcuts import render - +from .serializers import UserSerializer +from .models import User +from rest_framework import serializers, viewsets +from rest_framework.views import APIView # Create your views here. + +class UserViewSet(viewsets.ModelViewSet): + qureyset = User.objects.all() + serializer_class = UserSerializer + + def get_queryset(self): + return super().get_queryset() + +class UserChildView(APIView): + + def get(self, request): + user = User.objects.filter(user=self.request.user) + serializers = UserSerializer From 02239c1ad7bf8fa40d638ddd1d61d3db9a335428 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=90=EC=A0=95=EB=B2=94?= <2018027383@hanyang.ac.kr> Date: Fri, 19 Nov 2021 02:11:05 +0900 Subject: [PATCH 05/14] =?UTF-8?q?[feat#19]=20user,=20child=20viewset=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assignment/migrations/0001_initial.py | 25 ++++------ .../assignment/migrations/0002_initial.py | 34 +++++++++++++ teeting_backend/assignment/views.py | 2 - .../finance/migrations/0001_initial.py | 2 +- .../finance/migrations/0002_analysis_child.py | 4 +- teeting_backend/teeting_backend/urls.py | 1 + .../ttAccount/migrations/0001_initial.py | 6 +-- .../migrations/0002_auto_20211119_0048.py | 33 ------------- teeting_backend/ttAccount/serializers.py | 9 +++- teeting_backend/ttAccount/urls.py | 25 ++++++++++ teeting_backend/ttAccount/views.py | 49 +++++++++++++------ 11 files changed, 118 insertions(+), 72 deletions(-) create mode 100644 teeting_backend/assignment/migrations/0002_initial.py delete mode 100644 teeting_backend/ttAccount/migrations/0002_auto_20211119_0048.py create mode 100644 teeting_backend/ttAccount/urls.py diff --git a/teeting_backend/assignment/migrations/0001_initial.py b/teeting_backend/assignment/migrations/0001_initial.py index e35beba..94ebc2b 100644 --- a/teeting_backend/assignment/migrations/0001_initial.py +++ b/teeting_backend/assignment/migrations/0001_initial.py @@ -1,9 +1,7 @@ -# Generated by Django 3.2.9 on 2021-11-18 15:54 +# Generated by Django 3.2.9 on 2021-11-18 17:02 import datetime -from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): @@ -11,11 +9,17 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('ttAccount', '0002_auto_20211119_0048'), ] operations = [ + migrations.CreateModel( + name='Achievement', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('level', models.IntegerField(choices=[(1, 'level1'), (2, 'level2'), (3, 'level3'), (4, 'level4'), (5, 'level5'), (6, 'level6'), (7, 'level7'), (8, 'level8'), (9, 'level9')])), + ('score', models.IntegerField(default=0)), + ], + ), migrations.CreateModel( name='Mission', fields=[ @@ -26,17 +30,6 @@ class Migration(migrations.Migration): ('content', models.CharField(max_length=200)), ('reward', models.IntegerField()), ('isTransferred', models.BooleanField(default=False)), - ('child', models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='mission', to='ttAccount.child')), - ('parent', models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='Achievement', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('level', models.IntegerField(choices=[(1, 'level1'), (2, 'level2'), (3, 'level3'), (4, 'level4'), (5, 'level5'), (6, 'level6'), (7, 'level7'), (8, 'level8'), (9, 'level9')])), - ('score', models.IntegerField(default=0)), - ('child', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='achievement_child', to='ttAccount.child')), ], ), ] diff --git a/teeting_backend/assignment/migrations/0002_initial.py b/teeting_backend/assignment/migrations/0002_initial.py new file mode 100644 index 0000000..c86a93f --- /dev/null +++ b/teeting_backend/assignment/migrations/0002_initial.py @@ -0,0 +1,34 @@ +# Generated by Django 3.2.9 on 2021-11-18 17:02 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('assignment', '0001_initial'), + ('ttAccount', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name='mission', + name='child', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='mission', to='ttAccount.child'), + ), + migrations.AddField( + model_name='mission', + name='parent', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='achievement', + name='child', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='achievement_child', to='ttAccount.child'), + ), + ] diff --git a/teeting_backend/assignment/views.py b/teeting_backend/assignment/views.py index 91ea44a..8b13789 100644 --- a/teeting_backend/assignment/views.py +++ b/teeting_backend/assignment/views.py @@ -1,3 +1 @@ -from django.shortcuts import render -# Create your views here. diff --git a/teeting_backend/finance/migrations/0001_initial.py b/teeting_backend/finance/migrations/0001_initial.py index 90786db..e101a15 100644 --- a/teeting_backend/finance/migrations/0001_initial.py +++ b/teeting_backend/finance/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.9 on 2021-11-18 15:43 +# Generated by Django 3.2.9 on 2021-11-18 17:02 import django.core.validators from django.db import migrations, models diff --git a/teeting_backend/finance/migrations/0002_analysis_child.py b/teeting_backend/finance/migrations/0002_analysis_child.py index 520d872..36a9cd8 100644 --- a/teeting_backend/finance/migrations/0002_analysis_child.py +++ b/teeting_backend/finance/migrations/0002_analysis_child.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.9 on 2021-11-18 15:43 +# Generated by Django 3.2.9 on 2021-11-18 17:02 from django.db import migrations, models import django.db.models.deletion @@ -9,8 +9,8 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('finance', '0001_initial'), ('ttAccount', '0001_initial'), + ('finance', '0001_initial'), ] operations = [ diff --git a/teeting_backend/teeting_backend/urls.py b/teeting_backend/teeting_backend/urls.py index 4e33dfe..63d9297 100644 --- a/teeting_backend/teeting_backend/urls.py +++ b/teeting_backend/teeting_backend/urls.py @@ -23,5 +23,6 @@ path('admin/', admin.site.urls), path('api-auth/', include("rest_framework.urls")), path('api/rest-auth/', include('rest_auth.urls')), + path('api/ttAccount/', include('ttAccount.urls')), ] diff --git a/teeting_backend/ttAccount/migrations/0001_initial.py b/teeting_backend/ttAccount/migrations/0001_initial.py index 6f3a274..ed048dc 100644 --- a/teeting_backend/ttAccount/migrations/0001_initial.py +++ b/teeting_backend/ttAccount/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.9 on 2021-11-18 15:43 +# Generated by Django 3.2.9 on 2021-11-18 17:02 from django.conf import settings import django.contrib.auth.models @@ -33,7 +33,6 @@ class Migration(migrations.Migration): ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), ('birthday', models.CharField(max_length=8)), ('finAcno', models.CharField(max_length=200)), - ('finCard', models.CharField(max_length=200)), ('acno', models.CharField(max_length=100)), ('iscd', models.CharField(max_length=20)), ('accessToken', models.CharField(max_length=200)), @@ -53,9 +52,10 @@ class Migration(migrations.Migration): name='Child', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('firstname', models.CharField(max_length=20)), + ('lastname', models.CharField(max_length=20)), ('birthday', models.CharField(max_length=8)), ('finAcno', models.CharField(max_length=200)), - ('finCard', models.CharField(max_length=200)), ('acno', models.CharField(max_length=100)), ('iscd', models.CharField(max_length=20)), ('accessToken', models.CharField(max_length=200)), diff --git a/teeting_backend/ttAccount/migrations/0002_auto_20211119_0048.py b/teeting_backend/ttAccount/migrations/0002_auto_20211119_0048.py deleted file mode 100644 index b818962..0000000 --- a/teeting_backend/ttAccount/migrations/0002_auto_20211119_0048.py +++ /dev/null @@ -1,33 +0,0 @@ -# Generated by Django 3.2.9 on 2021-11-18 15:48 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('ttAccount', '0001_initial'), - ] - - operations = [ - migrations.RemoveField( - model_name='child', - name='finCard', - ), - migrations.RemoveField( - model_name='user', - name='finCard', - ), - migrations.AddField( - model_name='child', - name='firstname', - field=models.CharField(default=1, max_length=20), - preserve_default=False, - ), - migrations.AddField( - model_name='child', - name='lastname', - field=models.CharField(default=1, max_length=20), - preserve_default=False, - ), - ] diff --git a/teeting_backend/ttAccount/serializers.py b/teeting_backend/ttAccount/serializers.py index d1ccae8..7fd1464 100644 --- a/teeting_backend/ttAccount/serializers.py +++ b/teeting_backend/ttAccount/serializers.py @@ -1,4 +1,7 @@ -from .models import User +from re import L + +from django.db import models +from .models import User, Child from rest_framework import serializers class UserSerializer(serializers.ModelSerializer): @@ -7,3 +10,7 @@ class Meta: fields = '__all__' +class ChildSerializer(serializers.ModelSerializer) : + class Meta : + model = Child + fields = '__all__' \ No newline at end of file diff --git a/teeting_backend/ttAccount/urls.py b/teeting_backend/ttAccount/urls.py new file mode 100644 index 0000000..4352f40 --- /dev/null +++ b/teeting_backend/ttAccount/urls.py @@ -0,0 +1,25 @@ +from django.urls import path +from .views import * + +user_info = UserInfoViewSet.as_view({ + 'get' : 'list', +}) + +child_list = ChildInfoViewSet.as_view({ + 'get': 'list', +}) + +child_detail = ChildInfoViewSet.as_view({ + 'get': 'retrieve', + 'put': 'update', + 'patch': 'partial_update', + 'delete': 'destroy', +}) + +urlpatterns = [ + + path('user/', user_info), + path('child/', child_list), + path('child/', child_detail), + +] \ No newline at end of file diff --git a/teeting_backend/ttAccount/views.py b/teeting_backend/ttAccount/views.py index aa882c2..3c9a16e 100644 --- a/teeting_backend/ttAccount/views.py +++ b/teeting_backend/ttAccount/views.py @@ -1,19 +1,40 @@ -from django.shortcuts import render -from .serializers import UserSerializer -from .models import User -from rest_framework import serializers, viewsets -from rest_framework.views import APIView -# Create your views here. - -class UserViewSet(viewsets.ModelViewSet): - qureyset = User.objects.all() +from rest_framework import viewsets +from rest_framework.permissions import IsAuthenticated +from rest_framework.authentication import TokenAuthentication + +from .models import * +from .serializers import * + +class UserInfoViewSet(viewsets.ModelViewSet) : + + permission_classes = [IsAuthenticated] + authentication_classes = [TokenAuthentication] + + queryset = User.objects.all() serializer_class = UserSerializer def get_queryset(self): - return super().get_queryset() + qs = super().get_queryset() + + if self.request.user.is_authenticated : + qs = qs.filter(username = self.request.user) + else : + qs = qs.none() + return qs -class UserChildView(APIView): +class ChildInfoViewSet(viewsets.ModelViewSet) : + + permission_classes = [IsAuthenticated] + authentication_classes = [TokenAuthentication] + + queryset = Child.objects.all() + serializer_class = ChildSerializer + + def get_queryset(self): + qs = super().get_queryset() - def get(self, request): - user = User.objects.filter(user=self.request.user) - serializers = UserSerializer + if self.request.user.is_authenticated : + qs = qs.filter(parent = self.request.user) + else : + qs = qs.none() + return qs From 0e60feff266e04c21c9c98eb52be01ce63a8752d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=90=EC=A0=95=EB=B2=94?= <2018027383@hanyang.ac.kr> Date: Sun, 21 Nov 2021 13:11:58 +0900 Subject: [PATCH 06/14] =?UTF-8?q?[feat#20]=20=EC=9E=94=EC=95=A1=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C,=20=EA=B1=B0=EB=9E=98=EB=82=B4=EC=97=AD=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20view=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- requirements.txt | 1 + teeting_backend/finance/serializers.py | 3 +- teeting_backend/finance/urls.py | 4 +- teeting_backend/finance/views.py | 153 ++++++++++++++++++++++-- teeting_backend/teeting_backend/urls.py | 1 + 5 files changed, 153 insertions(+), 9 deletions(-) diff --git a/requirements.txt b/requirements.txt index 4599539..87db89b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,6 +5,7 @@ Django==3.2.9 django-rest-auth==0.9.5 djangorestframework==3.12.4 idna==3.3 +python-dateutil==2.8.2 pytz==2021.3 requests==2.26.0 six==1.16.0 diff --git a/teeting_backend/finance/serializers.py b/teeting_backend/finance/serializers.py index 24448fd..617a3e7 100644 --- a/teeting_backend/finance/serializers.py +++ b/teeting_backend/finance/serializers.py @@ -1,3 +1,4 @@ +from django.core.serializers import serialize from django.db.models import fields from rest_framework import serializers from .models import * @@ -5,4 +6,4 @@ class AnalysisSerializer(serializers.ModelSerializer) : class Meta : model = Analysis - fields = '__all__' \ No newline at end of file + fields = '__all__' diff --git a/teeting_backend/finance/urls.py b/teeting_backend/finance/urls.py index fd9af7e..4d91333 100644 --- a/teeting_backend/finance/urls.py +++ b/teeting_backend/finance/urls.py @@ -18,5 +18,7 @@ path('analysis/', analysis_list), path('analysis/', analysis_detail), - path('balance', InquireBalanceView.as_view()), # 잔액조회 + path('balance/', ParentBalanceView.as_view()), # 잔액조회 부모 + path('balance/child', ChildBalanceView.as_view()), # 잔액조회 자녀 + path('transaction/', ChildTransactionView.as_view()), # 거래내역조회 자녀 ] \ No newline at end of file diff --git a/teeting_backend/finance/views.py b/teeting_backend/finance/views.py index 2530e3d..611e310 100644 --- a/teeting_backend/finance/views.py +++ b/teeting_backend/finance/views.py @@ -1,3 +1,4 @@ +from django.utils import datastructures from rest_framework import serializers, viewsets, authentication, status from rest_framework.permissions import IsAuthenticated from rest_framework.authentication import TokenAuthentication @@ -5,14 +6,17 @@ from .models import * from .serializers import * -from ttAccount.models import User +from ttAccount.models import User, Child import requests import json from datetime import datetime +from dateutil.relativedelta import relativedelta + import random from django.http import HttpResponse +from django.core import serializers # Create your views here. @@ -39,14 +43,14 @@ def get_queryset(self): return qs -# 잔액 조회 GET 버전 -class InquireBalanceView(APIView) : +# 잔액조회 (부모) +class ParentBalanceView(APIView) : permission_classes = [IsAuthenticated] authentication_classes = [TokenAuthentication] - # 부모는 get으로 조회 def get(self, request): + user = User.objects.filter(username = self.request.user).first() url = "https://developers.nonghyup.com/InquireBalance.nh" # 잔액 조회 url @@ -73,20 +77,155 @@ def get(self, request): "Iscd": iscd, "FintechApsno": fintechApsno, "ApiSvcCd": apiSvcCd, - "IsTuno": "0007770", # isTuno + "IsTuno": "0007773" + str(random.randint(0,10000)), # isTuno "AccessToken": accessToken }, "FinAcno": finAcno } res = requests.post(url, data=json.dumps(body), headers=headers) + data = {} if res.status_code == 200 : - print(res.json()["Ldbl"]) - return HttpResponse(res.json()["Ldbl"], status = status.HTTP_200_OK) + data["id"] = self.request.user.id + data["username"] = self.request.user.username + data["acno"] = self.request.user.acno + data["balance"] = int(res.json()["Ldbl"]) + return HttpResponse(json.dumps(data), content_type="text/json-comment-filtered", status = status.HTTP_200_OK) else : return HttpResponse(res.status_code) +# 잔액조회 (자녀) +class ChildBalanceView(APIView) : + + permission_classes = [IsAuthenticated] + authentication_classes = [TokenAuthentication] + + def get(self, request): + currentUser = User.objects.filter(username = self.request.user).first() + children = Child.objects.filter(parent = currentUser) + + # 프론트에 response로 줄 json data + data = [] + + # 자녀 수만큼 api 반복 호출 + for i in range(len(children)) : + url = "https://developers.nonghyup.com/InquireBalance.nh" # 잔액 조회 url + + apiNm = url[url.find(".com/")+5 : url.find(".nh")] + tsymd = datetime.today().strftime("%Y%m%d") + trtm = "112428" + iscd = children[i].iscd + fintechApsno = "001" + apiSvcCd = "ReceivedTransferA" + # isTuno = 임의번호로 채번 + accessToken = children[i].accessToken + finAcno = children[i].finAcno + + headers = { + "Content-Type": "application/json; chearset=utf-8", + } + + body = { + "Header": { + "ApiNm": apiNm, + "Tsymd": tsymd, + "Trtm": trtm, + "Iscd": iscd, + "FintechApsno": fintechApsno, + "ApiSvcCd": apiSvcCd, + "IsTuno": "0007773" + str(random.randint(0,10000)), # isTuno + "AccessToken": accessToken + }, + "FinAcno": finAcno + } + + res = requests.post(url, data=json.dumps(body), headers=headers) + children_data = {} + if res.status_code == 200 : + children_data["id"] = children[i].id + children_data["firstname"] = children[i].firstname + children_data["parent"] = children[i].parent.username + children_data["balance"] = int(res.json()["Ldbl"]) + data.append(children_data) + else : + return HttpResponse(res.status_code) + return HttpResponse(json.dumps(data), content_type="text/json-comment-filtered", status = status.HTTP_200_OK) + + + +# 자녀 거래내역 조회 +class ChildTransactionView(APIView) : + permission_classes = [IsAuthenticated] + authentication_classes = [TokenAuthentication] + def get(self, request): + childId = self.request.query_params.get('childId') + currentUser = User.objects.filter(username = self.request.user).first() + child = Child.objects.filter(parent = currentUser).filter(pk = childId).first() + url = 'https://developers.nonghyup.com/InquireTransactionHistory.nh' # 거래내역 조회 url + apiNm = url[url.find(".com/")+5:url.find(".nh")] + tsymd = datetime.today().strftime("%Y%m%d") + trtm = "112428" + iscd = child.iscd + fintechApsno = "001" + apiSvcCd = "ReceivedTransferA" + # isTuno = 임의번호로 채번 + accessToken = child.accessToken + bncd = "011" # 농협은행코드 고정값 + acno = child.acno + insymd = (datetime.today() + relativedelta(days=-90)).strftime("%Y%m%d") + ineymd = datetime.today().strftime("%Y%m%d") + trnsDsnc = "A" + lnsq = "DESC" + pageNo = "1" + dmcnt = "100" + + headers = { + "Content-Type": "application/json; chearset=utf-8", + } + + body = { + "Header": { + "ApiNm": apiNm, + "Tsymd": tsymd, + "Trtm": trtm, + "Iscd": iscd, + "FintechApsno": fintechApsno, + "ApiSvcCd": apiSvcCd, + "IsTuno": "0007773" + str(random.randint(0,10000)), # isTuno + "AccessToken": accessToken + }, + "Bncd": bncd, + "Acno": acno, + "Insymd": insymd, + "Ineymd": ineymd, + "TrnsDsnc": trnsDsnc, + "Lnsq": lnsq, + "PageNo": pageNo, + "Dmcnt": dmcnt + } + + # 프론트에 response로 줄 json data + data = [] + + res = requests.post(url, data=json.dumps(body), headers=headers) + if res.status_code == 200 : + rec = res.json()["REC"] + + for i in range(len(rec)) : + transactions = {} + transactions["trdd"] = rec[i]["Trdd"] + transactions["txtm"] = rec[i]["Txtm"] + transactions["mnrcDrotDsnc"] = int(rec[i]["MnrcDrotDsnc"]) + transactions["tram"] = int(rec[i]["Tram"]) + transactions["aftrBlnc"] = int(rec[i]["AftrBlnc"]) + transactions["bnprCntn"] = rec[i]["BnprCntn"] + transactions["tuno"] = int(rec[i]["Tuno"]) + data.append(transactions) + return HttpResponse(json.dumps(data), content_type="text/json-comment-filtered", status = status.HTTP_200_OK) + + else : + return HttpResponse(res.status_code) \ No newline at end of file diff --git a/teeting_backend/teeting_backend/urls.py b/teeting_backend/teeting_backend/urls.py index 63d9297..f62b918 100644 --- a/teeting_backend/teeting_backend/urls.py +++ b/teeting_backend/teeting_backend/urls.py @@ -24,5 +24,6 @@ path('api-auth/', include("rest_framework.urls")), path('api/rest-auth/', include('rest_auth.urls')), path('api/ttAccount/', include('ttAccount.urls')), + path('api/finance/', include('finance.urls')), ] From 9595aa7279880a9ca7e85b2a2dfc225e25cf82c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=90=EC=A0=95=EB=B2=94?= <2018027383@hanyang.ac.kr> Date: Sun, 21 Nov 2021 15:57:23 +0900 Subject: [PATCH 07/14] =?UTF-8?q?[feat#26]=20=EB=B6=84=EC=84=9D=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20view=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0003_auto_20211121_1508.py | 35 +++++++ .../migrations/0004_alter_analysis_date.py | 18 ++++ teeting_backend/finance/models.py | 12 +-- teeting_backend/finance/urls.py | 29 +++--- teeting_backend/finance/views.py | 92 ++++++++++++++----- 5 files changed, 142 insertions(+), 44 deletions(-) create mode 100644 teeting_backend/finance/migrations/0003_auto_20211121_1508.py create mode 100644 teeting_backend/finance/migrations/0004_alter_analysis_date.py diff --git a/teeting_backend/finance/migrations/0003_auto_20211121_1508.py b/teeting_backend/finance/migrations/0003_auto_20211121_1508.py new file mode 100644 index 0000000..06c4868 --- /dev/null +++ b/teeting_backend/finance/migrations/0003_auto_20211121_1508.py @@ -0,0 +1,35 @@ +# Generated by Django 3.2.9 on 2021-11-21 06:08 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('finance', '0002_analysis_child'), + ] + + operations = [ + migrations.RemoveField( + model_name='analysis', + name='aftrBlnc', + ), + migrations.RemoveField( + model_name='analysis', + name='mnrcDrotDsnc', + ), + migrations.RemoveField( + model_name='analysis', + name='trdd', + ), + migrations.RemoveField( + model_name='analysis', + name='txtm', + ), + migrations.AddField( + model_name='analysis', + name='date', + field=models.DateField(default=datetime.date(2021, 11, 21)), + ), + ] diff --git a/teeting_backend/finance/migrations/0004_alter_analysis_date.py b/teeting_backend/finance/migrations/0004_alter_analysis_date.py new file mode 100644 index 0000000..857e34e --- /dev/null +++ b/teeting_backend/finance/migrations/0004_alter_analysis_date.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.9 on 2021-11-21 06:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('finance', '0003_auto_20211121_1508'), + ] + + operations = [ + migrations.AlterField( + model_name='analysis', + name='date', + field=models.DateField(), + ), + ] diff --git a/teeting_backend/finance/models.py b/teeting_backend/finance/models.py index aab4398..dcc8361 100644 --- a/teeting_backend/finance/models.py +++ b/teeting_backend/finance/models.py @@ -1,20 +1,18 @@ from django.core import validators from django.db import models from django.db.models.deletion import CASCADE -from django.utils import translation from ttAccount.models import * from django.core import validators - # Create your models here. # 분석 모델 class Analysis(models.Model) : child = models.ForeignKey(Child, on_delete=CASCADE, default=1) - trdd = models.CharField(max_length=8) # 거래날짜 - txtm = models.CharField(max_length=6) # 거래시간 - mnrcDrotDsnc = models.IntegerField(validators=[validators.MinValueValidator(1), validators.MaxValueValidator(4)]) # 1,2는 입금 / 3,4는 출금 + date = models.DateField(auto_now=False) # 거래날짜 + # txtm = models.CharField(max_length=6) # 거래시간 + # mnrcDrotDsnc = models.IntegerField(validators=[validators.MinValueValidator(1), validators.MaxValueValidator(4)]) # 1,2는 입금 / 3,4는 출금 tram = models.IntegerField(validators = [validators.MinValueValidator(0)]) # 거래금액 - aftrBlnc = models.IntegerField() # 거래후잔액 + # aftrBlnc = models.IntegerField() # 거래후잔액 bnprCntn = models.TextField() # 통장인자내용 tuno = models.IntegerField() # 거래고유번호 CATEGORIIES = ( @@ -26,4 +24,4 @@ class Analysis(models.Model) : category = models.IntegerField(default=0, choices=CATEGORIIES) def __str__(self): - return self.tuno \ No newline at end of file + return self.bnprCntn \ No newline at end of file diff --git a/teeting_backend/finance/urls.py b/teeting_backend/finance/urls.py index 4d91333..6053a45 100644 --- a/teeting_backend/finance/urls.py +++ b/teeting_backend/finance/urls.py @@ -2,23 +2,26 @@ from .views import * -analysis_list = AnalysisViewSet.as_view({ - 'get' : 'list', - 'post' : 'create' -}) +# analysis_list = AnalysisViewSet.as_view({ +# 'get' : 'list', +# 'post' : 'create' +# }) -analysis_detail = AnalysisViewSet.as_view({ - 'get' : 'retrieve', - 'put' : 'update', - 'patch' : 'partial_update', - 'delete' : 'destroy', -}) +# analysis_detail = AnalysisViewSet.as_view({ +# 'get' : 'retrieve', +# 'put' : 'update', +# 'patch' : 'partial_update', +# 'delete' : 'destroy', +# }) urlpatterns = [ - path('analysis/', analysis_list), - path('analysis/', analysis_detail), + # path('analysis/', analysis_list), + # path('analysis/', analysis_detail), + + + path('analysis/', ChildAnalysisView.as_view()), # 자녀분석 조회 ?childId= path('balance/', ParentBalanceView.as_view()), # 잔액조회 부모 path('balance/child', ChildBalanceView.as_view()), # 잔액조회 자녀 - path('transaction/', ChildTransactionView.as_view()), # 거래내역조회 자녀 + path('transaction/', ChildTransactionView.as_view()), # 거래내역조회 자녀 ?childId=&period= ] \ No newline at end of file diff --git a/teeting_backend/finance/views.py b/teeting_backend/finance/views.py index 611e310..68277c6 100644 --- a/teeting_backend/finance/views.py +++ b/teeting_backend/finance/views.py @@ -1,5 +1,6 @@ from django.utils import datastructures from rest_framework import serializers, viewsets, authentication, status +from rest_framework.exceptions import bad_request from rest_framework.permissions import IsAuthenticated from rest_framework.authentication import TokenAuthentication from rest_framework.views import APIView @@ -16,33 +17,10 @@ import random from django.http import HttpResponse -from django.core import serializers # Create your views here. -# 분석작업 기본적인 CRUD 구현 변경 많이많이 필요함 -class AnalysisViewSet(viewsets.ModelViewSet) : - - permission_classes = [IsAuthenticated] - authentication_classes = [TokenAuthentication] - - queryset = Analysis.objects.all() - serializer_class = AnalysisSerializer - - def perform_create(self, serializer): - serializer.save(child = self.request.user) - - def get_queryset(self): - qs = super().get_queryset() - - if self.request.user.is_authenticated : - qs = qs.filter(child = self.request.user) - else : - qs = qs.none() - return qs - - # 잔액조회 (부모) class ParentBalanceView(APIView) : @@ -228,4 +206,70 @@ def get(self, request): return HttpResponse(json.dumps(data), content_type="text/json-comment-filtered", status = status.HTTP_200_OK) else : - return HttpResponse(res.status_code) \ No newline at end of file + return HttpResponse(res.status_code) + + + +# 자녀 분석결과 조회 +class ChildAnalysisView(APIView) : + + permission_classes = [IsAuthenticated] + authentication_classes = [TokenAuthentication] + + + def get(self, request): + + # 프론트에 response로 줄 json data + data = {} + childId = self.request.query_params.get('childId') + child = Child.objects.filter(pk = childId).first() + period = self.request.query_params.get('period') + + if not child : + return HttpResponse("You don't have such child", status=status.HTTP_400_BAD_REQUEST) + + + # 필터링할 날짜 범위 지정 + if period == "week" : + start_date = datetime.now().date() + relativedelta(days=-7) + elif period == "month" : + start_date = datetime.now().date() + relativedelta(months=-1) + elif period == "semiannual" : + start_date = datetime.now().date() + relativedelta(months=-6) + elif period == "annual" : + start_date = datetime.now().date() + relativedelta(years=-1) + else : + return HttpResponse("Period is uncorrect", status=status.HTTP_400_BAD_REQUEST) + + spending = Analysis.objects.filter(child = child).filter(date__range = [start_date, datetime.now().date()]) + + + # initializing + food = 0 # 0번 카테고리 + transportation = 0 # 1번 카테고리 + hobby = 0 # 2번 카테고리 + etc = 0 # 3번 카테고리 + + for i in range(len(spending)) : + if spending[i].category == 0 : + food += spending[i].tram + + elif spending[i].category == 1 : + transportation += spending[i].tram + + elif spending[i].category == 2 : + hobby += spending[i].tram + + elif spending[i].category == 3 : + etc += spending[i].tram + + data["food"] = food + data["transportation"] = transportation + data["hobby"] = hobby + data["etc"] = etc + data["total"] = food + transportation + hobby + etc + + if self.request.user.is_authenticated : + return HttpResponse(json.dumps(data), content_type="text/json-comment-filtered", status=status.HTTP_200_OK) + else : + return HttpResponse(status=status.HTTP_400_BAD_REQUEST) \ No newline at end of file From 8eea16ad4091672912b431ad3de1899bd218189f Mon Sep 17 00:00:00 2001 From: joy Date: Sun, 21 Nov 2021 15:57:32 +0900 Subject: [PATCH 08/14] =?UTF-8?q?[feat#22]=20assignment=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- teeting_backend/assignment/apps.py | 3 + .../migrations/0002_auto_20211121_1343.py | 26 +++++++++ teeting_backend/assignment/models.py | 11 +++- teeting_backend/assignment/serializers.py | 11 ++++ teeting_backend/assignment/signals.py | 55 +++++++++++++++++++ teeting_backend/assignment/urls.py | 12 ++++ teeting_backend/assignment/views.py | 34 ++++++++++++ teeting_backend/teeting_backend/settings.py | 1 + teeting_backend/teeting_backend/urls.py | 2 + 9 files changed, 152 insertions(+), 3 deletions(-) create mode 100644 teeting_backend/assignment/migrations/0002_auto_20211121_1343.py create mode 100644 teeting_backend/assignment/signals.py create mode 100644 teeting_backend/assignment/urls.py diff --git a/teeting_backend/assignment/apps.py b/teeting_backend/assignment/apps.py index d80b629..488efae 100644 --- a/teeting_backend/assignment/apps.py +++ b/teeting_backend/assignment/apps.py @@ -4,3 +4,6 @@ class AssignmentConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'assignment' + def ready(self) -> None: + import assignment.signals + return super().ready() diff --git a/teeting_backend/assignment/migrations/0002_auto_20211121_1343.py b/teeting_backend/assignment/migrations/0002_auto_20211121_1343.py new file mode 100644 index 0000000..19ee5f0 --- /dev/null +++ b/teeting_backend/assignment/migrations/0002_auto_20211121_1343.py @@ -0,0 +1,26 @@ +# Generated by Django 3.2.9 on 2021-11-21 04:43 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('assignment', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='mission', + name='isFinished', + ), + migrations.RemoveField( + model_name='mission', + name='isTransferred', + ), + migrations.AddField( + model_name='mission', + name='status', + field=models.IntegerField(choices=[(0, 'fail'), (1, 'success'), (2, 'doing'), (3, 'finished')], default=2), + ), + ] diff --git a/teeting_backend/assignment/models.py b/teeting_backend/assignment/models.py index a60c750..1dd02c0 100644 --- a/teeting_backend/assignment/models.py +++ b/teeting_backend/assignment/models.py @@ -6,14 +6,19 @@ # Create your models here. class Mission(models.Model): + STATUS = ( + (0, 'fail'), # 기한이 지나서 실패 + (1, 'success'), # 미션 성공, 송금하지 않은 상태 + (2, 'doing'), # 미션 진행중 + (3, 'finished') # 성공 후 송금 완료 + ) parent = models.ForeignKey(User, on_delete=CASCADE, default=1) child = models.ForeignKey(Child, on_delete=CASCADE, related_name='mission', default=1) begDate = models.DateTimeField(default=datetime.now) expDate = models.DateTimeField(default=datetime.now) - isFinished = models.BooleanField(default=False) + status = models.IntegerField(default=2, choices=STATUS) content = models.CharField(max_length=200) reward = models.IntegerField() - isTransferred = models.BooleanField(default=False) def __str__(self): return self.content @@ -35,4 +40,4 @@ class Achievement(models.Model): score = models.IntegerField(default=0) def __str__(self): - return self.child + return self.child.firstname + ' score' diff --git a/teeting_backend/assignment/serializers.py b/teeting_backend/assignment/serializers.py index 9e4b60a..049fe79 100644 --- a/teeting_backend/assignment/serializers.py +++ b/teeting_backend/assignment/serializers.py @@ -1,2 +1,13 @@ +from django.db import models +from django.db.models import fields from rest_framework import serializers from .models import Mission, Achievement + +class MissionSerializer(serializers.ModelSerializer): + class Meta: + model = Mission + fields = '__all__' +class AchievementSerializer(serializers.ModelSerializer): + class Meta: + model = Achievement + fields = '__all__' \ No newline at end of file diff --git a/teeting_backend/assignment/signals.py b/teeting_backend/assignment/signals.py new file mode 100644 index 0000000..e27c21d --- /dev/null +++ b/teeting_backend/assignment/signals.py @@ -0,0 +1,55 @@ +from django.db.models.signals import post_save +from django.core.signals import request_started +from django.db.models import F +from django.dispatch import receiver +from .models import Mission, Achievement +from datetime import datetime +# mission이 finished (& transferred..?) 되면 achievement의 score가 update +# achievement의 score가 update되면 achievement의 level이 update +@receiver(post_save, sender=Mission) +def update_achievement_score(sender, **kwargs): + childid = kwargs['instance'].child_id + status = kwargs['instance'].status + reward = kwargs['instance'].reward + try: + if status == 3: + Achievement.objects.filter(child_id=childid).update(score=F('score') + (reward * 0.1)) + except: + pass +@receiver(post_save, sender=Achievement) +def update_achievement_level(sender, **kwargs): + childid = kwargs['instance'].child_id + score = kwargs['instance'].score + try: + if score < 500: + Achievement.objects.filter(child_id=childid).update(level=1) + elif score < 1000: + Achievement.objects.filter(child_id=childid).update(level=2) + elif score < 1500: + Achievement.objects.filter(child_id=childid).update(level=3) + elif score < 2000: + Achievement.objects.filter(child_id=childid).update(level=4) + elif score < 2500: + Achievement.objects.filter(child_id=childid).update(level=5) + elif score < 3000: + Achievement.objects.filter(child_id=childid).update(level=6) + elif score < 3500: + Achievement.objects.filter(child_id=childid).update(level=7) + elif score < 4000: + Achievement.objects.filter(child_id=childid).update(level=8) + else: + Achievement.objects.filter(child_id=childid).update(level=9) + except: + pass + +# 현재 접근 시간보다 mission의 expDate가 이전이면 status를 fail로 +@receiver(request_started) +def date_expire(sender, **kwargs): + current = datetime.now().date() + try: + for mission in list(Mission.objects.all()): + if mission.status == 2 and mission.expDate.date() < current: + mission.status = 0 #fail + mission.save() + except: + print('error') \ No newline at end of file diff --git a/teeting_backend/assignment/urls.py b/teeting_backend/assignment/urls.py new file mode 100644 index 0000000..e502492 --- /dev/null +++ b/teeting_backend/assignment/urls.py @@ -0,0 +1,12 @@ +from rest_framework import routers, urlpatterns +from rest_framework.routers import DefaultRouter +from django.urls import path, include +from assignment import views + +router = DefaultRouter() +router.register(r'mission', views.MissionViewSet, basename='mission') +router.register(r'achievement', views.AchievementViewSet, basename='achievement') + +urlpatterns = [ + path('', include(router.urls)) +] \ No newline at end of file diff --git a/teeting_backend/assignment/views.py b/teeting_backend/assignment/views.py index 91ea44a..67b05c9 100644 --- a/teeting_backend/assignment/views.py +++ b/teeting_backend/assignment/views.py @@ -1,3 +1,37 @@ +from django.http import request from django.shortcuts import render +from rest_framework.permissions import IsAuthenticated +from rest_framework.authentication import TokenAuthentication +from rest_framework import viewsets +from ttAccount.models import Child +from .models import Mission, Achievement +from .serializers import MissionSerializer, AchievementSerializer # Create your views here. + +class MissionViewSet(viewsets.ModelViewSet): + #permission_classes = [IsAuthenticated] + #authentication_classes = [TokenAuthentication] + queryset = Mission.objects.all() + serializer_class = MissionSerializer + #해당 child에 대해서만 나오게 하려면 + + def get_queryset(self): + qs = super().get_queryset() + childid = self.request.query_params.get("childId", None) + if childid is not None: + qs = Mission.objects.filter(child_id=childid) + return qs + +class AchievementViewSet(viewsets.ModelViewSet): + #permission_classes = [IsAuthenticated] + #authentication_classes = [TokenAuthentication] + queryset = Achievement.objects.all() + serializer_class = AchievementSerializer + + def get_queryset(self): + qs = super().get_queryset() + childid = self.request.query_params.get("childId", None) + if childid is not None: + qs = Achievement.objects.filter(child_id=childid) + return qs \ No newline at end of file diff --git a/teeting_backend/teeting_backend/settings.py b/teeting_backend/teeting_backend/settings.py index a7cd307..8ac5cbd 100644 --- a/teeting_backend/teeting_backend/settings.py +++ b/teeting_backend/teeting_backend/settings.py @@ -142,5 +142,6 @@ ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication', + 'rest_framework.authentication.SessionAuthentication', ) } \ No newline at end of file diff --git a/teeting_backend/teeting_backend/urls.py b/teeting_backend/teeting_backend/urls.py index 4e33dfe..3094f92 100644 --- a/teeting_backend/teeting_backend/urls.py +++ b/teeting_backend/teeting_backend/urls.py @@ -18,10 +18,12 @@ from rest_framework import urls from rest_auth import urls from django.conf import settings +from assignment import urls urlpatterns = [ path('admin/', admin.site.urls), path('api-auth/', include("rest_framework.urls")), path('api/rest-auth/', include('rest_auth.urls')), + path('assignment/', include('assignment.urls')), ] From 8baeb6f2dce55516bfb2626c658f7b4072399d38 Mon Sep 17 00:00:00 2001 From: joy Date: Sun, 21 Nov 2021 17:11:40 +0900 Subject: [PATCH 09/14] =?UTF-8?q?[feat#25]=20=EC=86=A1=EA=B8=88=20api=20?= =?UTF-8?q?=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assignment/migrations/0001_initial.py | 5 +- .../migrations/0002_auto_20211121_1343.py | 26 ----- .../assignment/migrations/0002_initial.py | 4 +- .../finance/migrations/0001_initial.py | 7 +- .../finance/migrations/0002_analysis_child.py | 4 +- .../migrations/0003_auto_20211121_1508.py | 35 ------- .../migrations/0004_alter_analysis_date.py | 18 ---- teeting_backend/finance/urls.py | 5 +- teeting_backend/finance/views.py | 99 ++++++++++++++++++- teeting_backend/teeting_backend/urls.py | 2 +- .../ttAccount/migrations/0001_initial.py | 2 +- teeting_backend/ttAccount/urls.py | 4 +- 12 files changed, 113 insertions(+), 98 deletions(-) delete mode 100644 teeting_backend/assignment/migrations/0002_auto_20211121_1343.py delete mode 100644 teeting_backend/finance/migrations/0003_auto_20211121_1508.py delete mode 100644 teeting_backend/finance/migrations/0004_alter_analysis_date.py diff --git a/teeting_backend/assignment/migrations/0001_initial.py b/teeting_backend/assignment/migrations/0001_initial.py index 94ebc2b..4959057 100644 --- a/teeting_backend/assignment/migrations/0001_initial.py +++ b/teeting_backend/assignment/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.9 on 2021-11-18 17:02 +# Generated by Django 3.2.9 on 2021-11-21 07:42 import datetime from django.db import migrations, models @@ -26,10 +26,9 @@ class Migration(migrations.Migration): ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('begDate', models.DateTimeField(default=datetime.datetime.now)), ('expDate', models.DateTimeField(default=datetime.datetime.now)), - ('isFinished', models.BooleanField(default=False)), + ('status', models.IntegerField(choices=[(0, 'fail'), (1, 'success'), (2, 'doing'), (3, 'finished')], default=2)), ('content', models.CharField(max_length=200)), ('reward', models.IntegerField()), - ('isTransferred', models.BooleanField(default=False)), ], ), ] diff --git a/teeting_backend/assignment/migrations/0002_auto_20211121_1343.py b/teeting_backend/assignment/migrations/0002_auto_20211121_1343.py deleted file mode 100644 index 19ee5f0..0000000 --- a/teeting_backend/assignment/migrations/0002_auto_20211121_1343.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 3.2.9 on 2021-11-21 04:43 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('assignment', '0001_initial'), - ] - - operations = [ - migrations.RemoveField( - model_name='mission', - name='isFinished', - ), - migrations.RemoveField( - model_name='mission', - name='isTransferred', - ), - migrations.AddField( - model_name='mission', - name='status', - field=models.IntegerField(choices=[(0, 'fail'), (1, 'success'), (2, 'doing'), (3, 'finished')], default=2), - ), - ] diff --git a/teeting_backend/assignment/migrations/0002_initial.py b/teeting_backend/assignment/migrations/0002_initial.py index c86a93f..cfaa6a6 100644 --- a/teeting_backend/assignment/migrations/0002_initial.py +++ b/teeting_backend/assignment/migrations/0002_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.9 on 2021-11-18 17:02 +# Generated by Django 3.2.9 on 2021-11-21 07:42 from django.conf import settings from django.db import migrations, models @@ -10,9 +10,9 @@ class Migration(migrations.Migration): initial = True dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('assignment', '0001_initial'), ('ttAccount', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ diff --git a/teeting_backend/finance/migrations/0001_initial.py b/teeting_backend/finance/migrations/0001_initial.py index e101a15..956e4ca 100644 --- a/teeting_backend/finance/migrations/0001_initial.py +++ b/teeting_backend/finance/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.9 on 2021-11-18 17:02 +# Generated by Django 3.2.9 on 2021-11-21 07:42 import django.core.validators from django.db import migrations, models @@ -16,11 +16,8 @@ class Migration(migrations.Migration): name='Analysis', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('trdd', models.CharField(max_length=8)), - ('txtm', models.CharField(max_length=6)), - ('mnrcDrotDsnc', models.IntegerField(validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(4)])), + ('date', models.DateField()), ('tram', models.IntegerField(validators=[django.core.validators.MinValueValidator(0)])), - ('aftrBlnc', models.IntegerField()), ('bnprCntn', models.TextField()), ('tuno', models.IntegerField()), ('category', models.IntegerField(choices=[(0, '식비'), (1, '교통비'), (2, '문화생활비'), (3, '기타')], default=0)), diff --git a/teeting_backend/finance/migrations/0002_analysis_child.py b/teeting_backend/finance/migrations/0002_analysis_child.py index 36a9cd8..308ffdd 100644 --- a/teeting_backend/finance/migrations/0002_analysis_child.py +++ b/teeting_backend/finance/migrations/0002_analysis_child.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.9 on 2021-11-18 17:02 +# Generated by Django 3.2.9 on 2021-11-21 07:42 from django.db import migrations, models import django.db.models.deletion @@ -9,8 +9,8 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('ttAccount', '0001_initial'), ('finance', '0001_initial'), + ('ttAccount', '0001_initial'), ] operations = [ diff --git a/teeting_backend/finance/migrations/0003_auto_20211121_1508.py b/teeting_backend/finance/migrations/0003_auto_20211121_1508.py deleted file mode 100644 index 06c4868..0000000 --- a/teeting_backend/finance/migrations/0003_auto_20211121_1508.py +++ /dev/null @@ -1,35 +0,0 @@ -# Generated by Django 3.2.9 on 2021-11-21 06:08 - -import datetime -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('finance', '0002_analysis_child'), - ] - - operations = [ - migrations.RemoveField( - model_name='analysis', - name='aftrBlnc', - ), - migrations.RemoveField( - model_name='analysis', - name='mnrcDrotDsnc', - ), - migrations.RemoveField( - model_name='analysis', - name='trdd', - ), - migrations.RemoveField( - model_name='analysis', - name='txtm', - ), - migrations.AddField( - model_name='analysis', - name='date', - field=models.DateField(default=datetime.date(2021, 11, 21)), - ), - ] diff --git a/teeting_backend/finance/migrations/0004_alter_analysis_date.py b/teeting_backend/finance/migrations/0004_alter_analysis_date.py deleted file mode 100644 index 857e34e..0000000 --- a/teeting_backend/finance/migrations/0004_alter_analysis_date.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.9 on 2021-11-21 06:09 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('finance', '0003_auto_20211121_1508'), - ] - - operations = [ - migrations.AlterField( - model_name='analysis', - name='date', - field=models.DateField(), - ), - ] diff --git a/teeting_backend/finance/urls.py b/teeting_backend/finance/urls.py index 6053a45..cb4d866 100644 --- a/teeting_backend/finance/urls.py +++ b/teeting_backend/finance/urls.py @@ -20,8 +20,9 @@ # path('analysis/', analysis_detail), - path('analysis/', ChildAnalysisView.as_view()), # 자녀분석 조회 ?childId= + path('analysis', ChildAnalysisView.as_view()), # 자녀분석 조회 ?childId= path('balance/', ParentBalanceView.as_view()), # 잔액조회 부모 path('balance/child', ChildBalanceView.as_view()), # 잔액조회 자녀 - path('transaction/', ChildTransactionView.as_view()), # 거래내역조회 자녀 ?childId=&period= + path('transaction', ChildTransactionView.as_view()), # 거래내역조회 자녀 ?childId=&period= + path('remittance', RemittanceView.as_view()), #송금하기, ?childId= ] \ No newline at end of file diff --git a/teeting_backend/finance/views.py b/teeting_backend/finance/views.py index 68277c6..0ef653a 100644 --- a/teeting_backend/finance/views.py +++ b/teeting_backend/finance/views.py @@ -272,4 +272,101 @@ def get(self, request): if self.request.user.is_authenticated : return HttpResponse(json.dumps(data), content_type="text/json-comment-filtered", status=status.HTTP_200_OK) else : - return HttpResponse(status=status.HTTP_400_BAD_REQUEST) \ No newline at end of file + return HttpResponse(status=status.HTTP_400_BAD_REQUEST) + + + +class RemittanceView(APIView): + permission_classes = [IsAuthenticated] + authentication_classes = [TokenAuthentication] + + def post(self, request): + + user = User.objects.filter(username = self.request.user).first() + childid = self.request.query_params.get("childId", None) + if childid is not None: + child = Child.objects.filter(id=childid).first() + else: + return HttpResponse(status=status.HTTP_400_BAD_REQUEST) + + url_drawing = "https://developers.nonghyup.com/DrawingTransfer.nh" # 출금 이체 url + + apiNm = url_drawing[url_drawing.find(".com/")+5 : url_drawing.find(".nh")] + tsymd = datetime.today().strftime("%Y%m%d") + trtm = "112428" + iscd = user.iscd + fintechApsno = "001" + apiSvcCd = "ReceivedTransferA" + # isTuno = 임의번호로 채번 + accessToken = user.accessToken + finAcno = user.finAcno + tram = self.request.POST['tram'] + dractOtlt = child.lastname + child.firstname #출금인자내용 + + headers = { + "Content-Type": "application/json; chearset=utf-8", + } + + body = { + "Header": { + "ApiNm": apiNm, + "Tsymd": tsymd, + "Trtm": trtm, + "Iscd": iscd, + "FintechApsno": fintechApsno, + "ApiSvcCd": apiSvcCd, + "IsTuno": "0007773" + str(random.randint(0,10000)), # isTuno + "AccessToken": accessToken + }, + "FinAcno": finAcno, + "Tram" : tram, + "DractOtlt" : dractOtlt + } + res = requests.post(url_drawing, data=json.dumps(body), headers=headers) + if res.status_code == 200 : + #출금성공, 입금 + url_receive = "https://developers.nonghyup.com/ReceivedTransferAccountNumber.nh" # 출금 이체 url + + apiNm = url_receive[url_receive.find(".com/")+5 : url_receive.find(".nh")] + tsymd = datetime.today().strftime("%Y%m%d") + trtm = "112428" + iscd = child.iscd + fintechApsno = "001" + apiSvcCd = "ReceivedTransferA" + # isTuno = 임의번호로 채번 + accessToken = child.accessToken + bncd = "011" + acno = child.acno + tram = self.request.POST['tram'] + dractOtlt = child.lastname + child.firstname #출금인자내용 + mractOtlt = user.username + + headers = { + "Content-Type": "application/json; chearset=utf-8", + } + + body = { + "Header": { + "ApiNm": apiNm, + "Tsymd": tsymd, + "Trtm": trtm, + "Iscd": iscd, + "FintechApsno": fintechApsno, + "ApiSvcCd": apiSvcCd, + "IsTuno": "0007773" + str(random.randint(0,10000)), # isTuno + "AccessToken": accessToken + }, + "Bncd" : bncd, + "Acno" : acno, + "Tram" : tram, + "DractOtlt" : dractOtlt, + "MractOtlt" : mractOtlt + } + res = requests.post(url_receive, data=json.dumps(body), headers=headers) + if res.status_code == 200 : + return HttpResponse("remittance successed", status = status.HTTP_200_OK) + else: + return HttpResponse("drawed but not transferred error", res.status_code) #출금은 되었는데 입금이 안됨.... 나중에 핸들링 필요 + else : + #출금실패 + return HttpResponse("not drawed",res.status_code) diff --git a/teeting_backend/teeting_backend/urls.py b/teeting_backend/teeting_backend/urls.py index eb889bf..848441e 100644 --- a/teeting_backend/teeting_backend/urls.py +++ b/teeting_backend/teeting_backend/urls.py @@ -24,7 +24,7 @@ path('admin/', admin.site.urls), path('api-auth/', include("rest_framework.urls")), path('api/rest-auth/', include('rest_auth.urls')), - path('assignment/', include('assignment.urls')), + path('api/assignment/', include('assignment.urls')), path('api/ttAccount/', include('ttAccount.urls')), path('api/finance/', include('finance.urls')), diff --git a/teeting_backend/ttAccount/migrations/0001_initial.py b/teeting_backend/ttAccount/migrations/0001_initial.py index ed048dc..2fad220 100644 --- a/teeting_backend/ttAccount/migrations/0001_initial.py +++ b/teeting_backend/ttAccount/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.9 on 2021-11-18 17:02 +# Generated by Django 3.2.9 on 2021-11-21 07:42 from django.conf import settings import django.contrib.auth.models diff --git a/teeting_backend/ttAccount/urls.py b/teeting_backend/ttAccount/urls.py index 4352f40..c545186 100644 --- a/teeting_backend/ttAccount/urls.py +++ b/teeting_backend/ttAccount/urls.py @@ -18,8 +18,8 @@ urlpatterns = [ - path('user/', user_info), - path('child/', child_list), + path('user', user_info), + path('child', child_list), path('child/', child_detail), ] \ No newline at end of file From 1628a81d9ad6ea987a59163b2a7a55998b802c5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=90=EC=A0=95=EB=B2=94?= <2018027383@hanyang.ac.kr> Date: Sun, 21 Nov 2021 17:49:38 +0900 Subject: [PATCH 10/14] =?UTF-8?q?[feat#29]=20user=EB=AA=A8=EB=8D=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- requirements.txt | 9 +++ .../assignment/migrations/0001_initial.py | 5 +- .../migrations/0002_auto_20211121_1343.py | 26 ------- .../assignment/migrations/0002_initial.py | 4 +- .../finance/migrations/0001_initial.py | 7 +- .../finance/migrations/0002_analysis_child.py | 4 +- .../migrations/0003_auto_20211121_1508.py | 35 ---------- .../migrations/0004_alter_analysis_date.py | 18 ----- teeting_backend/teeting_backend/settings.py | 7 ++ teeting_backend/teeting_backend/urls.py | 4 +- .../ttAccount/migrations/0001_initial.py | 31 ++++---- teeting_backend/ttAccount/models.py | 70 +++++++++++++++++-- teeting_backend/ttAccount/serializers.py | 5 +- teeting_backend/ttAccount/urls.py | 6 +- teeting_backend/ttAccount/views.py | 3 +- 15 files changed, 115 insertions(+), 119 deletions(-) delete mode 100644 teeting_backend/assignment/migrations/0002_auto_20211121_1343.py delete mode 100644 teeting_backend/finance/migrations/0003_auto_20211121_1508.py delete mode 100644 teeting_backend/finance/migrations/0004_alter_analysis_date.py diff --git a/requirements.txt b/requirements.txt index 87db89b..6d61030 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,13 +1,22 @@ asgiref==3.4.1 certifi==2021.10.8 +cffi==1.15.0 charset-normalizer==2.0.7 +cryptography==35.0.0 +defusedxml==0.7.1 Django==3.2.9 +django-allauth==0.46.0 django-rest-auth==0.9.5 djangorestframework==3.12.4 idna==3.3 +oauthlib==3.1.1 +pycparser==2.21 +PyJWT==2.3.0 python-dateutil==2.8.2 +python3-openid==3.2.0 pytz==2021.3 requests==2.26.0 +requests-oauthlib==1.3.0 six==1.16.0 sqlparse==0.4.2 urllib3==1.26.7 diff --git a/teeting_backend/assignment/migrations/0001_initial.py b/teeting_backend/assignment/migrations/0001_initial.py index 94ebc2b..9c508d2 100644 --- a/teeting_backend/assignment/migrations/0001_initial.py +++ b/teeting_backend/assignment/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.9 on 2021-11-18 17:02 +# Generated by Django 3.2.9 on 2021-11-21 08:34 import datetime from django.db import migrations, models @@ -26,10 +26,9 @@ class Migration(migrations.Migration): ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('begDate', models.DateTimeField(default=datetime.datetime.now)), ('expDate', models.DateTimeField(default=datetime.datetime.now)), - ('isFinished', models.BooleanField(default=False)), + ('status', models.IntegerField(choices=[(0, 'fail'), (1, 'success'), (2, 'doing'), (3, 'finished')], default=2)), ('content', models.CharField(max_length=200)), ('reward', models.IntegerField()), - ('isTransferred', models.BooleanField(default=False)), ], ), ] diff --git a/teeting_backend/assignment/migrations/0002_auto_20211121_1343.py b/teeting_backend/assignment/migrations/0002_auto_20211121_1343.py deleted file mode 100644 index 19ee5f0..0000000 --- a/teeting_backend/assignment/migrations/0002_auto_20211121_1343.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 3.2.9 on 2021-11-21 04:43 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('assignment', '0001_initial'), - ] - - operations = [ - migrations.RemoveField( - model_name='mission', - name='isFinished', - ), - migrations.RemoveField( - model_name='mission', - name='isTransferred', - ), - migrations.AddField( - model_name='mission', - name='status', - field=models.IntegerField(choices=[(0, 'fail'), (1, 'success'), (2, 'doing'), (3, 'finished')], default=2), - ), - ] diff --git a/teeting_backend/assignment/migrations/0002_initial.py b/teeting_backend/assignment/migrations/0002_initial.py index c86a93f..b4d6e31 100644 --- a/teeting_backend/assignment/migrations/0002_initial.py +++ b/teeting_backend/assignment/migrations/0002_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.9 on 2021-11-18 17:02 +# Generated by Django 3.2.9 on 2021-11-21 08:34 from django.conf import settings from django.db import migrations, models @@ -10,9 +10,9 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('assignment', '0001_initial'), ('ttAccount', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('assignment', '0001_initial'), ] operations = [ diff --git a/teeting_backend/finance/migrations/0001_initial.py b/teeting_backend/finance/migrations/0001_initial.py index e101a15..2208397 100644 --- a/teeting_backend/finance/migrations/0001_initial.py +++ b/teeting_backend/finance/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.9 on 2021-11-18 17:02 +# Generated by Django 3.2.9 on 2021-11-21 08:34 import django.core.validators from django.db import migrations, models @@ -16,11 +16,8 @@ class Migration(migrations.Migration): name='Analysis', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('trdd', models.CharField(max_length=8)), - ('txtm', models.CharField(max_length=6)), - ('mnrcDrotDsnc', models.IntegerField(validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(4)])), + ('date', models.DateField()), ('tram', models.IntegerField(validators=[django.core.validators.MinValueValidator(0)])), - ('aftrBlnc', models.IntegerField()), ('bnprCntn', models.TextField()), ('tuno', models.IntegerField()), ('category', models.IntegerField(choices=[(0, '식비'), (1, '교통비'), (2, '문화생활비'), (3, '기타')], default=0)), diff --git a/teeting_backend/finance/migrations/0002_analysis_child.py b/teeting_backend/finance/migrations/0002_analysis_child.py index 36a9cd8..7f33685 100644 --- a/teeting_backend/finance/migrations/0002_analysis_child.py +++ b/teeting_backend/finance/migrations/0002_analysis_child.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.9 on 2021-11-18 17:02 +# Generated by Django 3.2.9 on 2021-11-21 08:34 from django.db import migrations, models import django.db.models.deletion @@ -9,8 +9,8 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('ttAccount', '0001_initial'), ('finance', '0001_initial'), + ('ttAccount', '0001_initial'), ] operations = [ diff --git a/teeting_backend/finance/migrations/0003_auto_20211121_1508.py b/teeting_backend/finance/migrations/0003_auto_20211121_1508.py deleted file mode 100644 index 06c4868..0000000 --- a/teeting_backend/finance/migrations/0003_auto_20211121_1508.py +++ /dev/null @@ -1,35 +0,0 @@ -# Generated by Django 3.2.9 on 2021-11-21 06:08 - -import datetime -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('finance', '0002_analysis_child'), - ] - - operations = [ - migrations.RemoveField( - model_name='analysis', - name='aftrBlnc', - ), - migrations.RemoveField( - model_name='analysis', - name='mnrcDrotDsnc', - ), - migrations.RemoveField( - model_name='analysis', - name='trdd', - ), - migrations.RemoveField( - model_name='analysis', - name='txtm', - ), - migrations.AddField( - model_name='analysis', - name='date', - field=models.DateField(default=datetime.date(2021, 11, 21)), - ), - ] diff --git a/teeting_backend/finance/migrations/0004_alter_analysis_date.py b/teeting_backend/finance/migrations/0004_alter_analysis_date.py deleted file mode 100644 index 857e34e..0000000 --- a/teeting_backend/finance/migrations/0004_alter_analysis_date.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.9 on 2021-11-21 06:09 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('finance', '0003_auto_20211121_1508'), - ] - - operations = [ - migrations.AlterField( - model_name='analysis', - name='date', - field=models.DateField(), - ), - ] diff --git a/teeting_backend/teeting_backend/settings.py b/teeting_backend/teeting_backend/settings.py index 8ac5cbd..684d09e 100644 --- a/teeting_backend/teeting_backend/settings.py +++ b/teeting_backend/teeting_backend/settings.py @@ -47,6 +47,13 @@ 'rest_framework', 'rest_auth', 'rest_framework.authtoken', + + 'django.contrib.sites', #회원가입 + 'allauth', + 'allauth.account', + 'allauth.socialaccount', + 'rest_auth.registration', + ] MIDDLEWARE = [ diff --git a/teeting_backend/teeting_backend/urls.py b/teeting_backend/teeting_backend/urls.py index eb889bf..ef4aa23 100644 --- a/teeting_backend/teeting_backend/urls.py +++ b/teeting_backend/teeting_backend/urls.py @@ -23,8 +23,8 @@ urlpatterns = [ path('admin/', admin.site.urls), path('api-auth/', include("rest_framework.urls")), - path('api/rest-auth/', include('rest_auth.urls')), - path('assignment/', include('assignment.urls')), + # path('api/rest-auth/', include('rest_auth.urls')), + path('api/assignment/', include('assignment.urls')), path('api/ttAccount/', include('ttAccount.urls')), path('api/finance/', include('finance.urls')), diff --git a/teeting_backend/ttAccount/migrations/0001_initial.py b/teeting_backend/ttAccount/migrations/0001_initial.py index ed048dc..6857fd9 100644 --- a/teeting_backend/ttAccount/migrations/0001_initial.py +++ b/teeting_backend/ttAccount/migrations/0001_initial.py @@ -1,11 +1,10 @@ -# Generated by Django 3.2.9 on 2021-11-18 17:02 +# Generated by Django 3.2.9 on 2021-11-21 08:34 from django.conf import settings -import django.contrib.auth.models -import django.contrib.auth.validators from django.db import migrations, models import django.db.models.deletion import django.utils.timezone +import ttAccount.models class Migration(migrations.Migration): @@ -24,28 +23,26 @@ class Migration(migrations.Migration): ('password', models.CharField(max_length=128, verbose_name='password')), ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), - ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), - ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), - ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), - ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), - ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), - ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), - ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), - ('birthday', models.CharField(max_length=8)), - ('finAcno', models.CharField(max_length=200)), - ('acno', models.CharField(max_length=100)), - ('iscd', models.CharField(max_length=20)), - ('accessToken', models.CharField(max_length=200)), + ('username', models.CharField(max_length=30, unique=True)), + ('firstname', models.CharField(max_length=30)), + ('lastname', models.CharField(max_length=30)), + ('is_staff', models.BooleanField(default=False)), + ('is_active', models.BooleanField(default=True)), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now)), + ('finAcno', models.CharField(blank=True, max_length=200, null=True)), + ('acno', models.CharField(blank=True, max_length=100, null=True)), + ('iscd', models.CharField(blank=True, max_length=20, null=True)), + ('accessToken', models.CharField(blank=True, max_length=200, null=True)), ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), ], options={ 'verbose_name': 'user', 'verbose_name_plural': 'users', - 'abstract': False, + 'swappable': 'AUTH_USER_MODEL', }, managers=[ - ('objects', django.contrib.auth.models.UserManager()), + ('objects', ttAccount.models.UserManager()), ], ), migrations.CreateModel( diff --git a/teeting_backend/ttAccount/models.py b/teeting_backend/ttAccount/models.py index dc8771c..0e1ebb5 100644 --- a/teeting_backend/ttAccount/models.py +++ b/teeting_backend/ttAccount/models.py @@ -2,14 +2,72 @@ from django.contrib.auth.models import AbstractUser from django.db.models.deletion import CASCADE from django.db.models.fields import related +from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager +from django.contrib.auth.models import PermissionsMixin +from django.utils import timezone + # Create your models here. -class User(AbstractUser): - birthday = models.CharField(max_length=8) - finAcno = models.CharField(max_length=200) #핀어카운트 - acno = models.CharField(max_length=100) #계좌 - iscd =models.CharField(max_length=20) #기관번호 - accessToken = models.CharField(max_length=200) #토큰 +# class User(AbstractUser): +# birthday = models.CharField(max_length=8) +# finAcno = models.CharField(max_length=200) #핀어카운트 +# acno = models.CharField(max_length=100) #계좌 +# iscd =models.CharField(max_length=20) #기관번호 +# accessToken = models.CharField(max_length=200) #토큰 + + +class UserManager(BaseUserManager): + use_in_migrations = True + + def _create_user(self, username, password, **extra_fields): + if not username : + raise ValueError('Username must be set') + user = self.model(username = username, **extra_fields) + user.set_password(password) + user.save(using=self._db) + return user + + def create_user(self, username=None, password=None, **extra_fields): + extra_fields.setdefault('is_staff', False) + extra_fields.setdefault('is_superuser', False) + return self._create_user(username, password, **extra_fields) + + def create_superuser(self, username, password, **extra_fields): + extra_fields.setdefault('is_staff', True) + extra_fields.setdefault('is_superuser', True) + + if extra_fields.get('is_staff') is not True: + raise ValueError('Superuser must have is_staff=True.') + if extra_fields.get('is_superuser') is not True: + raise ValueError('Superuser must have is_superuser=True.') + + return self._create_user(username, password, **extra_fields) + +class User(AbstractBaseUser, PermissionsMixin) : + + username = models.CharField(max_length=30, unique=True) + firstname = models.CharField(max_length=30) + lastname = models.CharField(max_length=30) + + is_staff = models.BooleanField(default=False) + is_active = models.BooleanField(default=True) + date_joined = models.DateTimeField(default=timezone.now) + + finAcno = models.CharField(max_length=200, null=True, blank=True) #핀어카운트 + acno = models.CharField(max_length=100, null=True, blank=True) #계좌 + iscd =models.CharField(max_length=20, null=True, blank=True) #기관번호 + accessToken = models.CharField(max_length=200, null=True, blank=True) #토큰 + + objects = UserManager() + + USERNAME_FIELD = 'username' + REQUIRED_FIELD = ['username'] + + class Meta: + verbose_name = 'user' + verbose_name_plural = 'users' + swappable = 'AUTH_USER_MODEL' + class Child(models.Model): diff --git a/teeting_backend/ttAccount/serializers.py b/teeting_backend/ttAccount/serializers.py index 7fd1464..f506c65 100644 --- a/teeting_backend/ttAccount/serializers.py +++ b/teeting_backend/ttAccount/serializers.py @@ -13,4 +13,7 @@ class Meta: class ChildSerializer(serializers.ModelSerializer) : class Meta : model = Child - fields = '__all__' \ No newline at end of file + fields = '__all__' + + + \ No newline at end of file diff --git a/teeting_backend/ttAccount/urls.py b/teeting_backend/ttAccount/urls.py index 4352f40..8ae952b 100644 --- a/teeting_backend/ttAccount/urls.py +++ b/teeting_backend/ttAccount/urls.py @@ -1,5 +1,7 @@ from django.urls import path from .views import * +from rest_auth.views import (LoginView, LogoutView) +from rest_auth.registration.views import RegisterView user_info = UserInfoViewSet.as_view({ 'get' : 'list', @@ -21,5 +23,7 @@ path('user/', user_info), path('child/', child_list), path('child/', child_detail), - + path('login', LoginView.as_view()), + path('logout', LogoutView.as_view()), + path('register', RegisterView.as_view()), ] \ No newline at end of file diff --git a/teeting_backend/ttAccount/views.py b/teeting_backend/ttAccount/views.py index 3c9a16e..1639cc7 100644 --- a/teeting_backend/ttAccount/views.py +++ b/teeting_backend/ttAccount/views.py @@ -1,4 +1,5 @@ -from rest_framework import viewsets +from rest_framework import generics, viewsets +from rest_framework import authentication from rest_framework.permissions import IsAuthenticated from rest_framework.authentication import TokenAuthentication From 3860c27796f067cfea4e8e39742b752af926c036 Mon Sep 17 00:00:00 2001 From: joy Date: Mon, 22 Nov 2021 16:53:23 +0900 Subject: [PATCH 11/14] =?UTF-8?q?[feat#31]=20assignment=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20=EA=B6=8C=ED=95=9C=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?=EB=B0=8F=20mission=20update?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assignment/migrations/0001_initial.py | 1 + .../assignment/migrations/0002_initial.py | 6 +-- .../0003_alter_achievement_level.py | 18 ++++++++ teeting_backend/assignment/models.py | 2 +- teeting_backend/assignment/signals.py | 2 +- teeting_backend/assignment/views.py | 41 ++++++++++++++----- .../finance/migrations/0001_initial.py | 1 + .../finance/migrations/0002_analysis_child.py | 3 +- teeting_backend/teeting_backend/settings.py | 6 ++- .../ttAccount/migrations/0001_initial.py | 2 + 10 files changed, 63 insertions(+), 19 deletions(-) create mode 100644 teeting_backend/assignment/migrations/0003_alter_achievement_level.py diff --git a/teeting_backend/assignment/migrations/0001_initial.py b/teeting_backend/assignment/migrations/0001_initial.py index 800fac0..6bb8ddb 100644 --- a/teeting_backend/assignment/migrations/0001_initial.py +++ b/teeting_backend/assignment/migrations/0001_initial.py @@ -1,3 +1,4 @@ +# Generated by Django 3.2.9 on 2021-11-22 05:37 import datetime from django.db import migrations, models diff --git a/teeting_backend/assignment/migrations/0002_initial.py b/teeting_backend/assignment/migrations/0002_initial.py index 94cfb7a..900d96a 100644 --- a/teeting_backend/assignment/migrations/0002_initial.py +++ b/teeting_backend/assignment/migrations/0002_initial.py @@ -1,3 +1,4 @@ +# Generated by Django 3.2.9 on 2021-11-22 05:37 from django.conf import settings from django.db import migrations, models @@ -9,11 +10,10 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('ttAccount', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('assignment', '0001_initial'), - + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] operations = [ migrations.AddField( diff --git a/teeting_backend/assignment/migrations/0003_alter_achievement_level.py b/teeting_backend/assignment/migrations/0003_alter_achievement_level.py new file mode 100644 index 0000000..f9b2327 --- /dev/null +++ b/teeting_backend/assignment/migrations/0003_alter_achievement_level.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.9 on 2021-11-22 07:26 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('assignment', '0002_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='achievement', + name='level', + field=models.IntegerField(choices=[(1, 'level1'), (2, 'level2'), (3, 'level3'), (4, 'level4'), (5, 'level5'), (6, 'level6'), (7, 'level7'), (8, 'level8'), (9, 'level9')], default=1), + ), + ] diff --git a/teeting_backend/assignment/models.py b/teeting_backend/assignment/models.py index 1dd02c0..9e06360 100644 --- a/teeting_backend/assignment/models.py +++ b/teeting_backend/assignment/models.py @@ -36,7 +36,7 @@ class Achievement(models.Model): (9, 'level9') ) child = models.OneToOneField(Child, on_delete=CASCADE, related_name='achievement_child') - level = models.IntegerField(choices=LEVEL_CHOICES) + level = models.IntegerField(choices=LEVEL_CHOICES, default=1) score = models.IntegerField(default=0) def __str__(self): diff --git a/teeting_backend/assignment/signals.py b/teeting_backend/assignment/signals.py index e27c21d..8855acd 100644 --- a/teeting_backend/assignment/signals.py +++ b/teeting_backend/assignment/signals.py @@ -13,7 +13,7 @@ def update_achievement_score(sender, **kwargs): reward = kwargs['instance'].reward try: if status == 3: - Achievement.objects.filter(child_id=childid).update(score=F('score') + (reward * 0.1)) + Achievement.objects.filter(child_id=childid).update(score=F('score') + (reward * 0.01)) except: pass @receiver(post_save, sender=Achievement) diff --git a/teeting_backend/assignment/views.py b/teeting_backend/assignment/views.py index 8ef3c48..c1bbf25 100644 --- a/teeting_backend/assignment/views.py +++ b/teeting_backend/assignment/views.py @@ -4,34 +4,53 @@ from rest_framework.authentication import TokenAuthentication from rest_framework import viewsets + from ttAccount.models import Child from .models import Mission, Achievement from .serializers import MissionSerializer, AchievementSerializer # Create your views here. class MissionViewSet(viewsets.ModelViewSet): - #permission_classes = [IsAuthenticated] - #authentication_classes = [TokenAuthentication] + permission_classes = [IsAuthenticated] + authentication_classes = [TokenAuthentication] queryset = Mission.objects.all() serializer_class = MissionSerializer #해당 child에 대해서만 나오게 하려면 - + def get_queryset(self): qs = super().get_queryset() - childid = self.request.query_params.get("childId", None) - if childid is not None: - qs = Mission.objects.filter(child_id=childid) + if self.request.method == "GET": + if self.request.user.is_authenticated : # 로그인 유무 + childid = self.request.query_params.get("childId", None) + # childid가 존재하고 현재 로그인 된 유저의 자식일때만 반영 + if childid is not None and Child.objects.filter(id=childid).first().parent == self.request.user: + qs = Mission.objects.filter(child_id=childid) + else: + qs = qs.none() + else: + qs = qs.none() return qs + + def update(self, request, *args, **kwargs): + kwargs['partial'] = True + return super().update(request, *args, **kwargs) + class AchievementViewSet(viewsets.ModelViewSet): - #permission_classes = [IsAuthenticated] - #authentication_classes = [TokenAuthentication] + permission_classes = [IsAuthenticated] + authentication_classes = [TokenAuthentication] queryset = Achievement.objects.all() serializer_class = AchievementSerializer def get_queryset(self): qs = super().get_queryset() - childid = self.request.query_params.get("childId", None) - if childid is not None: - qs = Achievement.objects.filter(child_id=childid) + if self.request.user.is_authenticated : # 로그인 유무 + childid = self.request.query_params.get("childId", None) + # childid가 존재하고 현재 로그인 된 유저의 자식일때만 반영 + if childid is not None and Child.objects.filter(id=childid).first().parent == self.request.user: + qs = Achievement.objects.filter(child_id=childid) + else: + qs = qs.none() + else: + qs = qs.none() return qs diff --git a/teeting_backend/finance/migrations/0001_initial.py b/teeting_backend/finance/migrations/0001_initial.py index ade193b..921b0bf 100644 --- a/teeting_backend/finance/migrations/0001_initial.py +++ b/teeting_backend/finance/migrations/0001_initial.py @@ -1,3 +1,4 @@ +# Generated by Django 3.2.9 on 2021-11-22 05:37 import django.core.validators from django.db import migrations, models diff --git a/teeting_backend/finance/migrations/0002_analysis_child.py b/teeting_backend/finance/migrations/0002_analysis_child.py index 0285f0c..af345e5 100644 --- a/teeting_backend/finance/migrations/0002_analysis_child.py +++ b/teeting_backend/finance/migrations/0002_analysis_child.py @@ -1,3 +1,4 @@ +# Generated by Django 3.2.9 on 2021-11-22 05:37 from django.db import migrations, models import django.db.models.deletion @@ -8,8 +9,8 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('finance', '0001_initial'), ('ttAccount', '0001_initial'), + ('finance', '0001_initial'), ] operations = [ diff --git a/teeting_backend/teeting_backend/settings.py b/teeting_backend/teeting_backend/settings.py index 684d09e..cd4ec56 100644 --- a/teeting_backend/teeting_backend/settings.py +++ b/teeting_backend/teeting_backend/settings.py @@ -149,6 +149,8 @@ ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication', - 'rest_framework.authentication.SessionAuthentication', + #'rest_framework.authentication.SessionAuthentication', ) -} \ No newline at end of file +} + +SITE_ID = 1 \ No newline at end of file diff --git a/teeting_backend/ttAccount/migrations/0001_initial.py b/teeting_backend/ttAccount/migrations/0001_initial.py index a8959bf..f751153 100644 --- a/teeting_backend/ttAccount/migrations/0001_initial.py +++ b/teeting_backend/ttAccount/migrations/0001_initial.py @@ -1,3 +1,5 @@ +# Generated by Django 3.2.9 on 2021-11-22 05:37 + from django.conf import settings from django.db import migrations, models import django.db.models.deletion From 0c8ea96290c9eaa017bbf26d4b07825ba61c68fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=90=EC=A0=95=EB=B2=94?= <2018027383@hanyang.ac.kr> Date: Mon, 22 Nov 2021 19:43:48 +0900 Subject: [PATCH 12/14] =?UTF-8?q?[feat#33]=20=EB=B6=80=EB=AA=A8=20?= =?UTF-8?q?=EA=B1=B0=EB=9E=98=EB=82=B4=EC=97=AD=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assignment/migrations/0001_initial.py | 1 + .../assignment/migrations/0002_initial.py | 6 +- .../finance/migrations/0001_initial.py | 1 + .../finance/migrations/0002_analysis_child.py | 3 +- teeting_backend/finance/urls.py | 3 +- teeting_backend/finance/views.py | 145 ++++++++++++------ teeting_backend/teeting_backend/settings.py | 4 +- .../ttAccount/migrations/0001_initial.py | 2 + .../ttAccount/migrations/0002_user_birthda.py | 19 +++ .../0003_rename_birthda_user_birthday.py | 18 +++ teeting_backend/ttAccount/models.py | 1 + 11 files changed, 146 insertions(+), 57 deletions(-) create mode 100644 teeting_backend/ttAccount/migrations/0002_user_birthda.py create mode 100644 teeting_backend/ttAccount/migrations/0003_rename_birthda_user_birthday.py diff --git a/teeting_backend/assignment/migrations/0001_initial.py b/teeting_backend/assignment/migrations/0001_initial.py index 800fac0..5a7597a 100644 --- a/teeting_backend/assignment/migrations/0001_initial.py +++ b/teeting_backend/assignment/migrations/0001_initial.py @@ -1,3 +1,4 @@ +# Generated by Django 3.2.9 on 2021-11-22 10:24 import datetime from django.db import migrations, models diff --git a/teeting_backend/assignment/migrations/0002_initial.py b/teeting_backend/assignment/migrations/0002_initial.py index 94cfb7a..b99a611 100644 --- a/teeting_backend/assignment/migrations/0002_initial.py +++ b/teeting_backend/assignment/migrations/0002_initial.py @@ -1,3 +1,4 @@ +# Generated by Django 3.2.9 on 2021-11-22 10:24 from django.conf import settings from django.db import migrations, models @@ -9,11 +10,10 @@ class Migration(migrations.Migration): initial = True dependencies = [ - + ('assignment', '0001_initial'), ('ttAccount', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('assignment', '0001_initial'), - + ] operations = [ migrations.AddField( diff --git a/teeting_backend/finance/migrations/0001_initial.py b/teeting_backend/finance/migrations/0001_initial.py index ade193b..71de44f 100644 --- a/teeting_backend/finance/migrations/0001_initial.py +++ b/teeting_backend/finance/migrations/0001_initial.py @@ -1,3 +1,4 @@ +# Generated by Django 3.2.9 on 2021-11-22 10:24 import django.core.validators from django.db import migrations, models diff --git a/teeting_backend/finance/migrations/0002_analysis_child.py b/teeting_backend/finance/migrations/0002_analysis_child.py index 0285f0c..a032d23 100644 --- a/teeting_backend/finance/migrations/0002_analysis_child.py +++ b/teeting_backend/finance/migrations/0002_analysis_child.py @@ -1,3 +1,4 @@ +# Generated by Django 3.2.9 on 2021-11-22 10:24 from django.db import migrations, models import django.db.models.deletion @@ -8,8 +9,8 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('finance', '0001_initial'), ('ttAccount', '0001_initial'), + ('finance', '0001_initial'), ] operations = [ diff --git a/teeting_backend/finance/urls.py b/teeting_backend/finance/urls.py index cb4d866..e406f0a 100644 --- a/teeting_backend/finance/urls.py +++ b/teeting_backend/finance/urls.py @@ -23,6 +23,7 @@ path('analysis', ChildAnalysisView.as_view()), # 자녀분석 조회 ?childId= path('balance/', ParentBalanceView.as_view()), # 잔액조회 부모 path('balance/child', ChildBalanceView.as_view()), # 잔액조회 자녀 - path('transaction', ChildTransactionView.as_view()), # 거래내역조회 자녀 ?childId=&period= + # path('transaction', ChildTransactionView.as_view()), # 거래내역조회 자녀 부모 포함?childId=&period= + path('transaction', TransactionView.as_view()), path('remittance', RemittanceView.as_view()), #송금하기, ?childId= ] \ No newline at end of file diff --git a/teeting_backend/finance/views.py b/teeting_backend/finance/views.py index 0ef653a..6ce1ff0 100644 --- a/teeting_backend/finance/views.py +++ b/teeting_backend/finance/views.py @@ -70,7 +70,7 @@ def get(self, request): data["balance"] = int(res.json()["Ldbl"]) return HttpResponse(json.dumps(data), content_type="text/json-comment-filtered", status = status.HTTP_200_OK) else : - return HttpResponse(res.status_code) + return HttpResponse("No User", res.status_code) # 잔액조회 (자녀) class ChildBalanceView(APIView) : @@ -126,65 +126,110 @@ def get(self, request): children_data["balance"] = int(res.json()["Ldbl"]) data.append(children_data) else : - return HttpResponse(res.status_code) + return HttpResponse("No child", res.status_code) return HttpResponse(json.dumps(data), content_type="text/json-comment-filtered", status = status.HTTP_200_OK) - -# 자녀 거래내역 조회 -class ChildTransactionView(APIView) : +# 거래내역 조회 -> params가 있다면 자녀거래내역 조회 / 없다면 유저(부모)의 거래내역 조회 +class TransactionView(APIView) : permission_classes = [IsAuthenticated] authentication_classes = [TokenAuthentication] def get(self, request): + url = 'https://developers.nonghyup.com/InquireTransactionHistory.nh' # 거래내역 조회 url + user = User.objects.filter(username = self.request.user).first() childId = self.request.query_params.get('childId') - currentUser = User.objects.filter(username = self.request.user).first() - child = Child.objects.filter(parent = currentUser).filter(pk = childId).first() + + # params로 받은 childId값이 없다면 유저거래내역 조회 + if not childId : + apiNm = url[url.find(".com/")+5:url.find(".nh")] + tsymd = datetime.today().strftime("%Y%m%d") + trtm = "112428" + iscd = user.iscd + fintechApsno = "001" + apiSvcCd = "ReceivedTransferA" + # isTuno = 임의번호로 채번 + accessToken = user.accessToken + bncd = "011" # 농협은행코드 고정값 + acno = user.acno + insymd = (datetime.today() + relativedelta(days=-90)).strftime("%Y%m%d") + ineymd = datetime.today().strftime("%Y%m%d") + trnsDsnc = "A" + lnsq = "DESC" + pageNo = "1" + dmcnt = "100" + + headers = { + "Content-Type": "application/json; chearset=utf-8", + } - url = 'https://developers.nonghyup.com/InquireTransactionHistory.nh' # 거래내역 조회 url + body = { + "Header": { + "ApiNm": apiNm, + "Tsymd": tsymd, + "Trtm": trtm, + "Iscd": iscd, + "FintechApsno": fintechApsno, + "ApiSvcCd": apiSvcCd, + "IsTuno": "0007773" + str(random.randint(0,10000)), # isTuno + "AccessToken": accessToken + }, + "Bncd": bncd, + "Acno": acno, + "Insymd": insymd, + "Ineymd": ineymd, + "TrnsDsnc": trnsDsnc, + "Lnsq": lnsq, + "PageNo": pageNo, + "Dmcnt": dmcnt + } + + # params로 받은 childId값이 있다면 유저거래내역 조회 + else : + child = Child.objects.filter(parent = user).filter(pk = childId).first() - apiNm = url[url.find(".com/")+5:url.find(".nh")] - tsymd = datetime.today().strftime("%Y%m%d") - trtm = "112428" - iscd = child.iscd - fintechApsno = "001" - apiSvcCd = "ReceivedTransferA" - # isTuno = 임의번호로 채번 - accessToken = child.accessToken - bncd = "011" # 농협은행코드 고정값 - acno = child.acno - insymd = (datetime.today() + relativedelta(days=-90)).strftime("%Y%m%d") - ineymd = datetime.today().strftime("%Y%m%d") - trnsDsnc = "A" - lnsq = "DESC" - pageNo = "1" - dmcnt = "100" - - headers = { - "Content-Type": "application/json; chearset=utf-8", - } + apiNm = url[url.find(".com/")+5:url.find(".nh")] + tsymd = datetime.today().strftime("%Y%m%d") + trtm = "112428" + iscd = child.iscd + fintechApsno = "001" + apiSvcCd = "ReceivedTransferA" + # isTuno = 임의번호로 채번 + accessToken = child.accessToken + bncd = "011" # 농협은행코드 고정값 + acno = child.acno + insymd = (datetime.today() + relativedelta(days=-90)).strftime("%Y%m%d") + ineymd = datetime.today().strftime("%Y%m%d") + trnsDsnc = "A" + lnsq = "DESC" + pageNo = "1" + dmcnt = "100" + + headers = { + "Content-Type": "application/json; chearset=utf-8", + } - body = { - "Header": { - "ApiNm": apiNm, - "Tsymd": tsymd, - "Trtm": trtm, - "Iscd": iscd, - "FintechApsno": fintechApsno, - "ApiSvcCd": apiSvcCd, - "IsTuno": "0007773" + str(random.randint(0,10000)), # isTuno - "AccessToken": accessToken - }, - "Bncd": bncd, - "Acno": acno, - "Insymd": insymd, - "Ineymd": ineymd, - "TrnsDsnc": trnsDsnc, - "Lnsq": lnsq, - "PageNo": pageNo, - "Dmcnt": dmcnt - } + body = { + "Header": { + "ApiNm": apiNm, + "Tsymd": tsymd, + "Trtm": trtm, + "Iscd": iscd, + "FintechApsno": fintechApsno, + "ApiSvcCd": apiSvcCd, + "IsTuno": "0007773" + str(random.randint(0,10000)), # isTuno + "AccessToken": accessToken + }, + "Bncd": bncd, + "Acno": acno, + "Insymd": insymd, + "Ineymd": ineymd, + "TrnsDsnc": trnsDsnc, + "Lnsq": lnsq, + "PageNo": pageNo, + "Dmcnt": dmcnt + } # 프론트에 response로 줄 json data data = [] @@ -206,8 +251,7 @@ def get(self, request): return HttpResponse(json.dumps(data), content_type="text/json-comment-filtered", status = status.HTTP_200_OK) else : - return HttpResponse(res.status_code) - + return HttpResponse("No User or No Child", res.status_code) # 자녀 분석결과 조회 @@ -228,7 +272,6 @@ def get(self, request): if not child : return HttpResponse("You don't have such child", status=status.HTTP_400_BAD_REQUEST) - # 필터링할 날짜 범위 지정 if period == "week" : start_date = datetime.now().date() + relativedelta(days=-7) diff --git a/teeting_backend/teeting_backend/settings.py b/teeting_backend/teeting_backend/settings.py index 684d09e..bdbb952 100644 --- a/teeting_backend/teeting_backend/settings.py +++ b/teeting_backend/teeting_backend/settings.py @@ -151,4 +151,6 @@ 'rest_framework.authentication.TokenAuthentication', 'rest_framework.authentication.SessionAuthentication', ) -} \ No newline at end of file +} + +SITE_ID = 1 \ No newline at end of file diff --git a/teeting_backend/ttAccount/migrations/0001_initial.py b/teeting_backend/ttAccount/migrations/0001_initial.py index a8959bf..b9f9216 100644 --- a/teeting_backend/ttAccount/migrations/0001_initial.py +++ b/teeting_backend/ttAccount/migrations/0001_initial.py @@ -1,3 +1,5 @@ +# Generated by Django 3.2.9 on 2021-11-22 10:24 + from django.conf import settings from django.db import migrations, models import django.db.models.deletion diff --git a/teeting_backend/ttAccount/migrations/0002_user_birthda.py b/teeting_backend/ttAccount/migrations/0002_user_birthda.py new file mode 100644 index 0000000..39abdf8 --- /dev/null +++ b/teeting_backend/ttAccount/migrations/0002_user_birthda.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.9 on 2021-11-22 10:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ttAccount', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='birthda', + field=models.CharField(default=19990221, max_length=8), + preserve_default=False, + ), + ] diff --git a/teeting_backend/ttAccount/migrations/0003_rename_birthda_user_birthday.py b/teeting_backend/ttAccount/migrations/0003_rename_birthda_user_birthday.py new file mode 100644 index 0000000..363bff2 --- /dev/null +++ b/teeting_backend/ttAccount/migrations/0003_rename_birthda_user_birthday.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.9 on 2021-11-22 10:32 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('ttAccount', '0002_user_birthda'), + ] + + operations = [ + migrations.RenameField( + model_name='user', + old_name='birthda', + new_name='birthday', + ), + ] diff --git a/teeting_backend/ttAccount/models.py b/teeting_backend/ttAccount/models.py index 0e1ebb5..6b5b83f 100644 --- a/teeting_backend/ttAccount/models.py +++ b/teeting_backend/ttAccount/models.py @@ -48,6 +48,7 @@ class User(AbstractBaseUser, PermissionsMixin) : username = models.CharField(max_length=30, unique=True) firstname = models.CharField(max_length=30) lastname = models.CharField(max_length=30) + birthday = models.CharField(max_length=8) is_staff = models.BooleanField(default=False) is_active = models.BooleanField(default=True) From 2f6a5a0733a81d9fc3856afd5cbd16fc0f8772f8 Mon Sep 17 00:00:00 2001 From: joy Date: Mon, 22 Nov 2021 19:51:25 +0900 Subject: [PATCH 13/14] =?UTF-8?q?[feat#34]=20MySQL=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- teeting_backend/my_settings.py | 11 +++++++++++ teeting_backend/teeting_backend/settings.py | 9 ++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 teeting_backend/my_settings.py diff --git a/teeting_backend/my_settings.py b/teeting_backend/my_settings.py new file mode 100644 index 0000000..3993876 --- /dev/null +++ b/teeting_backend/my_settings.py @@ -0,0 +1,11 @@ +DATABASES = { + 'default' : { + 'ENGINE' : 'django.db.backends.mysql', + 'NAME' : 'teenting_db', + 'USER' : 'root', + 'PASSWORD' : 'password', + 'HOST' : 'localhost', + 'PORT' : '3306', + } +} +SECRET_KEY = 'django-insecure-ekox3y18$=_o!eeh&qx47dxy&t8+(f_avmzj=too-3mt^+=ng*' \ No newline at end of file diff --git a/teeting_backend/teeting_backend/settings.py b/teeting_backend/teeting_backend/settings.py index cd4ec56..836068f 100644 --- a/teeting_backend/teeting_backend/settings.py +++ b/teeting_backend/teeting_backend/settings.py @@ -11,6 +11,7 @@ """ from pathlib import Path +import my_settings # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -20,8 +21,8 @@ # See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = 'django-insecure-ekox3y18$=_o!eeh&qx47dxy&t8+(f_avmzj=too-3mt^+=ng*' - +# SECRET_KEY = 'django-insecure-ekox3y18$=_o!eeh&qx47dxy&t8+(f_avmzj=too-3mt^+=ng*' +SECRET_KEY = my_settings.SECRET_KEY # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True @@ -89,13 +90,15 @@ # Database # https://docs.djangoproject.com/en/3.2/ref/settings/#databases - +''' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } } +''' +DATABASES = my_settings.DATABASES # Password validation From 0e30eb290056070f11625a9a0b22c2d0f85b9a75 Mon Sep 17 00:00:00 2001 From: joy Date: Mon, 22 Nov 2021 20:38:36 +0900 Subject: [PATCH 14/14] lightsail host add --- teeting_backend/teeting_backend/settings.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/teeting_backend/teeting_backend/settings.py b/teeting_backend/teeting_backend/settings.py index 836068f..10e5d04 100644 --- a/teeting_backend/teeting_backend/settings.py +++ b/teeting_backend/teeting_backend/settings.py @@ -26,7 +26,9 @@ # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = [] +ALLOWED_HOSTS = [ + '3.37.71.54' +] # Application definition