Example #1
0
    def render_henkilolista(self):
        henkilolista = "<ul class=\"henkilolista\">\n"
        for id in Henkilo.load_ids():
            henkilo = Henkilo.load_from_database(id)
            henkilolista += "<li class=\"henkilolista\"><a href=\"%s/%d\">%s</a></li>\n" % (self.conf['request_uri'], henkilo.henkilo_id, cgi.escape(henkilo.nimi))
        henkilolista += "</ul>\n"

        return henkilolista
Example #2
0
    def handle_newuser(self):
        henkilon_nimi_input = self.form.getvalue("henkilon_nimi")
        tunnus_input = self.form.getvalue("tunnus")
        salasana1_input = self.form.getvalue("salasana1")
        salasana2_input = self.form.getvalue("salasana2")

        if (henkilon_nimi_input is None or
            tunnus_input is None or
            salasana1_input is None or
            salasana2_input is None):
            self.parameters = { 'status': '<p class="status">Ole hyvä ja täytä kaikki kentät!</p>' }
            return 'missing_newuser_input'

        #
        # Siivoa tekstimuotoiset parameterit. Nimissä ja tunnuksissa
        # ei sallita mitään tageja.
        #
        parser = CommentHTMLParser(ok_tags=[])

        henkilon_nimi = parser.parse_string(henkilon_nimi_input)
        tunnus = parser.parse_string(tunnus_input)

        if salasana1_input != salasana2_input:
            return 'password_mismatch'

        henkilo_ids = Henkilo.load_ids(tunnus=tunnus)

        # blääh
        henkilo_id = None
        for i in henkilo_ids:
            henkilo_id = i
            break

        henkilo = None
        if henkilo_id is not None:
            henkilo = Henkilo.load_from_database(henkilo_id)
        if henkilo is not None:
            self.parameters = { 'status': '<p class="status">Tunnus "%s" on jo käytössä!</p>' % (tunnus) }
            return 'username_exists'

        #
        # Tehdään salasanasta hajautussumma.
        #
        salasana_hash = salasana.hash_password(salasana1_input)

        #
        # Tallennetaan henkilo tietokantaan
        #
        henkilo = Henkilo.new(nimi=henkilon_nimi, tunnus=tunnus, salasana=salasana_hash, omistajaa=None)

        #
        # Luo uusi istunto saman tien.
        #
        self.create_new_session(henkilo_id=henkilo.henkilo_id)

        self.parameters = { 'status': '<p class="status">Tunnus luotu, tervetuloa %s!</p>' % (tunnus) }

        return 'welcome'
Example #3
0
    def get(self):
        if self.henkilo_id is not None:
            henkilo = Henkilo.load_from_database(self.henkilo_id)

            #
            # Älä näytä rajoituksia kirjautumattomille käyttäjille
            # yksilönsuojasyistä.
            #
            self.render_restriction_list()

            lisaalomake = ''
            if self.authorized():

                lisaalomake = """\
        <form class="cmxform" action="%s/rajoitus" method="post">
          <fieldset>
            <legend>Lisää rajoitus:</legend>
            <ol>
  	      <li>
	        <label for="ruokaaine_id">Ruoka-aine</label>
  	        <select name="ruokaaine_id" id="ruokaaine_id" autofocus>
		  %s
  	        </select>
  	      </li>
              <li>
                <label for="rajoitus">Rajoitus</label>
                <input type="text" name="rajoitus"/>
              </li>
              <li>
                <input type="submit" value="Lisää" />
              </li>
            </ol>
          </fieldset>
        </form>
    """ % (self.conf['full_path'], self.create_ruokaaine_optiot())

            self.parameters.update({ 'lisaalomake': lisaalomake })

            kuva_link = ''
            for kommentti in henkilo.kommentit:
                kuva_link += "<img src=\"%s/../../kuva/%d\" alt=\"%s\" />\n" % (
                    self.conf['request_uri'],
                    kommentti.kommentti_id,
                    cgi.escape(kommentti.teksti))

            self.parameters.update({ 'nimi': henkilo.nimi,
                                     'henkilo_id': henkilo.henkilo_id,
                                     'tunnus': henkilo.tunnus,
                                     'kuva': kuva_link,
                                     })
        else:
            henkilolista = self.render_henkilolista()

            self.parameters.update({ 'henkilolista': henkilolista, 'status': '' })

        self.headers.append('Content-Type: text/html; charset=UTF-8')

        return [ self.headers, self.parameters ]
Example #4
0
    def post(self):
        nimi = self.form.getvalue("nimi")

        henkilo = Henkilo.new(nimi=nimi)

        henkilolista = self.render_henkilolista()

        self.redirect_after_post("%s?inserted=%d" % (self.conf['full_path'], henkilo.henkilo_id))
        return [ self.headers, self.parameters ]
Example #5
0
    def render_kohdeinfo(self, resepti):
        luotu = resepti.luotu.strftime("%d.%m.%y %H:%M")
        tunnus = '<span class="tuntematon">tuntematon</span>'
        if resepti.omistaja is not None:
            omistaja = Henkilo.load_from_database(resepti.omistaja)
            tunnus = omistaja.tunnus

        kohdeinfo = """%s<br />%s""" % (tunnus, luotu)

        self.parameters.update({ 'kohdeinfo': kohdeinfo })
Example #6
0
    def handle_login(self):
        tunnus_input = self.form.getvalue("tunnus")
        salasana_input = self.form.getvalue("salasana")

        if tunnus_input is None or salasana_input is None:
            self.parameters = { 'status': '<p class="status"></p>' }

            return 'missing_input'

        henkilo_ids = Henkilo.load_ids(tunnus=tunnus_input)

        # blääh
        henkilo_id = None
        for i in henkilo_ids:
            henkilo_id = i
            break

        henkilo = Henkilo.load_from_database(henkilo_id)
        if henkilo is not None:
            #
            # Ota suola tietokannassa olevasta salasanasta ja aja
            # hajautusfunktion läpi.
            #
            suola = salasana.get_salt_from_hash(henkilo.salasana)
            salasana_hash = salasana.hash_password(salasana_input, suola)
            if salasana_hash == henkilo.salasana:
                self.parameters = { 'status': '<p class="status">Tervetuloa, henkilö %d!</p>' % (henkilo.henkilo_id) }

                timestamp = int(math.floor(time.time()))

                self.sessio = Sessio(henkilo_id=henkilo.henkilo_id, start_timestamp=timestamp, remote_addr=self.conf['effective_remote_addr'])
                self.headers.append(self.sessio.create_cookie().output())

                #
                # Kaikki OK!
                #
                return 'logged_in'

        return 'login_failed'
Example #7
0
    def get(self):
        status_message = ''

        self.headers.append('Content-Type: text/html; charset=UTF-8')


        status = self.form.getvalue('status')
        if status is None:
            if self.sessio is None:
                self.set_status('Käyttäjä ei ole kirjautunut.')
                return [ self.headers, self.parameters ]

            #
            # Tarkista, että sessio on validi.
            #
            henkilo = Henkilo.load_from_database(self.sessio.henkilo_id)

            if self.sessio.remote_addr != self.conf['effective_remote_addr']:
                self.set_status('Session ip-osoite ei täsmää käyttäjän ip-osoitteen kanssa!')
            elif henkilo is None:
                self.set_status('Session käyttäjää %d ei löydy tietokannasta!' % self.sessio.henkilo_id)
            else:
                self.set_status('Tuttu henkilö %s</p>' % (self.sessio))

            return [ self.headers, self.parameters ]
        else:
            if status == 'error':
                self.set_status('Virheellinen toiminto')
            elif status == 'logged_out':
                self.set_status('Uloskirjautuminen OK.')
            elif status == 'logged_in':
                self.set_status('Tervetuloa %d.' % (self.sessio.henkilo_id))
            elif status == 'password_mismatch':
                self.set_status('Salasanat eroavat!')
            elif status == 'missing_input':
                self.set_status('Anna tunnus ja salasana!')
            elif status == 'login_failed':
                self.set_status('Kirjautuminen epäonnistui')
            elif status == 'missing_newuser_input':
                self.set_status('Ole hyvä ja täytä kaikki kentät!')
            elif status == 'username_exists':
                self.set_status('Tunnus on jo käytössä!')
            elif status == 'welcome':
                self.set_status('Tunnus luotu, tervetuloa!')

            return [ self.headers, self.parameters ]
Example #8
0
    def get(self):
        self.ruokaaine = Ruokaaine.load_from_database(self.ruokaaine_id)

        self.render_restriction_list()

        kuva_link = ''
        for kommentti in self.ruokaaine.kommentit:
            tunnus = '<span class="tuntematon">tuntematon</span>'
            if kommentti.omistaja is not None:
                omistaja = Henkilo.load_from_database(kommentti.omistaja)
                tunnus = omistaja.tunnus

            delete_form = ''
            if self.authorized():
                delete_form = """<form class="deleteform" action="%s/kommentti/%d" method="post">
                                   <input type="hidden" name="method_override" value="DELETE" />
                                   <input type="submit" value="Poista" class="deleteform" />
                                 </form>""" % (self.conf['full_path'], kommentti.kommentti_id)

            kuva_link += "<div class=\"comment\">"
            kuva_link += "<div class=\"timestamp\">%s %s %s</div>\n" % (tunnus, kommentti.aika, delete_form)
            kuva_link += "<img src=\"%s/kuva/%d\" alt=\"%s\" />\n" % (
                self.conf['script_name'],
                kommentti.kommentti_id,
                '')
            kuva_link += "<div class=\"commenttext\">%s</div>\n" % (kommentti.teksti)
            kuva_link += "</div>"

        status = ''
        if self.form.getvalue('updated', '') == 'true':
            status = '<p class="status">Tallennettu.</p>'
        elif self.form.getvalue('comment_created') is not None:
            status = '<p class="status">Uusi kommentti: %d</p>' % (int(self.form.getvalue('comment_created')))

        self.headers.append('Content-Type: text/html; charset=UTF-8')
        self.parameters.update({ 'nimi': cgi.escape(self.ruokaaine.nimi),
                                 'ruokaaine_id': self.ruokaaine.ruokaaine_id,
                                 'kuva': kuva_link,
                                 'status': status })

        return [ self.headers, self.parameters ]
Example #9
0
    def render_restriction_list(self):
        if not self.authorized():
            rajoituslista = 'Kirjaudu, jos haluat nähdä rajoitukset.'
        else:
            rajoituksia = 0
            rajoituslista = '<ul class="rajoituslista">'
            for rajoitus_id in Rajoitus.load_ids(ruokaaine_id=self.ruokaaine_id):
                rajoituksia = rajoituksia + 1
                rajoitus = Rajoitus.load_from_database(rajoitus_id)
                henkilo = Henkilo.load_from_database(rajoitus.henkilo_id)

                henkilo_link = ("""<a href="%s/henkilo/%d">%s</a>""" %
                                  (self.conf['script_name'],
                                   rajoitus.henkilo_id,
                                   henkilo.tunnus))

                rajoituslista += '<li>%s: %s</li>' % (rajoitus.rajoitus, henkilo_link)
            rajoituslista += "</ul>"

            if rajoituksia == 0:
                rajoituslista = 'Ei rajoituksia.'

        self.parameters.update({ 'rajoituslista': rajoituslista })
Example #10
0
    def get(self):
        edit = self.form.getvalue('edit')

        self.resepti = Resepti.load_from_database(self.resepti_id)

        self.render_kohdeinfo(self.resepti)

        kuva_link = ''
        for kommentti in self.resepti.kommentit:
            tunnus = '<span class="tuntematon">tuntematon</span>'
            if kommentti.omistaja is not None:
                omistaja = Henkilo.load_from_database(kommentti.omistaja)
                tunnus = omistaja.tunnus

            delete_form = ''
            if self.authorized():
                delete_form = """<form class="deleteform" action="%s/kommentti/%d" method="post">
                                   <input type="hidden" name="method_override" value="DELETE" />
                                   <input type="submit" value="Poista" class="deleteform" />
                                 </form>""" % (self.conf['full_path'], kommentti.kommentti_id)

            kuva_link += "<div class=\"comment\">"
            kuva_link += "<div class=\"timestamp\">%s %s %s</div>\n" % (tunnus, kommentti.aika, delete_form)
            if kommentti.kuva is not None:
                kuva_link += "<img src=\"%s/kuva/%d\" alt=\"%s\" />\n" % (
                    self.conf['script_name'],
                    kommentti.kommentti_id,
                    '')
            kuva_link += "<div class=\"commenttext\">%s</div>\n" % (kommentti.teksti)
            kuva_link += "</div>"

        ruokaaineetlista = self.create_ruokaaineet_list(self.resepti.resepti_id)

        valmistusohje_text = "<div class=\"valmistusohje\">%s</div>" % (self.resepti.valmistusohje)
        if self.authorized():
            if edit is not None:
                valmistusohje_text = textwrap.dedent("""\
                    <form class="cmxform" action="%s%s" method="post">
                      <fieldset>
                        <legend></legend>
                        <ol>
                          <li>
                            <textarea name="valmistusohje" rows="10" cols="60" id="valmistusohje">%s</textarea>
                          </li>
                          <li>
                            <input type="submit" value="Tallenna" />
                          </li>
                          <input type="hidden" name="action" value="updaterecipe"</input>
                        </ol>
                      </fieldset>
                    </form>""" % (self.conf['script_name'], self.conf['path_info'], self.resepti.valmistusohje))
            else:
                valmistusohje_text = valmistusohje_text + """\
                    <form action="%s">
                      <input type="submit" name="edit" value="Muokkaa" />
                    </form>""" % (self.conf['full_path'])

        lisaalomake = ''
        if self.authorized():
            ruokaaine_optiot = self.create_ruokaaine_optiot()
            mittayksikko_optiot = self.create_mittayksikko_optiot()

            lisaalomake = """\
          <form class="cmxform" action="%s/ruokaaine" method="post" enctype="multipart/form-data">
            <fieldset>
              <legend>Lisää ruoka-aine:</legend>
              <ol>
                <li>
                  <label for="ruokaaine_id">Ruoka-aine</label>
                  <select name="ruokaaine_id" id="ruokaaine_id">
                    %s
                  </select>
                </li>
                <li>
                  <label for="maara">Määrä</label>
                  <input type="text" name="maara" id="maara" />
                </li>
                <li>
                  <label for="mittayksikko">Mittayksikko</label>
                  <select name="mittayksikko" id="mittayksikko">
                    %s
                  </select>
                </li>
                <li>
                  <input type="submit" value="Lisää" />
                </li>
                <input type="hidden" name="action" value="add" />
              </ol>
            </fieldset>
          </form>
            """ % (self.conf['full_path'], ruokaaine_optiot, mittayksikko_optiot)


        status = ''
        if self.form.getvalue('updated', '') == 'true':
            status = '<p class="status">Tallennettu.</p>'
        elif self.form.getvalue('comment_created') is not None:
            status = '<p class="status">Uusi kommentti: %d</p>' % (int(self.form.getvalue('comment_created')))

        self.headers.append('Content-Type: text/html; charset=UTF-8')
        self.parameters.update({ 'nimi': self.resepti.nimi,
                                 'resepti_id': self.resepti.resepti_id,
                                 'valmistusohje': valmistusohje_text,
                                 'kuva': kuva_link,
                                 'ruokaaineetlista': ruokaaineetlista,
                                 'status': status,
                                 'lisaalomake': lisaalomake
                                 })

        return [ self.headers, self.parameters ]