GetTogether/get_together/views/__init__.py

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)