Added method for getting coordinates and city by ip
This commit is contained in:
parent
32de6f7705
commit
5176a455c1
|
|
@ -1,8 +1,10 @@
|
|||
"""Main app methods."""
|
||||
import logging
|
||||
from typing import Tuple, Optional
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib.gis.geoip2 import GeoIP2, GeoIP2Exception
|
||||
from geoip2.models import City
|
||||
|
||||
from main import models
|
||||
|
||||
|
|
@ -39,17 +41,16 @@ def determine_country_code(ip_addr):
|
|||
return country_code
|
||||
|
||||
|
||||
def determine_coordinates(ip_addr):
|
||||
longitude, latitude = None, None
|
||||
def determine_coordinates(ip_addr: str) -> Tuple[Optional[float], Optional[float]]:
|
||||
if ip_addr:
|
||||
try:
|
||||
geoip = GeoIP2()
|
||||
longitude, latitude = geoip.coords(ip_addr)
|
||||
return geoip.coords(ip_addr)
|
||||
except GeoIP2Exception as ex:
|
||||
logger.info(f'GEOIP Exception: {ex}. ip: {ip_addr}')
|
||||
logger.warning(f'GEOIP Exception: {ex}. ip: {ip_addr}')
|
||||
except Exception as ex:
|
||||
logger.error(f'GEOIP Base exception: {ex}')
|
||||
return longitude, latitude
|
||||
logger.warning(f'GEOIP Base exception: {ex}')
|
||||
return None, None
|
||||
|
||||
|
||||
def determine_user_site_url(country_code):
|
||||
|
|
@ -73,3 +74,12 @@ def determine_user_site_url(country_code):
|
|||
return site.site_url
|
||||
|
||||
|
||||
def determine_user_city(ip_addr: str) -> Optional[City]:
|
||||
try:
|
||||
geoip = GeoIP2()
|
||||
return geoip.city(ip_addr)
|
||||
except GeoIP2Exception as ex:
|
||||
logger.warning(f'GEOIP Exception: {ex}. ip: {ip_addr}')
|
||||
except Exception as ex:
|
||||
logger.warning(f'GEOIP Base exception: {ex}')
|
||||
return None
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ app = 'main'
|
|||
|
||||
urlpatterns = [
|
||||
path('determine-site/', views.DetermineSiteView.as_view(), name='determine-site'),
|
||||
path('determine-location/', views.DetermineLocation.as_view(), name='determine-location'),
|
||||
path('sites/', views.SiteListView.as_view(), name='site-list'),
|
||||
path('site-settings/<subdomain>/', views.SiteSettingsView.as_view(), name='site-settings'),
|
||||
path('awards/', views.AwardView.as_view(), name='awards_list'),
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ from rest_framework import generics, permissions
|
|||
from rest_framework.response import Response
|
||||
from main import methods, models, serializers
|
||||
from utils.serializers import EmptySerializer
|
||||
from django.http import Http404
|
||||
|
||||
|
||||
class DetermineSiteView(generics.GenericAPIView):
|
||||
|
|
@ -18,6 +19,22 @@ class DetermineSiteView(generics.GenericAPIView):
|
|||
return Response(data={'url': url})
|
||||
|
||||
|
||||
class DetermineLocation(generics.GenericAPIView):
|
||||
"""Determine user's location."""
|
||||
|
||||
permission_classes = (permissions.AllowAny,)
|
||||
serializer_class = EmptySerializer
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
user_ip = methods.get_user_ip(request)
|
||||
longitude, latitude = methods.determine_coordinates(user_ip)
|
||||
city = methods.determine_user_city(user_ip)
|
||||
if longitude and latitude and city:
|
||||
return Response(data={'latitude': latitude, 'longitude': longitude, 'city': city})
|
||||
else:
|
||||
raise Http404
|
||||
|
||||
|
||||
class SiteSettingsView(generics.RetrieveAPIView):
|
||||
"""Site settings View."""
|
||||
|
||||
|
|
@ -34,6 +51,8 @@ class SiteListView(generics.ListAPIView):
|
|||
permission_classes = (permissions.AllowAny,)
|
||||
queryset = models.SiteSettings.objects.with_country()
|
||||
serializer_class = serializers.SiteSerializer
|
||||
|
||||
|
||||
#
|
||||
# class FeatureViewMixin:
|
||||
# """Feature view mixin."""
|
||||
|
|
@ -76,7 +95,7 @@ class AwardView(generics.ListAPIView):
|
|||
"""Awards list view."""
|
||||
serializer_class = serializers.AwardSerializer
|
||||
queryset = models.Award.objects.all()
|
||||
permission_classes = (permissions.AllowAny, )
|
||||
permission_classes = (permissions.AllowAny,)
|
||||
|
||||
|
||||
class AwardRetrieveView(generics.RetrieveAPIView):
|
||||
|
|
@ -90,5 +109,5 @@ class CarouselListView(generics.ListAPIView):
|
|||
"""Return list of carousel items."""
|
||||
queryset = models.Carousel.objects.all()
|
||||
serializer_class = serializers.CarouselListSerializer
|
||||
permission_classes = (permissions.AllowAny, )
|
||||
permission_classes = (permissions.AllowAny,)
|
||||
pagination_class = None
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user