]> git.ipfire.org Git - ipfire.org.git/blob - src/web/donate.py
Migrate to libloc
[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 country = self.current_country_code
11
12 # Get defaults
13 first_name = self.get_argument("first_name", None)
14 last_name = self.get_argument("last_name", None)
15 amount = self.get_argument_float("amount", None)
16 currency = self.get_argument("currency", None)
17 frequency = self.get_argument("frequency", None)
18
19 # Set default currency
20 if not currency in ("EUR", "USD"):
21 currency = "EUR"
22
23 # Default to USD for the US only
24 if country == "US":
25 currency = "USD"
26
27 # Set default frequency
28 if not frequency in ("one-time", "monthly"):
29 frequency = "one-time"
30
31 self.render("donate/donate.html", countries=iso3166.countries,
32 country=country, first_name=first_name, last_name=last_name,
33 amount=amount, currency=currency, frequency=frequency)
34
35 @base.ratelimit(minutes=15, requests=5)
36 async def post(self):
37 amount = self.get_argument("amount")
38 currency = self.get_argument("currency", "EUR")
39 frequency = self.get_argument("frequency")
40
41 # Collect donor information
42 donor = {
43 "email" : self.get_argument("email"),
44 "title" : self.get_argument("title"),
45 "first_name" : self.get_argument("first_name"),
46 "last_name" : self.get_argument("last_name"),
47 }
48
49 # Collect address information
50 address = {
51 "street1" : self.get_argument("street1"),
52 "street2" : self.get_argument("street2", None),
53 "post_code" : self.get_argument("post_code"),
54 "city" : self.get_argument("city"),
55 "state" : self.get_argument("state", None),
56 "country_code" : self.get_argument("country_code"),
57 }
58
59 # Send everything to Zeiterfassung
60 try:
61 # Search for person or create a new one
62 response = await self.backend.zeiterfassung.send_request(
63 "/api/v1/persons/search", **donor
64 )
65
66 if not response:
67 response = await self.backend.zeiterfassung.send_request(
68 "/api/v1/persons/create", **donor, **address
69 )
70
71 person = response.get("number")
72
73 donation = {
74 "person" : person,
75
76 # $$$
77 "amount" : amount,
78 "currency" : currency,
79
80 # Is this a recurring donation?
81 "recurring" : frequency == "monthly",
82
83 # Add URLs to redirect the user back
84 "success_url" : "https://%s/donate/thank-you" % self.request.host,
85 "error_url" : "https://%s/donate/error" % self.request.host,
86 "back_url" : "https://%s/donate?amount=%s&currency=%s&frequency=%s" %
87 (self.request.host, amount, currency, frequency),
88 }
89
90 # Create donation
91 response = await self.backend.zeiterfassung.send_request(
92 "/api/v1/donations/create/ipfire-project", **donation, **address)
93
94 # Redirect the user to the payment page
95 redirect_url = response.get("redirect_url")
96 if not redirect_url:
97 raise tornado.web.HTTPError(500, "Did not receive a redirect URL")
98
99 self.redirect(redirect_url)
100
101 # XXX handle any problems when Zeiterfassung is unreachable
102 except Exception:
103 raise
104
105
106 class ThankYouHandler(base.BaseHandler):
107 def get(self):
108 self.render("donate/thank-you.html")
109
110
111 class ErrorHandler(base.BaseHandler):
112 def get(self):
113 self.render("donate/error.html")