
################################################################################################
#                        Kirjasõprade otsing huvialade järgi.                                  #
################################################################################################
# 3 Loo administraatorile võimalus huvialade sisestamiseks ja vaatamiseks.                     #
# 4 Lisa võimalus isikute andmete sisestamiseks. Iga isik saab valida,                         #
#   millised huvialad talle loetelust sobivad.                                                 #
# 5 Näita inimese lehel loetelu teistest inimestest, kellega tal vähemasti üks huviala kattub. #
#   Vajutades vastava inimese nimele näidatakse loetelu kattuvatest huvialadest.               #
################################################################################################
#                           (C)2003 AS SLuha Productions                                       #
################################################################################################

import OFS, Globals
from Globals import Persistent
import AccessControl
from Acquisition import Implicit

###############################

def lisamisKonstruktor(lisaja):
  "Kirjasõprade hoidla lisaja"
  lisaja.Destination()._setObject("kirjasobrad", KirjaSobrad())
  return "Kirjasõprade hoidla lisatud!"

###############################

class KirjaSobrad(    
   OFS.Folder.Folder,
   OFS.SimpleItem.Item,
   Persistent,
   AccessControl.Role.RoleManager):
   "Kataloog kirjasõprade hoidmiseks"
   meta_type="KirjaSobrad"
   loendur=0

   def stiilileht(self):
     "Stiilileht kogu veebilehestiku jaoks"
     t="<style>\n"+\
       "A:link{\n\ttext-decoration:none;\n\tcolor:gray;\n}\n"+\
       "A:visited{\n\ttext-decoration:none;\n\tcolor:black;\n}\n"+\
       "A:active{\n\ttext-decoration:none;\n\tcolor:blue;\n}\n"+\
       "A:hover{\n\ttext-decoration:underline;\n\tcolor:red;\n}\n"+\
       "</style>\n"
     return t

   def header(self, title, pealkiri, juurkaustas):
     "Lehtede päised"
     vahestring=" -:- "
     t="<html>\n"+\
       "<head>\n"+\
       "<title>"+title+"</title>\n"+\
       self.stiilileht()+\
       "</head>\n"+\
       "<body bgcolor=#FFEEDD>\n"+\
       "<h1>"+pealkiri+"</h1>\n"
     if juurkaustas:
       t=t+"<a href='./huvialad/'>Huvialade kataloog</a>"+vahestring+\
           "<a href='./'>Sõprade nimekiri</a>"+vahestring+\
           "<a href='./lisamisVorm'>Lisa sõber</a><p>\n"
     else:
       t=t+"<a href='../'>Sõprade nimekiri</a>"+vahestring+\
           "<a href='./'>Huvialade kataloog</a>"+vahestring+\
           "<a href='./#lisamisVorm'>Lisa huviala</a><p>\n"
     return t

   def footer(self):
     "Lehtede jalused"
     return "</body>\n</html>"

   def notAuthenticated(self):
     "Veateade, et pole õige kasutajanimi"
     return "You are not authorized to view this resource!"

   def lisaSober(self, eesnimi, perenimi, email, huvialad=()):
     "Lisab selle sõbra siia kausta"
     import types
     if type(huvialad)==types.StringType:
       huvialad=(huvialad,)
     s=KirjaSober(eesnimi, perenimi, email, huvialad)
     self.loendur+=1
     s.id='kirjasober'+str(self.loendur)
     self._setObject(s.id, s)
     return "Sõber "+s.id+" lisatud"

   def index_html(self):
     "Kirjasõprade avaleht"
     if not hasattr(self, 'huvialad'):
       t="<a href=lisaHuvialad>Lisa huvialade kataloog</a>\n"
     else:
       t=self.header("Kirjasõbrad", "Kirjasõprade nimekiri",1)
       t=t+"<table>\n"
       m=self.objectValues('KirjaSober')
       jrk=0
       for x in m:
         jrk+=1
         t=t+"<tr><td align=right>"+str(jrk)+".</td>"+\
             "<td><b>"+x.kysiEesnimi()+"</b></td>"+\
             "<td><b>"+x.kysiPerenimi()+"</b></td>"+\
             "<td><a href=naitaSopra?sid="+x.id+">Vaata</a></td><td>.:.</td>"+\
             "<td><a href=muutmisVorm?sid="+x.id+">Muuda</a></td><td>.:.</td>"+\
             "<td><a href=kustutamisLeht?sid="+x.id+">Kustuta</a></td>"+\
             "</tr>\n"
       t=t+"</table>\n"
       t=t+self.footer()
     return t

   def lisamisVorm(self):
     "Sõbra lisamise vorm"
     t=self.header("Kirjasõbra lisamise vorm", "Kirjasõbra lisamine",1)+\
       "<table>\n"+\
       "<form action=lisamisLeht>\n"+\
       "<tr><td>Eesnimi: </td><td><input type=text name=eesnimi></td></tr>\n"+\
       "<tr><td>Perenimi: </td><td><input type=text name=perenimi></td></tr>\n"+\
       "<tr><td>E-mail: </td><td><input type=text name=email></td></tr>\n"+\
       "<tr><td>Huvialad: </td><td>"+self.huvialad.huvialadeSelect()+"</td></tr>\n"+\
       "<tr><td></td><td><input type=submit value='Lisa sõber!'></td></tr>\n"+\
       "</form>\n"+\
       "</table>\n"+\
       self.footer()
     return t

   def muutmisVorm(self, sid):
     "Vorm sõbra andmete muutmiseks"
     a=getattr(self, sid)
     t=self.header("Sõbra andmete muutmine","Muuda sõbra andmeid: <i>"+a.kysiEesnimi()+" "+a.kysiPerenimi()+"</i>",1)+\
       "<table>\n"+\
       "<form action=muutmisLeht>\n<input type=hidden name=sid value='"+sid+"'>\n"+\
       "<tr><td>Eesnimi: </td><td><input type=text name=eesnimi value='"+a.kysiEesnimi()+"'></td></tr>\n"+\
       "<tr><td>Perenimi: </td><td><input type=text name=perenimi value='"+a.kysiPerenimi()+"'></td></tr>\n"+\
       "<tr><td>E-mail: </td><td><input type=text name=email value='"+a.kysiEmail()+"'></td></tr>\n"+\
       "<tr><td>Huvialad: </td><td>"+self.huvialad.huvialadeSelect(a.Huvialad)+"</td></tr>\n"+\
       "<tr><td></td><td><input type=submit value='Muuda sõbra andmeid!'></td></tr>\n"+\
       "</form>\n"+\
       "</table>\n"+\
       self.footer()
     return t

   def lisamisLeht(self, REQUEST, eesnimi, perenimi, email, huvialad):
     "Sõbra lisamise leht"
     self.lisaSober(eesnimi, perenimi, email, huvialad)
     REQUEST.RESPONSE.redirect('./')

   def muutmisLeht(self, REQUEST, sid, eesnimi, perenimi, email, huvialad):
     "Sõbra andmete muutmise leht"
     a=getattr(self, sid)
     a.seaEesnimi(eesnimi)
     a.seaPerenimi(perenimi)
     a.seaEmail(email)
     a.seaHuvialad(huvialad)
     REQUEST.RESPONSE.redirect('./naitaSopra?sid='+sid)

   def kustutamisLeht(self, REQUEST, sid):
     "Kustutab sõbra ära!"
     self._delObject(sid)
     REQUEST.RESPONSE.redirect('./')


   def naitaSopra(self, REQUEST, sid):
     "Näitab sõbra andmeid"
     mina=getattr(self, sid)
     t=self.header("Sõbra andmete vaatamine", "Vaata sõpra: <i>"+mina.kysiEesnimi()+" "+mina.kysiPerenimi()+"</i>",1)
     t=t+"<table>\n"+\
         "<tr><td>Eesnimi:</td><td><b>"+mina.kysiEesnimi()+"</b></td></tr>\n"+\
         "<tr><td>Perenimi:</td><td><b>"+mina.kysiPerenimi()+"</b></td></tr>\n"+\
         "<tr><td>E-mail:</td><td><b>"+mina.kysiEmail()+"</b></td></tr>\n"
     kattuvadNimed=[]
     import types
     if type(mina.Huvialad)==types.StringType:
       mina.Huvialad=(mina.Huvialad,)
     t=t+"<tr><td valign=top>Huvialad:</td><td>\n\t<table width='100%'>\n"
     for x in mina.Huvialad:       #Ketra selle inimese huvialad läbi
       t=t+"\t<tr><td><b>"+getattr(mina.huvialad,x).kysiNimi()+"</b></td><td align=right><a href=naitaHuviala?hid="+x+">Näita selle huvialaga</a></td></tr>\n"
       m=self.objectValues('KirjaSober')
       for y in m: #Käi kõik inimesed läbi
         if not y.id==mina.id:     # See pole mina
           for z in y.Huvialad:    # Käi selle inimese huvialad läbi
             if z==x:              # oli sama huviala
               sobib=1
               for q in kattuvadNimed:
                 if q==y:
                   sobib=0
               if sobib:
                 kattuvadNimed.append(y)
     t=t+"\t</table>\n</td></tr>\n<tr><td valign=top>Kattuvad:</td><td>\n\t<table width='100%'>\n"
     for x in kattuvadNimed:
       t=t+"\t<tr><td><b>"+x.kysiEesnimi()+" "+x.kysiPerenimi()+"</b></td><td><a href=vordle?id1="+x.id+"&id2="+mina.id+">Võrdle</a></td><td>.:.</td><td><a href=naitaSopra?sid="+x.id+">Vaata</td></tr>\n"
     t=t+"\t</table>\n</td></tr>\n"
     t=t+"<tr><td><a href=muutmisVorm?sid="+sid+">Muuda</a></td><td></td></tr>\n"
     t=t+"</table>\n"
     t=t+self.footer()
     return t

   def vordle(self, id1, id2):
     "Näitab kattuvaid huvialasid"
     sober1=getattr(self, id1)
     sober2=getattr(self, id2)
     t=self.header("Võrdle sõprade huvialasid","Võrdle sõpru: <i>"+sober1.kysiEesnimi()+" "+sober1.kysiPerenimi()+"</i> ja <i>"+sober2.kysiEesnimi()+" "+sober2.kysiPerenimi()+"</i>",1)
     t=t+"Ühised huvialad: <p>\n<table>\n"
     for x in sober1.Huvialad:
       for y in sober2.Huvialad:
         if x==y:
           t=t+"<tr><td><b>"+getattr(self.huvialad, x).kysiNimi()+"</b></td><td><a href=naitaHuviala?hid="+x+">Näita sõpru selle huvialaga</a></td></tr>\n"
     t=t+"</table>\n"
     t=t+self.footer()
     return t

   def naitaHuviala(self, hid):
     "Näitab kõiki selle huvialaga"
     a=getattr(self.huvialad, hid)
     t=self.header("Näita huviala", "Näita kõiki sõpru huvialaga: <i>"+a.kysiNimi()+"</i>",1)
     t=t+"<table>\n"
     m=self.objectValues("KirjaSober")
     for x in m:
       for y in x.Huvialad:
         if hid==y:
           t=t+"<tr><td><b>"+x.kysiEesnimi()+"</b></td><td><b>"+x.kysiPerenimi()+"</b></td><td><a href=naitaSopra?sid="+x.id+">Vaata sõpra</a></td></tr>\n"
     t=t+"</table>\n"
     t=t+self.footer()
     return t 

   def lisaHuvialad(self):
     "Huvialade kausta lisaja"
     if not hasattr(self, 'huvialad'):
       self._setObject('huvialad', Huvialad())
       self.huvialad.id='huvialad'
       return "Huvialade kataloog lisatud"
     return "Huvialade kataloog juba olemas"

###############################

class KirjaSober(
   OFS.SimpleItem.Item,
   Persistent,
   Implicit,
   AccessControl.Role.RoleManager):
   "Siin on siis meie sõber!"
   meta_type="KirjaSober"
   Eesnimi=""
   Perenimi=""
   Email=""
   Huvialad=[]

   def __init__(self, eesnimi, perenimi, email, huvialad):
     "Kirjasõbra loomine"
     self.Eesnimi=eesnimi
     self.Perenimi=perenimi
     self.Email=email
     self.Huvialad=[]
     import types
     if type(huvialad)==types.StringType:
       huvialad=(huvialad,)
     for x in huvialad:
       if len(x)>0:
         self.Huvialad.append(x)

   def kysiEesnimi(self):
     "Ütleb Sõbra eesnime"
     return self.Eesnimi

   def kysiPerenimi(self):
     "Ütleb Sõbra perekonnanime"
     return self.Perenimi

   def kysiEmail(self):
     "Ütleb Sõbra Emailiaadressi"
     return self.Email

   def seaEesnimi(self, eesnimi):
     "Seab eesnime vastavaks"
     self.Eesnimi=eesnimi

   def seaPerenimi(self, perenimi):
     "Seab perenime vastavaks"
     self.Perenimi=perenimi

   def seaEmail(self, email):
     "Seab emaili vastavaks"
     self.Email=email

   def seaHuvialad(self, huvialad):
     "Seab huvialad vastavaks"
     self.Huvialad=[]
     import types
     if type(huvialad)==types.StringType:
       huvialad=(huvialad,)
     for x in huvialad:
       if len(x)>0:
         self.Huvialad.append(x)
     
   def index_html(self, REQUEST):
     "Näitab ühe sõbra andmeid"
     REQUEST.RESPONSE.redirect("./naitaSopra?sid="+self.id)

###############################

class Huvialad(
   OFS.Folder.Folder,
   OFS.SimpleItem.Item,
   Persistent,
   AccessControl.Role.RoleManager):
   "Kataloog huvialade"
   meta_type="Huvialad"
   loendur=0

   def lisaHuviala(self, REQUEST, nimi):
     "Uue Huviala lisamine kataloogi"
     h=Huviala(nimi)
     self.loendur+=1
     h.id='huviala'+str(self.loendur)
     self._setObject(h.id, h)
     return "Kaust "+h.id+" lisatud"

   def index_html(self, REQUEST):
     "Huvialade nimekiri"
     t=self.header("Kirjasõprade huvialad", "Huvialade kataloog",0)
     if str(REQUEST.AUTHENTICATED_USER)=="admin":
       t=t+"Huvialad:<br>\n<table>\n"
       m=self.objectValues()
       jrk=0
       for x in m:
         jrk+=1
         t=t+"<tr><td align=right>"+str(jrk)+".</td><td><b>"+x.kysiNimi()+"</b></td><td><a href=muutmisVorm?hid="+x.id+">Muuda</a></td><td>.:.</td><td><a href='../naitaHuviala?hid="+x.id+"'>Näita sellise huvialaga sõpru</a></td></tr>\n"
       t=t+"</table>\n<a name='lisamisVorm'>\n"
       t=t+"<form action=lisamisLeht>\n<table>\n"+\
           "<tr><td>Huviala nimi:</td><td><input type=text name=nimi></td></tr>\n"+\
           "<tr><td></td><td><input type=submit value='Lisa huviala'></td></tr>\n"+\
           "</table>\n</form>\n"
     else:
       t=t+self.notAuthenticated()
     t=t+self.footer()
     return t

   def lisamisLeht(self, REQUEST, nimi):
     "Meetod huviala lisamiseks"
     if str(REQUEST.AUTHENTICATED_USER)=="admin":
       self.lisaHuviala(REQUEST, nimi)
       REQUEST.RESPONSE.redirect('index_html')
     else:
       return self.notAuthenticated()

   def muutmisVorm(self, hid):
     "Vorm huviala nime muutmiseks"
     t=self.header("Huviala nime muutmine","Muuda huviala nime: ",0)
     a=getattr(self,hid)
     t=t+"<form action=muutmisLeht>\n<table>\n<input type=hidden name=id value='"+hid+"'>"+\
         "<tr><td>Huviala nimi: </td><td><input type=text name=nimi value='"+a.kysiNimi()+"'></td></tr>\n"+\
         "<tr><td></td><td><input type=submit value='Muuda huviala nime'></td></tr>\n"+\
         "</table>\n</form>\n"
     t=t+self.footer()
     return t

   def muutmisLeht(self, REQUEST, id, nimi):
     "Muudab huviala nime ära"
     getattr(self, id).s2eNimi(nimi)
     REQUEST.RESPONSE.redirect('./')

   def huvialadeSelect(self, valitud=()):
     "Väljastab huvialade select-elemendi"
     t="<select name=huvialad size=10 multiple>"
     m=self.objectValues('Huviala')
     for x in m:
        t=t+"\n\t<option value='"+x.id+"'"
        for y in valitud:
          if x.id==y:
            t=t+" selected"
        t=t+">"+x.kysiNimi()+"</option>"
     t=t+"\n</select>"
     return t

###############################

class Huviala(
   OFS.SimpleItem.Item,
   Persistent,
   AccessControl.Role.RoleManager):
   "Huviala ise!"
   meta_type="Huviala"

   def __init__(self, nimi):
     "Kausta loomine"
     self.Nimi=nimi

   def kysiNimi(self):
     "Ütleb huviala nime"
     return self.Nimi

   def s2eNimi(self, nimi):
     "Seab nime paika"
     self.Nimi=nimi

#########################################################################################################