This file is indexed.

/usr/share/pyshared/zc/table/column.py is in python-zc.table 0.9.0-0ubuntu1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
##############################################################################
#
# Copyright (c) 2004 Zope Foundation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Useful predefined columns

$Id: column.py 4318 2005-12-06 03:41:37Z gary $
"""
import warnings
from xml.sax.saxutils import quoteattr

from zope import interface, component, schema, i18n
from zope.formlib.interfaces import IInputWidget
from zope.formlib.interfaces import WidgetInputError, WidgetsError

from zc.table import interfaces

class Column(object):
    interface.implements(interfaces.IColumn)
    title = None
    name = None

    def __init__(self, title=None, name=None):
        if title is not None:
            self.title = title

        self.name = name or title

    def renderHeader(self, formatter):
        return i18n.translate(
            self.title, context=formatter.request, default=self.title)

    def renderCell(self, item, formatter):
        raise NotImplementedError('Subclasses must provide their '
                                  'own renderCell method.')

class SortingColumn(Column):
    interface.implements(interfaces.ISortableColumn)

    # sort and reversesort are part of ISortableColumn, not IColumn, but are
    # put here to provide a reasonable default implementation.

    def __init__(self, title=None, name=None, subsort=False):
        self.subsort = subsort
        super(SortingColumn, self).__init__(title, name)

    def _sort(self, items, formatter, start, stop, sorters, multiplier):
        if self.subsort and sorters:
            items = sorters[0](items, formatter, start, stop, sorters[1:])
        else:
            items = list(items) # don't mutate original
        getSortKey = self.getSortKey

        items.sort(
            cmp=lambda a, b: multiplier*cmp(a, b),
            key=lambda item: getSortKey(item, formatter))

        return items

    def sort(self, items, formatter, start, stop, sorters):
        return self._sort(items, formatter, start, stop, sorters, 1)

    def reversesort(self, items, formatter, start, stop, sorters):
        return self._sort(items, formatter, start, stop, sorters, -1)

    # this is a convenience to override if you just want to keep the basic
    # implementation but change the comparison values.

    def getSortKey(self, item, formatter):
        raise NotImplementedError

class GetterColumn(SortingColumn):
    """Column for simple use cases.

    title - the title of the column
    getter - a callable that is passed the item and the table formatter;
        returns the value used in the cell
    cell_formatter - a callable that is passed the result of getter, the
        item, and the table formatter; returns the formatted HTML
    """
    interface.implementsOnly(interfaces.IColumn)

    def __init__(self, title=None, getter=None, cell_formatter=None, 
                 name=None, subsort=False):
        if getter is not None:
            self.getter = getter

        if cell_formatter is not None:
            self.cell_formatter = cell_formatter

        super(GetterColumn, self).__init__(title, name, subsort=subsort)

    def getter(self, item, formatter):
        return item

    def cell_formatter(self, value, item, formatter):
        return unicode(value).replace('&', '&') \
                              .replace('<', '&#60;') \
                              .replace('>', '&#62;')

    def renderCell(self, item, formatter):
        value = self.getter(item, formatter)
        return self.cell_formatter(value, item, formatter)

    # this is a convenience to override if you just want to keep the basic
    # implementation but change the comparison values.

    def getSortKey(self, item, formatter):
        return self.getter(item, formatter)


class MailtoColumn(GetterColumn):
    def renderCell(self, item, formatter):
        email = super(MailtoColumn, self).renderCell(item, formatter)
        return '<a href="mailto:%s">%s</a>' % (email, email)

class FieldEditColumn(Column):
    """Columns that supports field/widget update

    Note that fields are only bound if bind == True.
    """

    def __init__(self, title=None, prefix=None, field=None,
                 idgetter=None, getter=None, setter=None, name='', bind=False, 
                 widget_class=None, widget_extra=None):
        super(FieldEditColumn, self).__init__(title, name)
        assert prefix is not None # this is required
        assert field is not None # this is required
        assert idgetter is not None # this is required
        self.prefix = prefix
        self.field = field
        self.idgetter = idgetter
        if getter is None:
            getter = field.get
        self.get = getter
        if setter is None:
            setter = field.set
        self.set = setter
        self.bind = bind
        self.widget_class = widget_class
        self.widget_extra = widget_extra

    def makeId(self, item):
        return ''.join(self.idgetter(item).encode('base64').split())

    def input(self, items, request):
        if not hasattr(request, 'form'):
            warnings.warn(
                'input should be called with a request, not a formatter',
                DeprecationWarning, 2)
            request = request.request
        data = {}
        errors = []
        bind = self.bind
        if not bind:
            widget = component.getMultiAdapter(
                (self.field, request), IInputWidget)
        for item in items:
            if bind:
                widget = component.getMultiAdapter(
                    (self.field.bind(item), request), IInputWidget)
            id = self.makeId(item)
            # this is wrong: should use formatter prefix.  column should not
            # have a prefix.  This requires a rewrite; this entire class
            # will be deprecated.
            widget.setPrefix(self.prefix + '.' + id)
            if widget.hasInput():
                try:
                    data[id] = widget.getInputValue()
                except WidgetInputError, v:
                    errors.append(v)

        if errors:
            raise WidgetsError(errors)
        return data

    def update(self, items, data):
        changed = False
        for item in items:
            id = self.makeId(item)
            v = data.get(id, self)
            if v is self:
                continue
            if self.get(item) != v:
                self.set(item, v)
                changed = True
        return changed

    def renderCell(self, item, formatter):
        id = self.makeId(item)
        request = formatter.request
        field = self.field
        if self.bind:
            field = field.bind(item)
        widget = component.getMultiAdapter((field, request), IInputWidget)
        widget.setPrefix(self.prefix + '.' + id)
        if self.widget_extra is not None:
            widget.extra = self.widget_extra
        if self.widget_class is not None:
            widget.cssClass = self.widget_class
        ignoreStickyValues = getattr(formatter, 'ignoreStickyValues', False)
        if ignoreStickyValues or not widget.hasInput():
            widget.setRenderedValue(self.get(item))
        return widget()


class SelectionColumn(FieldEditColumn):
    title = ''

    def __init__(self, idgetter, field=None, prefix=None, getter=None,
                 setter=None, title=None, name='', hide_header=False):
        if field is None:
            field = schema.Bool()
        if not prefix:
            if field.__name__:
                prefix = field.__name__ + '_selection_column'
            else:
                prefix = 'selection_column'
        if getter is None:
            getter = lambda item: False
        if setter is None:
            setter = lambda item, value: None
        if title is None:
            title = field.title or ""
        self.hide_header = hide_header
        super(SelectionColumn, self).__init__(field=field, prefix=prefix,
                                              getter=getter, setter=setter,
                                              idgetter=idgetter, title=title,
                                              name=name)

    def renderHeader(self, formatter):
        if self.hide_header:
            return ''
        return super(SelectionColumn, self).renderHeader(formatter)

    def getSelected(self, items, request):
        """Return the items which were selected."""
        data = self.input(items, request)
        return [item for item in items if data.get(self.makeId(item))]

class SubmitColumn(Column):
    def __init__(self, title=None, prefix=None, idgetter=None, action=None,
                 labelgetter=None, condition=None,
                 extra=None, cssClass=None, renderer=None, name=''):
        super(SubmitColumn, self).__init__(title, name)
        # hacked together. :-/
        assert prefix is not None # this is required
        assert idgetter is not None # this is required
        assert labelgetter is not None # this is required
        assert action is not None # this is required
        self.prefix = prefix
        self.idgetter = idgetter
        self.action = action
        self.renderer=renderer
        self.condition = condition
        self.extra = extra
        self.cssClass = cssClass
        self.labelgetter = labelgetter

    def makeId(self, item):
        return ''.join(self.idgetter(item).encode('base64').split())

    def input(self, items, request):
        for item in items:
            id = self.makeId(item)
            identifier = '%s.%s' % (self.prefix, id)
            if identifier in request.form:
                if self.condition is None or self.condition(item):
                    return id
                break

    def update(self, items, data):
        if data:
            for item in items:
                id = self.makeId(item)
                if id == data:
                    self.action(item)
                    return True
        return False

    def renderCell(self, item, formatter):
        if self.condition is None or self.condition(item):
            id = self.makeId(item)
            identifier = '%s.%s' % (self.prefix, id)
            if self.renderer is not None:
                return self.renderer(
                    item, identifier, formatter, self.extra, self.cssClass)
            label = self.labelgetter(item, formatter)
            label = i18n.translate(
                label, context=formatter.request, default=label)
            val = "<input type='submit' name=%s value=%s %s" % (
                quoteattr(identifier),
                quoteattr(label),
                self.extra and quoteattr(self.extra) or '')
            if self.cssClass:
                val = "%s class=%s />" % (val, quoteattr(self.cssClass))
            else:
                val += " />"
            return val
        return ''