source: publico/SDE/trunk/StrDocElem.py @ 5327

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

v101: Merge das versões v003 e v100. Ainda falta resolver os problemas

que surgiram na v003, especialmente no tratamento de eventos.

File size: 15.0 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 StrDocElem_addForm(self, REQUEST):
15    "HTML para adicionar um novo objeto StrDocElem"
16    return """
17<HTML>
18<HEAD><TITLE>Add StrDocElement</TITLE></HEAD>
19<BODY BGCOLOR="#FFFFFF" LINK="#000099" VLINK="#555555">
20<H2>Add StrDocElement</H2>
21<form action="StrDocElem_add"><table>
22<tr><th>Id</th>
23    <td><input type=text name=id value="Automatic assignment" disabled=true></td>
24</tr>
25<tr><th>Type</th>
26    <td><input type=text name=type></td>
27</tr>
28<tr><td></td><td><input type=submit value=" Add "></td></tr>
29</table></form>
30</body></html>
31"""
32
33def StrDocElem_add(self,REQUEST):
34    "Método para adicionar um objeto StrDocElem"
35    print "### DEBUG: StrDocElem_add: id do self: %s - %s" % (self.id,`self`)
36    print "### DEBUG: StrDocElem_add: id do self.this(): %s - %s" % (self.this().id,`self.this()`)
37    request = REQUEST
38    RESPONSE =  request.RESPONSE
39    temp_id = self.newElemId()
40    request.set('id',temp_id)
41    instance = StrDocElem(request,self.this())
42    instance.reindex_object()
43       
44    # add the instance to the ObjectManager
45    self._setObject(request.id,instance)
46    instance=getattr(self.this(),request.id)
47    if request.has_key('position'):
48        offset = request.position
49    else:
50        offset = 0
51    self.manage_move_objects_to_top (request, temp_id)
52    if offset > 0:
53        self.manage_move_objects_down (request, temp_id, offset)
54    return instance
55
56class StrDocElem(OrderedFolder,CatalogAware):
57    "Classe de elementos de documentos estruturados"
58    meta_type = 'SDE-Document-Element'
59    filtered_meta_types = []
60
61    def __init__(self,REQUEST,container):
62        self.id = REQUEST.id
63        self._setProperty("type",'')
64        self._setProperty("text",'')
65        if REQUEST.has_key('type'):
66            self.type = REQUEST['type']
67            doc=container.document()
68            print "### DEBUG - __init__ - doc: %s - %s" % (doc.id, `doc`)
69            defpath=container.definitionPath()+'/'+self.type
70            print "### DEBUG - defpath : %s " % defpath
71            defelem=doc.definitionElement(element_path=defpath)
72            print "### DEBUG - defelem : %s - %s " % (defelem.id, `defelem`)
73            for p in defelem.objectValues('SDE-Template-Attribute'):
74                self.manage_addProperty(id='@'+p.id+'@', value='', type='string')
75            if hasattr(defelem,"initial_text"):
76                if defelem.initial_text != "":
77                    self.text = defelem.initial_text
78
79    # *** attributes
80    def attributes(self):
81        defelem = self.definitionElement(obj=self)
82        attr = []
83        for a in self.propertyItems():
84            if ((a[0][0] == '@') and (a[0][-1] == '@')):
85                attr_id = a[0][1:-1]
86                try:
87                    attr_name = defelem[attr_id].name()
88                except:
89                    attr_name = attr_id
90                attr.append (list ((attr_id,a[1],attr_name)))
91        return attr
92
93    # *** definitionPath
94    def definitionPath (self,absolute=0):
95        return self.parent().definitionPath(absolute) + "/" + self.type
96
97    # *** getAttribute
98    def getAttribute (self,attribute=''):
99        return self.getProperty('@'+attribute+'@','')
100
101    # *** has_own_value
102    def has_own_value(self):
103        defelem = self.definitionElement(obj=self)
104        if hasattr(defelem, "has_own_value"):
105            return defelem.has_own_value
106        else:
107            return ""
108           
109    def setNewIdForChildren(self, recursive=1, obj=""):
110        if obj:           
111            self=obj
112        for t_obj in self.objectValues():           
113            OrderedFolder.manage_renameObject(self, t_obj.id, self.newElemId())
114            if recursive:
115                t_obj.setNewIdForChildren (recursive=recursive, obj=t_obj)
116
117    def _get_id(self, id):
118        # This is a overriding of the CopyContainer._get_id method,
119        # located in OFS/CopySupport.py
120        new_id = id
121        session=self.REQUEST.SESSION
122        if session.has_key('SDE_clip_type'):
123            if session['SDE_clip_type'] == 'COPY':
124                new_id = self.newElemId()
125        print "### DEBUG: _get_id: old=%s new=%s" % (id,new_id)
126        return new_id
127       
128    # *** manage_beforeDelete (EVENT)
129    def manage_beforeDelete (self, item, containeR):
130        defElem = item.definitionElement(obj=item)
131        if 'SDE_BeforeDelete' in defElem.objectIds('Script (Python)'):
132            defElem.SDE_BeforeDelete(item)
133        return
134       
135    # *** manage_afterAdd (EVENT)
136    def manage_afterAdd (self, item, containeR):
137        print "### DEBUG: AfterAdd para o item %s" % item.id
138        defElem = item.definitionElement(obj=item)
139        print "### DEBUG: id do defelem: %s" % defElem.id
140        if 'SDE_AfterInsert' in defElem.objectIds('Script (Python)'):
141            print "### DEBUG: Achou Python de evento"
142            print defElem.SDE_AfterInsert(item)
143        return       
144
145    # *** manage_afterClone (EVENT)
146    def manage_afterClone (self, item):
147        print "### DEBUG: AfterClone para o item %s" % item.id
148        session=self.REQUEST.SESSION
149        if session.has_key('SDE_clip_type'):
150            if session['SDE_clip_type'] == 'COPY':
151                self.setNewIdForChildren(recursive=1,obj=self)
152        return
153#        return self.manage_afterAdd (item, containeR=None)
154
155
156    # *** parent
157    def parent (self):
158        return self.aq_parent
159
160    # *** render
161    def render(self):
162        printed = ""
163        printed+= str(self.text)
164        for x in (self.objectValues()):
165            printed+= str(x.render())
166        return printed
167
168    # *** renderHTML
169    def renderHTML(self,indent=0):
170        printed = ""
171        i = indent * 8
172        printed+= "<div style=\"padding-left: %ipx;\">%s</div>" % (i,self.text)
173        for x in (self.objectValues()):
174            printed+= str(x.renderHTML(indent+4))
175        printed+= "\n"
176        return printed
177
178    # *** renderHTMLforEditing
179    def renderHTMLforEditing (self,indent=0,elem_id=""):
180        printed =""
181        i = indent * 8
182        defelem = self.definitionElement(obj=self)
183        attr = self.attributes()
184        printed+= "<a name=\"%s\"></a>" % self.id
185        if (elem_id == self.id):
186            printed+= "<form method=\"post\" action=\"%s/save\">" % self.absolute_url()
187            printed+= "    <p>(%s)<br>" % defelem.name()
188            for a in attr:
189                printed+= a[2] + ':<input type="text" size="10" name="txattr_' + a[0] + '" value="' + a[1] + '">&nbsp;&nbsp;&nbsp;'
190            if self.has_own_value():
191                printed+= "    <textarea name=\"textedit\" cols=\"%i\" rows=\"4\" style=\"padding-left: %ipx;\">%s</textarea><br>" % (130-indent,i,self.text)
192            else:
193                printed+= "    <input name=\"textedit\" type=\"hidden\" value=\"%s\">" % self.text
194            printed+= "    <input name=\"cmd\" type=\"submit\" value=\"Gravar\">"
195            printed+= "    <input name=\"cmd\" type=\"submit\" value=\"Excluir\">"
196            printed+= "    <input type=\"reset\" value=\"Original\">"
197
198            tmpObjs = self.possibleChild(obj=self)
199            if (tmpObjs != []):
200                printed+= "    <select name=\"selChild\" onChange=AddChildOnSelect('%s',this)>" % self.absolute_url()
201                printed+= "        <option selected>Inserir filho...</option>"
202                opt = 0
203                for obj in tmpObjs:
204                    printed+= "        <option value=\"%i\">%s</option>" % (opt, obj[2])
205                    opt = opt + 1
206                printed+= "    </select>"
207            printed+= "</p>"
208            printed+= "</form>"
209        else:
210            strlink = "(%s)" % defelem.name()
211            str_attr = ''
212            for a in attr:
213                if str_attr:
214                    str_attr = str_attr + '&nbsp;&nbsp;&nbsp;'
215                else:
216                    str_attr = '['
217                str_attr = str_attr + a[2] + '="' + a[1] + '";'
218            if str_attr:
219                str_attr = str_attr[:-1] + ']'
220            printed+= "<p style=\"padding-left: %ipx; white-space: pre;\"><a class=\"elem\" href=\"renderHTMLforEditing?elem_id=%s#%s\">%s</a> %s" % (i,self.id,self.id,strlink,str_attr)
221            printed+= "%s</p>" % self.text
222        for x in (self.objectValues()):
223            printed+= x.renderHTMLforEditing(indent+4,elem_id)
224        return printed
225
226    # *** renderXML
227    def renderXML (self,indent=""):
228        printed=""
229        pref = self.template().xmlns_prefix
230        xmltag = self.definitionElement(obj=self).xmlTag()
231        attr = self.attributes()
232        str_attr = ''
233        for a in attr:
234            str_attr = str_attr + ' ' + a[0] + '="' + str(a[1]) + '"'
235        printed+= "%s<%s:%s id=\"%s\"%s>" % (indent,pref,xmltag,self.id,str_attr)
236        if self.has_own_value():
237            printed+= "%s<%s:%s_text>%s</%s:%s_text>" % (indent+"   ",pref,xmltag,self.text,pref,xmltag)
238        for x in (self.objectValues("SDE-Document-Element")):
239            printed+= x.renderXML(indent+"   ")
240        printed+= "%s</%s:%s>" % (indent,pref,xmltag)
241        return printed
242
243    # *** renderXMLforEditing
244    def renderXMLforEditing (self,indent=0, id_edit='', path='', prev='', next=''):
245        "Método de renderização XML"
246       
247        session = self.REQUEST.SESSION
248        printed=""
249        spaces = ''
250        for i in range (0,indent * 4):
251            spaces = spaces + ' '
252
253        defelem = self.definitionElement(obj=self)
254        attr = self.attributes()
255        chd = self.possibleChild(obj=self)
256        id = self.id
257
258        if path:
259            c_path = path + id + '/'
260        else:
261            c_path = id + '/'
262
263        if (id_edit==id) and (defelem.has_own_value):
264            str_edit_attrib = 'yes'
265        else:
266            str_edit_attrib = 'no'
267
268        str_moveup_attrib = 'no'
269        if prev:
270            if prev.type == self.type:
271                str_moveup_attrib = 'yes'
272
273        str_movedn_attrib = 'no'
274        if next:
275            if next.type == self.type:
276                str_movedn_attrib = 'yes'
277               
278        str_canpaste_attrib = 'no'
279        if session.has_key('SDE_clip_key'):
280            if session['SDE_clip_key']:
281                for c in chd:
282                    if c[0] == session['SDE_clip_object_type']:
283                        str_canpaste_attrib = 'yes'
284                        break;
285
286        printed+= '%s<sd_element id="%s" type="%s" type_name="%s" editing="%s" path="%s" up="%s" down="%s" paste="%s">\n' % (spaces, id, self.type, defelem.name(), str_edit_attrib, path, str_moveup_attrib, str_movedn_attrib, str_canpaste_attrib)
287        if defelem.has_own_value:
288            printed+= '%s    <sde_text>%s</sde_text>\n' % (spaces, self.text)
289        if attr != []:
290            for a in attr:
291                printed+= '%s    <sde_attr id="%s" name="%s">%s</sde_attr>\n' % (spaces, a[0], a[2], a[1])
292        for c in chd:
293            if c[1] == 0:
294                if c[3]:
295                    str_opt = "yes"
296                else:
297                    str_opt = "no"
298                printed+= '%s    <sde_child type="%s" name="%s" pos="%s" opt="%s" path="%s"></sde_child>\n' % (spaces, c[0],c[2],c[1], str_opt, c_path)
299        pos = 0
300        t_prev = ''
301        t_next = ''
302        t_objs = self.objectValues()
303        t_i = 0
304        t_max = len(t_objs) - 1
305        while t_i <= t_max:
306            x = t_objs[t_i]
307            if t_i > 0:
308                t_prev = t_objs[t_i - 1]
309            else:
310                t_prev = ''
311            if t_i < (t_max):
312                t_next = t_objs[t_i + 1]
313            else:
314                t_next = ''
315            printed+= x.renderXMLforEditing(indent+1, id_edit, path + id + '/', t_prev, t_next)
316            pos = pos + 1
317            for c in chd:
318                if c[1] == pos:
319                    if c[3]:
320                        str_opt = "yes"
321                    else:
322                        str_opt = "no"
323                    printed+= '%s    <sde_child type="%s" name="%s" pos="%s" opt="%s" path="%s"></sde_child>\n' % (spaces, c[0],c[2],c[1], str_opt, c_path)
324            t_i = t_i + 1
325        for c in chd:
326            if c[1] > pos:
327                if c[3]:
328                    str_opt = "yes"
329                else:
330                    str_opt = "no"
331                printed+= '%s    <sde_child type="%s" name="%s" pos="%s" opt="%s" path="%s"></sde_child>\n' % (spaces, c[0],c[2],c[1], str_opt, c_path)
332        printed+= '%s</sd_element>\n' % spaces
333        return printed
334       
335    def add_to_clipboard (self, op_type, REQUEST):
336        """ Método que coloca uma referência do objeto na área de teransferência (clipboard).
337            se op_type = 'CUT', quando a operação de "paste" for realizada, o objeto será movido,
338            senão (se op_type='COPY') o objeto será copiado. """
339       
340        session=self.REQUEST.SESSION
341        session['SDE_clip_object_type'] = self.type   
342        if op_type == 'COPY':
343            v_clip_key = self.parent().manage_copyObjects(self.id)
344        elif op_type == 'CUT':
345            v_clip_key = self.parent().manage_cutObjects(self.id)
346        else:
347            return 0
348       
349        session['SDE_clip_type'] = op_type
350        session['SDE_clip_key'] = v_clip_key
351       
352        return
353
354    def move_up(self):
355        self.parent().manage_move_objects_up(self.REQUEST, self.id, 1)
356        defElem = self.definitionElement(obj=self)
357        if 'SDE_AfterMove' in defElem.objectIds('Script (Python)'):
358            defElem.SDE_AfterMove(self, "UP")
359        return
360
361    def move_down(self):
362        self.parent().manage_move_objects_down(self.REQUEST, self.id, 1)
363        defElem = self.definitionElement(obj=self)
364        if 'SDE_AfterMove' in defElem.objectIds('Script (Python)'):
365            defElem.SDE_AfterMove(self, "DOWN")
366        return
367
368    def save(self):
369        "Método para salvar os textos digitados"
370        request = self.REQUEST
371        RESPONSE = request.RESPONSE
372        act = request.cmd
373        anchor = ""
374        father = self.parent()
375        if act == "Gravar":
376            self.manage_changeProperties(text=request.textedit)
377            dic_attr = {}
378            attr = self.attributes()
379            for a in attr:
380                if request.has_key('txattr_' + a[0]):
381                    self.saveAttribute(a[0],request['txattr_'+a[0]])
382            if len(dic_attr) > 0:
383                self.manage_changeProperties(dic_attr)
384            if (father.meta_type == "SDE-Document"):
385                anchor = ""
386            else:
387                anchor = "?elem_id=%s#%s" % (father.id, father.id)
388        elif act == "Excluir":
389            request.set('id',self.id)
390            self.parent().delChild()
391        return RESPONSE.redirect (self.document().absolute_url() + "/renderHTMLforEditing" + anchor)
392
393    # *** saveAttribute
394    def saveAttribute(self,attribute='',value=''):
395        dic={}
396        dic['@'+attribute+'@'] = value
397        self.manage_changeProperties(dic)
398        return
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.