#!/usr/bin/env python # -*- coding: utf-8 -*- # WWW-sovellukset TJTA270 Vt4 Taso 5 # http://appro.mit.jyu.fi/sovellukset/vt/vt4/ # (C) Esa-Matti Suuronen """ Tanne kirjoitetaan itse sovellus """ import sys import os import tempfile import shutil if __name__ == "__main__": sys.path.insert(0, "/home/epeli/usr/eclipse/plugins/org.python.pydev.debug_1.5.4.2010011921/pysrc/") import cherrypy from cherrypy.lib.static import serve_file from mako.lookup import TemplateLookup import config mylookup = TemplateLookup(directories=[config.template_dir], input_encoding='utf-8') def serve_mako(templatename, **kwargs): if kwargs.has_key("self"): del kwargs['self'] try: style = cherrypy.request.cookie['style'].value if style: style = "http://www.danielgreene.com/styles/%s.css" % style except KeyError: style = "" kwargs["style"] = style kwargs["logged"] = bool(cherrypy.session.get('username', False)) mytemplate = mylookup.get_template(templatename) return mytemplate.render(**kwargs) from sokkeli import webapp as sokkeli from sokkeli.kela import Form, Invalid from userdb import UserDB, User from picdb import PicDB, PicDBException from customforms import * from run import PIC_DIR, MOUNT_POINT, SESSIONS_DIR def require_auth(fn): def access_denied(*args, **kwargs): raise cherrypy.HTTPRedirect(os.path.join( cherrypy.config.get("mount_point", "/"), "login")) def select_fn(*args, **kwargs): user = cherrypy.session.get('username', None) if user: return fn(*args, **kwargs) else: return access_denied(*args, **kwargs) return select_fn class Root(object): _cp_config = { 'tools.sessions.on': True, 'tools.sessions.storage_type': "file", 'tools.sessions.storage_path': SESSIONS_DIR } @cherrypy.expose @sokkeli.wrap_with("shell.html", title="Asetukset") @require_auth def foo(self): return sokkeli.html("hello.html") @cherrypy.expose @require_auth def testi(self): return serve_mako( "testi.mako", name=self.user_object().name, ) @cherrypy.expose def index(self): return serve_mako( "index.mako", ) @cherrypy.expose @require_auth def testi2(self): return serve_mako( "testi2.mako", ) @cherrypy.expose @require_auth def servepic(self, filename=""): return serve_file(os.path.join(PIC_DIR, filename)) @cherrypy.expose @require_auth def pics(self): picdb = PicDB() pics = [(name, value[0], value[1]) for name, value in picdb.pics.items()] return serve_mako( "pics.mako", pics=pics, ) @cherrypy.expose @require_auth def upload(self, picture=None, name=""): error = "" filename = "" size = 0 if picture is not None: filename = picture.filename try: size = self.handle_file(picture, name) except Invalid, e: error = e.args[0] picture.file.close() return serve_mako( "upload.mako", **locals() ) def handle_file(self, picture, name): ext = picture.filename.split(".")[-1] if ext.lower() not in ("jpg", "png", "jpeg", "gif"): raise Invalid("Extension %s is not allowed!" % ext) file = picture.file # Ei synny koskaan saman nimisia tiedostoja saved_pic = tempfile.NamedTemporaryFile(prefix="userpic", dir=PIC_DIR) size = 0 file.seek(0) while True: data = file.read(1024) if not data: break saved_pic.write(data) size += len(data) if size > 500*1024: saved_pic.close() raise Invalid("Input file is too large!") p = saved_pic.name name_on_filesystem = os.path.join( os.path.dirname(p), os.path.basename(p).strip("/")+ "."+ext ) saved_pic.flush() # Tehdaan kova linkitys kuvasta jotta eika turhaan kopioida. os.link(p, name_on_filesystem) os.chmod(name_on_filesystem, 0666) saved_pic.close() picdb = PicDB() try: picdb.add_pic(name, name_on_filesystem) except PicDBException, e: saved_pic.close() raise Invalid(*e.args) return size @cherrypy.expose def logout(self): try: del cherrypy.session['username'] except KeyError: pass raise cherrypy.HTTPRedirect("login") def logged_in_username(self): return cherrypy.session.get('username', None) def user_object(self): userdb = UserDB() return userdb.get_user(self.logged_in_username()) def set_login(self, username): cherrypy.session['username'] = username @cherrypy.expose def login(self, *args, **kwargs): if self.logged_in_username(): raise cherrypy.HTTPRedirect("testi") form = Form("login") form.add(LoginForm("Loginform")) if cherrypy.request.method == "POST": form.populate(cherrypy.request.body_params) if form.validate(): self.set_login(form['username'].get_value()) raise cherrypy.HTTPRedirect("testi") return serve_mako( "login.mako", form=form, register_ok=bool(kwargs.get("register", "")) ) @cherrypy.expose def register(self, *args, **kwargs): form = Form("login") form.add(Username("username", label_text="Username", required=True, min_length=5)) form.add(Text("name", label_text="Full name", required=True)) form.add(Passwords("passwords")) if cherrypy.request.method == "POST": form.populate(cherrypy.request.body_params) if form.validate(): self.add_user(form) raise cherrypy.HTTPRedirect("login?register=true") return serve_mako("register.mako", form=form) def add_user(self, form): print "=" * 80 user = User(form['username'].get_value(), form['name'].get_value(), password=form['password1'].get_value()) userdb = UserDB() userdb.add_user(user) @cherrypy.expose @require_auth def settings(self, *args, **kwargs): form = Form("settings") form.add(Passwords("passwords")) form.add(Text("passwords")) msg = "" if cherrypy.request.method == "POST": form.populate(cherrypy.request.body_params) msg = "something went wrong..." if form.validate(): userdb = UserDB() username = self.logged_in_username() user = userdb.users[username] user.set_password(form['password1'].get_value()) userdb.save() msg = "Saved!" style = cherrypy.request.body_params.get("style", "") cherrypy.response.cookie['style'] = style cherrypy.response.cookie['style']['max-age'] = 31556926 return serve_mako("settings.mako", form=form, msg=msg) if __name__ == "__main__": import sys try: server = sys.argv[1] except IndexError: server = None if server == "wsgiref": from wsgiref.simple_server import make_server port = 8080 httpd = make_server('', port, cherrypy.tree.mount(Root())) print "running in %s" % port httpd.serve_forever() else: cherrypy.quickstart(Root())