File: Methods.py

package info (click to toggle)
zope-zpatterns 0.4.3p2-2
  • links: PTS
  • area: main
  • in suites: woody
  • size: 476 kB
  • ctags: 814
  • sloc: python: 2,817; ansic: 310; makefile: 52; sh: 39
file content (160 lines) | stat: -rw-r--r-- 4,707 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
from Products.ZPatterns.Providers import NullProvider
from Products.ZPatterns.Proxy import ProxyManager
from Products.ZPatterns.PlugIns import PlugIn, defaultConstructors
from Compiler import compile
from Globals import DTMLFile, default__class_init__
from DateTime.DateTime import DateTime
from OFS.SimpleItem import Item
from OFS import History

class SSMethod(PlugIn, NullProvider, ProxyManager, History.Historical):

    """SkinScript Method"""
    
    __plugin_kind__ = "Attribute Provider"
    meta_type = "SkinScript Method"

    manage_options = (
        {'label':'Edit', 'action':'manage_main', 'help': ('ZPatterns','SkinScriptSyntax.stx')},
    ) + ProxyManager.manage_options + History.Historical.manage_options + Item.manage_options 


    def manage_historyCompare(self, rev1, rev2, REQUEST,
                              historyComparisonResults=''):
        return SSMethod.inheritedAttribute('manage_historyCompare')(
            self, rev1, rev2, REQUEST,
            historyComparisonResults=History.html_diff(
                rev1.text, rev2.text
                ))
    
    text = ''
    _providers = ()
    
    def _propertiesChanged(self):
        providers = self._providers = compile(self.text)
        
        for p in providers:
            p._proxy_roles = self._proxy_roles
            p.id = '%s, line %d' % (self.id,p.lineno); p.title = self.title

        self.aq_inner.aq_parent.manage_refreshPlugIns()
            
    def _getProviders(self):
        return self._providers

    manage_main=DTMLFile('methodEdit',globals())
    
    def manage_edit(self, title, text, SUBMIT=None,
                    dtpref_cols='50', dtpref_rows='20', REQUEST=None):
        """Change the method"""

        if self._size_changes.has_key(SUBMIT):
            return self._er(text,title,SUBMIT,dtpref_cols,dtpref_rows,REQUEST)

        self._validateProxy(REQUEST)


        if self._size_changes.has_key(SUBMIT):
            return self._er(text, title, SUBMIT, dtpref_cols,
                            dtpref_rows, REQUEST)

        if type(text) is not type(''):
            text = text.read()
            
        self.text, self.title = text, title

        self._propertiesChanged()

        if REQUEST:
            message = "Contents updated."
            return self.manage_main(self, REQUEST, manage_tabs_message=message)












    _size_changes={
        'Bigger': (5,5),
        'Smaller': (-5,-5),
        'Narrower': (0,-5),
        'Wider': (0,5),
        'Taller': (5,0),
        'Shorter': (-5,0),
        }

    def _er(self,text,title,SUBMIT,dtpref_cols,dtpref_rows,REQUEST):
        dr,dc = self._size_changes[SUBMIT]
        from string import atoi        
        rows=max(1,atoi(dtpref_rows)+dr)
        cols=max(40,atoi(dtpref_cols)+dc)
        e=(DateTime('GMT') + 365).rfc822()
        resp=REQUEST['RESPONSE']
        resp.setCookie('dtpref_rows',str(rows),path='/',expires=e)
        resp.setCookie('dtpref_cols',str(cols),path='/',expires=e)
        return self.manage_main(self, REQUEST, title=title, 
            text=text, dtpref_cols=cols, dtpref_rows=rows)


    def manage_upload(self,file='', REQUEST=None):
        """Replace the contents of the method with the text in file."""
        self._validateProxy(REQUEST)
        if type(file) is not type(''): file=file.read()
        self.text = file; self._propertiesChanged()
        
        if REQUEST:
            return self.manage_main(self, REQUEST,
                manage_tabs_message="Contents updated.")










    def PUT(self, REQUEST, RESPONSE):
        """Handle HTTP PUT requests."""
        self.dav__init(REQUEST, RESPONSE)
        body=REQUEST.get('BODY', '')
        self._validateProxy(REQUEST)
        self.text=body; self._propertiesChanged()
        RESPONSE.setStatus(204)
        return RESPONSE

    def manage_proxy(self, roles=(), REQUEST=None):
        "Change Proxy Roles"
        r = ProxyManager.manage_proxy.im_func(self,roles,REQUEST)

        # Update proxy roles on providers, and reload them into parent
        for p in self._providers: p._proxy_roles = self._proxy_roles
        self.aq_inner.aq_parent.manage_refreshPlugIns()

        return r

    __ac_permissions__ = (
        ('Change proxy roles', ('manage_proxy')),
        ('View management screens',  ('manage_uploadForm','manage_main')),
        ('Change SkinScript methods',('manage_upload','PUT','manage_edit')),
    )


default__class_init__(SSMethod)


def initialize(context):
    context.registerPlugInClass(
        SSMethod,
        permission = 'Add SkinScript Methods',
        constructors = defaultConstructors(SSMethod,globals()),
        icon = 'www/SkinScriptMethod.gif'
    )