]>
Commit | Line | Data |
---|---|---|
c7bcb9ca MT |
1 | #!/usr/bin/python3 |
2 | ||
3 | import iso3166 | |
c7bcb9ca MT |
4 | import tornado.web |
5 | ||
55a907a5 | 6 | from . import auth |
c7bcb9ca MT |
7 | from . import base |
8 | ||
55a907a5 | 9 | class 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¤cy=%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 | ||
107 | class ThankYouHandler(base.BaseHandler): | |
108 | def get(self): | |
109 | self.render("donate/thank-you.html") | |
110 | ||
111 | ||
112 | class ErrorHandler(base.BaseHandler): | |
113 | def get(self): | |
114 | self.render("donate/error.html") |