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