]> git.ipfire.org Git - ipfire.org.git/blob - src/web/donate.py
Drop checking URL blacklists to block users
[ipfire.org.git] / src / web / donate.py
1 #!/usr/bin/python3
2
3 import iso3166
4 import tornado.web
5
6 from . import base
7
8 class DonateHandler(base.BaseHandler):
9 def get(self):
10 location = self.get_remote_location()
11
12 if location:
13 country = location.country
14 else:
15 country = None
16
17 # Get defaults
18 first_name = self.get_argument("first_name", None)
19 last_name = self.get_argument("last_name", None)
20 amount = self.get_argument_float("amount", None)
21 currency = self.get_argument("currency", None)
22 frequency = self.get_argument("frequency", None)
23
24 # Set default currency
25 if not currency in ("EUR", "USD"):
26 currency = "EUR"
27
28 # Default to USD for the US only
29 if country == "US":
30 currency = "USD"
31
32 # Set default frequency
33 if not frequency in ("one-time", "monthly"):
34 frequency = "one-time"
35
36 self.render("donate/donate.html", countries=iso3166.countries,
37 country=country, first_name=first_name, last_name=last_name,
38 amount=amount, currency=currency, frequency=frequency)
39
40 @base.ratelimit(minutes=24*60, requests=5)
41 async def post(self):
42 amount = self.get_argument("amount")
43 currency = self.get_argument("currency", "EUR")
44 frequency = self.get_argument("frequency")
45
46 # Get form inputs
47 args = {
48 "amount" : amount,
49 "currency" : currency,
50
51 # Is this a recurring donation?
52 "recurring" : frequency == "monthly",
53
54 # Address
55 "email" : self.get_argument("email"),
56 "title" : self.get_argument("title"),
57 "first_name" : self.get_argument("first_name"),
58 "last_name" : self.get_argument("last_name"),
59 "company_name" : self.get_argument("company_name", None),
60 "street1" : self.get_argument("street1"),
61 "street2" : self.get_argument("street2", None),
62 "post_code" : self.get_argument("post_code"),
63 "city" : self.get_argument("city"),
64 "state" : self.get_argument("state", None),
65 "country_code" : self.get_argument("country_code"),
66 }
67
68 # Add URLs to redirect the user back
69 args.update({
70 "success_url" : "https://%s/donate/thank-you" % self.request.host,
71 "error_url" : "https://%s/donate/error" % self.request.host,
72 "back_url" : "https://%s/donate?amount=%s&currency=%s&frequency=%s" %
73 (self.request.host, amount, currency, frequency),
74 })
75
76 # Send request to Zeiterfassung
77 try:
78 response = await self.backend.zeiterfassung.send_request(
79 "/api/v1/donations/create/ipfire-project", **args)
80
81 except Exception:
82 raise # XXX handle any problems when Zeiterfassung is unreachable
83
84 # Redirect the user to the payment page
85 redirect_url = response.get("redirect_url")
86 if not redirect_url:
87 raise tornado.web.HTTPError(500, "Did not receive a redirect URL")
88
89 self.redirect(redirect_url)
90
91
92 class ThankYouHandler(base.BaseHandler):
93 def get(self):
94 self.render("donate/thank-you.html")
95
96
97 class ErrorHandler(base.BaseHandler):
98 def get(self):
99 self.render("donate/error.html")