annotate roundup/hyperdb.py @ 5442:afd9fd3a0edb

Python 3 preparation: avoid assigning to instance __getitem__ in TruthDict. In Python 3, special method names are generally only looked up at the class level, not on instance objects, and so assigning to them for an instance object doesn't work as expected.
author Joseph Myers <jsm@polyomino.org.uk>
date Wed, 25 Jul 2018 12:29:08 +0000
parents f2c5e0f6506e
children 87f22a5d65ca
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
213
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
1 #
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
2 # Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/)
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
3 # This module is free software, and you may redistribute it and/or modify
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
4 # under the same terms as Python, so long as this copyright message and
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
5 # disclaimer are retained in their original form.
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
6 #
214
18134bffab37 stupid typo
Richard Jones <richard@users.sourceforge.net>
parents: 213
diff changeset
7 # IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR
213
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
8 # DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
9 # OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
10 # POSSIBILITY OF SUCH DAMAGE.
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
11 #
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
12 # BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
13 # BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
14 # FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS"
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
15 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
16 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
17 #
406
bdc2ea127ae9 Added module docstrings to all modules.
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 398
diff changeset
18
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
19 """Hyperdatabase implementation, especially field types.
1244
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1085
diff changeset
20 """
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
21 __docformat__ = 'restructuredtext'
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
22
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23 # standard python modules
5079
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
24 import os, re, shutil, sys, weakref
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
25 import traceback
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
26 import logging
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
27
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
28 # roundup modules
5388
d26921b851c3 Python 3 preparation: make relative imports explicit.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
29 from . import date, password
d26921b851c3 Python 3 preparation: make relative imports explicit.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
30 from .support import ensureParentsExist, PrioList
3925
603ec9630b08 i18n for hyperdb and backend errors
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3924
diff changeset
31 from roundup.i18n import _
5079
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
32 from roundup.cgi.exceptions import DetectorError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
34 logger = logging.getLogger('roundup.hyperdb')
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
35
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36 #
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37 # Types
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38 #
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
39 class _Type(object):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
40 """A roundup property type."""
5112
8901cc4ef0e0 - issue1714899: Feature Request: Optional Change Note. Added a new
John Rouillard <rouilj@ieee.org>
parents: 5101
diff changeset
41 def __init__(self, required=False, default_value = None, quiet=False):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
42 self.required = required
4481
9bbf3758c16a Allow default value declaration in DB schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4480
diff changeset
43 self.__default_value = default_value
5112
8901cc4ef0e0 - issue1714899: Feature Request: Optional Change Note. Added a new
John Rouillard <rouilj@ieee.org>
parents: 5101
diff changeset
44 self.quiet = quiet
224
ad2c98faec97 using isinstance(blah, Foo) now instead of isFooType
Richard Jones <richard@users.sourceforge.net>
parents: 214
diff changeset
45 def __repr__(self):
657
e0a1cc7538e9 more pychecker warnings removed
Richard Jones <richard@users.sourceforge.net>
parents: 648
diff changeset
46 ' more useful for dumps '
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
47 return '<%s.%s>'%(self.__class__.__module__, self.__class__.__name__)
4481
9bbf3758c16a Allow default value declaration in DB schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4480
diff changeset
48 def get_default_value(self):
9bbf3758c16a Allow default value declaration in DB schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4480
diff changeset
49 """The default value when creating a new instance of this property."""
9bbf3758c16a Allow default value declaration in DB schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4480
diff changeset
50 return self.__default_value
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
51 def sort_repr (self, cls, val, name):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
52 """Representation used for sorting. This should be a python
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
53 built-in type, otherwise sorting will take ages. Note that
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
54 individual backends may chose to use something different for
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
55 sorting as long as the outcome is the same.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
56 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
57 return val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
58
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
59 class String(_Type):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
60 """An object designating a String property."""
5112
8901cc4ef0e0 - issue1714899: Feature Request: Optional Change Note. Added a new
John Rouillard <rouilj@ieee.org>
parents: 5101
diff changeset
61 def __init__(self, indexme='no', required=False, default_value = "", quiet=False):
8901cc4ef0e0 - issue1714899: Feature Request: Optional Change Note. Added a new
John Rouillard <rouilj@ieee.org>
parents: 5101
diff changeset
62 super(String, self).__init__(required, default_value, quiet)
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
63 self.indexme = indexme == 'yes'
3992
fe2af84a5ca5 allow binary data for "content" props through rawToHyperdb
Richard Jones <richard@users.sourceforge.net>
parents: 3925
diff changeset
64 def from_raw(self, value, propname='', **kw):
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
65 """fix the CRLF/CR -> LF stuff"""
3992
fe2af84a5ca5 allow binary data for "content" props through rawToHyperdb
Richard Jones <richard@users.sourceforge.net>
parents: 3925
diff changeset
66 if propname == 'content':
fe2af84a5ca5 allow binary data for "content" props through rawToHyperdb
Richard Jones <richard@users.sourceforge.net>
parents: 3925
diff changeset
67 # Why oh why wasn't the FileClass content property a File
fe2af84a5ca5 allow binary data for "content" props through rawToHyperdb
Richard Jones <richard@users.sourceforge.net>
parents: 3925
diff changeset
68 # type from the beginning?
fe2af84a5ca5 allow binary data for "content" props through rawToHyperdb
Richard Jones <richard@users.sourceforge.net>
parents: 3925
diff changeset
69 return value
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
70 return fixNewlines(value)
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
71 def sort_repr (self, cls, val, name):
3684
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3682
diff changeset
72 if not val:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3682
diff changeset
73 return val
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
74 if name == 'id':
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
75 return int(val)
3684
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3682
diff changeset
76 return val.lower()
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
78 class Password(_Type):
270
a4241ddd22d7 Added the Password property type.
Richard Jones <richard@users.sourceforge.net>
parents: 264
diff changeset
79 """An object designating a Password property."""
5112
8901cc4ef0e0 - issue1714899: Feature Request: Optional Change Note. Added a new
John Rouillard <rouilj@ieee.org>
parents: 5101
diff changeset
80 def __init__(self, scheme=None, required=False, default_value = None, quiet=False):
8901cc4ef0e0 - issue1714899: Feature Request: Optional Change Note. Added a new
John Rouillard <rouilj@ieee.org>
parents: 5101
diff changeset
81 super(Password, self).__init__(required, default_value, quiet)
5053
9792b18e0b19 issue 2550880: Ability to choose password store scheme and SSHA support.
John Rouillard <rouilj@ieee.org>
parents: 4995
diff changeset
82 self.scheme = scheme
9792b18e0b19 issue 2550880: Ability to choose password store scheme and SSHA support.
John Rouillard <rouilj@ieee.org>
parents: 4995
diff changeset
83
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
84 def from_raw(self, value, **kw):
3668
a15c15510e99 hyperdb handling of empty raw values for Multilink and Password [SF#1507814]
Richard Jones <richard@users.sourceforge.net>
parents: 3635
diff changeset
85 if not value:
a15c15510e99 hyperdb handling of empty raw values for Multilink and Password [SF#1507814]
Richard Jones <richard@users.sourceforge.net>
parents: 3635
diff changeset
86 return None
4480
1613754d2646 Fix first part of Password handling security issue2550688
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4472
diff changeset
87 try:
5053
9792b18e0b19 issue 2550880: Ability to choose password store scheme and SSHA support.
John Rouillard <rouilj@ieee.org>
parents: 4995
diff changeset
88 return password.Password(encrypted=value, scheme=self.scheme, strict=True)
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5232
diff changeset
89 except password.PasswordValueError as message:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
90 raise HyperdbValueError(_('property %s: %s')%(kw['propname'], message))
4480
1613754d2646 Fix first part of Password handling security issue2550688
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4472
diff changeset
91
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
92 def sort_repr (self, cls, val, name):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
93 if not val:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
94 return val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
95 return str(val)
270
a4241ddd22d7 Added the Password property type.
Richard Jones <richard@users.sourceforge.net>
parents: 264
diff changeset
96
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
97 class Date(_Type):
224
ad2c98faec97 using isinstance(blah, Foo) now instead of isFooType
Richard Jones <richard@users.sourceforge.net>
parents: 214
diff changeset
98 """An object designating a Date property."""
5112
8901cc4ef0e0 - issue1714899: Feature Request: Optional Change Note. Added a new
John Rouillard <rouilj@ieee.org>
parents: 5101
diff changeset
99 def __init__(self, offset=None, required=False, default_value = None, quiet=False):
4481
9bbf3758c16a Allow default value declaration in DB schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4480
diff changeset
100 super(Date, self).__init__(required = required,
5112
8901cc4ef0e0 - issue1714899: Feature Request: Optional Change Note. Added a new
John Rouillard <rouilj@ieee.org>
parents: 5101
diff changeset
101 default_value = default_value,
8901cc4ef0e0 - issue1714899: Feature Request: Optional Change Note. Added a new
John Rouillard <rouilj@ieee.org>
parents: 5101
diff changeset
102 quiet=quiet)
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
103 self._offset = offset
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
104 def offset(self, db):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
105 if self._offset is not None:
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
106 return self._offset
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
107 return db.getUserTimezone()
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
108 def from_raw(self, value, db, **kw):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
109 try:
3621
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
110 value = date.Date(value, self.offset(db))
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5232
diff changeset
111 except ValueError as message:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
112 raise HyperdbValueError(_('property %s: %r is an invalid '\
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
113 'date (%s)')%(kw['propname'], value, message))
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
114 return value
3586
f47bddab5a49 date spec wasn't allowing week intervals
Richard Jones <richard@users.sourceforge.net>
parents: 3545
diff changeset
115 def range_from_raw(self, value, db):
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
116 """return Range value from given raw value with offset correction"""
3586
f47bddab5a49 date spec wasn't allowing week intervals
Richard Jones <richard@users.sourceforge.net>
parents: 3545
diff changeset
117 return date.Range(value, date.Date, offset=self.offset(db))
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
118 def sort_repr (self, cls, val, name):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
119 if not val:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
120 return val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
121 return str(val)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
122
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
123 class Interval(_Type):
224
ad2c98faec97 using isinstance(blah, Foo) now instead of isFooType
Richard Jones <richard@users.sourceforge.net>
parents: 214
diff changeset
124 """An object designating an Interval property."""
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
125 def from_raw(self, value, **kw):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
126 try:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
127 value = date.Interval(value)
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5232
diff changeset
128 except ValueError as message:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
129 raise HyperdbValueError(_('property %s: %r is an invalid '\
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
130 'date interval (%s)')%(kw['propname'], value, message))
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
131 return value
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
132 def sort_repr (self, cls, val, name):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
133 if not val:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
134 return val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
135 return val.as_seconds()
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
136
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
137 class _Pointer(_Type):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
138 """An object designating a Pointer property that links or multilinks
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
139 to a node in a specified class."""
4877
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
140 def __init__(self, classname, do_journal='yes', try_id_parsing='yes',
5063
2840a9e86ef2 New Link/Multilink attribute 'msg_header_property'
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5053
diff changeset
141 required=False, default_value=None,
5112
8901cc4ef0e0 - issue1714899: Feature Request: Optional Change Note. Added a new
John Rouillard <rouilj@ieee.org>
parents: 5101
diff changeset
142 msg_header_property = None, quiet=False):
4877
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
143 """ Default is to journal link and unlink events.
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
144 When try_id_parsing is false, we don't allow IDs in input
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
145 fields (the key of the Link or Multilink property must be
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
146 given instead). This is useful when the name of a property
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
147 can be numeric. It will only work if the linked item has a
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
148 key property and is a questionable feature for multilinks.
5063
2840a9e86ef2 New Link/Multilink attribute 'msg_header_property'
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5053
diff changeset
149 The msg_header_property is used in the mail gateway when
2840a9e86ef2 New Link/Multilink attribute 'msg_header_property'
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5053
diff changeset
150 sending out messages: By default roundup creates headers of
2840a9e86ef2 New Link/Multilink attribute 'msg_header_property'
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5053
diff changeset
151 the form: 'X-Roundup-issue-prop: value' for all properties
2840a9e86ef2 New Link/Multilink attribute 'msg_header_property'
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5053
diff changeset
152 prop of issue that have a 'name' property. This definition
2840a9e86ef2 New Link/Multilink attribute 'msg_header_property'
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5053
diff changeset
153 allows to override the 'name' property. A common use-case is
2840a9e86ef2 New Link/Multilink attribute 'msg_header_property'
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5053
diff changeset
154 adding a mail-header with the assigned_to property to allow
2840a9e86ef2 New Link/Multilink attribute 'msg_header_property'
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5053
diff changeset
155 user mail-filtering of issue-emails for which they're
2840a9e86ef2 New Link/Multilink attribute 'msg_header_property'
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5053
diff changeset
156 responsible. In that case setting
2840a9e86ef2 New Link/Multilink attribute 'msg_header_property'
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5053
diff changeset
157 'msg_header_property="username"' for the assigned_to
2840a9e86ef2 New Link/Multilink attribute 'msg_header_property'
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5053
diff changeset
158 property will generated message headers of the form:
2840a9e86ef2 New Link/Multilink attribute 'msg_header_property'
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5053
diff changeset
159 'X-Roundup-issue-assigned_to: joe_user'.
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
160 """
5112
8901cc4ef0e0 - issue1714899: Feature Request: Optional Change Note. Added a new
John Rouillard <rouilj@ieee.org>
parents: 5101
diff changeset
161 super(_Pointer, self).__init__(required, default_value, quiet)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
162 self.classname = classname
555
5fd94347c6f2 Journal entries for link and multilink properties can now be switched on or off.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 543
diff changeset
163 self.do_journal = do_journal == 'yes'
5063
2840a9e86ef2 New Link/Multilink attribute 'msg_header_property'
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5053
diff changeset
164 self.try_id_parsing = try_id_parsing == 'yes'
2840a9e86ef2 New Link/Multilink attribute 'msg_header_property'
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5053
diff changeset
165 self.msg_header_property = msg_header_property
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
166 def __repr__(self):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
167 """more useful for dumps. But beware: This is also used in schema
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
168 storage in SQL backends!
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
169 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
170 return '<%s.%s to "%s">'%(self.__class__.__module__,
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
171 self.__class__.__name__, self.classname)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
172
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
173 class Link(_Pointer):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
174 """An object designating a Link property that links to a
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
175 node in a specified class."""
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
176 def from_raw(self, value, db, propname, **kw):
4877
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
177 if (self.try_id_parsing and value == '-1') or not value:
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
178 value = None
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
179 else:
4877
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
180 if self.try_id_parsing:
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
181 value = convertLinkValue(db, propname, self, value)
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
182 else:
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
183 value = convertLinkValue(db, propname, self, value, None)
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
184 return value
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
185 def sort_repr (self, cls, val, name):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
186 if not val:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
187 return val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
188 op = cls.labelprop()
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
189 if op == 'id':
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
190 return int(cls.get(val, op))
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
191 return cls.get(val, op)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
192
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
193 class Multilink(_Pointer):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
194 """An object designating a Multilink property that links
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
195 to nodes in a specified class.
557
dfac856502d1 brief docco on the do_journal argument
Richard Jones <richard@users.sourceforge.net>
parents: 555
diff changeset
196
dfac856502d1 brief docco on the do_journal argument
Richard Jones <richard@users.sourceforge.net>
parents: 555
diff changeset
197 "classname" indicates the class to link to
dfac856502d1 brief docco on the do_journal argument
Richard Jones <richard@users.sourceforge.net>
parents: 555
diff changeset
198
dfac856502d1 brief docco on the do_journal argument
Richard Jones <richard@users.sourceforge.net>
parents: 555
diff changeset
199 "do_journal" indicates whether the linked-to nodes should have
dfac856502d1 brief docco on the do_journal argument
Richard Jones <richard@users.sourceforge.net>
parents: 555
diff changeset
200 'link' and 'unlink' events placed in their journal
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
201 """
4481
9bbf3758c16a Allow default value declaration in DB schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4480
diff changeset
202
5169
7b74a5addfea fix multilink support of try_id_parsing=no and add test for multilink cases.
John Rouillard <rouilj@ieee.org>
parents: 5112
diff changeset
203 def __init__(self, classname, do_journal = 'yes', required = False, quiet=False, try_id_parsing='yes'):
4481
9bbf3758c16a Allow default value declaration in DB schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4480
diff changeset
204
9bbf3758c16a Allow default value declaration in DB schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4480
diff changeset
205 super(Multilink, self).__init__(classname,
9bbf3758c16a Allow default value declaration in DB schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4480
diff changeset
206 do_journal,
9bbf3758c16a Allow default value declaration in DB schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4480
diff changeset
207 required = required,
5169
7b74a5addfea fix multilink support of try_id_parsing=no and add test for multilink cases.
John Rouillard <rouilj@ieee.org>
parents: 5112
diff changeset
208 default_value = [], quiet=quiet,
7b74a5addfea fix multilink support of try_id_parsing=no and add test for multilink cases.
John Rouillard <rouilj@ieee.org>
parents: 5112
diff changeset
209 try_id_parsing=try_id_parsing)
4481
9bbf3758c16a Allow default value declaration in DB schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4480
diff changeset
210
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
211 def from_raw(self, value, db, klass, propname, itemid, **kw):
3668
a15c15510e99 hyperdb handling of empty raw values for Multilink and Password [SF#1507814]
Richard Jones <richard@users.sourceforge.net>
parents: 3635
diff changeset
212 if not value:
a15c15510e99 hyperdb handling of empty raw values for Multilink and Password [SF#1507814]
Richard Jones <richard@users.sourceforge.net>
parents: 3635
diff changeset
213 return []
a15c15510e99 hyperdb handling of empty raw values for Multilink and Password [SF#1507814]
Richard Jones <richard@users.sourceforge.net>
parents: 3635
diff changeset
214
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
215 # get the current item value if it's not a new item
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
216 if itemid and not itemid.startswith('-'):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
217 curvalue = klass.get(itemid, propname)
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
218 else:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
219 curvalue = []
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
220
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
221 # if the value is a comma-separated string then split it now
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
222 if isinstance(value, type('')):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
223 value = value.split(',')
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
224
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
225 # handle each add/remove in turn
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
226 # keep an extra list for all items that are
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
227 # definitely in the new list (in case of e.g.
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
228 # <propname>=A,+B, which should replace the old
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
229 # list with A,B)
4089
eddb82d0964c Add compatibility package to allow us to deal with Python versions 2.3..2.6.
Richard Jones <richard@users.sourceforge.net>
parents: 4063
diff changeset
230 do_set = 1
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
231 newvalue = []
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
232 for item in value:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
233 item = item.strip()
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
234
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
235 # skip blanks
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
236 if not item: continue
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
237
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
238 # handle +/-
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
239 remove = 0
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
240 if item.startswith('-'):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
241 remove = 1
5069
2706b66675bf issue2550763 Strip whitespace from Multilink values after + or -.
John Rouillard <rouilj@ieee.org>
parents: 5067
diff changeset
242 item = item[1:].strip()
4089
eddb82d0964c Add compatibility package to allow us to deal with Python versions 2.3..2.6.
Richard Jones <richard@users.sourceforge.net>
parents: 4063
diff changeset
243 do_set = 0
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
244 elif item.startswith('+'):
5069
2706b66675bf issue2550763 Strip whitespace from Multilink values after + or -.
John Rouillard <rouilj@ieee.org>
parents: 5067
diff changeset
245 item = item[1:].strip()
4089
eddb82d0964c Add compatibility package to allow us to deal with Python versions 2.3..2.6.
Richard Jones <richard@users.sourceforge.net>
parents: 4063
diff changeset
246 do_set = 0
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
247
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
248 # look up the value
4877
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
249 if self.try_id_parsing:
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
250 itemid = convertLinkValue(db, propname, self, item)
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
251 else:
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
252 itemid = convertLinkValue(db, propname, self, item, None)
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
253
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
254 # perform the add/remove
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
255 if remove:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
256 try:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
257 curvalue.remove(itemid)
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
258 except ValueError:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
259 raise HyperdbValueError(_('property %s: %r is not ' \
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
260 'currently an element')%(propname, item))
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
261 else:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
262 newvalue.append(itemid)
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
263 if itemid not in curvalue:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
264 curvalue.append(itemid)
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
265
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
266 # that's it, set the new Multilink property value,
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
267 # or overwrite it completely
4089
eddb82d0964c Add compatibility package to allow us to deal with Python versions 2.3..2.6.
Richard Jones <richard@users.sourceforge.net>
parents: 4063
diff changeset
268 if do_set:
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
269 value = newvalue
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
270 else:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
271 value = curvalue
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
272
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
273 # TODO: one day, we'll switch to numeric ids and this will be
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
274 # unnecessary :(
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
275 value = [int(x) for x in value]
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
276 value.sort()
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
277 value = [str(x) for x in value]
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
278 return value
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
279
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
280 def sort_repr (self, cls, val, name):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
281 if not val:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
282 return val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
283 op = cls.labelprop()
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
284 if op == 'id':
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
285 return [int(cls.get(v, op)) for v in val]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
286 return [cls.get(v, op) for v in val]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
287
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
288 class Boolean(_Type):
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 858
diff changeset
289 """An object designating a boolean property"""
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
290 def from_raw(self, value, **kw):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
291 value = value.strip()
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
292 # checked is a common HTML checkbox value
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
293 value = value.lower() in ('checked', 'yes', 'true', 'on', '1')
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
294 return value
2603
5ccd99777869 fix metakit handling of filter on Link==None; fix some unit tests
Richard Jones <richard@users.sourceforge.net>
parents: 2571
diff changeset
295
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
296 class Number(_Type):
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 858
diff changeset
297 """An object designating a numeric property"""
5175
e1e40674a0bc Implement double-precision Number
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5169
diff changeset
298 def __init__(self, use_double = False, **kw):
e1e40674a0bc Implement double-precision Number
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5169
diff changeset
299 """ The value use_double tells the database backend to use a
e1e40674a0bc Implement double-precision Number
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5169
diff changeset
300 floating-point format with more precision than the default.
e1e40674a0bc Implement double-precision Number
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5169
diff changeset
301 Usually implemented by type 'double precision' in the sql
e1e40674a0bc Implement double-precision Number
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5169
diff changeset
302 backend. The default is to use single-precision float (aka
e1e40674a0bc Implement double-precision Number
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5169
diff changeset
303 'real') in the db. Note that sqlite already uses 8-byte for
e1e40674a0bc Implement double-precision Number
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5169
diff changeset
304 floating point numbers.
e1e40674a0bc Implement double-precision Number
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5169
diff changeset
305 """
e1e40674a0bc Implement double-precision Number
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5169
diff changeset
306 self.use_double = use_double
e1e40674a0bc Implement double-precision Number
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5169
diff changeset
307 super(Number, self).__init__(**kw)
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
308 def from_raw(self, value, **kw):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
309 value = value.strip()
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
310 try:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
311 value = float(value)
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
312 except ValueError:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
313 raise HyperdbValueError(_('property %s: %r is not a number')%(
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
314 kw['propname'], value))
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
315 return value
5067
e424987d294a Add support for an integer type to join the existing number type.
John Rouillard <rouilj@ieee.org>
parents: 5063
diff changeset
316
e424987d294a Add support for an integer type to join the existing number type.
John Rouillard <rouilj@ieee.org>
parents: 5063
diff changeset
317 class Integer(_Type):
e424987d294a Add support for an integer type to join the existing number type.
John Rouillard <rouilj@ieee.org>
parents: 5063
diff changeset
318 """An object designating an integer property"""
e424987d294a Add support for an integer type to join the existing number type.
John Rouillard <rouilj@ieee.org>
parents: 5063
diff changeset
319 def from_raw(self, value, **kw):
e424987d294a Add support for an integer type to join the existing number type.
John Rouillard <rouilj@ieee.org>
parents: 5063
diff changeset
320 value = value.strip()
e424987d294a Add support for an integer type to join the existing number type.
John Rouillard <rouilj@ieee.org>
parents: 5063
diff changeset
321 try:
e424987d294a Add support for an integer type to join the existing number type.
John Rouillard <rouilj@ieee.org>
parents: 5063
diff changeset
322 value = int(value)
e424987d294a Add support for an integer type to join the existing number type.
John Rouillard <rouilj@ieee.org>
parents: 5063
diff changeset
323 except ValueError:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
324 raise HyperdbValueError(_('property %s: %r is not an integer')%(
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
325 kw['propname'], value))
5067
e424987d294a Add support for an integer type to join the existing number type.
John Rouillard <rouilj@ieee.org>
parents: 5063
diff changeset
326 return value
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
327 #
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
328 # Support for splitting designators
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
329 #
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
330 class DesignatorError(ValueError):
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
331 pass
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
332 def splitDesignator(designator, dre=re.compile(r'([^\d]+)(\d+)')):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
333 """ Take a foo123 and return ('foo', 123)
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
334 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
335 m = dre.match(designator)
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
336 if m is None:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
337 raise DesignatorError(_('"%s" not a node designator')%designator)
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
338 return m.group(1), m.group(2)
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
339
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
340 class Proptree(object):
4935
adb8b787e157 Attempt to clarify hyperdb.Proptree meaning
anatoly techtonik <techtonik@gmail.com>
parents: 4877
diff changeset
341 """ Simple tree data structure for property lookup. Each node in
adb8b787e157 Attempt to clarify hyperdb.Proptree meaning
anatoly techtonik <techtonik@gmail.com>
parents: 4877
diff changeset
342 the tree is a roundup Class Property that has to be navigated to
adb8b787e157 Attempt to clarify hyperdb.Proptree meaning
anatoly techtonik <techtonik@gmail.com>
parents: 4877
diff changeset
343 find given property. The need_for attribute is used to mark nodes
adb8b787e157 Attempt to clarify hyperdb.Proptree meaning
anatoly techtonik <techtonik@gmail.com>
parents: 4877
diff changeset
344 that are used for sorting, searching or retrieval: The attribute
adb8b787e157 Attempt to clarify hyperdb.Proptree meaning
anatoly techtonik <techtonik@gmail.com>
parents: 4877
diff changeset
345 is a dictionary containing one or several of the values 'sort',
adb8b787e157 Attempt to clarify hyperdb.Proptree meaning
anatoly techtonik <techtonik@gmail.com>
parents: 4877
diff changeset
346 'search', 'retrieve'.
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
347
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
348 The Proptree is also used for transitively searching attributes for
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
349 backends that do not support transitive search (e.g. anydbm). The
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
350 _val attribute with set_val is used for this.
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
351 """
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
352
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
353 def __init__(self, db, cls, name, props, parent=None, retr=False):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
354 self.db = db
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
355 self.name = name
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
356 self.props = props
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
357 self.parent = parent
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
358 self._val = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
359 self.has_values = False
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
360 self.cls = cls
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
361 self.classname = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
362 self.uniqname = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
363 self.children = []
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
364 self.sortattr = []
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
365 self.propdict = {}
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
366 self.need_for = {'search' : True}
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
367 self.sort_direction = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
368 self.sort_ids = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
369 self.sort_ids_needed = False
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
370 self.sort_result = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
371 self.attr_sort_done = False
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
372 self.tree_sort_done = False
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
373 self.propclass = None
3695
01ea89743311 Add an attribute for sort-order fix in rdbms backends
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3687
diff changeset
374 self.orderby = []
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
375 self.sql_idx = None # index of retrieved column in sql result
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
376 if parent:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
377 self.root = parent.root
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
378 self.depth = parent.depth + 1
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
379 else:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
380 self.root = self
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
381 self.seqno = 1
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
382 self.depth = 0
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
383 self.need_for['sort'] = True
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
384 self.id = self.root.seqno
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
385 self.root.seqno += 1
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
386 if self.cls:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
387 self.classname = self.cls.classname
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
388 self.uniqname = '%s%s' % (self.cls.classname, self.id)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
389 if not self.parent:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
390 self.uniqname = self.cls.classname
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
391 if retr:
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
392 self.append_retr_props()
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
393
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
394 def append(self, name, need_for='search', retr=False):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
395 """Append a property to self.children. Will create a new
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
396 propclass for the child.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
397 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
398 if name in self.propdict:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
399 pt = self.propdict[name]
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
400 pt.need_for[need_for] = True
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
401 if retr and isinstance(pt.propclass, Link):
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
402 pt.append_retr_props()
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
403 return pt
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
404 propclass = self.props[name]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
405 cls = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
406 props = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
407 if isinstance(propclass, (Link, Multilink)):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
408 cls = self.db.getclass(propclass.classname)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
409 props = cls.getprops()
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
410 child = self.__class__(self.db, cls, name, props, parent = self)
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
411 child.need_for = {need_for : True}
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
412 child.propclass = propclass
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
413 self.children.append(child)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
414 self.propdict[name] = child
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
415 if retr and isinstance(child.propclass, Link):
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
416 child.append_retr_props()
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
417 return child
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
418
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
419 def append_retr_props(self):
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
420 """Append properties for retrieval."""
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
421 for name, prop in self.cls.getprops(protected=1).items():
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
422 if isinstance(prop, Multilink):
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
423 continue
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
424 self.append(name, need_for='retrieve')
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
425
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
426 def compute_sort_done(self, mlseen=False):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
427 """ Recursively check if attribute is needed for sorting
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
428 ('sort' in self.need_for) or all children have tree_sort_done set and
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
429 sort_ids_needed unset: set self.tree_sort_done if one of the conditions
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
430 holds. Also remove sort_ids_needed recursively once having seen a
4850
6998ad77841e Fix bug in SQL generation
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4687
diff changeset
431 Multilink that is used for sorting.
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
432 """
4850
6998ad77841e Fix bug in SQL generation
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4687
diff changeset
433 if isinstance (self.propclass, Multilink) and 'sort' in self.need_for:
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
434 mlseen = True
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
435 if mlseen:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
436 self.sort_ids_needed = False
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
437 self.tree_sort_done = True
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
438 for p in self.children:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
439 p.compute_sort_done(mlseen)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
440 if not p.tree_sort_done:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
441 self.tree_sort_done = False
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
442 if 'sort' not in self.need_for:
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
443 self.tree_sort_done = True
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
444 if mlseen:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
445 self.tree_sort_done = False
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
446
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
447 def ancestors(self):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
448 p = self
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
449 while p.parent:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
450 yield p
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
451 p = p.parent
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
452
5318
506c7ee9a385 Add a 'retired' parameter to Class.filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5315
diff changeset
453 def search(self, search_matches=None, sort=True, retired=False):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
454 """ Recursively search for the given properties in a proptree.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
455 Once all properties are non-transitive, the search generates a
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
456 simple _filter call which does the real work
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
457 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
458 filterspec = {}
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
459 for p in self.children:
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
460 if 'search' in p.need_for:
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
461 if p.children:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
462 p.search(sort = False)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
463 filterspec[p.name] = p.val
5318
506c7ee9a385 Add a 'retired' parameter to Class.filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5315
diff changeset
464 self.val = self.cls._filter(search_matches, filterspec, sort and self,
506c7ee9a385 Add a 'retired' parameter to Class.filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5315
diff changeset
465 retired=retired)
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
466 return self.val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
467
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
468 def sort (self, ids=None):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
469 """ Sort ids by the order information stored in self. With
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
470 optimisations: Some order attributes may be precomputed (by the
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
471 backend) and some properties may already be sorted.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
472 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
473 if ids is None:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
474 ids = self.val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
475 if self.sortattr and [s for s in self.sortattr if not s.attr_sort_done]:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
476 return self._searchsort(ids, True, True)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
477 return ids
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
478
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
479 def sortable_children(self, intermediate=False):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
480 """ All children needed for sorting. If intermediate is True,
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
481 intermediate nodes (not being a sort attribute) are returned,
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
482 too.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
483 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
484 return [p for p in self.children
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
485 if 'sort' in p.need_for and (intermediate or p.sort_direction)]
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
486
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
487 def __iter__(self):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
488 """ Yield nodes in depth-first order -- visited nodes first """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
489 for p in self.children:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
490 yield p
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
491 for c in p:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
492 yield c
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
493
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
494 def _get (self, ids):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
495 """Lookup given ids -- possibly a list of list. We recurse until
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
496 we have a list of ids.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
497 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
498 if not ids:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
499 return ids
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
500 if isinstance (ids[0], list):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
501 cids = [self._get(i) for i in ids]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
502 else:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
503 cids = [i and self.parent.cls.get(i, self.name) for i in ids]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
504 if self.sortattr:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
505 cids = [self._searchsort(i, False, True) for i in cids]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
506 return cids
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
507
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
508 def _searchsort(self, ids=None, update=True, dosort=True):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
509 """ Recursively compute the sort attributes. Note that ids
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
510 may be a deeply nested list of lists of ids if several
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
511 multilinks are encountered on the way from the root to an
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
512 individual attribute. We make sure that everything is properly
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
513 sorted on the way up. Note that the individual backend may
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
514 already have precomputed self.result or self.sort_ids. In this
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
515 case we do nothing for existing sa.result and recurse further if
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
516 self.sort_ids is available.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
517
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
518 Yech, Multilinks: This gets especially complicated if somebody
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
519 sorts by different attributes of the same multilink (or
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
520 transitively across several multilinks). My use-case is sorting
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
521 by issue.messages.author and (reverse) by issue.messages.date.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
522 In this case we sort the messages by author and date and use
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
523 this sorted list twice for sorting issues. This means that
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
524 issues are sorted by author and then by the time of the messages
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
525 *of this author*. Probably what the user intends in that case,
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
526 so we do *not* use two sorted lists of messages, one sorted by
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
527 author and one sorted by date for sorting issues.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
528 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
529 for pt in self.sortable_children(intermediate = True):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
530 # ids can be an empty list
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
531 if pt.tree_sort_done or not ids:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
532 continue
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
533 if pt.sort_ids: # cached or computed by backend
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
534 cids = pt.sort_ids
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
535 else:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
536 cids = pt._get(ids)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
537 if pt.sort_direction and not pt.sort_result:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
538 sortrep = pt.propclass.sort_repr
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
539 pt.sort_result = pt._sort_repr(sortrep, cids)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
540 pt.sort_ids = cids
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
541 if pt.children:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
542 pt._searchsort(cids, update, False)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
543 if self.sortattr and dosort:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
544 ids = self._sort(ids)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
545 if not update:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
546 for pt in self.sortable_children(intermediate = True):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
547 pt.sort_ids = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
548 for pt in self.sortattr:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
549 pt.sort_result = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
550 return ids
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
551
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
552 def _set_val(self, val):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
553 """Check if self._val is already defined. If yes, we compute the
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
554 intersection of the old and the new value(s)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
555 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
556 if self.has_values:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
557 v = self._val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
558 if not isinstance(self._val, type([])):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
559 v = [self._val]
4089
eddb82d0964c Add compatibility package to allow us to deal with Python versions 2.3..2.6.
Richard Jones <richard@users.sourceforge.net>
parents: 4063
diff changeset
560 vals = set(v)
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
561 vals.intersection_update(val)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
562 self._val = [v for v in vals]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
563 else:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
564 self._val = val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
565 self.has_values = True
3924
21d3d7eeea8c assorted pyflakes fixes
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3802
diff changeset
566
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
567 val = property(lambda self: self._val, _set_val)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
568
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
569 def _sort(self, val):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
570 """Finally sort by the given sortattr.sort_result. Note that we
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
571 do not sort by attrs having attr_sort_done set. The caller is
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
572 responsible for setting attr_sort_done only for trailing
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
573 attributes (otherwise the sort order is wrong). Since pythons
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
574 sort is stable, we can sort already sorted lists without
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
575 destroying the sort-order for items that compare equal with the
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
576 current sort.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
577
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
578 Sorting-Strategy: We sort repeatedly by different sort-keys from
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
579 right to left. Since pythons sort is stable, we can safely do
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
580 that. An optimisation is a "run-length encoding" of the
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
581 sort-directions: If several sort attributes sort in the same
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
582 direction we can combine them into a single sort. Note that
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
583 repeated sorting is probably more efficient than using
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
584 compare-methods in python due to the overhead added by compare
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
585 methods.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
586 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
587 if not val:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
588 return val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
589 sortattr = []
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
590 directions = []
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
591 dir_idx = []
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
592 idx = 0
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
593 curdir = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
594 for sa in self.sortattr:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
595 if sa.attr_sort_done:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
596 break
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
597 if sortattr:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
598 assert len(sortattr[0]) == len(sa.sort_result)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
599 sortattr.append (sa.sort_result)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
600 if curdir != sa.sort_direction:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
601 dir_idx.append (idx)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
602 directions.append (sa.sort_direction)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
603 curdir = sa.sort_direction
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
604 idx += 1
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
605 sortattr.append (val)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
606 sortattr = zip (*sortattr)
5397
f2c5e0f6506e Python 3 preparation: use list() around zip() as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5395
diff changeset
607 for dir, i in reversed(list(zip(directions, dir_idx))):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
608 rev = dir == '-'
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
609 sortattr = sorted (sortattr, key = lambda x:x[i:idx], reverse = rev)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
610 idx = i
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
611 return [x[-1] for x in sortattr]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
612
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
613 def _sort_repr(self, sortrep, ids):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
614 """Call sortrep for given ids -- possibly a list of list. We
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
615 recurse until we have a list of ids.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
616 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
617 if not ids:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
618 return ids
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
619 if isinstance (ids[0], list):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
620 res = [self._sort_repr(sortrep, i) for i in ids]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
621 else:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
622 res = [sortrep(self.cls, i, self.name) for i in ids]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
623 return res
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
624
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
625 def __repr__(self):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
626 r = ["proptree:" + self.name]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
627 for n in self:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
628 r.append("proptree:" + " " * n.depth + n.name)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
629 return '\n'.join(r)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
630 __str__ = __repr__
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
631
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
632 #
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
633 # the base Database class
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
634 #
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
635 class DatabaseError(ValueError):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
636 """Error to be raised when there is some problem in the database code
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
637 """
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
638 pass
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
639 class Database:
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
640 """A database for storing records containing flexible data types.
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
641
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
642 This class defines a hyperdatabase storage layer, which the Classes use to
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
643 store their data.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
644
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
645
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
646 Transactions
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
647 ------------
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
648 The Database should support transactions through the commit() and
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
649 rollback() methods. All other Database methods should be transaction-aware,
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
650 using data from the current transaction before looking up the database.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
651
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
652 An implementation must provide an override for the get() method so that the
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
653 in-database value is returned in preference to the in-transaction value.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
654 This is necessary to determine if any values have changed during a
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
655 transaction.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
656
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
657
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
658 Implementation
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
659 --------------
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
660
1926
3bdd34547fa7 Remove implementations of Class.getnode from back_anydbm and rdbms_common...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1905
diff changeset
661 All methods except __repr__ must be implemented by a concrete backend Database.
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
662
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
663 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
664
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
665 # flag to set on retired entries
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
666 RETIRED_FLAG = '__hyperdb_retired'
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
667
3491
0e5f15520e70 fix detection of "missing" existing values in CGI form parser [SF#1414149]
Richard Jones <richard@users.sourceforge.net>
parents: 3488
diff changeset
668 BACKEND_MISSING_STRING = None
0e5f15520e70 fix detection of "missing" existing values in CGI form parser [SF#1414149]
Richard Jones <richard@users.sourceforge.net>
parents: 3488
diff changeset
669 BACKEND_MISSING_NUMBER = None
0e5f15520e70 fix detection of "missing" existing values in CGI form parser [SF#1414149]
Richard Jones <richard@users.sourceforge.net>
parents: 3488
diff changeset
670 BACKEND_MISSING_BOOLEAN = None
0e5f15520e70 fix detection of "missing" existing values in CGI form parser [SF#1414149]
Richard Jones <richard@users.sourceforge.net>
parents: 3488
diff changeset
671
524
dce4c75bef5a changed all config accesses...
Richard Jones <richard@users.sourceforge.net>
parents: 490
diff changeset
672 def __init__(self, config, journaltag=None):
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
673 """Open a hyperdatabase given a specifier to some storage.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
674
524
dce4c75bef5a changed all config accesses...
Richard Jones <richard@users.sourceforge.net>
parents: 490
diff changeset
675 The 'storagelocator' is obtained from config.DATABASE.
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
676 The meaning of 'storagelocator' depends on the particular
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
677 implementation of the hyperdatabase. It could be a file name,
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
678 a directory path, a socket descriptor for a connection to a
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
679 database over the network, etc.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
680
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
681 The 'journaltag' is a token that will be attached to the journal
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
682 entries for any edits done on the database. If 'journaltag' is
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
683 None, the database is opened in read-only mode: the Class.create(),
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
684 Class.set(), and Class.retire() methods are disabled.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
685 """
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
686 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
687
825
0779ea9f1f18 More indexer work:
Richard Jones <richard@users.sourceforge.net>
parents: 805
diff changeset
688 def post_init(self):
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
689 """Called once the schema initialisation has finished.
1840
91a4619b1a14 hyperdb grows a refresh_database() method.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1780
diff changeset
690 If 'refresh' is true, we want to rebuild the backend
91a4619b1a14 hyperdb grows a refresh_database() method.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1780
diff changeset
691 structures.
91a4619b1a14 hyperdb grows a refresh_database() method.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1780
diff changeset
692 """
91a4619b1a14 hyperdb grows a refresh_database() method.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1780
diff changeset
693 raise NotImplementedError
91a4619b1a14 hyperdb grows a refresh_database() method.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1780
diff changeset
694
91a4619b1a14 hyperdb grows a refresh_database() method.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1780
diff changeset
695 def refresh_database(self):
91a4619b1a14 hyperdb grows a refresh_database() method.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1780
diff changeset
696 """Called to indicate that the backend should rebuild all tables
91a4619b1a14 hyperdb grows a refresh_database() method.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1780
diff changeset
697 and structures. Not called in normal usage."""
825
0779ea9f1f18 More indexer work:
Richard Jones <richard@users.sourceforge.net>
parents: 805
diff changeset
698 raise NotImplementedError
0779ea9f1f18 More indexer work:
Richard Jones <richard@users.sourceforge.net>
parents: 805
diff changeset
699
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
700 def __getattr__(self, classname):
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
701 """A convenient way of calling self.getclass(classname)."""
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
702 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
703
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
704 def addclass(self, cl):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
705 """Add a Class to the hyperdatabase.
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
706 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
707 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
708
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
709 def getclasses(self):
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
710 """Return a list of the names of all existing classes."""
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
711 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
712
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
713 def getclass(self, classname):
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
714 """Get the Class object representing a particular class.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
715
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
716 If 'classname' is not a valid class name, a KeyError is raised.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
717 """
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
718 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
719
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
720 def clear(self):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
721 """Delete all database contents.
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
722 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
723 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
724
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
725 def getclassdb(self, classname, mode='r'):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
726 """Obtain a connection to the class db that will be used for
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
727 multiple actions.
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
728 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
729 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
730
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
731 def addnode(self, classname, nodeid, node):
1928
7c1ddebe7589 Small readability improvements.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1927
diff changeset
732 """Add the specified node to its class's db.
7c1ddebe7589 Small readability improvements.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1927
diff changeset
733 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
734 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
735
676
bc46480e2a2b Fixed serialisation problem...
Richard Jones <richard@users.sourceforge.net>
parents: 657
diff changeset
736 def serialise(self, classname, node):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
737 """Copy the node contents, converting non-marshallable data into
676
bc46480e2a2b Fixed serialisation problem...
Richard Jones <richard@users.sourceforge.net>
parents: 657
diff changeset
738 marshallable data.
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
739 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
740 return node
676
bc46480e2a2b Fixed serialisation problem...
Richard Jones <richard@users.sourceforge.net>
parents: 657
diff changeset
741
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
742 def setnode(self, classname, nodeid, node):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
743 """Change the specified node.
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
744 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
745 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
746
676
bc46480e2a2b Fixed serialisation problem...
Richard Jones <richard@users.sourceforge.net>
parents: 657
diff changeset
747 def unserialise(self, classname, node):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
748 """Decode the marshalled node data
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
749 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
750 return node
676
bc46480e2a2b Fixed serialisation problem...
Richard Jones <richard@users.sourceforge.net>
parents: 657
diff changeset
751
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
752 def getnode(self, classname, nodeid):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
753 """Get a node from the database.
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
754
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
755 'cache' exists for backwards compatibility, and is not used.
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
756 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
757 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
758
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
759 def hasnode(self, classname, nodeid):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
760 """Determine if the database has a given node.
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
761 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
762 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
763
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
764 def countnodes(self, classname):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
765 """Count the number of nodes that exist for a particular Class.
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
766 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
767 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
768
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
769 def storefile(self, classname, nodeid, property, content):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
770 """Store the content of the file in the database.
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
771
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
772 The property may be None, in which case the filename does not
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
773 indicate which property is being saved.
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
774 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
775 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
776
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
777 def getfile(self, classname, nodeid, property):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
778 """Get the content of the file in the database.
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
779 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
780 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
781
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
782 def addjournal(self, classname, nodeid, action, params):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
783 """ Journal the Action
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
784 'action' may be:
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
785
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
786 'set' -- 'params' is a dictionary of property values
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
787 'create' -- 'params' is an empty dictionary as of
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
788 Wed Nov 06 11:38:43 2002 +0000
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
789 'link' or 'unlink' -- 'params' is (classname, nodeid, propname)
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
790 'retired' or 'restored'-- 'params' is None
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
791 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
792 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
793
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
794 def getjournal(self, classname, nodeid):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
795 """ get the journal for id
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
796 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
797 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
798
562
62febbd7ffec You can now use the roundup-admin tool to pack the database
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 557
diff changeset
799 def pack(self, pack_before):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
800 """ pack the database
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
801 """
562
62febbd7ffec You can now use the roundup-admin tool to pack the database
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 557
diff changeset
802 raise NotImplementedError
62febbd7ffec You can now use the roundup-admin tool to pack the database
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 557
diff changeset
803
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
804 def commit(self):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
805 """ Commit the current transactions.
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
806
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
807 Save all data changed since the database was opened or since the
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
808 last commit() or rollback().
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
809 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
810 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
811
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
812 def rollback(self):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
813 """ Reverse all actions from the current transaction.
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
814
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
815 Undo all the changes made since the database was opened or the last
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
816 commit() or rollback() was performed.
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
817 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
818 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
819
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
820 def close(self):
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
821 """Close the database.
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
822
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
823 This method must be called at the end of processing.
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
824
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
825 """
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
826
4306
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
827 def iter_roles(roles):
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
828 ''' handle the text processing of turning the roles list
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
829 into something python can use more easily
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
830 '''
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
831 if not roles or not roles.strip():
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
832 raise StopIteration("Empty roles given")
4306
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
833 for role in [x.lower().strip() for x in roles.split(',')]:
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
834 yield role
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
835
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
836
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
837 #
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
838 # The base Class class
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
839 #
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
840 class Class:
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
841 """ The handle to a particular class of nodes in a hyperdatabase.
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
842
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
843 All methods except __repr__ and getnode must be implemented by a
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
844 concrete backend Class.
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
845 """
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
846
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
847 def __init__(self, db, classname, **properties):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
848 """Create a new class with a given name and property specification.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
849
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
850 'classname' must not collide with the name of an existing class,
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
851 or a ValueError is raised. The keyword arguments in 'properties'
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
852 must map names to property objects, or a TypeError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
853 """
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
854 for name in 'creation activity creator actor'.split():
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
855 if name in properties:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
856 raise ValueError('"creation", "activity", "creator" and '\
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
857 '"actor" are reserved')
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
858
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
859 self.classname = classname
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
860 self.properties = properties
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
861 self.db = weakref.proxy(db) # use a weak ref to avoid circularity
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
862 self.key = ''
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
863
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
864 # should we journal changes (default yes)
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
865 self.do_journal = 1
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
866
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
867 # do the db-related init stuff
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
868 db.addclass(self)
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
869
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
870 actions = "create set retire restore".split()
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
871 self.auditors = dict([(a, PrioList()) for a in actions])
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
872 self.reactors = dict([(a, PrioList()) for a in actions])
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
873
452
7181efddce66 yuck, a gdbm instance tests false :(
Richard Jones <richard@users.sourceforge.net>
parents: 431
diff changeset
874 def __repr__(self):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
875 """Slightly more useful representation
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
876 """
993
07f88a837450 turn on journalling of links by default
Richard Jones <richard@users.sourceforge.net>
parents: 940
diff changeset
877 return '<hyperdb.Class "%s">'%self.classname
452
7181efddce66 yuck, a gdbm instance tests false :(
Richard Jones <richard@users.sourceforge.net>
parents: 431
diff changeset
878
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
879 # Editing nodes:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
880
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
881 def create(self, **propvalues):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
882 """Create a new node of this class and return its id.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
883
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
884 The keyword arguments in 'propvalues' map property names to values.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
885
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
886 The values of arguments must be acceptable for the types of their
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
887 corresponding properties or a TypeError is raised.
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
888
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
889 If this class has a key property, it must be present and its value
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
890 must not collide with other key strings or a ValueError is raised.
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
891
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
892 Any other properties on this class that are missing from the
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
893 'propvalues' dictionary are set to None.
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
894
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
895 If an id in a link or multilink property does not refer to a valid
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
896 node, an IndexError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
897 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
898 raise NotImplementedError
775
4409798dfa15 Can debug to stdout now
Richard Jones <richard@users.sourceforge.net>
parents: 764
diff changeset
899
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
900 _marker = []
475
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 466
diff changeset
901 def get(self, nodeid, propname, default=_marker, cache=1):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
902 """Get the value of a property on an existing node of this class.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
903
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
904 'nodeid' must be the id of an existing node of this class or an
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
905 IndexError is raised. 'propname' must be the name of a property
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
906 of this class or a KeyError is raised.
475
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 466
diff changeset
907
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
908 'cache' exists for backwards compatibility, and is not used.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
909 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
910 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
911
1926
3bdd34547fa7 Remove implementations of Class.getnode from back_anydbm and rdbms_common...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1905
diff changeset
912 # not in spec
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
913 def getnode(self, nodeid):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
914 """ Return a convenience wrapper for the node.
475
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 466
diff changeset
915
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 466
diff changeset
916 'nodeid' must be the id of an existing node of this class or an
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 466
diff changeset
917 IndexError is raised.
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 466
diff changeset
918
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
919 'cache' exists for backwards compatibility, and is not used.
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
920 """
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
921 return Node(self, nodeid)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
922
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
923 def getnodeids(self, retired=None):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
924 """Retrieve all the ids of the nodes for a particular Class.
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
925 """
1864
969a14faf707 Fixed "documentation" of getnodeids in roundup.hyperdb
Richard Jones <richard@users.sourceforge.net>
parents: 1840
diff changeset
926 raise NotImplementedError
969a14faf707 Fixed "documentation" of getnodeids in roundup.hyperdb
Richard Jones <richard@users.sourceforge.net>
parents: 1840
diff changeset
927
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
928 def set(self, nodeid, **propvalues):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
929 """Modify a property on an existing node of this class.
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
930
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
931 'nodeid' must be the id of an existing node of this class or an
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
932 IndexError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
933
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
934 Each key in 'propvalues' must be the name of a property of this
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
935 class or a KeyError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
936
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
937 All values in 'propvalues' must be acceptable types for their
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
938 corresponding properties or a TypeError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
939
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
940 If the value of the key property is set, it must not collide with
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
941 other key strings or a ValueError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
942
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
943 If the value of a Link or Multilink property contains an invalid
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
944 node id, a ValueError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
945 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
946 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
947
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
948 def retire(self, nodeid):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
949 """Retire a node.
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
950
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
951 The properties on the node remain available from the get() method,
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
952 and the node's id is never reused.
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
953
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
954 Retired nodes are not returned by the find(), list(), or lookup()
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
955 methods, and other nodes may reuse the values of their key properties.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
956 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
957 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
958
1523
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1470
diff changeset
959 def restore(self, nodeid):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
960 """Restpre a retired node.
1523
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1470
diff changeset
961
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1470
diff changeset
962 Make node available for all operations like it was before retirement.
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
963 """
1523
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1470
diff changeset
964 raise NotImplementedError
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
965
940
301a02ea6020 added is_retired query to Class
Richard Jones <richard@users.sourceforge.net>
parents: 910
diff changeset
966 def is_retired(self, nodeid):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
967 """Return true if the node is rerired
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
968 """
940
301a02ea6020 added is_retired query to Class
Richard Jones <richard@users.sourceforge.net>
parents: 910
diff changeset
969 raise NotImplementedError
301a02ea6020 added is_retired query to Class
Richard Jones <richard@users.sourceforge.net>
parents: 910
diff changeset
970
894
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
971 def destroy(self, nodeid):
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
972 """Destroy a node.
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
973
894
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
974 WARNING: this method should never be used except in extremely rare
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
975 situations where there could never be links to the node being
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
976 deleted
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
977
894
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
978 WARNING: use retire() instead
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
979
894
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
980 WARNING: the properties of this node will not be available ever again
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
981
894
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
982 WARNING: really, use retire() instead
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
983
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
984 Well, I think that's enough warnings. This method exists mostly to
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
985 support the session storage of the cgi interface.
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
986
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
987 The node is completely removed from the hyperdb, including all journal
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
988 entries. It will no longer be available, and will generally break code
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
989 if there are any references to the node.
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
990 """
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
991
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
992 def history(self, nodeid, enforceperm=True, skipquiet=True):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
993 """Retrieve the journal of edits on a particular node.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
994
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
995 'nodeid' must be the id of an existing node of this class or an
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
996 IndexError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
997
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
998 The returned list contains tuples of the form
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
999
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1000 (date, tag, action, params)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1001
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1002 'date' is a Timestamp object specifying the time of the change and
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1003 'tag' is the journaltag specified when the database was opened.
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1004
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1005 If the property to be displayed is a quiet property, it will
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1006 not be shown. This can be disabled by setting skipquiet=False.
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1007
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1008 If the user requesting the history does not have View access
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1009 to the property, the journal entry will not be shown. This can
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1010 be disabled by setting enforceperm=False.
5315
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1011
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1012 Note that there is a check for obsolete properties and classes
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1013 resulting from history changes. These are also only checked if
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1014 enforceperm is True.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1015 """
4483
22bc0426e348 Second patch from issue2550688 -- with some changes:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4481
diff changeset
1016 if not self.do_journal:
22bc0426e348 Second patch from issue2550688 -- with some changes:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4481
diff changeset
1017 raise ValueError('Journalling is disabled for this class')
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1018
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1019 perm = self.db.security.hasPermission
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1020 journal = []
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1021
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1022 uid=self.db.getuid() # id of the person requesting the history
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1023
5315
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1024 # Roles of the user and the configured obsolete_history_roles
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1025 hr = set(iter_roles(self.db.config.OBSOLETE_HISTORY_ROLES))
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1026 ur = set(self.db.user.get_roles(uid))
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1027 allow_obsolete = bool(hr & ur)
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1028
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1029 for j in self.db.getjournal(self.classname, nodeid):
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1030 # hide/remove journal entry if:
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1031 # property is quiet
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1032 # property is not (viewable or editable)
5315
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1033 # property is obsolete and not allow_obsolete
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1034 id, evt_date, user, action, args = j
5261
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1035 if logger.isEnabledFor(logging.DEBUG):
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1036 j_repr = "%s"%(j,)
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1037 else:
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1038 j_repr=''
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1039 if args and type(args) == type({}):
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1040 for key in args.keys():
5315
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1041 if key not in self.properties :
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1042 if enforceperm and not allow_obsolete:
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1043 del j[4][key]
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1044 continue
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1045 if skipquiet and self.properties[key].quiet:
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1046 logger.debug("skipping quiet property"
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1047 " %s::%s in %s",
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1048 self.classname, key, j_repr)
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1049 del j[4][key]
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1050 continue
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1051 if enforceperm and not ( perm("View",
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1052 uid,
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1053 self.classname,
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1054 property=key ) or perm("Edit",
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1055 uid,
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1056 self.classname,
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1057 property=key )):
5315
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1058 logger.debug("skipping unaccessible property "
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1059 "%s::%s seen by user%s in %s",
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1060 self.classname, key, uid, j_repr)
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1061 del j[4][key]
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1062 continue
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1063 if not args:
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1064 logger.debug("Omitting journal entry for %s%s"
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1065 " all props removed in: %s",
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1066 self.classname, nodeid, j_repr)
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1067 continue
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1068 journal.append(j)
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1069 elif action in ['link', 'unlink' ] and type(args) == type(()):
5261
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1070 # definitions:
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1071 # myself - object whose history is being filtered
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1072 # linkee - object/class whose property is changing to
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1073 # include/remove myself
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1074 # link property - property of the linkee class that is changing
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1075 #
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1076 # Remove the history item if
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1077 # linkee.link property (key) is quiet
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1078 # linkee class.link property is not (viewable or editable)
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1079 # to user
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1080 # [ should linkee object.link property is not
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1081 # (viewable or editable) to user be included?? ]
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1082 # linkee object (linkcl, linkid) is not
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1083 # (viewable or editable) to user
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1084 if len(args) == 3:
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1085 # e.g. for issue3 blockedby adds link to issue5 with:
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1086 # j = id, evt_date, user, action, args
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1087 # 3|20170528045201.484|5|link|('issue', '5', 'blockedby')
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1088 linkcl, linkid, key = args
5315
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1089 cls = None
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1090 try:
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1091 cls = self.db.getclass(linkcl)
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1092 except KeyError:
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1093 pass
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1094 # obsolete property or class
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1095 if not cls or key not in cls.properties:
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1096 if not enforceperm or allow_obsolete:
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1097 journal.append(j)
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1098 continue
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1099 # is the updated property quiet?
5261
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1100 if skipquiet and cls.properties[key].quiet:
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1101 logger.debug("skipping quiet property: "
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1102 "%s %sed %s%s",
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1103 j_repr, action, self.classname, nodeid)
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1104 continue
5261
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1105 # can user view the property in linkee class
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1106 if enforceperm and not (perm("View",
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1107 uid,
5261
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1108 linkcl,
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1109 property=key) or perm("Edit",
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1110 uid,
5261
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1111 linkcl,
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1112 property=key)):
5261
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1113 logger.debug("skipping unaccessible property: "
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1114 "%s with uid %s %sed %s%s",
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1115 j_repr, uid, action,
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1116 self.classname, nodeid)
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1117 continue
5261
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1118 # check access to linkee object
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1119 if enforceperm and not (perm("View",
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1120 uid,
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1121 cls.classname,
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1122 itemid=linkid) or perm("Edit",
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1123 uid,
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1124 cls.classname,
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1125 itemid=linkid)):
5261
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1126 logger.debug("skipping unaccessible object: "
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1127 "%s uid %s %sed %s%s",
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1128 j_repr, uid, action,
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1129 self.classname, nodeid)
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1130 continue
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1131 journal.append(j)
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1132 else:
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1133 logger.error("Invalid %s journal entry for %s%s: %s",
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1134 action, self.classname, nodeid, j)
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1135 elif action in ['create', 'retired', 'restored']:
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1136 journal.append(j)
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1137 else:
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1138 logger.warning("Possibly malformed journal for %s%s %s",
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1139 self.classname, nodeid, j)
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1140 return journal
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1141
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1142 # Locating nodes:
627
952679be9e2c Added simple editing for classes that don't define a templated interface.
Richard Jones <richard@users.sourceforge.net>
parents: 618
diff changeset
1143 def hasnode(self, nodeid):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1144 """Determine if the given nodeid actually exists
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1145 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1146 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1147
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1148 def setkey(self, propname):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1149 """Select a String property of this class to be the key property.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1150
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1151 'propname' must be the name of a String property of this class or
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1152 None, or a TypeError is raised. The values of the key property on
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1153 all existing nodes must be unique or a ValueError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1154 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1155 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1156
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1157 def setlabelprop(self, labelprop):
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1158 """Set the label property. Used for override of labelprop
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1159 resolution order.
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1160 """
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1161 if labelprop not in self.getprops():
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
1162 raise ValueError(_("Not a property name: %s") % labelprop)
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1163 self._labelprop = labelprop
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1164
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1165 def setorderprop(self, orderprop):
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1166 """Set the order property. Used for override of orderprop
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1167 resolution order
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1168 """
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1169 if orderprop not in self.getprops():
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
1170 raise ValueError(_("Not a property name: %s") % orderprop)
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1171 self._orderprop = orderprop
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1172
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1173 def getkey(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1174 """Return the name of the key property for this class or None."""
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1175 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1176
188
1536be43d2fa Roundupdb now appends "mailing list" information to its messages...
Richard Jones <richard@users.sourceforge.net>
parents: 172
diff changeset
1177 def labelprop(self, default_to_id=0):
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1178 """Return the property name for a label for the given node.
123
51cce9671db0 Cleanup of the link label generation.
Richard Jones <richard@users.sourceforge.net>
parents: 118
diff changeset
1179
51cce9671db0 Cleanup of the link label generation.
Richard Jones <richard@users.sourceforge.net>
parents: 118
diff changeset
1180 This method attempts to generate a consistent label for the node.
51cce9671db0 Cleanup of the link label generation.
Richard Jones <richard@users.sourceforge.net>
parents: 118
diff changeset
1181 It tries the following in order:
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1182
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1183 0. self._labelprop if set
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1184 1. key property
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1185 2. "name" property
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1186 3. "title" property
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1187 4. first property from the sorted property name list
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1188 """
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1189 if hasattr(self, '_labelprop'):
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1190 return self._labelprop
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1191 k = self.getkey()
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1192 if k:
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1193 return k
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1194 props = self.getprops()
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
1195 if 'name' in props:
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1196 return 'name'
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
1197 elif 'title' in props:
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1198 return 'title'
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1199 if default_to_id:
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1200 return 'id'
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
1201 props = sorted(props.keys())
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1202 return props[0]
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1203
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1204 def orderprop(self):
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1205 """Return the property name to use for sorting for the given node.
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1206
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1207 This method computes the property for sorting.
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1208 It tries the following in order:
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1209
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1210 0. self._orderprop if set
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1211 1. "order" property
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1212 2. self.labelprop()
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1213 """
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1214
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1215 if hasattr(self, '_orderprop'):
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1216 return self._orderprop
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1217 props = self.getprops()
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
1218 if 'order' in props:
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1219 return 'order'
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1220 return self.labelprop()
123
51cce9671db0 Cleanup of the link label generation.
Richard Jones <richard@users.sourceforge.net>
parents: 118
diff changeset
1221
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1222 def lookup(self, keyvalue):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1223 """Locate a particular node by its key property and return its id.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1224
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1225 If this class has no key property, a TypeError is raised. If the
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1226 'keyvalue' matches one of the values for the key property among
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1227 the nodes in this class, the matching node's id is returned;
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1228 otherwise a KeyError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1229 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1230 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1231
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1232 def find(self, **propspec):
834
568eed5fb4fd Optimize Class.find so that the propspec can contain a set of ids to match.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 825
diff changeset
1233 """Get the ids of nodes in this class which link to the given nodes.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1234
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
1235 'propspec' consists of keyword args propname={nodeid:1,}
883
Richard Jones <richard@users.sourceforge.net>
parents: 880
diff changeset
1236 'propname' must be the name of a property in this class, or a
Richard Jones <richard@users.sourceforge.net>
parents: 880
diff changeset
1237 KeyError is raised. That property must be a Link or Multilink
Richard Jones <richard@users.sourceforge.net>
parents: 880
diff changeset
1238 property, or a TypeError is raised.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1239
834
568eed5fb4fd Optimize Class.find so that the propspec can contain a set of ids to match.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 825
diff changeset
1240 Any node in this class whose 'propname' property links to any of the
568eed5fb4fd Optimize Class.find so that the propspec can contain a set of ids to match.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 825
diff changeset
1241 nodeids will be returned. Used by the full text indexing, which knows
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1242 that "foo" occurs in msg1, msg3 and file7, so we have hits on these
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1243 issues:
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1244
834
568eed5fb4fd Optimize Class.find so that the propspec can contain a set of ids to match.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 825
diff changeset
1245 db.issue.find(messages={'1':1,'3':1}, files={'7':1})
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1246 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1247 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1248
3634
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1249 def _filter(self, search_matches, filterspec, sort=(None,None),
5318
506c7ee9a385 Add a 'retired' parameter to Class.filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5315
diff changeset
1250 group=(None,None), retired=False):
3634
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1251 """For some backends this implements the non-transitive
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1252 search, for more information see the filter method.
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1253 """
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1254 raise NotImplementedError
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1255
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1256 def _proptree(self, filterspec, sortattr=[], retr=False):
3634
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1257 """Build a tree of all transitive properties in the given
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1258 filterspec.
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1259 If we retrieve (retr is True) linked items we don't follow
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1260 across multilinks. We also don't follow if the searched value
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1261 can contain NULL values.
3634
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1262 """
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1263 proptree = Proptree(self.db, self, '', self.getprops(), retr=retr)
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
1264 for key, v in filterspec.items():
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1265 keys = key.split('.')
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1266 p = proptree
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1267 mlseen = False
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1268 for k in keys:
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1269 if isinstance (p.propclass, Multilink):
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1270 mlseen = True
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1271 isnull = v == '-1' or v is None
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1272 nullin = isinstance(v, type([])) and ('-1' in v or None in v)
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1273 r = retr and not mlseen and not isnull and not nullin
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1274 p = p.append(k, retr=r)
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1275 p.val = v
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1276 multilinks = {}
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1277 for s in sortattr:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1278 keys = s[1].split('.')
3634
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1279 p = proptree
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1280 mlseen = False
3635
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1281 for k in keys:
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1282 if isinstance (p.propclass, Multilink):
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1283 mlseen = True
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1284 r = retr and not mlseen
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1285 p = p.append(k, need_for='sort', retr=r)
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1286 if isinstance (p.propclass, Multilink):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1287 multilinks[p] = True
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1288 if p.cls:
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1289 p = p.append(p.cls.orderprop(), need_for='sort')
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1290 if p.sort_direction: # if an orderprop is also specified explicitly
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1291 continue
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1292 p.sort_direction = s[0]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1293 proptree.sortattr.append (p)
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
1294 for p in multilinks.keys():
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1295 sattr = {}
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1296 for c in p:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1297 if c.sort_direction:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1298 sattr [c] = True
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1299 for sa in proptree.sortattr:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1300 if sa in sattr:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1301 p.sortattr.append (sa)
3634
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1302 return proptree
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1303
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1304 def get_transitive_prop(self, propname_path, default = None):
3635
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1305 """Expand a transitive property (individual property names
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1306 separated by '.' into a new property at the end of the path. If
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1307 one of the names does not refer to a valid property, we return
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1308 None.
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1309 Example propname_path (for class issue): "messages.author"
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1310 """
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1311 props = self.db.getclass(self.classname).getprops()
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1312 for k in propname_path.split('.'):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1313 try:
3635
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1314 prop = props[k]
4408
06af6d5bedbe fix for incorrect except: syntax, issue2550661
Richard Jones <richard@users.sourceforge.net>
parents: 4306
diff changeset
1315 except (KeyError, TypeError):
3635
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1316 return default
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1317 cl = getattr(prop, 'classname', None)
3635
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1318 props = None
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1319 if cl:
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1320 props = self.db.getclass(cl).getprops()
3635
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1321 return prop
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1322
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1323 def _sortattr(self, sort=[], group=[]):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1324 """Build a single list of sort attributes in the correct order
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1325 with sanity checks (no duplicate properties) included. Always
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1326 sort last by id -- if id is not already in sortattr.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1327 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1328 seen = {}
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1329 sortattr = []
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1330 for srt in group, sort:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1331 if not isinstance(srt, list):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1332 srt = [srt]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1333 for s in srt:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1334 if s[1] and s[1] not in seen:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1335 sortattr.append((s[0] or '+', s[1]))
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1336 seen[s[1]] = True
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1337 if 'id' not in seen :
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1338 sortattr.append(('+', 'id'))
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1339 return sortattr
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1340
5318
506c7ee9a385 Add a 'retired' parameter to Class.filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5315
diff changeset
1341 def filter(self, search_matches, filterspec, sort=[], group=[],
506c7ee9a385 Add a 'retired' parameter to Class.filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5315
diff changeset
1342 retired=False):
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1343 """Return a list of the ids of the active nodes in this class that
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1344 match the 'filter' spec, sorted by the group spec and then the
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1345 sort spec.
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1346
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1347 "filterspec" is {propname: value(s)}
1249
6c24a86a12ae Fixes for SourceForge tracker bugs.
Richard Jones <richard@users.sourceforge.net>
parents: 1244
diff changeset
1348
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1349 "sort" and "group" are [(dir, prop), ...] where dir is '+', '-'
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1350 or None and prop is a prop name or None. Note that for
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1351 backward-compatibility reasons a single (dir, prop) tuple is
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1352 also allowed.
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1353
4048
7ad0918ee8bd Clarify 'search_matches' docs.
Stefan Seefeld <stefan@seefeld.name>
parents: 4044
diff changeset
1354 "search_matches" is a container type
1249
6c24a86a12ae Fixes for SourceForge tracker bugs.
Richard Jones <richard@users.sourceforge.net>
parents: 1244
diff changeset
1355
3455
e01bc6d65fa9 fixed documentation of filter()...
Richard Jones <richard@users.sourceforge.net>
parents: 3399
diff changeset
1356 The filter must match all properties specificed. If the property
e01bc6d65fa9 fixed documentation of filter()...
Richard Jones <richard@users.sourceforge.net>
parents: 3399
diff changeset
1357 value to match is a list:
e01bc6d65fa9 fixed documentation of filter()...
Richard Jones <richard@users.sourceforge.net>
parents: 3399
diff changeset
1358
e01bc6d65fa9 fixed documentation of filter()...
Richard Jones <richard@users.sourceforge.net>
parents: 3399
diff changeset
1359 1. String properties must match all elements in the list, and
e01bc6d65fa9 fixed documentation of filter()...
Richard Jones <richard@users.sourceforge.net>
parents: 3399
diff changeset
1360 2. Other properties must match any of the elements in the list.
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1361
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1362 Note that now the propname in filterspec and prop in a
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1363 sort/group spec may be transitive, i.e., it may contain
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1364 properties of the form link.link.link.name, e.g. you can search
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1365 for all issues where a message was added by a certain user in
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1366 the last week with a filterspec of
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1367 {'messages.author' : '42', 'messages.creation' : '.-1w;'}
3924
21d3d7eeea8c assorted pyflakes fixes
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3802
diff changeset
1368
3634
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1369 Implementation note:
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1370 This implements a non-optimized version of Transitive search
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1371 using _filter implemented in a backend class. A more efficient
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1372 version can be implemented in the individual backends -- e.g.,
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1373 an SQL backend will want to create a single SQL statement and
3634
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1374 override the filter method instead of implementing _filter.
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1375 """
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1376 sortattr = self._sortattr(sort = sort, group = group)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1377 proptree = self._proptree(filterspec, sortattr)
5318
506c7ee9a385 Add a 'retired' parameter to Class.filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5315
diff changeset
1378 proptree.search(search_matches, retired=retired)
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1379 return proptree.sort()
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1380
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1381 # non-optimized filter_iter, a backend may chose to implement a
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1382 # better version that provides a real iterator that pre-fills the
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1383 # cache for each id returned. Note that the filter_iter doesn't
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1384 # promise to correctly sort by multilink (which isn't sane to do
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1385 # anyway).
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1386 filter_iter = filter
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1387
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1388 def count(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1389 """Get the number of nodes in this class.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1390
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1391 If the returned integer is 'numnodes', the ids of all the nodes
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1392 in this class run from 1 to numnodes, and numnodes+1 will be the
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1393 id of the next node to be created in this class.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1394 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1395 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1396
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1397 # Manipulating properties:
262
ab921dc53ccd Added nicer command-line item adding:
Richard Jones <richard@users.sourceforge.net>
parents: 236
diff changeset
1398 def getprops(self, protected=1):
ab921dc53ccd Added nicer command-line item adding:
Richard Jones <richard@users.sourceforge.net>
parents: 236
diff changeset
1399 """Return a dictionary mapping property names to property objects.
ab921dc53ccd Added nicer command-line item adding:
Richard Jones <richard@users.sourceforge.net>
parents: 236
diff changeset
1400 If the "protected" flag is true, we include protected properties -
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1401 those which may not be modified.
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1402 """
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1403 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1404
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1405 def get_required_props(self, propnames = []):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1406 """Return a dict of property names mapping to property objects.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1407 All properties that have the "required" flag set will be
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1408 returned in addition to all properties in the propnames
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1409 parameter.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1410 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1411 props = self.getprops(protected = False)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1412 pdict = dict([(p, props[p]) for p in propnames])
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
1413 pdict.update([(k, v) for k, v in props.items() if v.required])
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1414 return pdict
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1415
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1416 def addprop(self, **properties):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1417 """Add properties to this class.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1418
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1419 The keyword arguments in 'properties' must map names to property
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1420 objects, or a TypeError is raised. None of the keys in 'properties'
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1421 may collide with the names of existing properties, or a ValueError
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1422 is raised before any properties have been added.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1423 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1424 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1425
825
0779ea9f1f18 More indexer work:
Richard Jones <richard@users.sourceforge.net>
parents: 805
diff changeset
1426 def index(self, nodeid):
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1427 """Add (or refresh) the node to search indexes"""
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1428 raise NotImplementedError
825
0779ea9f1f18 More indexer work:
Richard Jones <richard@users.sourceforge.net>
parents: 805
diff changeset
1429
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1430 #
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1431 # Detector interface
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1432 #
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1433 def audit(self, event, detector, priority = 100):
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1434 """Register an auditor detector"""
3743
e754cc14e76a fix unstable ordering of detectors [SF#1585378]
Richard Jones <richard@users.sourceforge.net>
parents: 3695
diff changeset
1435 self.auditors[event].append((priority, detector.__name__, detector))
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1436
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1437 def fireAuditors(self, event, nodeid, newvalues):
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1438 """Fire all registered auditors"""
3743
e754cc14e76a fix unstable ordering of detectors [SF#1585378]
Richard Jones <richard@users.sourceforge.net>
parents: 3695
diff changeset
1439 for prio, name, audit in self.auditors[event]:
5079
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1440 try:
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1441 audit(self.db, self, nodeid, newvalues)
5084
675b3b3d88f0 Fix issue2550826 third try. This limits the capture of exceptions to
John Rouillard <rouilj@ieee.org>
parents: 5080
diff changeset
1442 except (EnvironmentError, ArithmeticError) as e:
5079
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1443 tb = traceback.format_exc()
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1444 html = ("<h1>Traceback</h1>" + str(tb).replace('\n', '<br>').
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1445 replace(' ', '&nbsp;'))
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1446 txt = 'Caught exception %s: %s\n%s' % (str(type(e)), e, tb)
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1447 exc_info = sys.exc_info()
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1448 subject = "Error: %s" % exc_info[1]
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1449 raise DetectorError(subject, html, txt)
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1450
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1451 def react(self, event, detector, priority = 100):
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1452 """Register a reactor detector"""
3743
e754cc14e76a fix unstable ordering of detectors [SF#1585378]
Richard Jones <richard@users.sourceforge.net>
parents: 3695
diff changeset
1453 self.reactors[event].append((priority, detector.__name__, detector))
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1454
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1455 def fireReactors(self, event, nodeid, oldvalues):
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1456 """Fire all registered reactors"""
3743
e754cc14e76a fix unstable ordering of detectors [SF#1585378]
Richard Jones <richard@users.sourceforge.net>
parents: 3695
diff changeset
1457 for prio, name, react in self.reactors[event]:
5079
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1458 try:
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1459 react(self.db, self, nodeid, oldvalues)
5084
675b3b3d88f0 Fix issue2550826 third try. This limits the capture of exceptions to
John Rouillard <rouilj@ieee.org>
parents: 5080
diff changeset
1460 except (EnvironmentError, ArithmeticError) as e:
5079
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1461 tb = traceback.format_exc()
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1462 html = ("<h1>Traceback</h1>" + str(tb).replace('\n', '<br>').
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1463 replace(' ', '&nbsp;'))
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1464 txt = 'Caught exception %s: %s\n%s' % (str(type(e)), e, tb)
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1465 exc_info = sys.exc_info()
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1466 subject = "Error: %s" % exc_info[1]
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1467 raise DetectorError(subject, html, txt)
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1468
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1469 #
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1470 # import / export support
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1471 #
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1472 def export_propnames(self):
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1473 """List the property names for export from this Class"""
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
1474 propnames = sorted(self.getprops().keys())
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1475 return propnames
4430
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1476
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1477 def import_journals(self, entries):
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1478 """Import a class's journal.
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1479
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1480 Uses setjournal() to set the journal for each item.
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1481 Strategy for import: Sort first by id, then import journals for
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1482 each id, this way the memory footprint is a lot smaller than the
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1483 initial implementation which stored everything in a big hash by
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1484 id and then proceeded to import journals for each id."""
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1485 properties = self.getprops()
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1486 a = []
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1487 for l in entries:
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1488 # first element in sorted list is the (numeric) id
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1489 # in python2.4 and up we would use sorted with a key...
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1490 a.append ((int (l [0].strip ("'")), l))
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1491 a.sort ()
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1492
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1493
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1494 last = 0
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1495 r = []
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1496 for n, l in a:
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1497 nodeid, jdate, user, action, params = map(eval, l)
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1498 assert (str(n) == nodeid)
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1499 if n != last:
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1500 if r:
4431
9b619dcb030a - fix import (now passes for memorydb, too)
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4430
diff changeset
1501 self.db.setjournal(self.classname, str(last), r)
4430
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1502 last = n
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1503 r = []
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1504
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1505 if action == 'set':
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
1506 for propname, value in params.items():
4430
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1507 prop = properties[propname]
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1508 if value is None:
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1509 pass
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1510 elif isinstance(prop, Date):
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1511 value = date.Date(value)
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1512 elif isinstance(prop, Interval):
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1513 value = date.Interval(value)
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1514 elif isinstance(prop, Password):
4483
22bc0426e348 Second patch from issue2550688 -- with some changes:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4481
diff changeset
1515 value = password.JournalPassword(encrypted=value)
4430
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1516 params[propname] = value
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1517 elif action == 'create' and params:
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1518 # old tracker with data stored in the create!
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1519 params = {}
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1520 r.append((nodeid, date.Date(jdate), user, action, params))
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1521 if r:
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1522 self.db.setjournal(self.classname, nodeid, r)
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1523
4306
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1524 #
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1525 # convenience methods
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1526 #
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1527 def get_roles(self, nodeid):
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1528 """Return iterator for all roles for this nodeid.
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1529
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1530 Yields string-processed roles.
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1531 This method can be overridden to provide a hook where we can
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1532 insert other permission models (e.g. get roles from database)
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1533 In standard schemas only a user has a roles property but
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1534 this may be different in customized schemas.
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1535 Note that this is the *central place* where role
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1536 processing happens!
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1537 """
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1538 node = self.db.getnode(self.classname, nodeid)
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1539 return iter_roles(node['roles'])
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1540
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1541 def has_role(self, nodeid, *roles):
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1542 '''See if this node has any roles that appear in roles.
4480
1613754d2646 Fix first part of Password handling security issue2550688
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4472
diff changeset
1543
4306
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1544 For convenience reasons we take a list.
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1545 In standard schemas only a user has a roles property but
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1546 this may be different in customized schemas.
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1547 '''
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1548 roles = dict.fromkeys ([r.strip().lower() for r in roles])
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1549 for role in self.get_roles(nodeid):
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1550 if role in roles:
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1551 return True
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1552 return False
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1553
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1554
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1555 class HyperdbValueError(ValueError):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1556 """ Error converting a raw value into a Hyperdb value """
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1557 pass
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1558
2244
ac4f295499a4 fixed journal marshalling in RDBMS backends [SF#943627]
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
1559 def convertLinkValue(db, propname, prop, value, idre=re.compile('^\d+$')):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1560 """ Convert the link value (may be id or key value) to an id value. """
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1561 linkcl = db.classes[prop.classname]
4877
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
1562 if not idre or not idre.match(value):
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1563 if linkcl.getkey():
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1564 try:
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1565 value = linkcl.lookup(value)
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5232
diff changeset
1566 except KeyError as message:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
1567 raise HyperdbValueError(_('property %s: %r is not a %s.')%(
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
1568 propname, value, prop.classname))
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1569 else:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
1570 raise HyperdbValueError(_('you may only enter ID values '\
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
1571 'for property %s')%propname)
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1572 return value
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1573
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1574 def fixNewlines(text):
1928
7c1ddebe7589 Small readability improvements.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1927
diff changeset
1575 """ Homogenise line endings.
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1576
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1577 Different web clients send different line ending values, but
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1578 other systems (eg. email) don't necessarily handle those line
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1579 endings. Our solution is to convert all line endings to LF.
1928
7c1ddebe7589 Small readability improvements.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1927
diff changeset
1580 """
5309
20084e2b48c3 Fix bug where unsetting a text value triggered an exception because
John Rouillard <rouilj@ieee.org>
parents: 5261
diff changeset
1581 if text is not None:
20084e2b48c3 Fix bug where unsetting a text value triggered an exception because
John Rouillard <rouilj@ieee.org>
parents: 5261
diff changeset
1582 text = text.replace('\r\n', '\n')
20084e2b48c3 Fix bug where unsetting a text value triggered an exception because
John Rouillard <rouilj@ieee.org>
parents: 5261
diff changeset
1583 return text.replace('\r', '\n')
20084e2b48c3 Fix bug where unsetting a text value triggered an exception because
John Rouillard <rouilj@ieee.org>
parents: 5261
diff changeset
1584 return text
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1585
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
1586 def rawToHyperdb(db, klass, itemid, propname, value, **kw):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1587 """ Convert the raw (user-input) value to a hyperdb-storable value. The
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1588 value is for the "propname" property on itemid (may be None for a
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1589 new item) of "klass" in "db".
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1590
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1591 The value is usually a string, but in the case of multilink inputs
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1592 it may be either a list of strings or a string with comma-separated
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1593 values.
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1594 """
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1595 properties = klass.getprops()
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1596
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1597 # ensure it's a valid property name
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1598 propname = propname.strip()
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1599 try:
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1600 proptype = properties[propname]
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1601 except KeyError:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
1602 raise HyperdbValueError(_('%r is not a property of %s')%(propname,
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
1603 klass.classname))
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1604
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1605 # if we got a string, strip it now
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1606 if isinstance(value, type('')):
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1607 value = value.strip()
3668
a15c15510e99 hyperdb handling of empty raw values for Multilink and Password [SF#1507814]
Richard Jones <richard@users.sourceforge.net>
parents: 3635
diff changeset
1608
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1609 # convert the input value to a real property value
3668
a15c15510e99 hyperdb handling of empty raw values for Multilink and Password [SF#1507814]
Richard Jones <richard@users.sourceforge.net>
parents: 3635
diff changeset
1610 value = proptype.from_raw(value, db=db, klass=klass,
a15c15510e99 hyperdb handling of empty raw values for Multilink and Password [SF#1507814]
Richard Jones <richard@users.sourceforge.net>
parents: 3635
diff changeset
1611 propname=propname, itemid=itemid, **kw)
a15c15510e99 hyperdb handling of empty raw values for Multilink and Password [SF#1507814]
Richard Jones <richard@users.sourceforge.net>
parents: 3635
diff changeset
1612
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1613 return value
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1614
1442
b42fa71754c9 don't attempt to create FileClass items if no content is supplied
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1615 class FileClass:
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1616 """ A class that requires the "content" property and stores it on
1442
b42fa71754c9 don't attempt to create FileClass items if no content is supplied
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1617 disk.
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1618 """
3601
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3586
diff changeset
1619 default_mime_type = 'text/plain'
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3586
diff changeset
1620
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3586
diff changeset
1621 def __init__(self, db, classname, **properties):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1622 """The newly-created class automatically includes the "content"
3601
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3586
diff changeset
1623 property.
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1624 """
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
1625 if 'content' not in properties:
3924
21d3d7eeea8c assorted pyflakes fixes
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3802
diff changeset
1626 properties['content'] = String(indexme='yes')
3601
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3586
diff changeset
1627
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1628 def export_propnames(self):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1629 """ Don't export the "content" property
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1630 """
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
1631 propnames = list(self.getprops().keys())
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1632 propnames.remove('content')
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1633 propnames.sort()
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1634 return propnames
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1635
3019
293a17149765 First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 2962
diff changeset
1636 def exportFilename(self, dirname, nodeid):
5101
d043a09952db Tried to explain the use of hyperdb's exportFilename
John Rouillard <rouilj@ieee.org>
parents: 5084
diff changeset
1637 """ Returns destination filename for a exported file
d043a09952db Tried to explain the use of hyperdb's exportFilename
John Rouillard <rouilj@ieee.org>
parents: 5084
diff changeset
1638
d043a09952db Tried to explain the use of hyperdb's exportFilename
John Rouillard <rouilj@ieee.org>
parents: 5084
diff changeset
1639 Called by export function in roundup admin to generate
d043a09952db Tried to explain the use of hyperdb's exportFilename
John Rouillard <rouilj@ieee.org>
parents: 5084
diff changeset
1640 the <class>-files subdirectory
d043a09952db Tried to explain the use of hyperdb's exportFilename
John Rouillard <rouilj@ieee.org>
parents: 5084
diff changeset
1641 """
3019
293a17149765 First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 2962
diff changeset
1642 subdir_filename = self.db.subdirFilename(self.classname, nodeid)
293a17149765 First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 2962
diff changeset
1643 return os.path.join(dirname, self.classname+'-files', subdir_filename)
293a17149765 First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 2962
diff changeset
1644
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1645 def export_files(self, dirname, nodeid):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1646 """ Export the "content" property as a file, not csv column
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1647 """
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1648 source = self.db.filename(self.classname, nodeid)
3019
293a17149765 First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 2962
diff changeset
1649
293a17149765 First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 2962
diff changeset
1650 dest = self.exportFilename(dirname, nodeid)
293a17149765 First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 2962
diff changeset
1651 ensureParentsExist(dest)
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1652 shutil.copyfile(source, dest)
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1653
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1654 def import_files(self, dirname, nodeid):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1655 """ Import the "content" property as a file
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1656 """
3019
293a17149765 First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 2962
diff changeset
1657 source = self.exportFilename(dirname, nodeid)
293a17149765 First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 2962
diff changeset
1658
2962
4607f58a007b py2.1 compatibility
Richard Jones <richard@users.sourceforge.net>
parents: 2909
diff changeset
1659 dest = self.db.filename(self.classname, nodeid, create=1)
3019
293a17149765 First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 2962
diff changeset
1660 ensureParentsExist(dest)
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1661 shutil.copyfile(source, dest)
1442
b42fa71754c9 don't attempt to create FileClass items if no content is supplied
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1662
3544
5cd1c83dea50 Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3491
diff changeset
1663 mime_type = None
3802
c3af8c6a6b5b Bug-fix: Only index the content property if it has the indexme attribute set
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3743
diff changeset
1664 props = self.getprops()
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
1665 if 'type' in props:
3545
507b2df02956 fixes to import_files
Richard Jones <richard@users.sourceforge.net>
parents: 3544
diff changeset
1666 mime_type = self.get(nodeid, 'type')
3544
5cd1c83dea50 Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3491
diff changeset
1667 if not mime_type:
5cd1c83dea50 Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3491
diff changeset
1668 mime_type = self.default_mime_type
3802
c3af8c6a6b5b Bug-fix: Only index the content property if it has the indexme attribute set
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3743
diff changeset
1669 if props['content'].indexme:
c3af8c6a6b5b Bug-fix: Only index the content property if it has the indexme attribute set
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3743
diff changeset
1670 self.db.indexer.add_text((self.classname, nodeid, 'content'),
c3af8c6a6b5b Bug-fix: Only index the content property if it has the indexme attribute set
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3743
diff changeset
1671 self.get(nodeid, 'content'), mime_type)
3544
5cd1c83dea50 Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3491
diff changeset
1672
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1673 class Node:
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1674 """ A convenience wrapper for the given node
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1675 """
475
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 466
diff changeset
1676 def __init__(self, cl, nodeid, cache=1):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1677 self.__dict__['cl'] = cl
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1678 self.__dict__['nodeid'] = nodeid
278
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
1679 def keys(self, protected=1):
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
1680 return list(self.cl.getprops(protected=protected).keys())
278
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
1681 def values(self, protected=1):
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
1682 l = []
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
1683 for name in self.cl.getprops(protected=protected).keys():
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
1684 l.append(self.cl.get(self.nodeid, name))
278
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
1685 return l
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
1686 def items(self, protected=1):
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
1687 l = []
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
1688 for name in self.cl.getprops(protected=protected).keys():
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
1689 l.append((name, self.cl.get(self.nodeid, name)))
278
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
1690 return l
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1691 def has_key(self, name):
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
1692 return name in self.cl.getprops()
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
1693 def get(self, name, default=None):
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
1694 if name in self:
1470
9ccd69fbe33e applied patch [SF#688595]
Richard Jones <richard@users.sourceforge.net>
parents: 1442
diff changeset
1695 return self[name]
9ccd69fbe33e applied patch [SF#688595]
Richard Jones <richard@users.sourceforge.net>
parents: 1442
diff changeset
1696 else:
9ccd69fbe33e applied patch [SF#688595]
Richard Jones <richard@users.sourceforge.net>
parents: 1442
diff changeset
1697 return default
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1698 def __getattr__(self, name):
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
1699 if name in self.__dict__:
278
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
1700 return self.__dict__[name]
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1701 try:
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
1702 return self.cl.get(self.nodeid, name)
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5232
diff changeset
1703 except KeyError as value:
460
9c895b44240a take a copy of the node dict...
Richard Jones <richard@users.sourceforge.net>
parents: 457
diff changeset
1704 # we trap this but re-raise it as AttributeError - all other
9c895b44240a take a copy of the node dict...
Richard Jones <richard@users.sourceforge.net>
parents: 457
diff changeset
1705 # exceptions should pass through untrapped
9c895b44240a take a copy of the node dict...
Richard Jones <richard@users.sourceforge.net>
parents: 457
diff changeset
1706 pass
9c895b44240a take a copy of the node dict...
Richard Jones <richard@users.sourceforge.net>
parents: 457
diff changeset
1707 # nope, no such attribute
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
1708 raise AttributeError(str(value))
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1709 def __getitem__(self, name):
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
1710 return self.cl.get(self.nodeid, name)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1711 def __setattr__(self, name, value):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1712 try:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1713 return self.cl.set(self.nodeid, **{name: value})
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5232
diff changeset
1714 except KeyError as value:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
1715 raise AttributeError(str(value))
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1716 def __setitem__(self, name, value):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1717 self.cl.set(self.nodeid, **{name: value})
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1718 def history(self, enforceperm=True, skipquiet=True):
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1719 return self.cl.history(self.nodeid,
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1720 enforceperm=enforceperm,
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1721 skipquiet=skipquiet )
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1722 def retire(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1723 return self.cl.retire(self.nodeid)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1724
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1725
648
07422fe57db2 Ran it through pychecker, made fixes
Richard Jones <richard@users.sourceforge.net>
parents: 628
diff changeset
1726 def Choice(name, db, *options):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1727 """Quick helper to create a simple class with choices
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1728 """
648
07422fe57db2 Ran it through pychecker, made fixes
Richard Jones <richard@users.sourceforge.net>
parents: 628
diff changeset
1729 cl = Class(db, name, name=String(), order=String())
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1730 for i in range(len(options)):
648
07422fe57db2 Ran it through pychecker, made fixes
Richard Jones <richard@users.sourceforge.net>
parents: 628
diff changeset
1731 cl.create(name=options[i], order=i)
3924
21d3d7eeea8c assorted pyflakes fixes
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3802
diff changeset
1732 return Link(name)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1733
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
1734 # vim: set filetype=python sts=4 sw=4 et si :

Roundup Issue Tracker: http://roundup-tracker.org/