Merge branch 'feature/location_by_ip' into 'develop'

Added method for getting coordinates and city by ip

See merge request gm/gm-backend!52
This commit is contained in:
d.kuzmenko 2019-10-17 07:03:48 +00:00
commit 6926fc350f
3 changed files with 38 additions and 8 deletions

View File

@ -1,8 +1,10 @@
"""Main app methods.""" """Main app methods."""
import logging import logging
from typing import Tuple, Optional
from django.conf import settings from django.conf import settings
from django.contrib.gis.geoip2 import GeoIP2, GeoIP2Exception from django.contrib.gis.geoip2 import GeoIP2, GeoIP2Exception
from geoip2.models import City
from main import models from main import models
@ -39,17 +41,16 @@ def determine_country_code(ip_addr):
return country_code return country_code
def determine_coordinates(ip_addr): def determine_coordinates(ip_addr: str) -> Tuple[Optional[float], Optional[float]]:
longitude, latitude = None, None
if ip_addr: if ip_addr:
try: try:
geoip = GeoIP2() geoip = GeoIP2()
longitude, latitude = geoip.coords(ip_addr) return geoip.coords(ip_addr)
except GeoIP2Exception as ex: 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: except Exception as ex:
logger.error(f'GEOIP Base exception: {ex}') logger.warning(f'GEOIP Base exception: {ex}')
return longitude, latitude return None, None
def determine_user_site_url(country_code): def determine_user_site_url(country_code):
@ -73,3 +74,12 @@ def determine_user_site_url(country_code):
return site.site_url 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

View File

@ -6,6 +6,7 @@ app = 'main'
urlpatterns = [ urlpatterns = [
path('determine-site/', views.DetermineSiteView.as_view(), name='determine-site'), 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('sites/', views.SiteListView.as_view(), name='site-list'),
path('site-settings/<subdomain>/', views.SiteSettingsView.as_view(), name='site-settings'), path('site-settings/<subdomain>/', views.SiteSettingsView.as_view(), name='site-settings'),
path('awards/', views.AwardView.as_view(), name='awards_list'), path('awards/', views.AwardView.as_view(), name='awards_list'),

View File

@ -3,6 +3,7 @@ from rest_framework import generics, permissions
from rest_framework.response import Response from rest_framework.response import Response
from main import methods, models, serializers from main import methods, models, serializers
from utils.serializers import EmptySerializer from utils.serializers import EmptySerializer
from django.http import Http404
class DetermineSiteView(generics.GenericAPIView): class DetermineSiteView(generics.GenericAPIView):
@ -18,6 +19,22 @@ class DetermineSiteView(generics.GenericAPIView):
return Response(data={'url': url}) 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): class SiteSettingsView(generics.RetrieveAPIView):
"""Site settings View.""" """Site settings View."""
@ -34,6 +51,8 @@ class SiteListView(generics.ListAPIView):
permission_classes = (permissions.AllowAny,) permission_classes = (permissions.AllowAny,)
queryset = models.SiteSettings.objects.with_country() queryset = models.SiteSettings.objects.with_country()
serializer_class = serializers.SiteSerializer serializer_class = serializers.SiteSerializer
# #
# class FeatureViewMixin: # class FeatureViewMixin:
# """Feature view mixin.""" # """Feature view mixin."""
@ -76,7 +95,7 @@ class AwardView(generics.ListAPIView):
"""Awards list view.""" """Awards list view."""
serializer_class = serializers.AwardSerializer serializer_class = serializers.AwardSerializer
queryset = models.Award.objects.all() queryset = models.Award.objects.all()
permission_classes = (permissions.AllowAny, ) permission_classes = (permissions.AllowAny,)
class AwardRetrieveView(generics.RetrieveAPIView): class AwardRetrieveView(generics.RetrieveAPIView):
@ -90,5 +109,5 @@ class CarouselListView(generics.ListAPIView):
"""Return list of carousel items.""" """Return list of carousel items."""
queryset = models.Carousel.objects.all() queryset = models.Carousel.objects.all()
serializer_class = serializers.CarouselListSerializer serializer_class = serializers.CarouselListSerializer
permission_classes = (permissions.AllowAny, ) permission_classes = (permissions.AllowAny,)
pagination_class = None pagination_class = None