add simple view
This commit is contained in:
@@ -77,12 +77,18 @@
|
||||
<form class="pure-form pure-form-aligned" action="{% url "index" %}" method="post">
|
||||
<fieldset>
|
||||
{% csrf_token %}
|
||||
{% comment %}
|
||||
<span class="pure-form-message message-error">{{ .Err }}</span>
|
||||
|
||||
{% if error_message %}
|
||||
<span class="pure-form-message message-error">{{ error_message }}</span>
|
||||
{% elif request.GET.success %}
|
||||
<span class="pure-form-message message-success">
|
||||
You are now subscribed!
|
||||
{% if request.GET.already_subscribed %}
|
||||
Looks like you were already subscribed. We share your excitement!
|
||||
{% else %}
|
||||
You are now subscribed!
|
||||
{% endif %}
|
||||
</span>
|
||||
{% endcomment %}
|
||||
{% endif %}
|
||||
|
||||
<input type="email" class="subscribe-email" name="email" id="email" placeholder="your@email.com" required />
|
||||
|
||||
|
||||
@@ -1,3 +1,21 @@
|
||||
from django.test import TestCase
|
||||
from django.test import TestCase, Client
|
||||
|
||||
from django.urls import reverse
|
||||
|
||||
def SignupViewTests(TestCase):
|
||||
def setUp(self):
|
||||
self.client = Client()
|
||||
|
||||
def test_index(self):
|
||||
resp = self.client.get(reverse("index"))
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertContains(resp, "11sync is a privacy-respecting way")
|
||||
|
||||
def test_ok_signup(self):
|
||||
resp = self.client.post(reverse("index"), {"email": "foo@example.com"},
|
||||
follow = True,
|
||||
HTTP_USER_AGENT = "foo-agent",
|
||||
REMOTE_ADDR = "127.0.0.2")
|
||||
self.assertEqual(resp.redirect_chain, ('http://testserver/?success', 302))
|
||||
self.assertContains(resp, "You are now subscribed!")
|
||||
|
||||
# Create your tests here.
|
||||
|
||||
@@ -1,4 +1,48 @@
|
||||
from django.shortcuts import render
|
||||
import logging
|
||||
|
||||
from django.shortcuts import render, redirect
|
||||
from django.db import IntegrityError
|
||||
|
||||
from lib.anonymize_ip import anonymize_ip
|
||||
|
||||
from .models import Signup
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def index(request):
|
||||
if request.method == "POST":
|
||||
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
|
||||
if x_forwarded_for:
|
||||
ip = x_forwarded_for.split(',')[0]
|
||||
else:
|
||||
ip = request.META.get('REMOTE_ADDR')
|
||||
anonymous_ip = anonymize_ip(ip)
|
||||
|
||||
e = Email(
|
||||
email = request.POST.get("email"),
|
||||
anonymized_ip = anonymous_ip,
|
||||
user_agent = request.META["HTTP_USER_AGENT"],
|
||||
)
|
||||
|
||||
try:
|
||||
e.clean_fields()
|
||||
except ValidationError as e:
|
||||
return e.render(request, "signup/index.html",
|
||||
{"error_message": e.message})
|
||||
|
||||
logging.info("registering email={}".format(request.POST.get("email")))
|
||||
try:
|
||||
e.save()
|
||||
except IntegrityError:
|
||||
# email already registered, presumably
|
||||
return redirect("index") + "?already_subscribed"
|
||||
except DatabaseError:
|
||||
logger.exception("database error when registering an email")
|
||||
err = "Sorry, database error. Please come back later."
|
||||
return render(request, "signup/index.html",
|
||||
{"error_message": err})
|
||||
return redirect("index") + "?success"
|
||||
|
||||
return render(request, "signup/index.html", {})
|
||||
|
||||
Reference in New Issue
Block a user