]>
git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - www/webapp/ui_modules.py
3 from __future__
import division
13 from tornado
.database
import Row
18 class UIModule(tornado
.web
.UIModule
):
21 return self
.handler
.accounts
25 return self
.handler
.banners
29 return self
.handler
.memcached
33 return self
.handler
.releases
36 class MenuModule(UIModule
):
38 hostname
= self
.request
.host
.lower().split(':')[0]
41 for m
in backend
.Menu().get(hostname
):
44 if m
.uri
and self
.request
.uri
.endswith(m
.uri
):
47 # Translate the description of the link
49 self
.locale
.translate(m
.description
)
50 m
.description
= tornado
.escape
.xhtml_escape(m
.description
)
54 return self
.render_string("modules/menu.html", menuitems
=menuitems
)
57 class NewsItemModule(UIModule
):
58 def get_author(self
, author
):
60 author
= self
.accounts
.find(author
)
64 _
= self
.locale
.translate
65 return _("Unknown author")
67 def render(self
, item
, uncut
=False):
69 item
.author
= self
.get_author(item
.author_id
)
71 if not uncut
and len(item
.text
) >= 400:
72 item
.text
= item
.text
[:400] + "..."
75 text_id
= "news-%s" % hashlib
.md5(item
.text
.encode("utf-8")).hexdigest()
77 text
= self
.memcached
.get(text_id
)
79 text
= textile
.textile(item
.text
)
80 self
.memcached
.set(text_id
, text
, 60)
84 return self
.render_string("modules/news-item.html", item
=item
, uncut
=uncut
)
87 class NewsLineModule(NewsItemModule
):
88 def render(self
, item
):
89 return self
.render_string("modules/news-line.html", item
=item
)
92 class MirrorItemModule(UIModule
):
93 def render(self
, item
):
94 return self
.render_string("modules/mirror-item.html", item
=item
)
97 class SidebarItemModule(UIModule
):
99 return self
.render_string("modules/sidebar-item.html")
102 class SidebarReleaseModule(UIModule
):
104 return self
.render_string("modules/sidebar-release.html",
105 latest
=self
.releases
.get_latest())
108 class ReleaseItemModule(UIModule
):
109 def render(self
, item
):
110 return self
.render_string("modules/release-item.html", release
=item
)
113 class SidebarBannerModule(UIModule
):
114 def render(self
, item
=None):
116 item
= self
.banners
.get_random()
118 return self
.render_string("modules/sidebar-banner.html", item
=item
)
121 class PlanetEntryModule(UIModule
):
122 def render(self
, entry
, short
=False):
123 return self
.render_string("modules/planet-entry.html",
124 entry
=entry
, short
=short
)
127 class TrackerPeerListModule(UIModule
):
128 def render(self
, peers
, percentages
=False):
129 # Guess country code and hostname of the host
131 country_code
= backend
.GeoIP().get_country(peer
["ip"])
132 peer
["country_code"] = country_code
or "unknown"
135 peer
["hostname"] = socket
.gethostbyaddr(peer
["ip"])[0]
137 peer
["hostname"] = ""
139 return self
.render_string("modules/tracker-peerlist.html",
140 peers
=[Row(p
) for p
in peers
], percentages
=percentages
)
143 class StasyTableModule(UIModule
):
144 def render(self
, items
, sortby
="key", reverse
=False, percentage
=False):
146 for v
in items
.values():
151 keys
= sorted(items
.keys(), reverse
=reverse
)
152 elif sortby
== "percentage":
153 keys
= [k
for k
,v
in sorted(items
.items(), key
=operator
.itemgetter(1))]
155 keys
= reversed(keys
)
157 raise Exception, "Unknown sortby parameter was provided"
163 v
= items
[k
] * 100 / hundred_percent
166 _items
.append((k
, v
))
169 if items
and type(items
[0][0]) == type(()) :
170 _
= self
.locale
.translate
173 k
= _("%s to %s") % k
174 _items
.append((k
, v
))
177 return self
.render_string("modules/stasy-table.html", items
=items
)
180 class StasyDeviceTableModule(UIModule
):
181 def render(self
, devices
):
184 for device
in devices
:
185 if not groups
.has_key(device
.cls
):
186 groups
[device
.cls
] = []
188 groups
[device
.cls
].append(device
)
190 return self
.render_string("modules/stasy-table-devices.html",
191 groups
=groups
.items())