Skip to content

30 email auth #32

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,5 @@ DB_USER=
DB_PASS=
DB_HOST=
DB_PORT=
EMAIL_SENDER=
EMAILOFFICE_KEY=
39 changes: 39 additions & 0 deletions accounts/management/commands/remove_duplicates.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#აქ ანუ რადგან რეალურ დათაბეიზში არის შემთხვევები როდესაც ორ მომხმარებელს
#აქვს ერთნაირი ნომერი ვასუფთავებთ ეგეთების ნომრებს გარდა ყველაზე ბოლო ვინც დაემატა


from django.core.management.base import BaseCommand
from django.contrib.auth import get_user_model
from django.db.models import Count, Max


User = get_user_model()

class Command(BaseCommand):
help = 'Remove duplicate user entries and keep only the latest ones based on primary key, prioritizing phone number, then email, and finally username, ignoring users with associated enrollments'

def handle(self, *args, **kwargs):
# Step 1: Delete duplicates based on phone number
phone_duplicates = User.objects.values('phone_number').annotate(count=Count('id')).filter(count__gt=1)
for duplicate in phone_duplicates:
users_to_update = User.objects.filter(phone_number=duplicate['phone_number']).order_by('-id')[1:]
for i, user in enumerate(users_to_update, start=1):
# Generate a unique phone number
phone_number = self.generate_unique_phone_number()
# Update the user's phone number
user.phone_number = phone_number
user.save()

self.stdout.write(self.style.SUCCESS('Duplicate users removed successfully'))

def generate_unique_phone_number(self):
# Start with 1
counter = 1
while True:
# Generate the phone number with leading zeros
phone_number = f"{counter:09d}"
# Check if a user with this phone number already exists
if not User.objects.filter(phone_number=phone_number).exists():
return phone_number
# Increment the counter if the phone number is not unique
counter += 1
18 changes: 18 additions & 0 deletions accounts/migrations/0013_alter_bitcampuser_phone_number.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 5.0.4 on 2024-05-15 09:53

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('accounts', '0012_authverificationcode_created_at'),
]

operations = [
migrations.AlterField(
model_name='bitcampuser',
name='phone_number',
field=models.CharField(max_length=16, unique=True),
),
]
18 changes: 18 additions & 0 deletions accounts/migrations/0014_alter_bitcampuser_phone_number.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 5.0.4 on 2024-05-15 09:55

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('accounts', '0013_alter_bitcampuser_phone_number'),
]

operations = [
migrations.AlterField(
model_name='bitcampuser',
name='phone_number',
field=models.CharField(max_length=16, null=True, unique=True),
),
]
14 changes: 12 additions & 2 deletions accounts/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@ class BitCampUser(AbstractUser):
)

phone_number = models.CharField(
max_length=16
max_length=16,
unique=True,
null=True
)

email = models.EmailField(
Expand All @@ -37,7 +39,15 @@ class BitCampUser(AbstractUser):
)

def __str__(self):
return self.phone_number
if self.username:
return self.username
elif self.phone_number:
return self.phone_number
elif self.email:
return self.email
else:
return ""


class AuthVerificationCode(models.Model):
user_id = models.ForeignKey(
Expand Down
86 changes: 84 additions & 2 deletions accounts/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@
from django.test import TestCase
from io import StringIO
from accounts.models import BitCampUser

from accounts.models import Enrollment
from django.contrib.auth import get_user_model
# if you want to test it then comment this in : views.py 97,98 and also views.py in 89 ,90
# # if not request.data.get("phone_number").isdigit() or len(request.data.get("phone_number")) != 9:
# return Response({"error": "Invalid phone number format"}, status=status.HTTP_400_BAD_REQUEST)



class UpdatePhoneNumbersTestCase(TestCase):
def setUp(self):
# Create BitCampUser objects with different phone numbers
Expand Down Expand Up @@ -203,3 +203,85 @@ def tearDown(self):
self.user24.delete()
self.user25.delete()

User = get_user_model()

class RemoveDuplicateUsersTestCase(TestCase):
def setUp(self):
# Create some duplicate users
self.user1 = User.objects.create(username='user1', email='[email protected]', phone_number='123456789')
self.user2 = User.objects.create(username='user2', email='[email protected]', phone_number='987654321')
self.user3 = User.objects.create(username='user3', email='[email protected]', phone_number='123456789')
self.user4 = User.objects.create(username='user4', email='[email protected]', phone_number='111111111')
self.user5 = User.objects.create(username='user5', email='[email protected]', phone_number='111111111')

def test_remove_duplicate_users(self):
# Ensure there are duplicates
self.assertEqual(User.objects.count(), 5)

# Call the management command
call_command('remove_duplicates')

# Check that duplicates are updated
self.assertEqual(User.objects.count(), 5)

# Check that the phone number is set to an empty string for duplicate users with more than one entry
self.assertEqual(User.objects.get(id=self.user1.id).phone_number, "000000002")
self.assertEqual(User.objects.get(id=self.user3.id).phone_number, "123456789")

# Check that the email is not changed for duplicate users
self.assertEqual(User.objects.get(id=self.user1.id).email, '[email protected]')
self.assertEqual(User.objects.get(id=self.user3.id).email, '[email protected]')

# Check that the phone number is not changed for the latest user
self.assertEqual(User.objects.get(id=self.user2.id).phone_number, '987654321')

# Check that the username is not changed for any user
self.assertEqual(User.objects.get(id=self.user1.id).username, 'user1')
self.assertEqual(User.objects.get(id=self.user2.id).username, 'user2')
self.assertEqual(User.objects.get(id=self.user3.id).username, 'user3')

# Check that users without duplicates are not affected
self.assertEqual(User.objects.get(id=self.user4.id).phone_number, '000000001')
self.assertEqual(User.objects.get(id=self.user5.id).phone_number, '111111111')
self.assertEqual(User.objects.get(id=self.user4.id).email, '[email protected]')
self.assertEqual(User.objects.get(id=self.user5.id).email, '[email protected]')
self.assertEqual(User.objects.get(id=self.user4.id).username, 'user4')
self.assertEqual(User.objects.get(id=self.user5.id).username, 'user5')
def test_no_duplicates(self):
# Create users without duplicates
User.objects.create(username='user6', email='[email protected]', phone_number='666666666')
User.objects.create(username='user7', email='[email protected]', phone_number='777777777')

# Call the management command
call_command('remove_duplicates')

# Check that no changes are made for users without duplicates
self.assertEqual(User.objects.get(username='user6').phone_number, '666666666')
self.assertEqual(User.objects.get(username='user7').phone_number, '777777777')

def test_multiple_duplicates(self):
# Create multiple duplicates for one user
User.objects.create(username='user8', email='[email protected]', phone_number='888888888')
User.objects.create(username='user9', email='[email protected]', phone_number='888888888')
User.objects.create(username='user10', email='[email protected]', phone_number='888888888')

# Call the management command
call_command('remove_duplicates')

# Check that the phone number is updated correctly for multiple duplicates
self.assertEqual(User.objects.get(username='user8').phone_number, '000000004')
self.assertEqual(User.objects.get(username='user9').phone_number, '000000003')
self.assertEqual(User.objects.get(username='user10').phone_number, '888888888')

def test_no_duplicates_exist(self):
# Call the management command when no duplicates exist
call_command('remove_duplicates')

# Check that no changes are made
self.assertEqual(User.objects.get(username='user4').phone_number, '000000001')
self.assertEqual(User.objects.get(username='user5').phone_number, '111111111')
self.assertEqual(User.objects.get(username='user4').email, '[email protected]')
self.assertEqual(User.objects.get(username='user5').email, '[email protected]')
self.assertEqual(User.objects.get(username='user4').username, 'user4')
self.assertEqual(User.objects.get(username='user5').username, 'user5')

1 change: 1 addition & 0 deletions accounts/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
path("auth/profile/update", views.UpdateUser.as_view(), name="updateuser"),
path("auth/connect-to-discord", views.Discord.as_view(), name="connect-to-discord"),
path("user", views.RegByNum.as_view(), name="register by phone number"),
path("user/email", views.RegByEmail.as_view(), name="register by Email"),
path("enroll", views.NewEnroll.as_view(), name="enrollment"),
path("enrollments", views.MyEnrolls.as_view(), name="myenrollments"),
path('enrollments/<int:id>/check-payze-subscription-status', views.CheckPayzeSubscriptionStatusView.as_view(), name='check-payze-status'),
Expand Down
Loading