]> git.ipfire.org Git - ipfire.org.git/blobdiff - www/webapp/handlers.py
Import of new website.
[ipfire.org.git] / www / webapp / handlers.py
index 88944e233718f1579f08ac0afa0fed870d2c3d64..fb459f40e0eb4a0e5d3ba6e4ae37bd96c64783ab 100644 (file)
 #!/usr/bin/python
 
-import datetime
-import httplib
-import mimetypes
-import operator
+#import httplib
+#import logging
+#import markdown2
 import os
-import simplejson
-import stat
-import sqlite3
-import time
-import urlparse
-
-import tornado.httpclient
-import tornado.locale
+#import random
+#import re
+#import socket
+#import time
+#import tornado.database
+#import tornado.locale
 import tornado.web
+#import unicodedata
 
-from banners import banners
-from helpers import size, Item
-from info import info
-from mirrors import mirrors
-from news import news
-from releases import releases
-
-import builds
-import cluster
-import menu
-import translations
-#import uriel
-
-class BaseHandler(tornado.web.RequestHandler):
-       def get_user_locale(self):
-               uri = self.request.uri.split("/")
-               if len(uri) > 1:
-                       for lang in tornado.locale.get_supported_locales(None):
-                               if lang[:2] == uri[1]:
-                                       return tornado.locale.get(lang)
-
-       @property
-       def render_args(self):
-               return {
-                       "banner"    : banners.get(),
-                       "lang"      : self.locale.code[:2],
-                       "langs"     : [l[:2] for l in tornado.locale.get_supported_locales(None)],
-                       "lang_link" : self.lang_link,
-                       "link"      : self.link,
-                       "title"     : "no title given",
-                       "server"    : self.request.host.replace("ipfire", "<span>ipfire</span>"),
-                       "uri"       : self.request.uri,
-                       "year"      : time.strftime("%Y"),
-               }
-
-       def render(self, *args, **kwargs):
-               nargs = self.render_args
-               nargs.update(kwargs)
-               nargs["title"] = "%s - %s" % (self.request.host, nargs["title"])
-               tornado.web.RequestHandler.render(self, *args, **nargs)
-
-       def link(self, s):
-               return "/%s/%s" % (self.locale.code[:2], s)
-       
-       def lang_link(self, lang):
-               return "/%s/%s" % (lang, self.request.uri[4:])
-       
-       def get_error_html(self, status_code, **kwargs):
-               if status_code in (404, 500):
-                       render_args = self.render_args
-                       render_args.update({
-                               "code"      : status_code,
-                               "exception" : kwargs.get("exception", None),
-                               "message"   : httplib.responses[status_code],
-                       })
-                       return self.render_string("error-%s.html" % status_code, **render_args)
-               else:
-                       return tornado.web.RequestHandler.get_error_html(self, status_code, **kwargs)
-
-       @property
-       def hash_db(self):
-               return self.application.hash_db
-
-class MainHandler(BaseHandler):
-       def get(self):
-               lang = self.locale.code[:2]
-               self.redirect("/%s/index" % (lang))
+import backend
 
+from handlers_admin import *
+from handlers_base import *
+from handlers_download import *
+from handlers_mirrors import *
+from handlers_news import *
+from handlers_planet import *
+from handlers_stasy import *
+from handlers_tracker import *
 
-class DownloadHandler(BaseHandler):
-       def get(self):
-               self.render("downloads.html", release=releases.latest)
 
+class RootHandler(BaseHandler):
+       """
+               This handler redirects any request directly to /.
 
-class DownloadAllHandler(BaseHandler):
-       def get(self):
-               self.render("downloads-all.html", releases=releases)
+               It can be used to be compatible with some ancient index urls.
+       """
+       def get(self, *args):
+               self.redirect("/")
 
 
-class DownloadDevelopmentHandler(BaseHandler):
-       def get(self):
-               self.render("downloads-development.html", releases=releases)
+class LangCompatHandler(BaseHandler):
+       """
+               Redirect links in the old format to current site:
 
+               E.g. /en/index -> /index
+       """
+       def get(self, lang, page):
+               self.redirect("/%s" % page)
 
-class DownloadTorrentHandler(BaseHandler):
-       tracker_url = "http://tracker.ipfire.org:6969/stats?format=txt&mode=tpbs"
 
-       @tornado.web.asynchronous
+class IndexHandler(BaseHandler):
+       """
+               This handler displays the welcome page.
+       """
        def get(self):
-               http = tornado.httpclient.AsyncHTTPClient()
-               http.fetch(self.tracker_url, callback=self.async_callback(self.on_response))
-
-       def on_response(self, response):
-               torrents = releases.torrents
-               hashes = {}
-               if response.code == 200:
-                       for line in response.body.split("\n"):
-                               if not line: continue
-                               hash, seeds, peers = line.split(":")
-                               hash.lower()
-                               hashes[hash] = {
-                                       "peers" : peers,
-                                       "seeds" : seeds,
-                               }
+               # Get a list of the most recent news items and put them on the page.            
+               latest_news = self.news.get_latest(limit=1, locale=self.locale)
+               recent_news = self.news.get_latest(limit=2, locale=self.locale, offset=1)
 
-               self.render("downloads-torrents.html",
-                       hashes=hashes,
-                       releases=torrents,
-                       request_time=response.request_time,
-                       tracker=urlparse.urlparse(response.request.url).netloc)
-
-
-class DownloadMirrorHandler(BaseHandler):
-       def get(self):
-               self.render("downloads-mirrors.html", mirrors=mirrors)
+               return self.render("index.html",
+                       latest_news=latest_news, recent_news=recent_news)
 
 
 class StaticHandler(BaseHandler):
+       """
+               This handler shows the files that are in plain html format.
+       """
        @property
        def static_path(self):
                return os.path.join(self.application.settings["template_path"], "static")
@@ -151,160 +80,6 @@ class StaticHandler(BaseHandler):
                if not name in self.static_files:
                        raise tornado.web.HTTPError(404)
 
-               self.render("static/%s" % name)
-
-
-class IndexHandler(BaseHandler):
-       def get(self):
-               self.render("index.html", news=news)
-
-
-class NewsHandler(BaseHandler):
-       def get(self):
-               self.render("news.html", news=news)
-
-
-class BuildHandler(BaseHandler):
-       def prepare(self):
-               self.builds = {
-                       "<12h" : [],
-                       ">12h" : [],
-                       ">24h" : [],
-               }
-
-               for build in builds.find():
-                       if (time.time() - float(build.get("date"))) < 12*60*60:
-                               self.builds["<12h"].append(build)
-                       elif (time.time() - float(build.get("date"))) < 24*60*60:
-                               self.builds[">12h"].append(build)
-                       else:
-                               self.builds[">24h"].append(build)
-
-               for l in self.builds.values():
-                       l.sort()
-
-       def get(self):
-               self.render("builds.html", builds=self.builds)
-
-
-class UrielBaseHandler(BaseHandler):
-       #db = uriel.Database()
-       pass
-
-class UrielHandler(UrielBaseHandler):
-       def get(self):
-               pass
-
-
-class ApiClusterInfoHandler(BaseHandler):
-       def get(self):
-               id = self.get_argument("id", "null")
-
-               c = cluster.Cluster(info["cluster"]["hostname"])
-
-               self.write(simplejson.dumps({
-                       "version": "1.1",
-                       "id": id,
-                       "result" : c.json,
-                       "error" : "null", }))
-               self.finish()
-
-
-class TranslationHandler(BaseHandler):
-       def get(self):
-               self.render("translations.html", projects=translations.projects)
-
-
-class SourceHandler(BaseHandler):
-       def get(self):
-               source_path = "/srv/sources"
-               fileobjects = []
-
-               for dir, subdirs, files in os.walk(source_path):
-                       if not files:
-                               continue
-                       for file in files:
-                               if file in [f["name"] for f in fileobjects]:
-                                       continue
-
-                               hash = self.hash_db.get_hash(os.path.join(dir, file))
-
-                               if not hash:
-                                       hash = "0000000000000000000000000000000000000000"
-
-                               fileobjects.append({
-                                       "dir"  : dir[len(source_path)+1:],
-                                       "name" : file,
-                                       "hash" : hash,
-                                       "size" : size(os.path.getsize(os.path.join(source_path, dir, file))),
-                               })
-
-               fileobjects.sort(key=operator.itemgetter("name"))
-
-               self.render("sources.html", files=fileobjects)
-
-
-class SourceDownloadHandler(BaseHandler):
-       def head(self, path):
-               self.get(path, include_body=False)
-
-       def get(self, path, include_body=True):
-               source_path = "/srv/sources"
-
-               path = os.path.abspath(os.path.join(source_path, path[1:]))
-
-               if not path.startswith(source_path):
-                       raise tornado.web.HTTPError(403)
-               if not os.path.exists(path):
-                       raise tornado.web.HTTPError(404)
-
-               stat_result = os.stat(path)
-               modified = datetime.datetime.fromtimestamp(stat_result[stat.ST_MTIME])
-
-               self.set_header("Last-Modified", modified)
-               self.set_header("Content-Length", stat_result[stat.ST_SIZE])
-
-               mime_type, encoding = mimetypes.guess_type(path)
-               if mime_type:
-                       self.set_header("Content-Type", mime_type)
-
-               hash = self.hash_db.get_hash(path)
-               if hash:
-                       self.set_header("X-Hash-Sha1", "%s" % hash)
-
-               if not include_body:
-                       return
-               file = open(path, "r")
-               try:
-                       self.write(file.read())
-               finally:
-                       file.close()
-
-
-class DownloadFileHandler(BaseHandler):
-       def get(self, path):
-               for mirror in mirrors.with_file(path):
-                       if not mirror.reachable:
-                               continue
-
-                       self.redirect(mirror.url + path)
-                       return
-
-               raise tornado.web.HTTPError(404)
-
-       def get_error_html(self, status_code, **kwargs):
-               return tornado.web.RequestHandler.get_error_html(self, status_code, **kwargs)
-
+               self.render("static/%s" % name, lang=self.locale.code[:2])
 
-class RSSHandler(BaseHandler):
-       def get(self, lang):
-               items = []
-               for item in news.get(15):
-                       item = Item(**item.args.copy())
-                       for attr in ("subject", "content"):
-                               if type(item[attr]) == type({}):
-                                       item[attr] = item[attr][lang]
-                       items.append(item)
 
-               self.set_header("Content-Type", "application/rss+xml")
-               self.render("rss.xml", items=items, lang=lang)