views.py (1969B) - Raw
1 import logging 2 import geoip2 3 4 from django.contrib.gis.geoip2 import GeoIP2 5 from django.shortcuts import render, redirect 6 from django.urls import reverse 7 from django.db import IntegrityError 8 from django.core.exceptions import ValidationError 9 from django.db.utils import DatabaseError 10 11 from lib.anonymize_ip import anonymize_ip 12 13 from .models import Signup 14 15 16 logger = logging.getLogger(__name__) 17 18 19 def index(request): 20 if request.method == "POST": 21 x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') 22 if x_forwarded_for: 23 ip = x_forwarded_for.split(',')[0] 24 else: 25 ip = request.META.get('REMOTE_ADDR') 26 anonymous_ip = anonymize_ip(ip) 27 28 try: 29 geoip = GeoIP2().city(anonymous_ip) 30 except geoip2.errors.AddressNotFoundError: 31 geoip = None 32 33 s = Signup( 34 email=request.POST.get("email"), 35 anonymized_ip=anonymous_ip, 36 user_agent=request.META.get('HTTP_USER_AGENT', ''), 37 geoip=geoip, 38 referrer=request.META.get('HTTP_REFERRER', ''), 39 ) 40 41 try: 42 s.clean_fields() 43 except ValidationError as e: 44 return render(request, "signup/index.html", 45 {"error_message": ", ".join(e.messages)}) 46 47 logging.info("registering email={}".format(request.POST.get("email"))) 48 try: 49 s.save() 50 except IntegrityError: 51 # email already registered, presumably 52 return redirect(reverse("index") + "?success=already_subscribed") 53 except DatabaseError: 54 logger.exception("database error when registering an email") 55 err = "Sorry, database error. Please come back later." 56 return render(request, "signup/index.html", 57 {"error_message": err}) 58 return redirect(reverse("index") + "?success=subscribed") 59 60 return render(request, "signup/index.html", {})