13 __docformat__ = 'restructuredtext' |
13 __docformat__ = 'restructuredtext' |
14 |
14 |
15 |
15 |
16 # import standard library |
16 # import standard library |
17 import time |
17 import time |
|
18 from html import escape |
|
19 |
18 import transaction |
20 import transaction |
19 from html import escape |
21 # import packages |
20 |
22 from BTrees.utils import oid_repr |
|
23 from ZODB.POSException import POSKeyError |
|
24 from ZODB.utils import p64, tid_repr, u64 |
|
25 from persistent import Persistent |
|
26 from persistent.timestamp import TimeStamp |
|
27 from pyramid.httpexceptions import HTTPFound |
|
28 from pyramid.view import view_config |
|
29 from zope.exceptions.interfaces import UserError |
|
30 from zope.interface import Interface, implementer |
|
31 |
|
32 from pyams_pagelet.pagelet import pagelet_config |
21 # import interfaces |
33 # import interfaces |
22 from pyams_skin.interfaces import IInnerPage |
34 from pyams_skin.interfaces import IInnerPage |
23 from pyams_skin.layer import IPyAMSLayer |
35 from pyams_skin.layer import IPyAMSLayer |
24 from pyams_zmi.interfaces.menu import IControlPanelMenu |
|
25 from pyams_zmi.layer import IAdminLayer |
|
26 from pyams_zodbbrowser.interfaces import IValueRenderer, IDatabaseHistory |
|
27 |
|
28 # import packages |
|
29 from BTrees.utils import oid_repr |
|
30 from persistent import Persistent |
|
31 from persistent.timestamp import TimeStamp |
|
32 from pyams_pagelet.pagelet import pagelet_config |
|
33 from pyams_skin.viewlet.menu import MenuItem |
36 from pyams_skin.viewlet.menu import MenuItem |
34 from pyams_template.template import template_config |
37 from pyams_template.template import template_config |
35 from pyams_utils.adapter import ContextRequestAdapter |
38 from pyams_utils.adapter import ContextRequestAdapter |
36 from pyams_utils.interfaces import PYAMS_APPLICATION_DEFAULT_NAME, PYAMS_APPLICATION_SETTINGS_KEY, \ |
39 from pyams_utils.interfaces import MANAGE_SYSTEM_PERMISSION, PYAMS_APPLICATION_DEFAULT_NAME, \ |
37 MANAGE_SYSTEM_PERMISSION |
40 PYAMS_APPLICATION_SETTINGS_KEY |
38 from pyams_utils.property import cached_property |
41 from pyams_utils.property import cached_property |
39 from pyams_viewlet.viewlet import viewlet_config |
42 from pyams_viewlet.viewlet import viewlet_config |
|
43 from pyams_zmi.interfaces.menu import IControlPanelMenu |
|
44 from pyams_zmi.layer import IAdminLayer |
|
45 from pyams_zodbbrowser import _ |
40 from pyams_zodbbrowser.diff import compareDictsHTML |
46 from pyams_zodbbrowser.diff import compareDictsHTML |
41 from pyams_zodbbrowser.history import ZodbObjectHistory |
47 from pyams_zodbbrowser.history import ZodbObjectHistory |
|
48 from pyams_zodbbrowser.interfaces import IDatabaseHistory, IValueRenderer |
42 from pyams_zodbbrowser.state import ZodbObjectState |
49 from pyams_zodbbrowser.state import ZodbObjectState |
43 from pyams_zodbbrowser.value import TRUNCATIONS, pruneTruncations |
50 from pyams_zodbbrowser.value import TRUNCATIONS, pruneTruncations |
44 from pyramid.httpexceptions import HTTPFound |
|
45 from pyramid.view import view_config |
|
46 from ZODB.POSException import POSKeyError |
|
47 from ZODB.utils import p64, u64, tid_repr |
|
48 from zope.exceptions.interfaces import UserError |
|
49 from zope.interface import implementer, Interface |
|
50 |
|
51 from pyams_zodbbrowser import _ |
|
52 |
51 |
53 |
52 |
54 def getObjectType(obj): |
53 def getObjectType(obj): |
55 cls = getattr(obj, '__class__', None) |
54 cls = getattr(obj, '__class__', None) |
56 if type(obj) is not cls: |
55 if type(obj) is not cls: |
531 objects = [] |
530 objects = [] |
532 for record in d: |
531 for record in d: |
533 obj = self.jar.get(record.oid) |
532 obj = self.jar.get(record.oid) |
534 url = "#zodbbrowser?oid=0x%x&tid=0x%x" % (u64(record.oid), |
533 url = "#zodbbrowser?oid=0x%x&tid=0x%x" % (u64(record.oid), |
535 utid) |
534 utid) |
536 objects.append(dict( |
535 try: |
537 oid=u64(record.oid), |
536 objects.append(dict( |
538 path=getObjectPath(obj, d.tid), |
537 oid=u64(record.oid), |
539 oid_repr=oid_repr(record.oid), |
538 path=getObjectPath(obj, d.tid), |
540 class_repr=getObjectType(obj), |
539 oid_repr=oid_repr(record.oid), |
541 url=url, |
540 class_repr=getObjectType(obj), |
542 repr=IValueRenderer(obj).render(d.tid), |
541 url=url, |
543 )) |
542 repr=IValueRenderer(obj).render(d.tid), |
|
543 )) |
|
544 except KeyError: # no history |
|
545 pass |
544 if len(objects) == 1: |
546 if len(objects) == 1: |
545 summary = '1 object record' |
547 summary = '1 object record' |
546 else: |
548 else: |
547 summary = '%d object records' % len(objects) |
549 summary = '%d object records' % len(objects) |
548 if size is not None: |
550 if size is not None: |