import AccessControl
import OFS, Globals
from OFS import SimpleItem
import types
from TraversableWrapper import Traversable
from Globals import Persistent
from AccessControl import ClassSecurityInfo
from Cruft import Cruft
from common import add_dtml
#import TestiYlesanne
#from TestiYlesanne import TestiYlesanne

class YlesandeKirjeldus(
     Persistent,
     OFS.SimpleItem.Item,
     Traversable,
     AccessControl.Role.RoleManager
     ):
     "Testi ülesande metadata"
     meta_type="YlesandeKirjeldus"
     marksonad=[]
     selgitus=""
     def kasLeidubMarksona(self, sona):
        "1, kui vastav märksõna olemas"
        return sona in self.marksonad
        
     def lisaMarksona(self, sona):
        "Kui märksõna puudub, siis lisatakse"
        if not self.kasLeidubMarksona(sona):
           self.marksonad.append(sona)
           
     def leivaPuru(self, viimane=0):
        "Teekond üles"
        return self.aq_parent.leivaPuru()+" &gt; kirjeldus"
           
     def muutmisVorm(self, REQUEST):
        "Vorm kirjelduse muutmiseks"
        tulemus=leheAlgus(self, REQUEST)+"<form action='muutmisLeht'><table><tr><td>Selgitus:</td>"+\
          ("<td><input type='text' name='selgitus' value='%s' /></td></tr>" % self.selgitus)
        for x in self.marksonad:
          tulemus=tulemus+"\n<tr><td>Marksona</td><td>"+\
             ("<input type='text' name='marksona' value='%s'/></td></tr>" % x)
        tulemus=tulemus+"\n<tr><td>Marksona</td><td>"+\
          ("<input type='text' name='marksona' value=''/></td></tr>")+\
          "<tr><td colspan='2' align='center'><input type='submit' value='Salvesta' /></td></tr></table></form>"
        return tulemus+leheLopp(self, REQUEST)
        
     def muutmisLeht(self, REQUEST, selgitus, marksona):
        "Muutuste salvestus"
        self.selgitus=selgitus
        if type(marksona) is None:
           marksona=()
        if type(marksona) is types.StringType:
           marksona=(marksona,)
        self.marksonad=[]
        for x in marksona:
           if x.strip():
             self.lisaMarksona(x)
        REQUEST.RESPONSE.redirect('muutmisVorm')
           
     def index_html(self):
        "Veebi näha olev osa"
        return self.selgitus+" "+str(self.marksonad)
           
        
     
class YlesanneKoosKirjeldusega(
     OFS.Folder.Folder,
     Persistent,
     AccessControl.Role.RoleManager,
     Traversable,
     Cruft
     ):
     "Hoiab ülesande oma kirjeldusega koos"
     def __init__(self, ylesanne, kirjeldus=YlesandeKirjeldus()):
        self._setObject('ylesanne', ylesanne)
        self._setObject('kirjeldus', kirjeldus)
        
     def lisaMarksona(self, sona):
        "Lisab kirjelduse alla sealt puuduva märksõna"
        self.kirjeldus.lisaMarksona(sona)
        
     def marksonadHTML(self):
        "Märksõnad jadana"
        return asendaHTML(str(self.kirjeldus.marksonad))
        
     def selgitusHTML(self):
        "Selgitus"
        return asendaHTML(self.kirjeldus.selgitus)
        
     def leivaPuru(self, viimane=0):
       "Teekond üles"
       nimi=self.id
       if viimane:
         tekst=nimi
       else:
         tekst="<a href='"+self.absolute_url()+"'">nimi+"</a>"
       return self.aq_parent().leivaPuru()+ " &gt; Kirjeldusega ülesanne " + tekst        
        
     def index_html(self):
        "Peegel veebis"
        return leheAlgus(self, REQUEST)+self.ylesanne.esitlusHTML() +\
           self.marksonadHTML()+self.selgitusHTML()+leheLopp(self, REQUEST)
        
        
     
     
class TestiYlesanneteHoidla(
     OFS.Folder.Folder,
     OFS.SimpleItem.Item,
     Persistent,
     AccessControl.Role.RoleManager,
     Traversable,
     Cruft):
     "Hoidla õpetaja tarvis"
     #elemendid=[]
     nr=0
     
     def elemendidHoidlas(self):
        "Hoidlas olevad ülesanded koos kirjeldustega"
        return self.objectValues()

     def kasYlesannePuudub(self, ylesanne):
        "1 kui vastavate väljadega ülesanne puudub"
        return ylesanne not in self.ylesandedHoidlas()
     
     def lisaYlesanneKoosKirjeldusega(self, element):
        "Ülesanne lisatakse puudumise korral"
        if self.kasYlesannePuudub(element.ylesanne):
           self.nr=self.nr+1
           element.id='el'+str(self.nr)
           self._setObject(element.id, element)
           #elemendid.append(element)
        
     def lisaYlesanne(self, ylesanne):
        "Vaid ülesande lisamine, kirjeldus tühi"
        self.lisaYlesanneKoosKirjeldusega(YlesanneKoosKirjeldusega(ylesanne))
     
     
     def ylesandedHoidlas(self):
        "Hoidlast vaid ülesanded, mitte kirjeldused."
        return [x.ylesanne for x in self.elemendidHoidlas()]
        
     
     def marksonadHoidlas(self):
        "Märksõnad kõikide ülesannete peale kokku"
        marksonad=[]
        for x in self.elemendidHoidlas():
          if x.kirjeldus:
            for k in x.kirjeldus.marksonad:
              if k not in marksonad:
                marksonad.append(k)
        return marksonad
        
     def marksonaViideteLoetelu(self, REQUEST):
        "Viited leiduvatele märksõnadele"
        m=self.marksonadHoidlas()
        #m.sort()
        if m is None:
          return "Tühi märksönastik"
        tulemus=leheAlgus(self, REQUEST)+"<h3>Marksonad</h3>"
        for x in m:
          tulemus=tulemus+"\n"+\
            "<a href='ylesandedTabelina?marksona="+x+"'>"+x+"</a><br />"
        return tulemus+leheLopp(self, REQUEST)

     def kasLeidubMarksona(self, sona):
        "Kas vastav märksõna hoidlas olemas"
        return sona in self.marksonadHoidlas()
        
     def marksonaleVastavadElemendid(self):
        "Vaid soovitud märksõnaga elemendid"
        elemendid=[]
        for x in self.ylesandedHoidlas():
          if sona in x.kirjedus.marksonad:
             elemendid.append(x)
        return elemendid


     def lisaYlesandedTestist(self, test):
        "Lisatakse vaid kordumatud ülesanded"
        for x in test.ylesanded():
           self.lisaYlesanne(x)
           
     def ylesandedTabelina(self, REQUEST, marksona=None):
        "Ülesanded ja nende kirjeldused tutvustava tabelina"
        if marksona is None:
          m=self.elemendidHoidlas()
        else:
          m=self.marksonaleVastavadElemendid(marksona)
        tulemus=leheAlgus(self, REQUEST)+"<table>"
        for x in m:
          tulemus=tulemus+"\n<tr><td>"+x.ylesanne.esitlusHTML()+"<td>"+\
            "<td>"+x.ylesanne.vaatamineHTML()+"</td>"+\
            "<td>"+x.marksonadHTML()+"</td>"+\
            "<td>"+x.selgitusHTML()+"</td>"+\
            "<td>"+x.ylesanne.meta_type+"</td></tr>"
        tulemus=tulemus+"</table>\n<br />"+self.marksonaViideteLoetelu()
        return tulemus+leheLopp(self, REQUEST)


     def ylesandedMuutmisTabelina(self, REQUEST):
        "Ülesanded koos viidetega kustutamiseks ja muutmiseks"
        tulemus=leheAlgus(self, REQUEST)+\
        "<form action='kustuta_leht'><table>"
        for x in self.elemendidHoidlas():
          tulemus=tulemus+"\n<tr><td>"+x.ylesanne.esitusHTML()+"<td>"+\
            "<td>"+x.ylesanne.vaatamineHTML()+"</td>"+\
            "<td>"+x.marksonadHTML()+"</td>"+\
            "<td>"+x.selgitusHTML()+"</td>"+\
            "<input type='checkbox' name='kustuta' value='"+x.id+"' />"+"</td>"+\
            "<td><a href='"+x.id+"/ylesanne/muutmisVorm'>Ülesanne</a><a href='"+x.id+"/kirjeldus/muutmisVorm'>Kirjeldus</a></td>"+\
            "</tr>"
        tulemus=tulemus+"</table><input type='submit' value='Kustuta' /></form>"+\
           "\n<br /><a href='ylesanneteTyypideLoetelu'>Lisa ülesanne</a>"
        return tulemus+leheLopp(self, REQUEST)
        
     def kustuta_leht(self, REQUEST, kustuta=None):
        "ülesannete kustutamise leht"
        if kustuta is None:
           kustuta=()
        if type(kustuta) is types.StringType:
           kustuta=(kustuta,)
        for x in kustuta:
           self._delObject(x)
        REQUEST.RESPONSE.redirect('ylesandedMuutmisTabelina')
        
        
     def ylesanneteTyypideLoetelu(self, REQUEST):
        "Väljakutse"
        return leheAlgus(self, REQUEST)+TestiYlesanne().ylesanneteTyypideLoetelu()+leheLopp(self, REQUEST)
        
     def lisaUusYlesanne(self, REQUEST, tyyp):
        "Ülesande lisamine" 
        yl=TestiYlesanne().lisaUusYlesanne(tyyp)
        self.lisaYlesanne(yl)
        #REQUEST.RESPONSE.redirect('ylesandedMuutmisTabelina')
        REQUEST.RESPONSE.redirect(yl.absolute_url()+"/muudaVorm?liikumisURL="+self.absolute_url())
        
     def leivaPuru(self, viimane=0):
        "Teekond üles"
        nimi="Ülesannete hoidla"
        if viimane:
          tekst=nimi
        else:
          tekst="<a href='"+self.absolute_url()+"'">nimi+"</a>"
        return " &gt; "+tekst
                          
     def index_html(self, REQUEST):
        "Peegel veebis"
        return self.ylesandedTabelina(REQUEST)

