]>
Commit | Line | Data |
---|---|---|
c7bcb9ca MT |
1 | #!/usr/bin/python3 |
2 | ||
3 | import iso3166 | |
c7bcb9ca MT |
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 | |
b00cc400 MT |
18 | first_name = self.get_argument("first_name", None) |
19 | last_name = self.get_argument("last_name", None) | |
a5f94966 | 20 | amount = self.get_argument_float("amount", None) |
c7bcb9ca MT |
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 | ||
0ba47b0f | 36 | self.render("donate/donate.html", countries=iso3166.countries, |
b00cc400 MT |
37 | country=country, first_name=first_name, last_name=last_name, |
38 | amount=amount, currency=currency, frequency=frequency) | |
c7bcb9ca | 39 | |
53a15fe0 | 40 | @base.ratelimit(minutes=15, requests=5) |
9fdf4fb7 | 41 | async def post(self): |
c7bcb9ca MT |
42 | amount = self.get_argument("amount") |
43 | currency = self.get_argument("currency", "EUR") | |
44 | frequency = self.get_argument("frequency") | |
45 | ||
bd9cc41d MT |
46 | # Collect donor information |
47 | donor = { | |
c7bcb9ca MT |
48 | "email" : self.get_argument("email"), |
49 | "title" : self.get_argument("title"), | |
50 | "first_name" : self.get_argument("first_name"), | |
51 | "last_name" : self.get_argument("last_name"), | |
bd9cc41d MT |
52 | } |
53 | ||
bd9cc41d MT |
54 | # Collect address information |
55 | address = { | |
c7bcb9ca MT |
56 | "street1" : self.get_argument("street1"), |
57 | "street2" : self.get_argument("street2", None), | |
58 | "post_code" : self.get_argument("post_code"), | |
59 | "city" : self.get_argument("city"), | |
60 | "state" : self.get_argument("state", None), | |
61 | "country_code" : self.get_argument("country_code"), | |
62 | } | |
63 | ||
bd9cc41d | 64 | # Send everything to Zeiterfassung |
c7bcb9ca | 65 | try: |
bd9cc41d | 66 | # Search for person or create a new one |
9fdf4fb7 | 67 | response = await self.backend.zeiterfassung.send_request( |
bd9cc41d MT |
68 | "/api/v1/persons/search", **donor |
69 | ) | |
c7bcb9ca | 70 | |
bd9cc41d MT |
71 | if not response: |
72 | response = await self.backend.zeiterfassung.send_request( | |
73 | "/api/v1/persons/create", **donor, **address | |
74 | ) | |
c7bcb9ca | 75 | |
bd9cc41d | 76 | person = response.get("number") |
c7bcb9ca | 77 | |
bd9cc41d | 78 | donation = { |
bd9cc41d MT |
79 | "person" : person, |
80 | ||
81 | # $$$ | |
82 | "amount" : amount, | |
83 | "currency" : currency, | |
84 | ||
85 | # Is this a recurring donation? | |
86 | "recurring" : frequency == "monthly", | |
87 | ||
88 | # Add URLs to redirect the user back | |
89 | "success_url" : "https://%s/donate/thank-you" % self.request.host, | |
90 | "error_url" : "https://%s/donate/error" % self.request.host, | |
91 | "back_url" : "https://%s/donate?amount=%s¤cy=%s&frequency=%s" % | |
92 | (self.request.host, amount, currency, frequency), | |
93 | } | |
94 | ||
95 | # Create donation | |
96 | response = await self.backend.zeiterfassung.send_request( | |
e8be239b | 97 | "/api/v1/donations/create/ipfire-project", **donation, **address) |
bd9cc41d MT |
98 | |
99 | # Redirect the user to the payment page | |
100 | redirect_url = response.get("redirect_url") | |
101 | if not redirect_url: | |
102 | raise tornado.web.HTTPError(500, "Did not receive a redirect URL") | |
103 | ||
104 | self.redirect(redirect_url) | |
105 | ||
106 | # XXX handle any problems when Zeiterfassung is unreachable | |
107 | except Exception: | |
108 | raise | |
c7bcb9ca MT |
109 | |
110 | ||
111 | class ThankYouHandler(base.BaseHandler): | |
112 | def get(self): | |
113 | self.render("donate/thank-you.html") | |
114 | ||
115 | ||
116 | class ErrorHandler(base.BaseHandler): | |
117 | def get(self): | |
118 | self.render("donate/error.html") |