|
|
@ -31,9 +31,24 @@ from utils import send_email, is_valid_email, absolute_https_url |
|
|
from config.settings import base as settings |
|
|
from config.settings import base as settings |
|
|
from apps.account.permissions import IsActiveUser, IsSuperAdminOrReadOnlyForProfessor |
|
|
from apps.account.permissions import IsActiveUser, IsSuperAdminOrReadOnlyForProfessor |
|
|
from apps.account.doc import * |
|
|
from apps.account.doc import * |
|
|
|
|
|
from utils.ip_helper import get_client_ip |
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__) |
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def detect_device_os(user_agent): |
|
|
|
|
|
if not user_agent: |
|
|
|
|
|
return None |
|
|
|
|
|
ua = user_agent.lower() |
|
|
|
|
|
if 'android' in ua: |
|
|
|
|
|
return 'android' |
|
|
|
|
|
if 'iphone' in ua or 'ipad' in ua or 'ios' in ua: |
|
|
|
|
|
return 'apple' |
|
|
|
|
|
if any(k in ua for k in ['mozilla', 'chrome', 'safari', 'windows', 'macintosh', 'linux']): |
|
|
|
|
|
return 'web' |
|
|
|
|
|
return None |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UserGuestView(CreateAPIView): |
|
|
class UserGuestView(CreateAPIView): |
|
|
permission_classes = [AllowAny] |
|
|
permission_classes = [AllowAny] |
|
|
@ -90,6 +105,8 @@ class UserGuestView(CreateAPIView): |
|
|
lat = serializer.validated_data.pop('lat', None) |
|
|
lat = serializer.validated_data.pop('lat', None) |
|
|
lon = serializer.validated_data.pop('lon', None) |
|
|
lon = serializer.validated_data.pop('lon', None) |
|
|
user_timezone = serializer.validated_data.pop('timezone', None) |
|
|
user_timezone = serializer.validated_data.pop('timezone', None) |
|
|
|
|
|
client_ip = get_client_ip(self.request) |
|
|
|
|
|
user_agent = self.request.META.get('HTTP_USER_AGENT', '') |
|
|
|
|
|
|
|
|
serializer_data = dict(serializer.validated_data) |
|
|
serializer_data = dict(serializer.validated_data) |
|
|
|
|
|
|
|
|
@ -103,12 +120,24 @@ class UserGuestView(CreateAPIView): |
|
|
logger.info(f'Guest-(created)->: {obj.device_id}') |
|
|
logger.info(f'Guest-(created)->: {obj.device_id}') |
|
|
|
|
|
|
|
|
obj.last_login = timezone.now() |
|
|
obj.last_login = timezone.now() |
|
|
|
|
|
if client_ip: |
|
|
|
|
|
obj.client_ip = client_ip |
|
|
|
|
|
if user_agent: |
|
|
|
|
|
obj.user_agent = user_agent |
|
|
|
|
|
if device_os: |
|
|
|
|
|
obj.device_os = device_os |
|
|
|
|
|
elif not obj.device_os and user_agent: |
|
|
|
|
|
obj.device_os = detect_device_os(user_agent) |
|
|
|
|
|
if fcm: |
|
|
|
|
|
obj.fcm = fcm |
|
|
obj.save() |
|
|
obj.save() |
|
|
login_history_obj = obj.login_history.create( |
|
|
login_history_obj = obj.login_history.create( |
|
|
lat=lat, |
|
|
lat=lat, |
|
|
lon=lon, |
|
|
lon=lon, |
|
|
ip=self.get_client_ip(), |
|
|
|
|
|
|
|
|
ip=client_ip, |
|
|
timezone=user_timezone, |
|
|
timezone=user_timezone, |
|
|
|
|
|
user_agent=user_agent, |
|
|
|
|
|
device_os=obj.device_os, |
|
|
) |
|
|
) |
|
|
return obj |
|
|
return obj |
|
|
|
|
|
|
|
|
@ -285,7 +314,12 @@ class UserVerifyView(CreateAPIView): |
|
|
verify_data.pop('email', None) |
|
|
verify_data.pop('email', None) |
|
|
verify_data.pop('device_id', None) |
|
|
verify_data.pop('device_id', None) |
|
|
user = self.perform_create( |
|
|
user = self.perform_create( |
|
|
email=email, device_id=device_id, **verify_data |
|
|
|
|
|
|
|
|
email=email, |
|
|
|
|
|
device_id=device_id, |
|
|
|
|
|
client_ip=get_client_ip(request), |
|
|
|
|
|
user_agent=request.META.get('HTTP_USER_AGENT', ''), |
|
|
|
|
|
device_os=request.data.get('device_os'), |
|
|
|
|
|
**verify_data |
|
|
) |
|
|
) |
|
|
token, _ = Token.objects.get_or_create(user=user) |
|
|
token, _ = Token.objects.get_or_create(user=user) |
|
|
return Response(data={ |
|
|
return Response(data={ |
|
|
@ -309,9 +343,17 @@ class UserVerifyView(CreateAPIView): |
|
|
email = kwargs.get('email') |
|
|
email = kwargs.get('email') |
|
|
device_id = kwargs.get('device_id') |
|
|
device_id = kwargs.get('device_id') |
|
|
password = kwargs.get('password') |
|
|
password = kwargs.get('password') |
|
|
|
|
|
client_ip = kwargs.get('client_ip') |
|
|
|
|
|
user_agent = kwargs.get('user_agent') |
|
|
|
|
|
device_os = kwargs.get('device_os') |
|
|
|
|
|
if not device_os and user_agent: |
|
|
|
|
|
device_os = detect_device_os(user_agent) |
|
|
|
|
|
|
|
|
create_kwargs = dict(kwargs) |
|
|
create_kwargs = dict(kwargs) |
|
|
create_kwargs.pop('password', None) |
|
|
create_kwargs.pop('password', None) |
|
|
|
|
|
create_kwargs.pop('client_ip', None) |
|
|
|
|
|
create_kwargs.pop('user_agent', None) |
|
|
|
|
|
create_kwargs.pop('device_os', None) |
|
|
|
|
|
|
|
|
user = User.objects.filter(email=email).first() |
|
|
user = User.objects.filter(email=email).first() |
|
|
if user: |
|
|
if user: |
|
|
@ -321,6 +363,12 @@ class UserVerifyView(CreateAPIView): |
|
|
user.deleted_at = None |
|
|
user.deleted_at = None |
|
|
if device_id: |
|
|
if device_id: |
|
|
user.device_id = device_id |
|
|
user.device_id = device_id |
|
|
|
|
|
if client_ip: |
|
|
|
|
|
user.client_ip = client_ip |
|
|
|
|
|
if user_agent: |
|
|
|
|
|
user.user_agent = user_agent |
|
|
|
|
|
if device_os: |
|
|
|
|
|
user.device_os = device_os |
|
|
user.last_login = timezone.now() |
|
|
user.last_login = timezone.now() |
|
|
user.save() |
|
|
user.save() |
|
|
else: |
|
|
else: |
|
|
@ -344,11 +392,23 @@ class UserVerifyView(CreateAPIView): |
|
|
|
|
|
|
|
|
if device_id: |
|
|
if device_id: |
|
|
user.device_id = device_id |
|
|
user.device_id = device_id |
|
|
|
|
|
if client_ip: |
|
|
|
|
|
user.client_ip = client_ip |
|
|
|
|
|
if user_agent: |
|
|
|
|
|
user.user_agent = user_agent |
|
|
|
|
|
if device_os: |
|
|
|
|
|
user.device_os = device_os |
|
|
user.last_login = timezone.now() |
|
|
user.last_login = timezone.now() |
|
|
user.is_active = True |
|
|
user.is_active = True |
|
|
user.deleted_at = None |
|
|
user.deleted_at = None |
|
|
user.save() |
|
|
user.save() |
|
|
|
|
|
|
|
|
|
|
|
user.login_history.create( |
|
|
|
|
|
ip=client_ip, |
|
|
|
|
|
user_agent=user_agent, |
|
|
|
|
|
device_os=user.device_os or device_os, |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
return user |
|
|
return user |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -400,13 +460,7 @@ class UserLoginView(CreateAPIView): |
|
|
def post(self, request, *args, **kwargs): |
|
|
def post(self, request, *args, **kwargs): |
|
|
return super().post(request, *args, **kwargs) |
|
|
return super().post(request, *args, **kwargs) |
|
|
def get_client_ip(self): |
|
|
def get_client_ip(self): |
|
|
request = self.request |
|
|
|
|
|
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') |
|
|
|
|
|
if x_forwarded_for: |
|
|
|
|
|
ip = x_forwarded_for.split(',')[0] |
|
|
|
|
|
else: |
|
|
|
|
|
ip = request.META.get('REMOTE_ADDR') |
|
|
|
|
|
return ip |
|
|
|
|
|
|
|
|
return get_client_ip(self.request) |
|
|
|
|
|
|
|
|
def create(self, request, *args, **kwargs): |
|
|
def create(self, request, *args, **kwargs): |
|
|
serializer = self.get_serializer(data=request.data) |
|
|
serializer = self.get_serializer(data=request.data) |
|
|
@ -431,15 +485,32 @@ class UserLoginView(CreateAPIView): |
|
|
if not user: |
|
|
if not user: |
|
|
raise ValidationError({"password": "password is incorrect"}) |
|
|
raise ValidationError({"password": "password is incorrect"}) |
|
|
|
|
|
|
|
|
|
|
|
client_ip = get_client_ip(request) |
|
|
|
|
|
user_agent = request.META.get('HTTP_USER_AGENT', '') |
|
|
|
|
|
device_os = request.data.get('device_os') |
|
|
|
|
|
if not device_os and user_agent: |
|
|
|
|
|
device_os = detect_device_os(user_agent) |
|
|
|
|
|
device_id = request.data.get('device_id') |
|
|
|
|
|
|
|
|
user_timezone = serializer.validated_data.pop('timezone', None) |
|
|
user_timezone = serializer.validated_data.pop('timezone', None) |
|
|
user.last_login = timezone.now() |
|
|
user.last_login = timezone.now() |
|
|
user.is_active = True |
|
|
user.is_active = True |
|
|
|
|
|
if client_ip: |
|
|
|
|
|
user.client_ip = client_ip |
|
|
|
|
|
if user_agent: |
|
|
|
|
|
user.user_agent = user_agent |
|
|
|
|
|
if device_os: |
|
|
|
|
|
user.device_os = device_os |
|
|
|
|
|
if device_id: |
|
|
|
|
|
user.device_id = device_id |
|
|
user.save() |
|
|
user.save() |
|
|
token, created = Token.objects.get_or_create(user=user) |
|
|
token, created = Token.objects.get_or_create(user=user) |
|
|
|
|
|
|
|
|
login_history_obj = user.login_history.create( |
|
|
login_history_obj = user.login_history.create( |
|
|
ip=self.get_client_ip(), |
|
|
|
|
|
|
|
|
ip=client_ip, |
|
|
timezone=user_timezone, |
|
|
timezone=user_timezone, |
|
|
|
|
|
user_agent=user_agent, |
|
|
|
|
|
device_os=user.device_os or device_os, |
|
|
) |
|
|
) |
|
|
return Response({ |
|
|
return Response({ |
|
|
"id": user.id, |
|
|
"id": user.id, |
|
|
@ -595,13 +666,7 @@ class AdminLoginView(CreateAPIView): |
|
|
return self.create(request, *args, **kwargs) |
|
|
return self.create(request, *args, **kwargs) |
|
|
|
|
|
|
|
|
def get_client_ip(self): |
|
|
def get_client_ip(self): |
|
|
request = self.request |
|
|
|
|
|
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') |
|
|
|
|
|
if x_forwarded_for: |
|
|
|
|
|
ip = x_forwarded_for.split(',')[0] |
|
|
|
|
|
else: |
|
|
|
|
|
ip = request.META.get('REMOTE_ADDR') |
|
|
|
|
|
return ip |
|
|
|
|
|
|
|
|
return get_client_ip(self.request) |
|
|
|
|
|
|
|
|
def create(self, request, *args, **kwargs): |
|
|
def create(self, request, *args, **kwargs): |
|
|
serializer = self.get_serializer(data=request.data) |
|
|
serializer = self.get_serializer(data=request.data) |
|
|
@ -622,17 +687,25 @@ class AdminLoginView(CreateAPIView): |
|
|
if not user.can_access_admin_panel(): |
|
|
if not user.can_access_admin_panel(): |
|
|
raise AuthenticationFailed("No admin found with that information.") |
|
|
raise AuthenticationFailed("No admin found with that information.") |
|
|
|
|
|
|
|
|
|
|
|
client_ip = get_client_ip(request) |
|
|
|
|
|
user_agent = request.META.get('HTTP_USER_AGENT', '') |
|
|
user_timezone = serializer.validated_data.pop('timezone', None) |
|
|
user_timezone = serializer.validated_data.pop('timezone', None) |
|
|
user.last_login = timezone.now() |
|
|
user.last_login = timezone.now() |
|
|
user.is_active = True |
|
|
user.is_active = True |
|
|
|
|
|
if client_ip: |
|
|
|
|
|
user.client_ip = client_ip |
|
|
|
|
|
if user_agent: |
|
|
|
|
|
user.user_agent = user_agent |
|
|
|
|
|
user.device_os = 'web' |
|
|
user.save() |
|
|
user.save() |
|
|
|
|
|
|
|
|
token, created = Token.objects.get_or_create(user=user) |
|
|
token, created = Token.objects.get_or_create(user=user) |
|
|
|
|
|
|
|
|
# Log the history |
|
|
# Log the history |
|
|
user.login_history.create( |
|
|
user.login_history.create( |
|
|
ip=self.get_client_ip(), |
|
|
|
|
|
|
|
|
ip=client_ip, |
|
|
timezone=user_timezone, |
|
|
timezone=user_timezone, |
|
|
|
|
|
user_agent=user_agent, |
|
|
device_os='web_admin' |
|
|
device_os='web_admin' |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
|