140 lines
6.2 KiB
Python
140 lines
6.2 KiB
Python
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from django.contrib import messages
|
|
from django.contrib.auth import logout as logout_user
|
|
from django.shortcuts import render, redirect
|
|
from django.http import HttpResponse, JsonResponse
|
|
from django.db.models import Q
|
|
|
|
from events.models.locale import City
|
|
from events.models.events import Event, Place, Attendee
|
|
from events.models.profiles import Team, UserProfile, Member
|
|
from events.models.search import Searchable
|
|
from events.forms import SearchForm
|
|
from events import location
|
|
|
|
from accounts.decorators import setup_wanted
|
|
from django.conf import settings
|
|
|
|
import simple_ga as ga
|
|
|
|
import datetime
|
|
import simplejson
|
|
import geocoder
|
|
import math
|
|
import traceback
|
|
|
|
from .teams import *
|
|
from .orgs import *
|
|
from .events import *
|
|
from .places import *
|
|
from .user import *
|
|
from .new_user import *
|
|
from .new_team import *
|
|
from .new_event import *
|
|
from .speakers import *
|
|
from .utils import *
|
|
|
|
KM_PER_DEGREE_LAT = 110.574
|
|
KM_PER_DEGREE_LNG = 111.320 # At the equator
|
|
DEFAULT_NEAR_DISTANCE = 100 # kilometeres
|
|
# Create your views here.
|
|
|
|
@setup_wanted
|
|
def home(request, *args, **kwards):
|
|
context = {}
|
|
|
|
near_distance = int(request.GET.get("distance", DEFAULT_NEAR_DISTANCE))
|
|
context['distance'] = near_distance
|
|
context['geoip_lookup'] = False
|
|
|
|
city=None
|
|
ll = None
|
|
if "city" in request.GET and request.GET.get("city"):
|
|
context['city_search'] = True
|
|
city = City.objects.get(id=request.GET.get("city"))
|
|
context['city'] = city
|
|
ll = [city.latitude, city.longitude]
|
|
ga.add_event(request, 'homepage_search', category='search', label=city.short_name)
|
|
else :
|
|
context['city_search'] = False
|
|
try:
|
|
g = location.get_geoip(request)
|
|
if g.latlng is not None and len(g.latlng) >= 2 and g.latlng[0] is not None and g.latlng[1] is not None:
|
|
ll = g.latlng
|
|
context['geoip_lookup'] = True
|
|
|
|
try:
|
|
city_distance = 1 #km
|
|
while city is None and city_distance < 100:
|
|
minlat = ll[0]-(city_distance/KM_PER_DEGREE_LAT)
|
|
maxlat = ll[0]+(city_distance/KM_PER_DEGREE_LAT)
|
|
minlng = ll[1]-(city_distance/(KM_PER_DEGREE_LNG*math.cos(math.radians(ll[0]))))
|
|
maxlng = ll[1]+(city_distance/(KM_PER_DEGREE_LNG*math.cos(math.radians(ll[0]))))
|
|
nearby_cities = City.objects.filter(latitude__gte=minlat, latitude__lte=maxlat, longitude__gte=minlng, longitude__lte=maxlng)
|
|
if len(nearby_cities) == 0:
|
|
city_distance += 1
|
|
else:
|
|
city = sorted(nearby_cities, key=lambda city: location.city_distance_from(ll, city))[0]
|
|
|
|
if request.user.is_authenticated and request.user.profile.city is None:
|
|
profile = request.user.profile
|
|
profile.city = city
|
|
profile.save()
|
|
except Exception as err:
|
|
print("City lookup failed", err)
|
|
raise Exception('City lookup filed')
|
|
else:
|
|
raise Exception('Geocoder result has no latlng')
|
|
except Exception as err:
|
|
context['geoip_lookup'] = False
|
|
print("Geocoder lookup failed for %s" % request.META.get('REMOTE_ADDR'), err)
|
|
|
|
|
|
if ll is not None:
|
|
context['latitude'] = ll[0]
|
|
context['longitude'] = ll[1]
|
|
try:
|
|
minlat = ll[0]-(near_distance/KM_PER_DEGREE_LAT)
|
|
maxlat = ll[0]+(near_distance/KM_PER_DEGREE_LAT)
|
|
minlng = ll[1]-(near_distance/(KM_PER_DEGREE_LNG*math.cos(math.radians(ll[0]))))
|
|
maxlng = ll[1]+(near_distance/(KM_PER_DEGREE_LNG*math.cos(math.radians(ll[0]))))
|
|
context['minlat'] = minlat
|
|
context['maxlat'] = maxlat
|
|
context['minlng'] = minlng
|
|
context['maxlng'] = maxlng
|
|
|
|
near_events = Searchable.objects.filter(latitude__gte=minlat,
|
|
latitude__lte=maxlat,
|
|
longitude__gte=minlng,
|
|
longitude__lte=maxlng,
|
|
end_time__gte=datetime.datetime.now())
|
|
context['near_events'] = sorted(near_events, key=lambda searchable: location.searchable_distance_from(ll, searchable))
|
|
|
|
# # If there aren't any teams in the user's geoip area, show them the closest ones
|
|
if context['geoip_lookup'] and len(near_events) < 1:
|
|
context['closest_events'] = sorted(Searchable.objects.filter(end_time__gte=datetime.datetime.now()),
|
|
key=lambda searchable: location.searchable_distance_from(ll, searchable))[:3]
|
|
|
|
near_teams = Team.public_objects.filter(city__latitude__gte=minlat,
|
|
city__latitude__lte=maxlat,
|
|
city__longitude__gte=minlng,
|
|
city__longitude__lte=maxlng
|
|
).filter(Q(access=Team.PUBLIC) | Q(access=Team.PRIVATE,
|
|
owner_profile=request.user.profile))
|
|
context['near_teams'] = sorted(near_teams, key=lambda team: location.team_distance_from(ll, team))
|
|
|
|
# # If there aren't any teams in the user's geoip area, show them the closest ones
|
|
if context['geoip_lookup'] and len(near_teams) < 1:
|
|
context['closest_teams'] = sorted(Team.public_objects.all(), key=lambda team: location.team_distance_from(ll, team))[:3]
|
|
except Exception as err:
|
|
print("Error looking up nearby teams and events", err)
|
|
traceback.print_exc()
|
|
|
|
initial_search = {'distance': near_distance}
|
|
if city is not None and city.id > 0:
|
|
initial_search['city'] = city.id
|
|
search_form = SearchForm(initial=initial_search)
|
|
context['search_form'] = search_form
|
|
return render(request, 'get_together/index.html', context)
|
|
|