diff --git a/api/__pycache__/settings.cpython-313.pyc b/api/__pycache__/settings.cpython-313.pyc index 84ccbefc..8e733ec7 100644 Binary files a/api/__pycache__/settings.cpython-313.pyc and b/api/__pycache__/settings.cpython-313.pyc differ diff --git a/api/settings.py b/api/settings.py index 9f881aba..e08ffe31 100644 --- a/api/settings.py +++ b/api/settings.py @@ -21,7 +21,7 @@ BASE_DIR = Path(__file__).resolve().parent.parent SECRET_KEY = 'django-insecure-_u202k$8qq2p*cr_eo(7k!0ngr5^n)27@85+5oy8&41(u6&j54' # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = False +DEBUG = True ALLOWED_HOSTS = ['*'] @@ -79,7 +79,7 @@ ASGI_APPLICATION = 'api.asgi.application' # https://docs.djangoproject.com/en/4.1/ref/settings/#databases #prod:5.223.52.193 dev:5.223.42.146 -MODE = 'prod' +MODE = 'dev' DBHOST = '138.199.203.34' if MODE == 'prod' else '138.199.203.34' DATABASES = { diff --git a/app/__pycache__/email.cpython-313.pyc b/app/__pycache__/email.cpython-313.pyc index 9ce93084..ffc70894 100644 Binary files a/app/__pycache__/email.cpython-313.pyc and b/app/__pycache__/email.cpython-313.pyc differ diff --git a/app/__pycache__/models.cpython-313.pyc b/app/__pycache__/models.cpython-313.pyc index 7723ace3..3340592c 100644 Binary files a/app/__pycache__/models.cpython-313.pyc and b/app/__pycache__/models.cpython-313.pyc differ diff --git a/app/__pycache__/views.cpython-313.pyc b/app/__pycache__/views.cpython-313.pyc index 839097cb..2c1a7c72 100644 Binary files a/app/__pycache__/views.cpython-313.pyc and b/app/__pycache__/views.cpython-313.pyc differ diff --git a/app/email.py b/app/email.py index 8e79e4c5..c5dad27e 100644 --- a/app/email.py +++ b/app/email.py @@ -145,5 +145,9 @@ def send_email(request): sender = request.data.get('sender') # send email - send_via_zeptomail(receiver, subject, content, sender) - return Response(status=status.HTTP_204_NO_CONTENT) \ No newline at end of file + result = send_via_zeptomail(receiver, subject, content, sender) + + if result: + return Response({'message': 'Send success'}, status=200) + else: + return Response({'message': 'Send failed'}, status=500) \ No newline at end of file diff --git a/app/migrations/0004_alter_user_email_alter_user_username.py b/app/migrations/0004_alter_user_email_alter_user_username.py new file mode 100644 index 00000000..11ed49d2 --- /dev/null +++ b/app/migrations/0004_alter_user_email_alter_user_username.py @@ -0,0 +1,23 @@ +# Generated by Django 5.1.7 on 2026-03-24 06:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0003_delete_news'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='email', + field=models.CharField(max_length=100, unique=True), + ), + migrations.AlterField( + model_name='user', + name='username', + field=models.CharField(max_length=50, null=True, unique=True), + ), + ] diff --git a/app/migrations/0005_alter_user_username.py b/app/migrations/0005_alter_user_username.py new file mode 100644 index 00000000..060343b7 --- /dev/null +++ b/app/migrations/0005_alter_user_username.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.7 on 2026-03-24 06:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0004_alter_user_email_alter_user_username'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='username', + field=models.CharField(max_length=50, null=True), + ), + ] diff --git a/app/migrations/0006_alter_customer_country_alter_customer_creator_and_more.py b/app/migrations/0006_alter_customer_country_alter_customer_creator_and_more.py new file mode 100644 index 00000000..1c3e0dd7 --- /dev/null +++ b/app/migrations/0006_alter_customer_country_alter_customer_creator_and_more.py @@ -0,0 +1,35 @@ +# Generated by Django 5.1.7 on 2026-03-24 06:59 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0005_alter_user_username'), + ] + + operations = [ + migrations.AlterField( + model_name='customer', + name='country', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='app.country'), + ), + migrations.AlterField( + model_name='customer', + name='creator', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='app.user'), + ), + migrations.AlterField( + model_name='customer', + name='email', + field=models.CharField(default=1, max_length=50, unique=True), + preserve_default=False, + ), + migrations.AlterField( + model_name='customer', + name='phone', + field=models.CharField(db_index=True, max_length=20, null=True), + ), + ] diff --git a/app/migrations/0007_alter_customer_type.py b/app/migrations/0007_alter_customer_type.py new file mode 100644 index 00000000..bc047fec --- /dev/null +++ b/app/migrations/0007_alter_customer_type.py @@ -0,0 +1,19 @@ +# Generated by Django 5.1.7 on 2026-03-24 07:05 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0006_alter_customer_country_alter_customer_creator_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='customer', + name='type', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='app.customer_type'), + ), + ] diff --git a/app/models.py b/app/models.py index e977108a..853896c3 100644 --- a/app/models.py +++ b/app/models.py @@ -157,9 +157,9 @@ class Discount_Type(models.Model): class User(models.Model): - username = models.CharField(max_length=50, null=False, unique=True) + username = models.CharField(max_length=50, null=True) password = models.CharField(max_length=100, null=False) - email = models.CharField(max_length=100, null=True, unique=True) + email = models.CharField(max_length=100, null=False, unique=True) avatar = models.CharField(max_length=100, null=True) fullname = models.CharField(max_length=50, null=False) display_name = models.CharField(max_length=50, null=True) @@ -951,21 +951,21 @@ class Customer(AutoCodeModel): code_padding = 5 code = models.CharField(max_length=20, null=True, unique=True, db_index=True) fullname = models.CharField(max_length=200, null=False, db_index=True) - phone = models.CharField(max_length=20, null=False, unique=True, db_index=True) - email = models.CharField(max_length=50, null=True, unique=True) + phone = models.CharField(max_length=20, null=True, db_index=True) + email = models.CharField(max_length=50, null=False, unique=True) legal_type = models.ForeignKey(Legal_Type, null=True, related_name='+', on_delete=models.PROTECT) legal_code = models.CharField(max_length=20, null=True, unique=True) issued_place = models.ForeignKey(Issued_Place, null=True, related_name='+', on_delete=models.PROTECT) issued_date = models.DateField(null=True) - country = models.ForeignKey(Country, null=False, related_name='+', on_delete=models.PROTECT) + country = models.ForeignKey(Country, null=True, related_name='+', on_delete=models.PROTECT) address = models.CharField(max_length=200, null=True) contact_address = models.CharField(max_length=200, null=True) note = models.TextField(null=True) - type = models.ForeignKey(Customer_Type, null=False, related_name='+', on_delete=models.PROTECT) + type = models.ForeignKey(Customer_Type, null=True, related_name='+', on_delete=models.PROTECT) segment = models.ForeignKey(Customer_Segment, null=True, related_name='+', on_delete=models.PROTECT) user = models.OneToOneField(User, null=True, related_name='customer_profile', on_delete=models.SET_NULL) sale_staff = models.ForeignKey('Staff', null=True, related_name='+', on_delete=models.PROTECT) - creator = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT) + creator = models.ForeignKey(User, null=True, related_name='+', on_delete=models.PROTECT) updater = models.ForeignKey(User, null=True, related_name='+', on_delete=models.PROTECT) deleted = models.BooleanField(null=False, default=False, db_index=True) create_time = models.DateTimeField(null=True, auto_now_add=True) diff --git a/app/views.py b/app/views.py index 59120c27..b175c392 100644 --- a/app/views.py +++ b/app/views.py @@ -586,10 +586,10 @@ def login(request): need_serializer = False if values == None: - user = User.objects.filter(username=filter['username']).first() + user = User.objects.filter(email=filter['email']).first() need_serializer = True else: - user = User.objects.filter(username=filter['username']).values(*values).first() + user = User.objects.filter(email=filter['email']).values(*values).first() if user == None: return Response(None) @@ -608,15 +608,15 @@ def login(request): #============================================================================= @api_view(['POST']) def signin(request): - username = request.data['username'] + email = request.data['email'] password = request.data['password'] - user = User.objects.filter(username=username).first() + user = User.objects.filter(email=email).first() if user: result = check_password(password, user.password) if result == False: return Response("invalid") else: - info = User.objects.filter(pk=user.id).values('id','username','avatar','fullname','auth_status','auth_status__code','auth_status__name').first() + info = User.objects.filter(pk=user.id).values('id','email','username','avatar','fullname','auth_status','auth_status__code','auth_status__name').first() return Response(info) # invalid return Response(status = status.HTTP_400_BAD_REQUEST) @@ -624,15 +624,15 @@ def signin(request): #============================================================================= @api_view(['POST']) def check_pin(request): - username = request.data['username'] + email = request.data['email'] pin = request.data['pin'] - user = User.objects.filter(username=username).first() + user = User.objects.filter(email=email).first() if user: result = check_password(pin, user.pin) if result == False: return Response("invalid") else: - info = User.objects.filter(pk=user.id).values('id','username','avatar','fullname','auth_status','auth_status__code','auth_status__name').first() + info = User.objects.filter(pk=user.id).values('id','email','username','avatar','fullname','auth_status','auth_status__code','auth_status__name').first() return Response(info) # invalid return Response(status = status.HTTP_400_BAD_REQUEST) diff --git a/prefect-ui.log b/prefect-ui.log index 82e9af10..f8d6b34c 100644 --- a/prefect-ui.log +++ b/prefect-ui.log @@ -14,3 +14,4 @@ Check out the dashboard at http://127.0.0.1:4200 +Server stopped!