source: publico/SDE/trunk/StrDoc.py @ 809

Última Alteração nesse arquivo desde 809 foi 809, incluída por ciciliati, 14 anos atrás

Versão 1.0: Alterados os meta-types das classes!!!
Esta versão foi desenvolvida com base na versão 0.0.2.
Faltam, portanto, as implementações da v. 0.0.3.
Fazer um diff(v002,v003) e aplicar sobre a v100.

File size: 17.7 KB
Linha 
1# -*- coding: iso-8859-1 -*-
2
3"""
4from OFS.SimpleItem import SimpleItem
5from Globals import Persistent
6from Acquisition import Implicit
7"""
8from OFS.OrderedFolder import OrderedFolder
9from Products.ZCatalog.CatalogAwareness import CatalogAware
10from OFS.ObjectManager import ObjectManager
11from OFS.PropertyManager import PropertyManager
12import string
13
14def StrDoc_addForm(self, REQUEST):
15    "HTML para adicionar um novo objeto StrDoc"
16    return """
17<HTML>
18<HEAD><TITLE>Add StructuredDocument</TITLE></HEAD>
19<BODY BGCOLOR="#FFFFFF" LINK="#000099" VLINK="#555555">
20<H2>Add StructuredDocument</H2>
21<form action="manage_addStrDoc"><table>
22<tr><th>Id</th>
23    <td><input type=text name=id></td>
24</tr>
25<tr><th>Template Path</th>
26    <td><input type=text name="template_path"></td>
27</tr>
28<tr><th>Document Type</th>
29    <td><input type=text name="type"></td>
30</tr>
31<tr><td></td><td><input type=submit value=" Add "></td></tr>
32</table></form>
33</body></html>
34"""
35
36def StrDoc_add(self,REQUEST):
37    "Método para adicionar um objeto StrDoc"
38    instance = StrDoc(REQUEST)
39    instance.reindex_object()
40    self._setObject(REQUEST.id,instance)
41    return instance
42
43class StrDoc(OrderedFolder,CatalogAware,ObjectManager,PropertyManager):
44    "Classe de documentos estruturados"
45    meta_type = 'SDE-Document'
46    filtered_meta_types = []
47
48    def __init__(self,REQUEST):
49        self.id = REQUEST.id
50        self._setProperty("template_path",REQUEST.template_path)
51        self._setProperty("type",REQUEST.type)
52        self._setProperty("nextElemId",1)
53
54    # *** addChild
55    def addChild (self,ch_type='',ch_position='',obj=''):
56        request = self.REQUEST
57        RESPONSE =  request.RESPONSE
58        if obj:
59            self=obj
60        if ch_type:
61            request.set('type',ch_type)
62        if ch_position:
63            request.set('position',int(ch_position))
64        newElem = self.manage_addProduct['StructuredDoc'].StrDocElem_add(request)
65        return newElem.id
66
67    # *** checksum
68    def checksum (self, obj=''):
69        "Método que calcula um checksum do conteúdo do documento estruturado"
70        from zlib import crc32
71        if obj:
72            self=obj
73        crc = 0L
74        i = 0
75        t = 0
76        for x in self.objectValues():
77            i = i + 1
78            crc = crc + (i * x.checksum(x))
79            t = t + i
80        if (i > 0):
81            crc = crc / t
82        else:
83            crc = 0L
84        if (self.meta_type == 'SDE-Document-Element'):
85            crc = crc + crc32(self.id + self.text)
86        return crc
87
88    # *** definitionElement
89    def definitionElement(self,element_path='',obj=''):
90        if obj:
91            self = obj
92        if element_path == '':
93            element_path = self.definitionPath(0)
94        subtree = string.split(element_path,"/")
95        temp_name = subtree.pop(0)
96        return self.template().getDefElement(subtree=subtree)
97
98    # *** definitionPath
99    def definitionPath(self,absolute=0):
100        if absolute:
101            return self.template_path + "/" + self.type
102        else:
103            return self.type
104
105    # *** delChild
106    def delChild(self):
107        request = self.REQUEST
108        RESPONSE = request.RESPONSE
109        if request.has_key ('id'):
110            self.manage_delObjects(request.id)
111        return RESPONSE.redirect (self.document().absolute_url() + "/renderHTMLforEditing")
112
113    # *** document
114    def document(self):
115      # return container.this() *** this was the ZClass version.
116        return self.this()
117
118    # *** getElements
119    def getElements(self,type='',obj=''):
120        if obj:
121            self = obj
122        result = []
123        for x in self.objectValues('SDE-Document-Element'):
124            if (not type) or (x.type == type):
125                result.append(x)
126            temp = x.getElements(type,obj=x)
127            if temp != []:
128                result.extend(temp)
129        return result
130
131    # *** getXML
132    def getXML(self,xsl=''):
133        tpt = self.template()
134        pref = tpt.xmlns_prefix
135        tag = tpt.xmlTag()
136        server = self.REQUEST['SERVER_URL']
137        printed = ''
138        printed+= "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n"   # generalizar o encoding
139        if xsl:
140            if (xsl!="__default__"):
141                printed+= "<?xml-stylesheet type=\"text/xsl\" href=\"%s\"?>\n" % xsl
142            elif (tpt.default_xslt_for_html):
143                printed+= "<?xml-stylesheet type=\"text/xsl\" href=\"%s\"?>\n" % tpt.default_xslt_for_html
144        printed+= "<%s:%s id=\"%s\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" %(pref,tag,self.id)
145        printed+= "       xmlns:%s=\"/XSD/%s\"" % (pref, self.type)
146        printed+= "       xsi:noNamespaceSchemaLocation=\"/XSD/%s.xsd\">" % self.type
147        for x in (self.objectValues("SDE-Document-Element")):
148            printed+= x.renderXML("   ")
149        printed+= "</%s:%s>" % (pref,tag)
150        return printed
151
152    # *** isInvalid
153    def isInvalid(self,obj=''):
154        if obj:
155            self = obj
156        request = self.REQUEST
157        RESPONSE = request.RESPONSE
158        tpt = self.definitionElement(obj=self).objectValues(['SDE-Template-Element','SDE-Template-Link'])
159        doc = self.objectValues('SDE-Document-Element')
160        exc = []
161        if ((len(doc) == 0) and (self.meta_type == 'SDE-Document')):
162            exc.append ("Documento Inválido: Está Vazio.")
163        if (len(exc) == 0):
164            it = 0
165            max_it = len(tpt)
166            instance_found = 0
167            for e in doc:
168                while ((e.type != tpt[it].id) and (it < max_it)):
169                    if ((not tpt[it].isOptional()) and (not instance_found) and \
170                       (e.definitionElement(obj=e).exclusivity_group == -1)):
171                        exc.append ("Verificando \"%s\": Elemento obrigatório, \"%s\", não foi encontrado antes \
172                                     do elemento \"%s\"" % (self.type, tpt[it].id,e.type))
173                    it = it + 1
174                    instance_found = 0
175                if (e.type == tpt[it].id):
176                    if (instance_found and (not tpt[it].isMultiple())):
177                        exc.append ("Verificando \"%s\": O elemento \"%s\" não admite mais de uma ocorrência \
178                                     nesse contexto." % (self.type,tpt[it].id))
179                    instance_found = 1
180            while (it < max_it):
181                if (not instance_found) and (not tpt[it].isOptional() and (tpt[it].exclusivity_group == -1)):
182                    exc.append ("Verificando \"%s\": Elemento obrigatório, \"%s\", não foi encontrado após o \
183                                 último elemento." % (self.type,tpt[it].id))
184                it = it + 1
185                instance_found = 0
186        if (len(exc) == 0):
187            for e in doc:
188                exc_child = e.isInvalid(obj=e)
189                if (len(exc_child) > 0):
190                    for x in exc_child:
191                        exc.append (x)
192        return exc
193
194    # *** newElemId
195    def newElemId(self):
196        newId = "SDE" + str(self.nextElemId)
197        self.manage_changeProperties(nextElemId= int(self.nextElemId) + 1)
198        return newId
199
200    # *** possibleChild
201    def possibleChild(self,debug=0,obj=''):
202        "***debug***"
203        if obj:
204            self=obj
205        elmdef = self.definitionElement(obj=self)
206        tpt = elmdef.possibleChild(obj=elmdef)
207
208        #***
209        if debug:
210            print "<html><body>"
211            print tpt
212            print "<hr>"
213        #***
214
215        doc = []
216        for x in self.objectValues():
217            elm = []
218            elm.append(x.type)
219            elm.append(x.id)
220            elm.append(self.getObjectPosition(x.id))
221            elm.append(x.definitionElement(obj=x).exclusivity_group)
222            doc.append (elm)
223
224        #***
225        if debug:
226            print doc
227            print "<hr>"
228        #***
229
230        excl_grp = []
231        chd = []
232        i = 0
233        pos = 0
234        m = len(tpt)
235        jump = ""
236        for x in doc:
237            if (x[0] == jump):
238                chd[-1][1] = (x[2] + 1)
239                pos = pos + 1
240                continue
241            elif (x[3] != -1):
242                excl_grp.append (x[3])
243            jump = x[0]
244            while (i < m) and (x[0] != tpt[i][0]):
245                if tpt[i][4] not in excl_grp:
246                    elm = []
247                    elm.append (tpt[i][0])
248                    elm.append (pos)
249                    elm.append (tpt[i][5])
250                    elm.append (tpt[i][1])
251                    chd.append (elm)
252                i = i + 1
253            pos = x[2]
254            if (i < m):
255                pos = pos + 1
256                if (tpt[i][2]):
257                    elm = []
258                    elm.append (tpt[i][0])
259                    elm.append (pos)
260                    elm.append (tpt[i][5])
261                    elm.append ((1==1))
262                    chd.append (elm)
263            i = i + 1
264        while (i < m):
265            if tpt[i][4] not in excl_grp:
266                elm = []
267                elm.append (tpt[i][0])
268                elm.append (pos)
269                elm.append (tpt[i][5])
270                elm.append (tpt[i][1])
271                chd.append (elm)
272            i = i + 1
273
274        #***
275        if debug:
276            print excl_grp
277            print "<hr>"
278            print chd
279            print "<hr>"
280            print "</body></html>"
281            return chd
282        else:
283            return chd
284        #***
285
286    # *** possibleChildDebug
287    def possibleChildDebug(self):
288        return self.possibleChild(debug=1)
289
290    # *** renderHTML
291    def renderHTML(self):
292        "Renderiza o documento em HTML para visualização. Útil para browsers que não suportam XML."
293        printed=""
294        printed+= "<html>\n"
295        for x in (self.objectValues()):
296            printed+= x.renderHTML()
297        printed+= "\n</html>"
298        return printed
299
300    # *** renderHTMLforEditing
301    def renderHTMLforEditing(self,validation=0,REQUEST=None):
302        "Renderiza o documento em HTML para Edição. Útil para browsers que não suportam XML."
303        printed=""
304        request = REQUEST
305        if not request.AUTHENTICATED_USER.has_permission('EditStructuredDocument',self):
306            return self.renderHTML()
307        elem_id = ""
308        if request.has_key("elem_id"):
309            elem_id = request.elem_id
310        printed+= "<html>\n"
311        printed+= "<head>"
312        printed+= "    <script type=\"text/javascript\">"
313        printed+= "        function AddChildOnSelect (strContext, selSelectObject)"
314        printed+= "        {"
315        printed+= "            if (selSelectObject.options[selSelectObject.selectedIndex].value != \"\")"
316        printed+= "            {"
317        printed+= "                location.href=(strContext + '/renderHTMLforEditing_addChild?opt=' + \
318                                   selSelectObject.options[selSelectObject.selectedIndex].value)"
319        printed+= "            }"
320        printed+= "        }"
321        printed+= "    </script>"
322        printed+= "    <style>"
323        printed+= "        a.elem:link     { text-decoration:none; color: blue; }"
324        printed+= "        a.elem:visited  { text-decoration:none; color: blue; }"
325        printed+= "        a.elem:hover    { text-decoration:underline; color: red; }"
326        printed+= "    </style>"
327        printed+= "</head>\n"
328        printed+= "<body style=\"font-family: \'times new roman\'; font-size: 12pt;\">\n"
329        if elem_id == "":
330            printed+= "<form method=\"post\" action=\"%s/save\">\n" % self.absolute_url()
331            tmpObjs = self.possibleChild()
332            if (tmpObjs != []):
333                printed+= "    <select name=\"selChild\" onChange=AddChildOnSelect('%s',this)>" % self.absolute_url()
334                printed+= "        <option selected>Inserir filho...</option>"
335                opt = 0
336                for obj in tmpObjs:
337                    printed+= "        <option value=\"%i\">%s</option>" % (opt, obj[2])
338                    opt = opt + 1
339                printed+= "    </select>"
340            printed+= "</form>"
341        else:
342            printed+= "<p><a href=\"renderHTMLforEditing\">(Raiz)</a></p>"
343        for x in (self.objectValues()):
344            printed+= x.renderHTMLforEditing(indent=0,elem_id=elem_id)
345        if (validation):
346            printed+= "<hr>"
347            printed+= "<h3>Validação do Documento</h3>"
348            errors = self.isInvalid()
349            if (errors):
350                printed+= "<ul>"
351                for e in errors:
352                    printed+= "<li>%s</li>" % e
353                printed+= "</ul>"
354            else:
355                printed+= "Documento Válido."
356        printed+= "\n</body>"
357        printed+= "\n</html>"
358        return printed
359
360    # *** renderHTMLforEditing
361    def renderHTMLforEditing_addChild(self,REQUEST):
362        "Método para adicionar elementos ao documento, usando a interface renderHTML."
363        request = REQUEST
364        RESPONSE = request.RESPONSE
365        option = string.atoi(request.opt)
366        chd = self.possibleChild()[option]
367        request.set ('type',chd[0])
368        request.set ('position',chd[1])
369        newElemId = self.addChild()
370        return RESPONSE.redirect (self.document().absolute_url() + "/renderHTMLforEditing?elem_id=" + \
371                                  newElemId + "#" + newElemId)
372
373    # *** renderXML
374    def renderXML(self,xsl=''):
375        "Renderiza o documento em XML, de acordo com a estrutura definida no modelo."
376        printed = self.getXML(xsl)
377        self.REQUEST.RESPONSE.setHeader('Content-type', 'text/xml')
378        return printed
379
380    def renderXMLforEditing(self,xslt=None, action=None, p_type=None, p_pos=None, p_id=None, p_path=None):
381        """ Renderiza o documento em XML, em estrutura especial para edição.
382        'action'   parameters             description
383        EDIT       p_id                   renders the sd_element whose id=p_id with the attribute editing='yes'
384        MOVE_UP    p_path, p_id           move one position up the element identified by p_id located at p_path
385        MOVE_DOWN  p_path, p_id           move one position down the element identified by p_id located at p_path
386        CREATE     p_path, p_type, p_pos  creates, under the element p_path, a child of type p_type at the p_pos position
387        DELETE     p_path, p_id           removes the element p_id located in p_path
388        SAVE       p_path, p_id, REQUEST  saves the changes to the element p_id located in p_path
389                                          in REQUEST object there shall be a form called 'form_edit' containing
390                                          a object (textarea) called 'txa_text' and several objects (text) named
391                                          tat_??????, where ?????? is an attribute name (sde_attr) """
392        request = self.REQUEST
393        response = request.RESPONSE
394        printed=""
395
396        if (action == 'CREATE'):
397            e = self.restrictedTraverse(p_path)
398            p_id = e.addChild (p_type, int(p_pos),obj=e)
399            action = 'EDIT'
400        elif (action == 'DELETE'):
401            e = self.restrictedTraverse(p_path)
402            e.manage_delObjects(p_id)
403        elif (action == 'SAVE'):
404            from Products.PythonScripts.standard import html_quote
405            e = self.restrictedTraverse(p_path + p_id)
406            e.manage_changeProperties(text=html_quote(request.txa_text))
407            for x in request.form.keys():
408                if x[0:4] == 'tat_':
409                    attrN = x[4:]
410                    attrV = request[x]
411                    e.saveAttribute(attrN,attrV)
412        elif (action == 'MOVE_UP'):
413            e = self.restrictedTraverse(p_path + p_id)
414            e.move_up()
415        elif (action == 'MOVE_DOWN'):
416            e = self.restrictedTraverse(p_path + p_id)
417            e.move_down()
418        if (action == 'EDIT'):
419            id_edit = p_id
420        else:
421            id_edit = ''
422
423        chd = self.possibleChild(obj=self)
424
425        #
426        #if not request.AUTHENTICATED_USER.has_permission('EditStructuredDocument',context):
427        #    return context.renderHTML()
428        #
429
430        response.setHeader('Content-type', 'text/xml')
431
432        printed+= '<?xml version="1.0" encoding="ISO-8859-1"?>\n'  #aqui tbm encoding poderia ser parametrizado
433        if xslt:
434            tpt = self.template()
435            if (xslt!="__default__"):
436                printed+= '<?xml-stylesheet type="text/xsl" href="%s"?>\n' % xslt
437            elif (tpt.default_xslt_for_editor):
438                printed+= '<?xml-stylesheet type="text/xsl" href="%s"?>\n' % tpt.default_xslt_for_editor
439        printed+= '<strdoc id="%s" type="%s">\n' % (self.id, self.type)
440        for c in chd:
441            if c[1] == 0:
442                if c[3]:
443                    str_opt = "yes"
444                else:
445                    str_opt = "no"
446                printed+= '    <sde_child type="%s" name="%s" pos="%s" opt="%s" path=""></sde_child>\n' % (c[0], c[2], c[1], str_opt)
447        pos = 0
448        for x in (self.objectValues()):
449            printed+= x.renderXMLforEditing(indent=1, id_edit=id_edit)
450            pos = pos + 1
451            for c in chd:
452                if c[1] == pos:
453                    if c[3]:
454                        str_opt = "yes"
455                    else:
456                        str_opt = "no"
457                    printed+= '    <sde_child type="%s" name="%s" pos="%s" opt="%s" path=""></sde_child>\n' % (c[0], c[2], c[1], str_opt)
458        for c in chd:
459            if c[1] > pos:
460                if c[3]:
461                    str_opt = "yes"
462                else:
463                    str_opt = "no"
464                printed+= '    <sde_child type="%s" name="%s" pos="%s" opt="%s" path=""></sde_child>\n' % (c[0], c[2], c[1], str_opt)
465        printed+= '</strdoc>\n'
466        response.setHeader('Content-type', 'text/xml')
467        return printed
468
469    # *** template
470    def template (self):
471        return self.restrictedTraverse(self.template_path + "/" + self.type)
Note: Veja TracBrowser para ajuda no uso do navegador do trac.
 

The contents and data of this website are published under license:
Creative Commons 4.0 Brasil - Atribuir Fonte - Compartilhar Igual.