]> git.ipfire.org Git - ipfire.org.git/blob - www/web/__init__.py
00758083a6f7d5e43cd8459f4c9ebd17447172b1
[ipfire.org.git] / www / web / __init__.py
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3
4 import os
5 import cgi
6 import time
7 import random
8 import simplejson as json
9
10 from http import HTTPResponse, WebError
11
12 class Data:
13 def __init__(self):
14 self.output = ""
15
16 def w(self, s):
17 self.output += "%s\n" % s
18
19 def __call__(self):
20 return self.output
21
22
23 class Json:
24 def __init__(self, file):
25 f = open(file)
26 data = f.read()
27 data = data.replace('\n', '') # Remove all \n
28 data = data.replace('\t', '') # Remove all \t
29 self.json = json.loads(data)
30 f.close()
31
32
33 class Page(Data):
34 def include(self, file):
35 f = open(file)
36 output = f.read()
37 f.close()
38 self.w(output % self.data)
39
40 def menu(self):
41 m = Menu(self.langs.current)
42 return m()
43
44 def __init__(self, title, content, sidebar=None):
45 self.output = ""
46 self.langs = Languages()
47 self.data = {"server": os.environ["SERVER_NAME"].replace("ipfire", "<span>ipfire</span>"),
48 "title" : "%s - %s" % (os.environ["SERVER_NAME"], title,),
49 "menu" : self.menu(),
50 "document_name" : title,
51 "lang" : self.langs.current,
52 "languages" : self.langs.menu(title),
53 "year" : time.strftime("%Y"),
54 "slogan" : "Security today!",
55 "content" : content(self.langs.current),
56 "sidebar" : "", }
57 if sidebar:
58 self.data["sidebar"] = sidebar(self.langs.current)
59
60 def __call__(self):
61 try:
62 self.include("template.inc")
63 code = 200
64 except WebError:
65 code = 500
66 h = HTTPResponse(code)
67 h.execute(self.output)
68
69
70 class News(Json):
71 def __init__(self, limit=3):
72 Json.__init__(self, "news.json")
73 self.news = self.json.values()
74 if limit:
75 self.news = self.news[:limit]
76 self.news.reverse()
77
78 def html(self, lang="en"):
79 s = ""
80 for item in self.news:
81 for i in ("content", "subject",):
82 if type(item[i]) == type({}):
83 item[i] = item[i][lang]
84 b = Box(item["date"] + " - " + item["subject"], "by %s" % item["author"])
85 b.w(item["content"])
86 s += b()
87 return s
88
89 __call__ = html
90
91 def headlines(self, lang="en"):
92 headlines = []
93 for item in self.news:
94 if type(item["subject"]) == type({}):
95 item["subject"] = item["subject"][lang]
96 headlines.append((item["subject"],))
97 return headlines
98
99
100 class Menu(Json):
101 def __init__(self, lang):
102 self.lang = lang
103 Json.__init__(self, "menu.json")
104
105 def __call__(self):
106 s = """<div id="menu"><ul>\n"""
107 for item in self.json.values():
108 item["active"] = ""
109
110 # Grab language
111 if type(item["name"]) == type({}):
112 item["name"] = item["name"][self.lang]
113
114 # Add language attribute to local uris
115 if item["uri"].startswith("/"):
116 item["uri"] = "/%s%s" % (self.lang, item["uri"],)
117
118 if os.environ["REQUEST_URI"].endswith(item["uri"]):
119 item["active"] = "class=\"active\""
120
121 s += """<li><a href="%(uri)s" %(active)s>%(name)s</a></li>\n""" % item
122 s += "</ul></div>"
123 return s
124
125
126 class Banners(Json):
127 def __init__(self, lang="en"):
128 self.lang = lang
129 Json.__init__(self, "banners.json")
130
131 def random(self):
132 banner = random.choice(self.json.values())
133 return banner
134
135
136 class Languages:
137 def __init__(self, doc=""):
138 self.available = []
139
140 for lang in ("de", "en",):
141 self.append(lang,)
142
143 self.current = cgi.FieldStorage().getfirst("lang") or "en"
144
145 def append(self, lang):
146 self.available.append(lang)
147
148 def menu(self, doc):
149 s = ""
150 for lang in self.available:
151 s += """<a href="/%(lang)s/%(doc)s"><img src="/images/%(lang)s.gif" alt="%(lang)s" /></a>""" % \
152 { "lang" : lang, "doc" : doc, }
153 return s
154
155
156 class Box(Data):
157 def __init__(self, headline, subtitle=""):
158 Data.__init__(self)
159 self.w("""<div class="post"><h3>%s</h3>""" % (headline,))
160 if subtitle:
161 self.w("""<ul class="post_info"><li class="date">%s</li></ul>""" % (subtitle,))
162
163 def __call__(self):
164 self.w("""<br class="clear" /></div>""")
165 return Data.__call__(self)
166
167
168 class Sidebar(Data):
169 def __init__(self, name):
170 Data.__init__(self)
171
172 def content(self, lang):
173 #self.w("""<h4>Test Page</h4>
174 # <p>Lorem ipsum dolor sit amet, consectetuer sadipscing elitr,
175 # sed diam nonumy eirmod tempor invidunt ut labore et dolore magna
176 # aliquyam erat, sed diam voluptua. At vero eos et accusam et justo
177 # duo dolores et ea rebum.</p>""")
178 banners = Banners()
179 self.w("""<h4>%(title)s</h4><a href="%(link)s" target="_blank">
180 <img class="banner" src="%(uri)s" /></a>""" % banners.random())
181
182 def __call__(self, lang):
183 self.content(lang)
184 return Data.__call__(self)
185
186
187 class Content(Data):
188 def __init__(self, name):
189 Data.__init__(self)
190
191 def content(self):
192 self.w("""<h3>Test Page</h3>
193 <p>Lorem ipsum dolor sit amet, consectetuer sadipscing elitr,
194 sed diam nonumy eirmod tempor invidunt ut labore et dolore magna
195 aliquyam erat, sed diam voluptua. At vero eos et accusam et justo
196 duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata
197 sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet,
198 consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt
199 ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero
200 eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
201 gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
202 Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam
203 nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,
204 sed diam voluptua. At vero eos et accusam et justo duo dolores et ea
205 rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem
206 ipsum dolor sit amet.</p>""")
207
208 b = Box("Test box one", "Subtitle of box")
209 b.write("""<p>Duis autem vel eum iriure dolor in hendrerit in vulputate velit
210 esse molestie consequat, vel illum dolore eu feugiat nulla facilisis
211 at vero eros et accumsan et iusto odio dignissim qui blandit praesent
212 luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
213 Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam
214 nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat
215 volutpat.</p>""")
216 self.w(b())
217
218 b = Box("Test box two", "Subtitle of box")
219 b.write("""<p>Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper
220 suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem
221 vel eum iriure dolor in hendrerit in vulputate velit esse molestie
222 consequat, vel illum dolore eu feugiat nulla facilisis at vero eros
223 et accumsan et iusto odio dignissim qui blandit praesent luptatum
224 zzril delenit augue duis dolore te feugait nulla facilisi.</p>""")
225 self.w(b())
226
227 def __call__(self, lang="en"):
228 self.content()
229 return Data.__call__(self)