e11sync

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | LICENSE

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", {})