Skip to content
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

Enable username sign in #21

Open
wants to merge 9 commits into
base: master
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
3 changes: 2 additions & 1 deletion CONTRIBUTORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@
Add your name in the given format.

- [Kunal Katiyar](https://github.com/kunal2812/)
- [Eleena Sarah Mathew](https://github.com/eleensmathew/)
- [Eleena Sarah Mathew](https://github.com/eleensmathew/)
- [Manan Arora](https://github.com/Manan-Arora31)
32 changes: 32 additions & 0 deletions main/authentication.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from django.contrib.auth.models import User
from main.models import User
class NameAuthBackend:
"""
Custom authentication backend.

Allows users to log in using their first name.
"""

def authenticate(self, request, email=None, name=None, password=None):
"""
Overrides the authenticate method
"""
try:
if email == None:
user = User.objects.get(name=name)
else:
user = User.objects.get(email=email)
if user.check_password(password):
return user
return None
except User.DoesNotExist:
return None

def get_user(self, user_id):
"""
Overrides the get_user method
"""
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
25 changes: 12 additions & 13 deletions main/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,21 @@ class UserManager(BaseUserManager):

use_in_migrations = True

def _create_user(self, email, password, **extra_fields):
def _create_user(self, email, name, password, **extra_fields):
"""Create and save a User with the given email and password."""
if not email:
raise ValueError('The given email must be set')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user = self.model(name=name, email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user

def create_user(self, email, password=None, **extra_fields):
def create_user(self, name, email, password=None, **extra_fields):
"""Create and save a regular User with the given email and password."""
extra_fields.setdefault('is_staff', False)
extra_fields.setdefault('is_superuser', False)
return self._create_user(email, password, **extra_fields)
return self._create_user(email, name, password, **extra_fields)

def create_superuser(self, email, password, **extra_fields):
"""Create and save a SuperUser with the given email and password."""
Expand All @@ -39,11 +39,11 @@ def create_superuser(self, email, password, **extra_fields):
class User(AbstractUser):
"""User model."""
ROLE=(('Student','STUDENT'),('Mentor','MENTOR'))
username = None
name = models.CharField(max_length=20, unique=True)
email = models.EmailField(_('email address'), unique=True)
role=models.CharField(choices=ROLE,max_length=10)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
REQUIRED_FIELDS = ['name']

objects = UserManager()

Expand All @@ -55,7 +55,7 @@ class Courses(models.Model):
course_language=models.CharField(max_length=50)
editing_status=models.BooleanField(default=True,blank=False);

def __str__(self):
def _str_(self):
return self.course_name

class Chapters(models.Model):
Expand All @@ -66,24 +66,24 @@ class Chapters(models.Model):
order = models.FloatField()


def __str__(self):
def _str_(self):
return self.chapter_name
class Titles(models.Model):
title_name=models.CharField(max_length=100,blank=False)
chapter= models.ForeignKey(Chapters,on_delete=models.CASCADE)
description=models.TextField()
order = models.FloatField()

def __str__(self):
def _str_(self):
return self.title_name

class Questions(models.Model):
chapter=models.ForeignKey(Chapters, on_delete=models.CASCADE)
question=models.TextField()
answer=models.TextField()
def __str__(self):
def _str_(self):
return self.question

class Tag(models.Model):
name = models.CharField(max_length=50, unique=True)
def __str__(self):
Expand Down Expand Up @@ -136,5 +136,4 @@ class UserProfile(models.Model):
bio=models.TextField(default='I am passionate about learning!')

def __str__(self):
return f'{self.user.first_name}'

return f'{self.user.first_name}'
11 changes: 9 additions & 2 deletions main/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,7 @@ def contact(request):

def signup(request):
if request.method == 'POST':
uname = request.POST['uname']
fname = request.POST['fname']
lname = request.POST['lname']
email = request.POST['email']
Expand All @@ -355,20 +356,26 @@ def signup(request):
role = request.POST['role']
if password1 == password2:
# Create a new user
user = User.objects.create_user( email=email,first_name=fname,last_name=lname,password=password1,role=role)
user = User.objects.create_user(name=uname,email=email,first_name=fname,last_name=lname,password=password1,role=role)
userp=UserProfile.objects.create(user=user)
userp.save()
user.save()
messages.success(request, "User registered successfully")
return redirect('signin')
else:
messages.error(request, "Passwords do not match")
return render(request, 'main/index.html')

def signin(request):
if request.method == 'POST':
email = request.POST['email']
password = request.POST['pass1']
user = authenticate(request,email=email, password=password)
options = request.POST['options']

if options == 'username':
user = authenticate(request,name=email, password=password)
else:
user = authenticate(request,email=email, password=password)

if user is not None:
login(request, user)
Expand Down
11 changes: 10 additions & 1 deletion templates/main/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,16 @@ <h2 class="heading-white mb-4" id="form-heading">
{% csrf_token %}
<!-- Signin form fields -->
<div class="form-group">
<input type="text" class="form-control" name="email" placeholder="Email"/>
<label for="options" style="color: white;">
Sign in using:
</label>
<select name="options" id="options">
<option value="username">username</option>
<option value="email">Email</option>
</select>
</div>
<div class="form-group">
<input type="text" class="form-control" name="email" placeholder="Email or Username"/>
</div>
<div class="form-group">
<input type="password" name="pass1" class="form-control" placeholder="Password"/>
Expand Down
7 changes: 6 additions & 1 deletion youdemy/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,4 +129,9 @@
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
TIME_ZONE = 'Asia/Kolkata'

AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend', # This is the default that allows us to log in via username
'main.authentication.NameAuthBackend'
]
TIME_ZONE = 'Asia/Kolkata'