]> git.ipfire.org Git - people/jschlag/pbs.git/blame - src/web/handlers_base.py
Merge branch 'master' of git://git.ipfire.org/pbs
[people/jschlag/pbs.git] / src / web / handlers_base.py
CommitLineData
9137135a
MT
1#!/usr/bin/python
2
f6e6ff79
MT
3import pakfire
4
5import datetime
9137135a 6import httplib
f6e6ff79 7import pytz
9137135a
MT
8import time
9import tornado.locale
10import tornado.web
f6e6ff79 11import traceback
9137135a 12
14d7ed77 13from .. import __version__
2c909128 14from .. import misc
d2738057 15from ..decorators import *
9137135a
MT
16
17class BaseHandler(tornado.web.RequestHandler):
c6c94528
MT
18 @property
19 def backend(self):
20 return self.application.backend
21
22 @property
23 def db(self):
24 return self.backend.db
25
d2738057
MT
26 @lazy_property
27 def session(self):
28 # Get the session from the cookie
29 session_id = self.get_cookie("session_id", None)
f6e6ff79 30
d2738057
MT
31 # Search for a valid database session
32 if session_id:
33 session = self.backend.sessions.get(session_id)
f6e6ff79 34
d2738057
MT
35 # Found a valid session
36 if session:
37 return session
9137135a 38
d2738057
MT
39 def get_current_user(self):
40 if self.session:
41 return self.session.impersonated_user or self.session.user
bdeb3c62 42
9137135a 43 def get_user_locale(self):
9137135a
MT
44 # Get the locale from the user settings.
45 if self.current_user and self.current_user.locale:
46 locale = tornado.locale.get(self.current_user.locale)
214463e3 47 if locale:
9137135a
MT
48 return locale
49
214463e3
MT
50 # If no locale was provided, we take what ever the browser requested.
51 return self.get_browser_locale()
9137135a 52
f6e6ff79 53 @property
12d79e59 54 def current_address(self):
f6e6ff79
MT
55 """
56 Returns the IP address the request came from.
57 """
371a879e 58 return self.request.headers.get("X-Real-IP") or self.request.remote_ip
f6e6ff79 59
61c74986
MT
60 @property
61 def user_agent(self):
62 """
63 Returns the HTTP user agent
64 """
65 return self.request.headers.get("User-Agent", None)
66
f6e6ff79
MT
67 @property
68 def timezone(self):
69 if self.current_user:
70 return self.current_user.timezone
71
72 return pytz.utc
73
74 def format_date(self, date, relative=True, shorter=False,
75 full_format=False):
76 # XXX not very precise but working for now.
77 gmt_offset = self.timezone.utcoffset(date).total_seconds() / -60
78
79 return self.locale.format_date(date, gmt_offset=gmt_offset,
80 relative=relative, shorter=shorter, full_format=full_format)
81
8fa68307
MT
82 def get_template_namespace(self):
83 ns = tornado.web.RequestHandler.get_template_namespace(self)
84
85 ns.update({
f6e6ff79
MT
86 "bugtracker" : self.pakfire.bugzilla,
87 "hostname" : self.request.host,
88 "format_date" : self.format_date,
2c909128
MT
89 "format_size" : misc.format_size,
90 "friendly_time" : misc.friendly_time,
91 "format_email" : misc.format_email,
92 "format_filemode" : misc.format_filemode,
f6e6ff79 93 "lang" : self.locale.code[:2],
d2738057 94 "session" : self.session,
14d7ed77 95 "version" : __version__,
f6e6ff79 96 "year" : time.strftime("%Y"),
8fa68307 97 })
9137135a 98
8fa68307 99 return ns
9137135a 100
f6e6ff79 101 def get_error_html(self, status_code, exception=None, **kwargs):
ae4c835a 102 error_document = "errors/error.html"
f6e6ff79
MT
103
104 kwargs.update({
105 "code" : status_code,
106 "message" : httplib.responses[status_code],
107 })
108
ae4c835a
MT
109 if status_code in (400, 403, 404):
110 error_document = "errors/error-%s.html" % status_code
f6e6ff79
MT
111
112 # Collect more information about the exception if possible.
113 if exception:
114 exception = traceback.format_exc()
115
116 return self.render_string(error_document, exception=exception, **kwargs)
9137135a
MT
117
118 @property
119 def pakfire(self):
c6c94528 120 return self.backend
9137135a 121
f6e6ff79
MT
122 @property
123 def mirrors(self):
1104bcbf 124 return self.pakfire.mirrors