]> git.ipfire.org Git - ipfire.org.git/blob - src/web/people.py
Redirect to right host when no avatar image is available
[ipfire.org.git] / src / web / people.py
1 #!/usr/bin/python
2
3 import datetime
4 import ldap
5 import logging
6 import tornado.web
7
8 from . import handlers_base as base
9 from . import ui_modules
10
11 class IndexHandler(base.BaseHandler):
12 @tornado.web.authenticated
13 def get(self):
14 self.render("people/index.html")
15
16
17 class AvatarHandler(base.BaseHandler):
18 always_cache = True
19
20 def get(self, uid):
21 # Get the desired size of the avatar file
22 size = self.get_argument("size", 0)
23
24 try:
25 size = int(size)
26 except (TypeError, ValueError):
27 size = None
28
29 logging.debug("Querying for avatar of %s" % uid)
30
31 # Fetch user account
32 account = self.backend.accounts.get_by_uid(uid)
33 if not account:
34 raise tornado.web.HTTPError(404, "Could not find account %s" % uid)
35
36 # Allow downstream to cache this for 60 minutes
37 self.set_expires(3600)
38
39 # Resize avatar
40 avatar = account.get_avatar(size)
41
42 # If there is no avatar, we serve a default image
43 if not avatar:
44 logging.debug("No avatar uploaded for %s" % account)
45
46 return self.redirect(self.static_url("img/default-avatar.jpg"))
47
48 # Set headers about content
49 self.set_header("Content-Disposition", "inline; filename=\"%s.jpg\"" % account.uid)
50 self.set_header("Content-Type", "image/jpeg")
51
52 # Deliver payload
53 self.finish(avatar)
54
55
56 class CallsHandler(base.BaseHandler):
57 @tornado.web.authenticated
58 def get(self, uid, date=None):
59 account = self.backend.accounts.get_by_uid(uid)
60 if not account:
61 raise tornado.web.HTTPError(404, "Could not find account %s" % uid)
62
63 if date:
64 try:
65 date = datetime.datetime.strptime(date, "%Y-%m-%d").date()
66 except ValueError:
67 raise tornado.web.HTTPError(400, "Invalid date: %s" % date)
68 else:
69 date = datetime.date.today()
70
71 self.render("people/calls.html", account=account, date=date)
72
73
74 class RegistrationsHandler(base.BaseHandler):
75 @tornado.web.authenticated
76 def get(self, uid):
77 # Get own account
78 if self.current_user.uid == uid:
79 account = self.current_user
80
81 # Admins can access all other users, too
82 elif self.current_user.is_admin():
83 account = self.backend.accounts.get_by_uid(uid)
84 if not account:
85 raise tornado.web.HTTPError(404, "Could not find account %s" % uid)
86
87 # Otherwise, no access is permitted
88 else:
89 raise tornado.web.HTTPError(403)
90
91 self.render("people/registrations.html", account=account)
92
93
94 class SearchHandler(base.BaseHandler):
95 @tornado.web.authenticated
96 def get(self):
97 q = self.get_argument("q")
98
99 # Perform the search
100 accounts = self.backend.accounts.search(q)
101
102 # Redirect when only one result was found
103 if len(accounts) == 1:
104 self.redirect("/users/%s" % accounts[0].uid)
105 return
106
107 self.render("people/search.html", q=q, accounts=accounts)
108
109
110 class UsersHandler(base.BaseHandler):
111 @tornado.web.authenticated
112 def get(self):
113 self.render("people/users.html")
114
115
116 class UserHandler(base.BaseHandler):
117 @tornado.web.authenticated
118 def get(self, uid):
119 account = self.backend.accounts.get_by_uid(uid)
120 if not account:
121 raise tornado.web.HTTPError(404, "Could not find account %s" % uid)
122
123 self.render("people/user.html", account=account)
124
125
126 class UserEditHandler(base.BaseHandler):
127 @tornado.web.authenticated
128 def get(self, uid):
129 account = self.backend.accounts.get_by_uid(uid)
130 if not account:
131 raise tornado.web.HTTPError(404, "Could not find account %s" % uid)
132
133 # Check for permissions
134 if not account.can_be_managed_by(self.current_user):
135 raise tornado.web.HTTPError(403, "%s cannot manage %s" % (self.current_user, account))
136
137 self.render("people/user-edit.html", account=account)
138
139 @tornado.web.authenticated
140 def post(self, uid):
141 account = self.backend.accounts.get_by_uid(uid)
142 if not account:
143 raise tornado.web.HTTPError(404, "Could not find account %s" % uid)
144
145 # Check for permissions
146 if not account.can_be_managed_by(self.current_user):
147 raise tornado.web.HTTPError(403, "%s cannot manage %s" % (self.current_user, account))
148
149 # Unfortunately this cannot be wrapped into a transaction
150 try:
151 account.first_name = self.get_argument("first_name")
152 account.last_name = self.get_argument("last_name")
153 account.address = self.get_argument("address")
154
155 # Avatar
156 try:
157 filename, data, mimetype = self.get_file("avatar")
158
159 if not mimetype.startswith("image/"):
160 raise tornado.web.HTTPError(400, "Avatar is not an image file: %s" % mimetype)
161
162 account.upload_avatar(data)
163 except ValueError:
164 pass
165
166 # Email
167 account.mail_routing_address = self.get_argument("mail_routing_address", None)
168
169 # Telephone
170 account.phone_numbers = self.get_argument("phone_numbers", "").splitlines()
171 account.sip_routing_address = self.get_argument("sip_routing_address", None)
172 except ldap.STRONG_AUTH_REQUIRED as e:
173 raise tornado.web.HTTPError(403, "%s" % e) from e
174
175 # Redirect back to user page
176 self.redirect("/users/%s" % account.uid)
177
178
179 class AccountsListModule(ui_modules.UIModule):
180 def render(self, accounts=None):
181 if accounts is None:
182 accounts = self.backend.accounts
183
184 return self.render_string("people/modules/accounts-list.html", accounts=accounts)
185
186
187 class CDRModule(ui_modules.UIModule):
188 def render(self, account, date=None, limit=None):
189 cdr = account.get_cdr(date=date, limit=limit)
190
191 return self.render_string("people/modules/cdr.html", account=account, cdr=cdr)
192
193
194 class ChannelsModule(ui_modules.UIModule):
195 def render(self, account):
196 channels = self.backend.talk.freeswitch.get_sip_channels(account)
197
198 return self.render_string("people/modules/channels.html", account=account, channels=channels)
199
200
201 class RegistrationsModule(ui_modules.UIModule):
202 def render(self, account):
203 return self.render_string("people/modules/registrations.html", account=account)