From ad074e34792c20571b8eaa2e768d1037c008ab68 Mon Sep 17 00:00:00 2001 From: irfan Date: Sun, 23 Oct 2022 20:31:43 +0300 Subject: [PATCH] Initial models and tests --- app/backend/backend/constants.py | 13 +++ .../backend/migrations/0001_initial.py | 90 ++++++++++++++++++ app/backend/backend/migrations/__init__.py | 0 app/backend/backend/models.py | 92 +++++++++++++++++++ app/backend/backend/settings.py | 9 +- app/backend/backend/utils.py | 7 ++ app/backend/tests/__init__.py | 0 app/backend/tests/test_models.py | 30 ++++++ 8 files changed, 238 insertions(+), 3 deletions(-) create mode 100644 app/backend/backend/constants.py create mode 100644 app/backend/backend/migrations/0001_initial.py create mode 100644 app/backend/backend/migrations/__init__.py create mode 100644 app/backend/backend/models.py create mode 100644 app/backend/backend/utils.py create mode 100644 app/backend/tests/__init__.py create mode 100644 app/backend/tests/test_models.py diff --git a/app/backend/backend/constants.py b/app/backend/backend/constants.py new file mode 100644 index 00000000..3b09970c --- /dev/null +++ b/app/backend/backend/constants.py @@ -0,0 +1,13 @@ +from enum import Enum + +""" +c = UserType.ADMIN +print(c) -> UserType.ADMIN +print(c.name) -> ADMIN +print(c.value) -> 0 +print(c is UserType.ADMIN) -> True +""" +class UserType(Enum): + ADMIN = 0 + DOCTOR = 1 + MEMBER = 2 diff --git a/app/backend/backend/migrations/0001_initial.py b/app/backend/backend/migrations/0001_initial.py new file mode 100644 index 00000000..76dfd8e8 --- /dev/null +++ b/app/backend/backend/migrations/0001_initial.py @@ -0,0 +1,90 @@ +# Generated by Django 4.1.2 on 2022-10-23 16:29 + +import django.contrib.postgres.fields +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Category', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50)), + ('definition', models.CharField(max_length=100, null=True)), + ], + ), + migrations.CreateModel( + name='MemberInfo', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('firstname', models.CharField(max_length=25)), + ('lastname', models.CharField(max_length=25)), + ('address', models.CharField(max_length=100, null=True)), + ('weight', models.DecimalField(decimal_places=1, max_digits=3, null=True)), + ('height', models.DecimalField(decimal_places=1, max_digits=3, null=True)), + ('age', models.IntegerField(null=True)), + ('past_illnesses', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=25), null=True, size=None)), + ('allergies', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=25), null=True, size=None)), + ('chronic_diseases', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=25), null=True, size=None)), + ('undergone_operations', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=25), null=True, size=None)), + ('used_drugs', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=25), null=True, size=None)), + ], + ), + migrations.CreateModel( + name='User', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=200)), + ('email', models.CharField(max_length=100)), + ('type', models.IntegerField()), + ], + ), + migrations.CreateModel( + name='Admin', + fields=[ + ('user_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='backend.user')), + ('username', models.CharField(max_length=50)), + ], + bases=('backend.user',), + ), + migrations.CreateModel( + name='Report', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('message', models.CharField(max_length=500)), + ('reported_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reported_user', to='backend.user')), + ('reporter_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reporter_user', to='backend.user')), + ('reviewed_by', models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='reviewed_by', to='backend.admin')), + ], + ), + migrations.CreateModel( + name='Member', + fields=[ + ('user_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='backend.user')), + ('username', models.CharField(max_length=50)), + ('avatar', models.CharField(max_length=200)), + ('banned_by', models.CharField(max_length=50, null=True)), + ('info', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='backend.memberinfo')), + ], + bases=('backend.user',), + ), + migrations.CreateModel( + name='Doctor', + fields=[ + ('user_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='backend.user')), + ('full_name', models.CharField(max_length=50)), + ('hospital_name', models.CharField(max_length=100, null=True)), + ('verified', models.BooleanField(default=False, max_length=100)), + ('specialization', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='backend.category')), + ], + bases=('backend.user',), + ), + ] diff --git a/app/backend/backend/migrations/__init__.py b/app/backend/backend/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/app/backend/backend/models.py b/app/backend/backend/models.py new file mode 100644 index 00000000..abc2f411 --- /dev/null +++ b/app/backend/backend/models.py @@ -0,0 +1,92 @@ +# from backend.auth_system import models +# from backend.follow_system import models +# from backend.profile_management import models + +from django.db import models +from django.contrib.postgres.fields import ArrayField + + +class User(models.Model): + password = models.CharField(max_length=200, null=False) + email = models.CharField(max_length=100, null=False) + + type = models.IntegerField(null=False) + + def __str__(self): + return self.email + + +class Admin(User): + # user = models.ForeignKey(User, on_delete=models.CASCADE) + username = models.CharField(max_length=50, null=False) + + def __str__(self): + return self.username + +class MemberInfo(models.Model): + firstname = models.CharField(max_length=25, null=False) + lastname = models.CharField(max_length=25, null=False) + address = models.CharField(max_length=100, null=True) + weight = models.DecimalField(null=True, max_digits=3, decimal_places=1) + height = models.DecimalField(null=True, max_digits=3, decimal_places=1) + age = models.IntegerField(null=True) + + past_illnesses = ArrayField( + models.CharField(max_length=25), null=True + ) + allergies = ArrayField( + models.CharField(max_length=25), null=True + ) + chronic_diseases = ArrayField( + models.CharField(max_length=25), null=True + ) + undergone_operations = ArrayField( + models.CharField(max_length=25), null=True + ) + used_drugs = ArrayField( + models.CharField(max_length=25), null=True + ) + + +class Member(User): + username = models.CharField(max_length=50, null=False) + avatar = models.CharField(max_length=200, null=False) + banned_by = models.CharField(max_length=50, null=True) # username of admin + + info = models.ForeignKey(MemberInfo, null=False, on_delete=models.CASCADE) + + def __str__(self): + retval = "" + if self.info.firstname != None: + retval += self.info.firstname + " " + if self.info.lastname != None: + retval += self.info.firstname + + if retval != " ": + return retval + + return self.username + + +class Category(models.Model): + name = models.CharField(max_length=50, null=False) + definition = models.CharField(max_length=100, null=True) + + +class Doctor(User): + full_name = models.CharField(max_length=50, null=False) + specialization = models.ForeignKey(Category, null=True, on_delete=models.SET_NULL) + hospital_name = models.CharField(max_length=100, null=True) + verified = models.BooleanField(max_length=100, null=False, default=False) + + def __str__(self): + return self.full_name + + +class Report(models.Model): + reporter_user = models.ForeignKey(User, null=False, on_delete=models.CASCADE, related_name='reporter_user') + reported_user = models.ForeignKey(User, null=False, on_delete=models.CASCADE, related_name='reported_user') + message = models.CharField(max_length=500, null=False) + reviewed_by = models.ForeignKey(Admin, null=True, default=None, on_delete=models.SET_NULL, related_name='reviewed_by') + + diff --git a/app/backend/backend/settings.py b/app/backend/backend/settings.py index 968cda68..2b9e05d0 100644 --- a/app/backend/backend/settings.py +++ b/app/backend/backend/settings.py @@ -11,6 +11,8 @@ """ from pathlib import Path +import os + # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -31,6 +33,7 @@ # Application definition INSTALLED_APPS = [ + 'backend', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', @@ -78,9 +81,9 @@ 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'app', 'USER': 'postgres', - 'PASSWORD': 'a1b2c3d4', - 'HOST':'ec2-100-24-23-233.compute-1.amazonaws.com', - 'PORT':'5432', + 'PASSWORD': os.environ['DATABASE_PW'], + 'HOST': 'ec2-100-24-23-233.compute-1.amazonaws.com', + 'PORT': '5432', } } diff --git a/app/backend/backend/utils.py b/app/backend/backend/utils.py new file mode 100644 index 00000000..3e5fbcca --- /dev/null +++ b/app/backend/backend/utils.py @@ -0,0 +1,7 @@ +import django.contrib.auth.hashers + +def make_password(password): + assert password + return django.contrib.auth.hashers.make_password( + password=password + ) diff --git a/app/backend/tests/__init__.py b/app/backend/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/app/backend/tests/test_models.py b/app/backend/tests/test_models.py new file mode 100644 index 00000000..363c5d3f --- /dev/null +++ b/app/backend/tests/test_models.py @@ -0,0 +1,30 @@ +from django.test import TestCase +from django.contrib.auth.hashers import check_password + +from backend import models +from backend import constants +from backend import utils + +TEST_ADMIN_EMAIL = "test_admin@test.com" +TEST_ADMIN_PASSWORD = "test_password" +TEST_ADMIN_USERNAME = "test_admin_unsername" + +class AdminTestCase(TestCase): + def setUp(self): + models.Admin.objects.create( + email=TEST_ADMIN_EMAIL, + password=utils.make_password(TEST_ADMIN_PASSWORD), + type=constants.UserType.ADMIN.value, + username=TEST_ADMIN_USERNAME + ) + + def test_admin_name(self): + testAdmin = models.Admin.objects.get(username=TEST_ADMIN_USERNAME) + + self.assertTrue(isinstance(testAdmin, models.Admin)) + + self.assertEqual(testAdmin.email, TEST_ADMIN_EMAIL) + self.assertTrue(check_password(TEST_ADMIN_PASSWORD, testAdmin.password)) + self.assertEqual(str(testAdmin), TEST_ADMIN_USERNAME) + self.assertEqual(testAdmin.type, constants.UserType.ADMIN.value) +