1 """The EggBasket root controller."""
2
3
4 import logging
5 import os
6
7 from os.path import join
8
9 import cherrypy as cp
10 import turbogears as tg
11
12 from eggbasket import __version__
13 from eggbasket import model
14 from eggbasket.controllers.errorcatcher import ErrorCatcher
15 from eggbasket.controllers.admin import AdminController
16 from eggbasket.controllers.packages import PackageController
17 from eggbasket.util import is_package_dir
18
19 from eggbasket.util import txt2html
20 from eggbasket.permissions import has_permission
21
22
23 log = logging.getLogger("eggbasket.controllers")
26 """Add site information to standard template variables."""
27 vars['sitename'] = tg.config.get('eggbasket.sitename',
28 'EggBasket Package Index')
29 vars['server_version'] = __version__
30 vars['has_permission'] = has_permission
31
32 tg.view.variable_providers.append(add_sitevars)
35 """Read text file from static directory and covert to HTML."""
36 static_dir = tg.config.get('static_filter.dir', path='/static')
37 filename = join(static_dir, name)
38 try:
39 fo = open(filename, 'rb')
40 except (OSError, IOError):
41 text = _(u"Could not read static content resource '%s'.") % name
42 else:
43 text = fo.read().decode('utf-8')
44 fo.close()
45 return txt2html(text)
46
47
48 -class Root(ErrorCatcher):
49 """The root controller of the EggBasket application."""
50
51 admin = AdminController()
52 package = PackageController()
53
54 @tg.expose()
55 - def index(self, *args, **kw):
56 """Delegate requests for front page to package list.
57
58 Might be replaced by a welcome / search page sometime.
59
60 """
61
62 return self.package.index(*args, **kw)
63 simple = index
64
65 @tg.expose()
66 - def default(self, package=None, *args, **kw):
67 """Delegate requests with package name to PackageController."""
68
69 return self.package.default(package, *args, **kw)
70
71 @tg.expose()
72 - def upload(self, *args, **kw):
73 """Delegate package uploads to PackageController."""
74 return self.package.upload(*args, **kw)
75
76 @tg.expose()
77 - def upload(self, name, content, *args, **kw):
78 """Delegate package uploads to PackageController."""
79 return self.package.upload(name, content, *args, **kw)
80
81 @tg.expose(template="eggbasket.templates.generic")
82 - def about(self, package=None):
83 """Display information page about the software."""
84 content = get_static_content('about.rst')
85 return dict(
86 title=_(u'About'),
87 heading=_(u'About the EggBasket Software'),
88 content=content
89 )
90
91 @tg.expose(template="eggbasket.templates.generic")
92 - def help(self, package=None):
93 """Display usage information for the software."""
94 content = get_static_content('help.rst')
95 return dict(
96 title=_(u'Help'),
97 heading=_(u'How to use EggBasket'),
98 content=content
99 )
100
101 @tg.expose(template="eggbasket.templates.login")
102 - def login(self, forward_url=None, previous_url=None, *args, **kw):
103 """Display the login form."""
104 if not tg.identity.current.anonymous \
105 and tg.identity.was_login_attempted() \
106 and not tg.identity.get_identity_errors():
107 tg.redirect(tg.url(forward_url or previous_url or '/', kw))
108
109 forward_url = None
110 previous_url = cp.request.path
111
112 if tg.identity.was_login_attempted():
113 msg = _("The credentials you supplied were not correct or "
114 "did not grant access to this resource.")
115 elif tg.identity.get_identity_errors():
116 msg = _("You must provide your credentials before accessing "
117 "this resource.")
118 else:
119 msg = _("Please log in.")
120 forward_url = cp.request.headers.get("Referer", "/")
121
122 cp.response.status = 401
123 return dict(message=msg, previous_url=previous_url, logging_in=True,
124 original_parameters=cp.request.params, forward_url=forward_url)
125
126 @tg.expose()
128 """Clear current identity and redirect to front page."""
129 tg.identity.current.logout()
130 tg.redirect("/")
131