@@ -243,16 +243,71 @@ def create(self, request, *args, **kwargs):
243243 }, status = status .HTTP_201_CREATED )
244244
245245
246+
247+ from django .contrib .auth import authenticate
248+ from rest_framework .views import APIView
249+ from rest_framework .permissions import AllowAny
250+ from rest_framework .response import Response
251+ from rest_framework import status
252+ from rest_framework .authtoken .models import Token
253+ from django .contrib .auth import get_user_model
254+ from django .core .exceptions import ObjectDoesNotExist
255+ from users .models import LawyerProfile
256+
257+ User = get_user_model ()
258+
259+
246260class LoginView (APIView ):
247261 permission_classes = [AllowAny ]
248262
249263 def post (self , request ):
264+ practice_number = request .data .get ('practice_number' )
250265 email = request .data .get ('email' ) or request .data .get ('username' )
251266 password = request .data .get ('password' )
252- user = authenticate (request , username = email , password = password )
253-
254- if user is not None :
255- token , created = Token .objects .get_or_create (user = user )
256- return Response ({'token' : token .key , 'email' : user .email })
267+ if not password :
268+ return Response ({'error' : 'Password is required' }, status = status .HTTP_400_BAD_REQUEST )
269+
270+ user = None
271+ if practice_number :
272+ try :
273+ lawyer_profile = LawyerProfile .objects .get (
274+ practice_number__iexact = practice_number .strip ()
275+ )
276+ user = lawyer_profile .user
277+ if user .role != 'lawyer' :
278+ user = None
279+ except LawyerProfile .DoesNotExist :
280+ user = None
281+
282+ if user and not user .check_password (password ):
283+ user = None
284+
285+
286+ elif email :
287+ user = authenticate (request , username = email , password = password )
288+ if user and user .role == 'lawyer' :
289+ user = None
290+
257291 else :
292+ return Response ({
293+ 'error' : 'Either practice_number (for lawyers) or email/username (for applicants and lsk_admin) must be provided'
294+ }, status = status .HTTP_400_BAD_REQUEST )
295+
296+
297+ if user is None :
258298 return Response ({'error' : 'Invalid credentials' }, status = status .HTTP_401_UNAUTHORIZED )
299+
300+
301+ if user .role not in ['applicant' , 'lawyer' , 'lsk_admin' ]:
302+ return Response ({'error' : 'Unauthorized role' }, status = status .HTTP_403_FORBIDDEN )
303+
304+
305+ token , created = Token .objects .get_or_create (user = user )
306+
307+ return Response ({
308+ 'token' : token .key ,
309+ 'email' : user .email ,
310+ 'role' : user .role ,
311+ 'first_name' : user .first_name ,
312+ 'last_name' : user .last_name ,
313+ })
0 commit comments