#!/usr/bin/python # -*- coding: UTF-8 -*- import cgitb cgitb.enable() import cgi import time import datetime import random import os import urllib import simplejson from jinja2 import Template, Environment, FileSystemLoader # tulostetaan HTTP-protokollan edellyttämä mediatyyppi ja dokumentissa # käytetty merkistö. WWW-palvelin täydentää loput HTTP-otsakkeet # Jos tämä on väärin niin tuloksena on aina server error! print """Content-type: text/html; charset=UTF-8\n""" css = ['http://www.w3.org/StyleSheets/Core/Oldstyle.css','http://www.w3.org/StyleSheets/Core/Modernist','http://www.w3.org/StyleSheets/Core/Midnight','http://www.w3.org/StyleSheets/Core/Steely'] # Valitaan css-tyyli kuluvan kuukauden perusteella kuukausi = datetime.datetime.now().month if kuukausi == 0 or kuukausi == 1 or kuukausi == 2: tyyli = "http://www.w3.org/StyleSheets/Core/Oldstyle.css" elif kuukausi >= 3 and kuukausi <= 5: tyyli = "http://www.w3.org/StyleSheets/Core/Modernist" elif kuukausi == 6 or kuukausi == 7 or kuukausi == 8: tyyli = "http://www.w3.org/StyleSheets/Core/Midnight" else: tyyli = "http://www.w3.org/StyleSheets/Core/Steely" # Jätetäänkin kuukausivalinta huomiotta ja arvotaan tyyli taulukosta tyyli = css[random.randint(0,len(css)-1)] # luetaan www-sivulta lomakkeelle syötetyt tiedot form = cgi.FieldStorage() # mahdollisesti syötetty css-tiedoston url. Pitää muistaa decoodata tai kaatuu erikoismerkkeihin! url = form.getfirst("url", "").decode("UTF-8") #hoidetaan decodaus myöhemmin url_plain = form.getfirst("url", "") # listasta valittu css-tiedosto valittu = form.getfirst("css", "").decode("UTF-8") # jo aiemmin syötetyt urlit urlit = form.getlist("css_list") urlit2 = dict() # jos lomaketta ei ole lähetetty niin käytetään oletuslistaa if len(urlit) == 0: urlit = css # Jos on syötetty käsin jokin url niin valitaankin se tyyliksi ja lisätään myös listan jatkoksi if len(url) > 0: # tässä ei voida käyttää urllib.quotea. Sivun saa epävalidiksi jos syöttää sopivaa sotkua. # quotea ei voida käyttää koska tämän oletetaan olevan validi url. Jos ajetaan quoten läpi niin osoite ei enää toimi, # koska koodaa mm. :-merkit. Pitäisi rakentaa monimutkaisempi tarkistus tyyli = url # css.append(url) urlit.append(url_plain) else: try: tyyli = css[int(valittu)] # jos ei ole valintaa niin arvotaan except: tyyli = css[random.randint(0,len(css)-1)] # varmistetaan, että samaa ei ole kahteen kertaan #css = list(set(css)) urlit = list(set(urlit)) # tehdään myös dict jossa valmiiksi urlenkoodattu versio linkistä # users.jyu.fin jinja2:ssa ei ole tätä funktiota valmiina for i in range(0, len(urlit)): # urllib.quotelle ei saa antaa UTF-8-muotoisia stringejä eli voi käyttää urllib.quote (urlit[i].decode("UTF-8")) # http://stackoverflow.com/questions/5557849/is-there-a-unicode-ready-substitute-i-can-use-for-urllib-quote-and-urllib-unquot?rq=1 urlit2[urlit[i].decode("UTF-8")] = urllib.quote ( urlit[i] ) if len(urlit) > len(css): # urlit pitää jokaisella kerralla ajaa decoden läpi! for i in range(0, len(urlit)): urlit[i] = urlit[i].decode("UTF-8") # yhdistetään vakiolistaus ja syötetyt css = css + urlit #tehdään urleista valmis linkkiin lisättävissä oleva string urlit_str = "" for key in urlit2: # huomaa css_list eli sama tunniste kuin lomakkeella urlit_str += "&css_list=" + urlit2[key] # antaa polun alikansiossa olevaan jinja.html-tiedostoon: # ei tarvitse huolehtia siitä onko polku riippuvainen palvelimenasetuksista # os.environ['SCRIPT_FILENAME'] palauttaa polun suoritettavaan ohjelmaan (jinja.cgi) # on syytä huomata, että tämä polku ei ole sama kuin tiedostopolku halava/jalava-palvelimissa # os.path.dirname tipauttaa polusta muut kuin kansioit pois eli poistaa jinja.cgin # os.path.join liittää os.path.dirnamen palauttaman polun ja 'templates' yhdeksi toimivaksi poluksi # jos tätä haluaa kokeilla komentoriviltä niin tuloksena on keyerror. SCRIPT_FILENAME-ympäristömuuttuja löytyy # vain www-palvelimen CGI-ympäristöstä eikä normaalista shellistä try: tmpl_path = os.path.join(os.path.dirname(os.environ['SCRIPT_FILENAME']), 'templates') except: # jos tänne päädytään www-palvelimessa niin koko sovellus kaatuu... tmpl_path = "templates" # alustetaan jinjan kaipaama ympäristö ja asetetaan myös autoescape käyttöön eli jinja automaattisesti # korjaa erikoismerkit html:ään kelpaavaan muotoon try: env = Environment(autoescape=True, loader=FileSystemLoader(tmpl_path), extensions=['jinja2.ext.autoescape']) except: # jinja2.ext.autoescape ei toimi halavassa/jalavassa env = Environment(autoescape=True, loader=FileSystemLoader(tmpl_path)) # ladataan oma template template = env.get_template('jinja.html') # tulostetaan lopullinen dokumentti print template.render(tyyli=tyyli, css=css, urlit=urlit, urlit2=urlit2, urlit_str=urlit_str).encode("UTF-8")