annotate roundup/hyperdb.py @ 3854:f4e8dc583256

Restored subject parser regexp to the string it was before the... ...implementation of customization of it, i.e., the version from CVS revision 1.184 of mailgw.py. This makes 'testFollowupTitleMatchMultiRe' work again.
author Erik Forsberg <forsberg@users.sourceforge.net>
date Sat, 12 May 2007 16:14:54 +0000
parents c3af8c6a6b5b
children 21d3d7eeea8c
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 #
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
18 # $Id: hyperdb.py,v 1.129 2007-01-10 18:17:00 schlatterbeck Exp $
406
bdc2ea127ae9 Added module docstrings to all modules.
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 398
diff changeset
19
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
20 """Hyperdatabase implementation, especially field types.
1244
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1085
diff changeset
21 """
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
22 __docformat__ = 'restructuredtext'
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
24 # standard python modules
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
25 import sys, os, time, re, shutil, weakref
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
26 from sets import Set
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
270
a4241ddd22d7 Added the Password property type.
Richard Jones <richard@users.sourceforge.net>
parents: 264
diff changeset
29 import date, password
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
30 from support import ensureParentsExist, PrioList, sorted, reversed
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32 #
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33 # Types
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34 #
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
35 class _Type(object):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
36 """A roundup property type."""
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
37 def __init__(self, required=False):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
38 self.required = required
224
ad2c98faec97 using isinstance(blah, Foo) now instead of isFooType
Richard Jones <richard@users.sourceforge.net>
parents: 214
diff changeset
39 def __repr__(self):
657
e0a1cc7538e9 more pychecker warnings removed
Richard Jones <richard@users.sourceforge.net>
parents: 648
diff changeset
40 ' more useful for dumps '
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
41 return '<%s.%s>'%(self.__class__.__module__, self.__class__.__name__)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
42 def sort_repr (self, cls, val, name):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
43 """Representation used for sorting. This should be a python
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
44 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
45 individual backends may chose to use something different for
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
46 sorting as long as the outcome is the same.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
47 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
48 return val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
49
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
50 class String(_Type):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
51 """An object designating a String property."""
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
52 def __init__(self, indexme='no', required=False):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
53 super(String, self).__init__(required)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
54 self.indexme = indexme == 'yes'
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
55 def from_raw(self, value, **kw):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
56 """fix the CRLF/CR -> LF stuff"""
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
57 return fixNewlines(value)
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
58 def sort_repr (self, cls, val, name):
3684
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3682
diff changeset
59 if not val:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3682
diff changeset
60 return val
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
61 if name == 'id':
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
62 return int(val)
3684
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3682
diff changeset
63 return val.lower()
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
64
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
65 class Password(_Type):
270
a4241ddd22d7 Added the Password property type.
Richard Jones <richard@users.sourceforge.net>
parents: 264
diff changeset
66 """An object designating a Password property."""
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
67 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
68 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
69 return None
3393
18e6e1326d4b merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3383
diff changeset
70 m = password.Password.pwre.match(value)
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
71 if m:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
72 # password is being given to us encrypted
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
73 p = password.Password()
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
74 p.scheme = m.group(1)
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
75 if p.scheme not in 'SHA crypt plaintext'.split():
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
76 raise HyperdbValueError, 'property %s: unknown encryption '\
3399
3a0d4e4a0f34 merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3393
diff changeset
77 'scheme %r'%(kw['propname'], p.scheme)
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
78 p.password = m.group(2)
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
79 value = p
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
80 else:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
81 try:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
82 value = password.Password(value)
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
83 except password.PasswordValueError, message:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
84 raise HyperdbValueError, 'property %s: %s'%(propname, message)
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
85 return value
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
86 def sort_repr (self, cls, val, name):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
87 if not val:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
88 return val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
89 return str(val)
270
a4241ddd22d7 Added the Password property type.
Richard Jones <richard@users.sourceforge.net>
parents: 264
diff changeset
90
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
91 class Date(_Type):
224
ad2c98faec97 using isinstance(blah, Foo) now instead of isFooType
Richard Jones <richard@users.sourceforge.net>
parents: 214
diff changeset
92 """An object designating a Date property."""
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
93 def __init__(self, offset=None, required=False):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
94 super(Date, self).__init__(required)
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
95 self._offset = offset
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
96 def offset(self, db):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
97 if self._offset is not None:
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
98 return self._offset
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
99 return db.getUserTimezone()
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
100 def from_raw(self, value, db, **kw):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
101 try:
3621
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
102 value = date.Date(value, self.offset(db))
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
103 except ValueError, message:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
104 raise HyperdbValueError, 'property %s: %r is an invalid '\
3393
18e6e1326d4b merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3383
diff changeset
105 'date (%s)'%(kw['propname'], value, message)
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
106 return value
3586
f47bddab5a49 date spec wasn't allowing week intervals
Richard Jones <richard@users.sourceforge.net>
parents: 3545
diff changeset
107 def range_from_raw(self, value, db):
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
108 """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
109 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
110 def sort_repr (self, cls, val, name):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
111 if not val:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
112 return val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
113 return str(val)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
114
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
115 class Interval(_Type):
224
ad2c98faec97 using isinstance(blah, Foo) now instead of isFooType
Richard Jones <richard@users.sourceforge.net>
parents: 214
diff changeset
116 """An object designating an Interval property."""
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
117 def from_raw(self, value, **kw):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
118 try:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
119 value = date.Interval(value)
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
120 except ValueError, message:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
121 raise HyperdbValueError, 'property %s: %r is an invalid '\
3393
18e6e1326d4b merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3383
diff changeset
122 'date interval (%s)'%(kw['propname'], value, message)
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
123 return value
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
124 def sort_repr (self, cls, val, name):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
125 if not val:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
126 return val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
127 return val.as_seconds()
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
128
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
129 class _Pointer(_Type):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
130 """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
131 to a node in a specified class."""
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
132 def __init__(self, classname, do_journal='yes', required=False):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
133 ''' Default is to journal link and unlink events
657
e0a1cc7538e9 more pychecker warnings removed
Richard Jones <richard@users.sourceforge.net>
parents: 648
diff changeset
134 '''
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
135 super(_Pointer, self).__init__(required)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
136 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
137 self.do_journal = do_journal == 'yes'
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
138 def __repr__(self):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
139 """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
140 storage in SQL backends!
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
141 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
142 return '<%s.%s to "%s">'%(self.__class__.__module__,
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
143 self.__class__.__name__, self.classname)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
144
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
145 class Link(_Pointer):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
146 """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
147 node in a specified class."""
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
148 def from_raw(self, value, db, propname, **kw):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
149 if value == '-1' or not value:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
150 value = None
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
151 else:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
152 value = convertLinkValue(db, propname, self, value)
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
153 return value
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
154 def sort_repr (self, cls, val, name):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
155 if not val:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
156 return val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
157 op = cls.labelprop()
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
158 if op == 'id':
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
159 return int(cls.get(val, op))
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
160 return cls.get(val, op)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
161
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
162 class Multilink(_Pointer):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
163 """An object designating a Multilink property that links
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
164 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
165
dfac856502d1 brief docco on the do_journal argument
Richard Jones <richard@users.sourceforge.net>
parents: 555
diff changeset
166 "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
167
dfac856502d1 brief docco on the do_journal argument
Richard Jones <richard@users.sourceforge.net>
parents: 555
diff changeset
168 "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
169 'link' and 'unlink' events placed in their journal
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
170 """
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
171 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
172 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
173 return []
a15c15510e99 hyperdb handling of empty raw values for Multilink and Password [SF#1507814]
Richard Jones <richard@users.sourceforge.net>
parents: 3635
diff changeset
174
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
175 # 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
176 if itemid and not itemid.startswith('-'):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
177 curvalue = klass.get(itemid, propname)
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
178 else:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
179 curvalue = []
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
180
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
181 # 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
182 if isinstance(value, type('')):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
183 value = value.split(',')
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
184
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
185 # handle each add/remove in turn
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
186 # keep an extra list for all items that are
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
187 # 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
188 # <propname>=A,+B, which should replace the old
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
189 # list with A,B)
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
190 set = 1
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
191 newvalue = []
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
192 for item in value:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
193 item = item.strip()
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
194
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
195 # skip blanks
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
196 if not item: continue
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
197
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
198 # handle +/-
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
199 remove = 0
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
200 if item.startswith('-'):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
201 remove = 1
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
202 item = item[1:]
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
203 set = 0
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
204 elif item.startswith('+'):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
205 item = item[1:]
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
206 set = 0
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
207
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
208 # look up the value
3393
18e6e1326d4b merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3383
diff changeset
209 itemid = convertLinkValue(db, propname, self, item)
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
210
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
211 # perform the add/remove
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
212 if remove:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
213 try:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
214 curvalue.remove(itemid)
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
215 except ValueError:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
216 raise HyperdbValueError, 'property %s: %r is not ' \
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
217 'currently an element'%(propname, item)
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 newvalue.append(itemid)
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
220 if itemid not in curvalue:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
221 curvalue.append(itemid)
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
222
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
223 # that's it, set the new Multilink property value,
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
224 # or overwrite it completely
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
225 if set:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
226 value = newvalue
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
227 else:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
228 value = curvalue
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
229
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
230 # 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
231 # unnecessary :(
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
232 value = [int(x) for x in value]
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
233 value.sort()
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
234 value = [str(x) for x in value]
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
235 return value
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
236
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
237 def sort_repr (self, cls, val, name):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
238 if not val:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
239 return val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
240 op = cls.labelprop()
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
241 if op == 'id':
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
242 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
243 return [cls.get(v, op) for v in val]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
244
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
245 class Boolean(_Type):
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 858
diff changeset
246 """An object designating a boolean property"""
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
247 def from_raw(self, value, **kw):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
248 value = value.strip()
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
249 # checked is a common HTML checkbox value
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
250 value = value.lower() in ('checked', 'yes', 'true', 'on', '1')
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
251 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
252
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
253 class Number(_Type):
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 858
diff changeset
254 """An object designating a numeric property"""
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
255 def from_raw(self, value, **kw):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
256 value = value.strip()
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
257 try:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
258 value = float(value)
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
259 except ValueError:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
260 raise HyperdbValueError, 'property %s: %r is not a number'%(
3393
18e6e1326d4b merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3383
diff changeset
261 kw['propname'], value)
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
262 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
263 #
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
264 # 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
265 #
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
266 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
267 pass
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
268 def splitDesignator(designator, dre=re.compile(r'([^\d]+)(\d+)')):
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
269 ''' Take a foo123 and return ('foo', 123)
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
270 '''
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
271 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
272 if m is None:
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
273 raise DesignatorError, '"%s" not a node designator'%designator
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
274 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
275
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
276 class Proptree(object):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
277 ''' Simple tree data structure for optimizing searching of
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
278 properties. Each node in the tree represents a roundup Class
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
279 Property that has to be navigated for finding the given search
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
280 or sort properties. The sort_type attribute is used for
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
281 distinguishing nodes in the tree used for sorting or searching: If
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
282 it is 0 for a node, that node is not used for sorting. If it is 1,
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
283 it is used for both, sorting and searching. If it is 2 it is used
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
284 for sorting only.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
285
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
286 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
287 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
288 _val attribute with set_val is used for this.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
289 '''
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
290
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
291 def __init__(self, db, cls, name, props, parent = None):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
292 self.db = db
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
293 self.name = name
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
294 self.props = props
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
295 self.parent = parent
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
296 self._val = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
297 self.has_values = False
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
298 self.cls = cls
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
299 self.classname = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
300 self.uniqname = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
301 self.children = []
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
302 self.sortattr = []
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
303 self.propdict = {}
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
304 self.sort_type = 0
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
305 self.sort_direction = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
306 self.sort_ids = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
307 self.sort_ids_needed = False
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
308 self.sort_result = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
309 self.attr_sort_done = False
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
310 self.tree_sort_done = False
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
311 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
312 self.orderby = []
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
313 if parent:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
314 self.root = parent.root
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
315 self.depth = parent.depth + 1
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
316 else:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
317 self.root = self
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
318 self.seqno = 1
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
319 self.depth = 0
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
320 self.sort_type = 1
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
321 self.id = self.root.seqno
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
322 self.root.seqno += 1
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
323 if self.cls:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
324 self.classname = self.cls.classname
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
325 self.uniqname = '%s%s' % (self.cls.classname, self.id)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
326 if not self.parent:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
327 self.uniqname = self.cls.classname
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
328
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
329 def append(self, name, sort_type = 0):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
330 """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
331 propclass for the child.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
332 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
333 if name in self.propdict:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
334 pt = self.propdict[name]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
335 if sort_type and not pt.sort_type:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
336 pt.sort_type = 1
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
337 return pt
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
338 propclass = self.props[name]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
339 cls = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
340 props = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
341 if isinstance(propclass, (Link, Multilink)):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
342 cls = self.db.getclass(propclass.classname)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
343 props = cls.getprops()
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
344 child = self.__class__(self.db, cls, name, props, parent = self)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
345 child.sort_type = sort_type
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
346 child.propclass = propclass
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
347 self.children.append(child)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
348 self.propdict[name] = child
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
349 return child
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
350
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
351 def compute_sort_done(self, mlseen=False):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
352 """ Recursively check if attribute is needed for sorting
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
353 (self.sort_type > 0) or all children have tree_sort_done set and
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
354 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
355 holds. Also remove sort_ids_needed recursively once having seen a
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
356 Multilink.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
357 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
358 if isinstance (self.propclass, Multilink):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
359 mlseen = True
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
360 if mlseen:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
361 self.sort_ids_needed = False
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
362 self.tree_sort_done = True
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
363 for p in self.children:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
364 p.compute_sort_done(mlseen)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
365 if not p.tree_sort_done:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
366 self.tree_sort_done = False
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
367 if not self.sort_type:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
368 self.tree_sort_done = True
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
369 if mlseen:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
370 self.tree_sort_done = False
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
371
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
372 def ancestors(self):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
373 p = self
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
374 while p.parent:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
375 yield p
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
376 p = p.parent
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
377
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
378 def search(self, search_matches=None, sort=True):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
379 """ Recursively search for the given properties in a proptree.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
380 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
381 simple _filter call which does the real work
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
382 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
383 filterspec = {}
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
384 for p in self.children:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
385 if p.sort_type < 2:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
386 if p.children:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
387 p.search(sort = False)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
388 filterspec[p.name] = p.val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
389 self.val = self.cls._filter(search_matches, filterspec, sort and self)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
390 return self.val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
391
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
392 def sort (self, ids=None):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
393 """ 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
394 optimisations: Some order attributes may be precomputed (by the
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
395 backend) and some properties may already be sorted.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
396 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
397 if ids is None:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
398 ids = self.val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
399 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
400 return self._searchsort(ids, True, True)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
401 return ids
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
402
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
403 def sortable_children(self, intermediate=False):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
404 """ All children needed for sorting. If intermediate is True,
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
405 intermediate nodes (not being a sort attribute) are returned,
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
406 too.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
407 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
408 return [p for p in self.children
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
409 if p.sort_type > 0 and (intermediate or p.sort_direction)]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
410
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
411 def __iter__(self):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
412 """ Yield nodes in depth-first order -- visited nodes first """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
413 for p in self.children:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
414 yield p
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
415 for c in p:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
416 yield c
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
417
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
418 def _get (self, ids):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
419 """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
420 we have a list of ids.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
421 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
422 if not ids:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
423 return ids
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
424 if isinstance (ids[0], list):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
425 cids = [self._get(i) for i in ids]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
426 else:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
427 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
428 if self.sortattr:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
429 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
430 return cids
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
431
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
432 def _searchsort(self, ids=None, update=True, dosort=True):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
433 """ Recursively compute the sort attributes. Note that ids
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
434 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
435 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
436 individual attribute. We make sure that everything is properly
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
437 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
438 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
439 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
440 self.sort_ids is available.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
441
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
442 Yech, Multilinks: This gets especially complicated if somebody
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
443 sorts by different attributes of the same multilink (or
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
444 transitively across several multilinks). My use-case is sorting
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
445 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
446 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
447 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
448 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
449 *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
450 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
451 author and one sorted by date for sorting issues.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
452 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
453 for pt in self.sortable_children(intermediate = True):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
454 # ids can be an empty list
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
455 if pt.tree_sort_done or not ids:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
456 continue
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
457 if pt.sort_ids: # cached or computed by backend
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
458 cids = pt.sort_ids
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
459 else:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
460 cids = pt._get(ids)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
461 if pt.sort_direction and not pt.sort_result:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
462 sortrep = pt.propclass.sort_repr
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
463 pt.sort_result = pt._sort_repr(sortrep, cids)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
464 pt.sort_ids = cids
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
465 if pt.children:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
466 pt._searchsort(cids, update, False)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
467 if self.sortattr and dosort:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
468 ids = self._sort(ids)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
469 if not update:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
470 for pt in self.sortable_children(intermediate = True):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
471 pt.sort_ids = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
472 for pt in self.sortattr:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
473 pt.sort_result = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
474 return ids
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
475
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
476 def _set_val(self, val):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
477 """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
478 intersection of the old and the new value(s)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
479 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
480 if self.has_values:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
481 v = self._val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
482 if not isinstance(self._val, type([])):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
483 v = [self._val]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
484 vals = Set(v)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
485 vals.intersection_update(val)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
486 self._val = [v for v in vals]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
487 else:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
488 self._val = val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
489 self.has_values = True
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
490
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
491 val = property(lambda self: self._val, _set_val)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
492
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
493 def _sort(self, val):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
494 """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
495 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
496 responsible for setting attr_sort_done only for trailing
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
497 attributes (otherwise the sort order is wrong). Since pythons
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
498 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
499 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
500 current sort.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
501
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
502 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
503 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
504 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
505 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
506 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
507 repeated sorting is probably more efficient than using
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
508 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
509 methods.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
510 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
511 if not val:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
512 return val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
513 sortattr = []
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
514 directions = []
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
515 dir_idx = []
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
516 idx = 0
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
517 curdir = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
518 for sa in self.sortattr:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
519 if sa.attr_sort_done:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
520 break
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
521 if sortattr:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
522 assert len(sortattr[0]) == len(sa.sort_result)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
523 sortattr.append (sa.sort_result)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
524 if curdir != sa.sort_direction:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
525 dir_idx.append (idx)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
526 directions.append (sa.sort_direction)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
527 curdir = sa.sort_direction
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
528 idx += 1
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
529 sortattr.append (val)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
530 #print >> sys.stderr, "\nsortattr", sortattr
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
531 sortattr = zip (*sortattr)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
532 for dir, i in reversed(zip(directions, dir_idx)):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
533 rev = dir == '-'
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
534 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
535 idx = i
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
536 return [x[-1] for x in sortattr]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
537
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
538 def _sort_repr(self, sortrep, ids):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
539 """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
540 recurse until we have a list of ids.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
541 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
542 if not ids:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
543 return ids
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
544 if isinstance (ids[0], list):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
545 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
546 else:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
547 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
548 return res
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
549
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
550 def __repr__(self):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
551 r = ["proptree:" + self.name]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
552 for n in self:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
553 r.append("proptree:" + " " * n.depth + n.name)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
554 return '\n'.join(r)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
555 __str__ = __repr__
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
556
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
557 #
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
558 # 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
559 #
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
560 class DatabaseError(ValueError):
657
e0a1cc7538e9 more pychecker warnings removed
Richard Jones <richard@users.sourceforge.net>
parents: 648
diff changeset
561 '''Error to be raised when there is some problem in the database code
e0a1cc7538e9 more pychecker warnings removed
Richard Jones <richard@users.sourceforge.net>
parents: 648
diff changeset
562 '''
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
563 pass
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
564 class Database:
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
565 '''A database for storing records containing flexible data types.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
566
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
567 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
568 store their data.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
569
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
570
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
571 Transactions
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
572 ------------
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
573 The Database should support transactions through the commit() and
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
574 rollback() methods. All other Database methods should be transaction-aware,
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
575 using data from the current transaction before looking up the database.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
576
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
577 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
578 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
579 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
580 transaction.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
581
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
582
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
583 Implementation
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
584 --------------
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
585
1926
3bdd34547fa7 Remove implementations of Class.getnode from back_anydbm and rdbms_common...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1905
diff changeset
586 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
587
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
588 '''
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
589
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
590 # flag to set on retired entries
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
591 RETIRED_FLAG = '__hyperdb_retired'
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
592
3491
0e5f15520e70 fix detection of "missing" existing values in CGI form parser [SF#1414149]
Richard Jones <richard@users.sourceforge.net>
parents: 3488
diff changeset
593 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
594 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
595 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
596
524
dce4c75bef5a changed all config accesses...
Richard Jones <richard@users.sourceforge.net>
parents: 490
diff changeset
597 def __init__(self, config, journaltag=None):
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
598 """Open a hyperdatabase given a specifier to some storage.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
599
524
dce4c75bef5a changed all config accesses...
Richard Jones <richard@users.sourceforge.net>
parents: 490
diff changeset
600 The 'storagelocator' is obtained from config.DATABASE.
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
601 The meaning of 'storagelocator' depends on the particular
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
602 implementation of the hyperdatabase. It could be a file name,
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
603 a directory path, a socket descriptor for a connection to a
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
604 database over the network, etc.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
605
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
606 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
607 entries for any edits done on the database. If 'journaltag' is
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
608 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
609 Class.set(), and Class.retire() methods are disabled.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
610 """
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
611 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
612
825
0779ea9f1f18 More indexer work:
Richard Jones <richard@users.sourceforge.net>
parents: 805
diff changeset
613 def post_init(self):
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
614 """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
615 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
616 structures.
91a4619b1a14 hyperdb grows a refresh_database() method.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1780
diff changeset
617 """
91a4619b1a14 hyperdb grows a refresh_database() method.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1780
diff changeset
618 raise NotImplementedError
91a4619b1a14 hyperdb grows a refresh_database() method.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1780
diff changeset
619
91a4619b1a14 hyperdb grows a refresh_database() method.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1780
diff changeset
620 def refresh_database(self):
91a4619b1a14 hyperdb grows a refresh_database() method.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1780
diff changeset
621 """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
622 and structures. Not called in normal usage."""
825
0779ea9f1f18 More indexer work:
Richard Jones <richard@users.sourceforge.net>
parents: 805
diff changeset
623 raise NotImplementedError
0779ea9f1f18 More indexer work:
Richard Jones <richard@users.sourceforge.net>
parents: 805
diff changeset
624
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
625 def __getattr__(self, classname):
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
626 """A convenient way of calling self.getclass(classname)."""
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
627 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
628
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
629 def addclass(self, cl):
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
630 '''Add a Class to the hyperdatabase.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
631 '''
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
632 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
633
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
634 def getclasses(self):
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
635 """Return a list of the names of all existing classes."""
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
636 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
637
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
638 def getclass(self, classname):
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
639 """Get the Class object representing a particular class.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
640
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
641 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
642 """
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
643 raise NotImplementedError
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 def clear(self):
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
646 '''Delete all database contents.
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 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
649
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
650 def getclassdb(self, classname, mode='r'):
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
651 '''Obtain a connection to the class db that will be used for
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
652 multiple actions.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
653 '''
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
654 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
655
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
656 def addnode(self, classname, nodeid, node):
1928
7c1ddebe7589 Small readability improvements.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1927
diff changeset
657 """Add the specified node to its class's db.
7c1ddebe7589 Small readability improvements.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1927
diff changeset
658 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
659 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
660
676
bc46480e2a2b Fixed serialisation problem...
Richard Jones <richard@users.sourceforge.net>
parents: 657
diff changeset
661 def serialise(self, classname, node):
bc46480e2a2b Fixed serialisation problem...
Richard Jones <richard@users.sourceforge.net>
parents: 657
diff changeset
662 '''Copy the node contents, converting non-marshallable data into
bc46480e2a2b Fixed serialisation problem...
Richard Jones <richard@users.sourceforge.net>
parents: 657
diff changeset
663 marshallable data.
bc46480e2a2b Fixed serialisation problem...
Richard Jones <richard@users.sourceforge.net>
parents: 657
diff changeset
664 '''
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
665 return node
676
bc46480e2a2b Fixed serialisation problem...
Richard Jones <richard@users.sourceforge.net>
parents: 657
diff changeset
666
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
667 def setnode(self, classname, nodeid, node):
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
668 '''Change the specified node.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
669 '''
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
670 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
671
676
bc46480e2a2b Fixed serialisation problem...
Richard Jones <richard@users.sourceforge.net>
parents: 657
diff changeset
672 def unserialise(self, classname, node):
bc46480e2a2b Fixed serialisation problem...
Richard Jones <richard@users.sourceforge.net>
parents: 657
diff changeset
673 '''Decode the marshalled node data
bc46480e2a2b Fixed serialisation problem...
Richard Jones <richard@users.sourceforge.net>
parents: 657
diff changeset
674 '''
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
675 return node
676
bc46480e2a2b Fixed serialisation problem...
Richard Jones <richard@users.sourceforge.net>
parents: 657
diff changeset
676
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
677 def getnode(self, classname, nodeid):
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
678 '''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
679
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
680 'cache' exists for backwards compatibility, and is not used.
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
681 '''
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
682 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
683
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
684 def hasnode(self, classname, nodeid):
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
685 '''Determine if the database has a given node.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
686 '''
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
687 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
688
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
689 def countnodes(self, classname):
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
690 '''Count the number of nodes that exist for a particular Class.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
691 '''
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
692 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
693
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
694 def storefile(self, classname, nodeid, property, content):
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
695 '''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
696
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
697 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
698 indicate which property is being saved.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
699 '''
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
700 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
701
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
702 def getfile(self, classname, nodeid, property):
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
703 '''Store the content of the file in the database.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
704 '''
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
705 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
706
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
707 def addjournal(self, classname, nodeid, action, params):
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
708 ''' Journal the Action
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
709 'action' may be:
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
710
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
711 'create' or 'set' -- 'params' is a dictionary of property values
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
712 'link' or 'unlink' -- 'params' is (classname, nodeid, propname)
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
713 'retire' -- 'params' is None
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
714 '''
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
715 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
716
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
717 def getjournal(self, classname, nodeid):
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
718 ''' get the journal for id
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 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
721
562
62febbd7ffec You can now use the roundup-admin tool to pack the database
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 557
diff changeset
722 def pack(self, pack_before):
62febbd7ffec You can now use the roundup-admin tool to pack the database
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 557
diff changeset
723 ''' pack the database
62febbd7ffec You can now use the roundup-admin tool to pack the database
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 557
diff changeset
724 '''
62febbd7ffec You can now use the roundup-admin tool to pack the database
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 557
diff changeset
725 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
726
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
727 def commit(self):
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
728 ''' Commit the current transactions.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
729
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
730 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
731 last commit() or rollback().
3687
ff9f4ca42454 Postgres backend allows transaction collisions to be ignored when...
Richard Jones <richard@users.sourceforge.net>
parents: 3684
diff changeset
732
ff9f4ca42454 Postgres backend allows transaction collisions to be ignored when...
Richard Jones <richard@users.sourceforge.net>
parents: 3684
diff changeset
733 fail_ok indicates that the commit is allowed to fail. This is used
ff9f4ca42454 Postgres backend allows transaction collisions to be ignored when...
Richard Jones <richard@users.sourceforge.net>
parents: 3684
diff changeset
734 in the web interface when committing cleaning of the session
ff9f4ca42454 Postgres backend allows transaction collisions to be ignored when...
Richard Jones <richard@users.sourceforge.net>
parents: 3684
diff changeset
735 database. We don't care if there's a concurrency issue there.
ff9f4ca42454 Postgres backend allows transaction collisions to be ignored when...
Richard Jones <richard@users.sourceforge.net>
parents: 3684
diff changeset
736
ff9f4ca42454 Postgres backend allows transaction collisions to be ignored when...
Richard Jones <richard@users.sourceforge.net>
parents: 3684
diff changeset
737 The only backend this seems to affect is postgres.
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
738 '''
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
739 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
740
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
741 def rollback(self):
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
742 ''' Reverse all actions from the current transaction.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
743
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
744 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
745 commit() or rollback() was performed.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
746 '''
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
747 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
748
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
749 def close(self):
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
750 """Close the database.
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
751
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
752 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
753
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
754 """
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
755
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
756 #
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
757 # The base Class class
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
758 #
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
759 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
760 """ 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
761
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
762 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
763 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
764 """
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
765
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
766 def __init__(self, db, classname, **properties):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
767 """Create a new class with a given name and property specification.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
768
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
769 'classname' must not collide with the name of an existing class,
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
770 or a ValueError is raised. The keyword arguments in 'properties'
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
771 must map names to property objects, or a TypeError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
772 """
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
773 for name in 'creation activity creator actor'.split():
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
774 if properties.has_key(name):
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
775 raise ValueError, '"creation", "activity", "creator" and '\
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
776 '"actor" are reserved'
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
777
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
778 self.classname = classname
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
779 self.properties = properties
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
780 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
781 self.key = ''
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
782
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
783 # should we journal changes (default yes)
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
784 self.do_journal = 1
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
785
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
786 # do the db-related init stuff
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
787 db.addclass(self)
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
788
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
789 actions = "create set retire restore".split()
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
790 self.auditors = dict([(a, PrioList()) for a in actions])
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
791 self.reactors = dict([(a, PrioList()) for a in actions])
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
792
452
7181efddce66 yuck, a gdbm instance tests false :(
Richard Jones <richard@users.sourceforge.net>
parents: 431
diff changeset
793 def __repr__(self):
657
e0a1cc7538e9 more pychecker warnings removed
Richard Jones <richard@users.sourceforge.net>
parents: 648
diff changeset
794 '''Slightly more useful representation
e0a1cc7538e9 more pychecker warnings removed
Richard Jones <richard@users.sourceforge.net>
parents: 648
diff changeset
795 '''
993
07f88a837450 turn on journalling of links by default
Richard Jones <richard@users.sourceforge.net>
parents: 940
diff changeset
796 return '<hyperdb.Class "%s">'%self.classname
452
7181efddce66 yuck, a gdbm instance tests false :(
Richard Jones <richard@users.sourceforge.net>
parents: 431
diff changeset
797
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
798 # Editing nodes:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
799
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
800 def create(self, **propvalues):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
801 """Create a new node of this class and return its id.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
802
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
803 The keyword arguments in 'propvalues' map property names to values.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
804
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
805 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
806 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
807
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
808 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
809 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
810
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
811 Any other properties on this class that are missing from the
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
812 'propvalues' dictionary are set to None.
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
813
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
814 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
815 node, an IndexError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
816 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
817 raise NotImplementedError
775
4409798dfa15 Can debug to stdout now
Richard Jones <richard@users.sourceforge.net>
parents: 764
diff changeset
818
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
819 _marker = []
475
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 466
diff changeset
820 def get(self, nodeid, propname, default=_marker, cache=1):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
821 """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
822
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
823 '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
824 IndexError is raised. 'propname' must be the name of a property
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
825 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
826
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
827 'cache' exists for backwards compatibility, and is not used.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
828 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
829 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
830
1926
3bdd34547fa7 Remove implementations of Class.getnode from back_anydbm and rdbms_common...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1905
diff changeset
831 # not in spec
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
832 def getnode(self, nodeid):
475
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 466
diff changeset
833 ''' Return a convenience wrapper for the node.
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 466
diff changeset
834
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 466
diff changeset
835 '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
836 IndexError is raised.
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 466
diff changeset
837
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
838 'cache' exists for backwards compatibility, and is not used.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
839 '''
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
840 return Node(self, nodeid)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
841
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
842 def getnodeids(self, retired=None):
1864
969a14faf707 Fixed "documentation" of getnodeids in roundup.hyperdb
Richard Jones <richard@users.sourceforge.net>
parents: 1840
diff changeset
843 '''Retrieve all the ids of the nodes for a particular Class.
969a14faf707 Fixed "documentation" of getnodeids in roundup.hyperdb
Richard Jones <richard@users.sourceforge.net>
parents: 1840
diff changeset
844 '''
969a14faf707 Fixed "documentation" of getnodeids in roundup.hyperdb
Richard Jones <richard@users.sourceforge.net>
parents: 1840
diff changeset
845 raise NotImplementedError
969a14faf707 Fixed "documentation" of getnodeids in roundup.hyperdb
Richard Jones <richard@users.sourceforge.net>
parents: 1840
diff changeset
846
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
847 def set(self, nodeid, **propvalues):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
848 """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
849
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
850 '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
851 IndexError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
852
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
853 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
854 class or a KeyError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
855
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
856 All values in 'propvalues' must be acceptable types for their
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
857 corresponding properties or a TypeError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
858
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
859 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
860 other key strings or a ValueError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
861
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
862 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
863 node id, a ValueError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
864 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
865 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
866
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
867 def retire(self, nodeid):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
868 """Retire a node.
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
869
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
870 The properties on the node remain available from the get() method,
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
871 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
872
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
873 Retired nodes are not returned by the find(), list(), or lookup()
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
874 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
875 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
876 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
877
1523
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1470
diff changeset
878 def restore(self, nodeid):
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1470
diff changeset
879 '''Restpre a retired node.
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1470
diff changeset
880
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1470
diff changeset
881 Make node available for all operations like it was before retirement.
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1470
diff changeset
882 '''
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1470
diff changeset
883 raise NotImplementedError
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
884
940
301a02ea6020 added is_retired query to Class
Richard Jones <richard@users.sourceforge.net>
parents: 910
diff changeset
885 def is_retired(self, nodeid):
301a02ea6020 added is_retired query to Class
Richard Jones <richard@users.sourceforge.net>
parents: 910
diff changeset
886 '''Return true if the node is rerired
301a02ea6020 added is_retired query to Class
Richard Jones <richard@users.sourceforge.net>
parents: 910
diff changeset
887 '''
301a02ea6020 added is_retired query to Class
Richard Jones <richard@users.sourceforge.net>
parents: 910
diff changeset
888 raise NotImplementedError
301a02ea6020 added is_retired query to Class
Richard Jones <richard@users.sourceforge.net>
parents: 910
diff changeset
889
894
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
890 def destroy(self, nodeid):
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
891 """Destroy a node.
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
892
894
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
893 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
894 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
895 deleted
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
896
894
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
897 WARNING: use retire() instead
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
898
894
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
899 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
900
894
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
901 WARNING: really, use retire() instead
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
902
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
903 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
904 support the session storage of the cgi interface.
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
905
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
906 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
907 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
908 if there are any references to the node.
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
909 """
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
910
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
911 def history(self, nodeid):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
912 """Retrieve the journal of edits on a particular node.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
913
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
914 '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
915 IndexError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
916
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
917 The returned list contains tuples of the form
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
918
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
919 (date, tag, action, params)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
920
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
921 '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
922 'tag' is the journaltag specified when the database was opened.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
923 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
924 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
925
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
926 # 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
927 def hasnode(self, nodeid):
952679be9e2c Added simple editing for classes that don't define a templated interface.
Richard Jones <richard@users.sourceforge.net>
parents: 618
diff changeset
928 '''Determine if the given nodeid actually exists
952679be9e2c Added simple editing for classes that don't define a templated interface.
Richard Jones <richard@users.sourceforge.net>
parents: 618
diff changeset
929 '''
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
930 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
931
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
932 def setkey(self, propname):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
933 """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
934
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
935 '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
936 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
937 all existing nodes must be unique or a ValueError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
938 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
939 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
940
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
941 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
942 """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
943 resolution order.
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
944 """
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
945 if labelprop not in self.getprops():
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
946 raise ValueError, "Not a property name: %s" % labelprop
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
947 self._labelprop = labelprop
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
948
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
949 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
950 """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
951 resolution order
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
952 """
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
953 if orderprop not in self.getprops():
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
954 raise ValueError, "Not a property name: %s" % orderprop
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
955 self._orderprop = orderprop
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
956
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
957 def getkey(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
958 """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
959 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
960
188
1536be43d2fa Roundupdb now appends "mailing list" information to its messages...
Richard Jones <richard@users.sourceforge.net>
parents: 172
diff changeset
961 def labelprop(self, default_to_id=0):
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
962 """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
963
51cce9671db0 Cleanup of the link label generation.
Richard Jones <richard@users.sourceforge.net>
parents: 118
diff changeset
964 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
965 It tries the following in order:
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
966
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
967 0. self._labelprop if set
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
968 1. key property
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
969 2. "name" property
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
970 3. "title" property
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
971 4. first property from the sorted property name list
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
972 """
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
973 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
974 return self._labelprop
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
975 k = self.getkey()
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
976 if k:
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
977 return k
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
978 props = self.getprops()
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
979 if props.has_key('name'):
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
980 return 'name'
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
981 elif props.has_key('title'):
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
982 return 'title'
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
983 if default_to_id:
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
984 return 'id'
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
985 props = props.keys()
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
986 props.sort()
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
987 return props[0]
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
988
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
989 def orderprop(self):
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
990 """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
991
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
992 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
993 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
994
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
995 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
996 1. "order" property
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
997 2. self.labelprop()
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
998 """
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
999
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1000 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
1001 return self._orderprop
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1002 props = self.getprops()
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1003 if props.has_key('order'):
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1004 return 'order'
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1005 return self.labelprop()
123
51cce9671db0 Cleanup of the link label generation.
Richard Jones <richard@users.sourceforge.net>
parents: 118
diff changeset
1006
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1007 def lookup(self, keyvalue):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1008 """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
1009
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1010 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
1011 'keyvalue' matches one of the values for the key property among
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1012 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
1013 otherwise a KeyError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1014 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1015 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1016
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1017 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
1018 """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
1019
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
1020 'propspec' consists of keyword args propname={nodeid:1,}
883
Richard Jones <richard@users.sourceforge.net>
parents: 880
diff changeset
1021 'propname' must be the name of a property in this class, or a
Richard Jones <richard@users.sourceforge.net>
parents: 880
diff changeset
1022 KeyError is raised. That property must be a Link or Multilink
Richard Jones <richard@users.sourceforge.net>
parents: 880
diff changeset
1023 property, or a TypeError is raised.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1024
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
1025 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
1026 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
1027 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
1028 issues:
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1029
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
1030 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
1031 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1032 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1033
3634
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1034 def _filter(self, search_matches, filterspec, sort=(None,None),
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1035 group=(None,None)):
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1036 """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
1037 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
1038 """
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1039 raise NotImplementedError
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1040
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1041 def _proptree(self, filterspec, sortattr=[]):
3634
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1042 """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
1043 filterspec.
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1044 """
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1045 proptree = Proptree(self.db, self, '', self.getprops())
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1046 for key, v in filterspec.iteritems():
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1047 keys = key.split('.')
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1048 p = proptree
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1049 for k in keys:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1050 p = p.append(k)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1051 p.val = v
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1052 multilinks = {}
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1053 for s in sortattr:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1054 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
1055 p = proptree
3635
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1056 for k in keys:
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1057 p = p.append(k, sort_type = 2)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1058 if isinstance (p.propclass, Multilink):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1059 multilinks[p] = True
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1060 if p.cls:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1061 p = p.append(p.cls.orderprop(), sort_type = 2)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1062 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
1063 continue
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1064 p.sort_direction = s[0]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1065 proptree.sortattr.append (p)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1066 for p in multilinks.iterkeys():
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1067 sattr = {}
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1068 for c in p:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1069 if c.sort_direction:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1070 sattr [c] = True
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1071 for sa in proptree.sortattr:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1072 if sa in sattr:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1073 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
1074 return proptree
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1075
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1076 def get_transitive_prop(self, propname_path, default = None):
3635
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1077 """Expand a transitive property (individual property names
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1078 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
1079 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
1080 None.
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1081 Example propname_path (for class issue): "messages.author"
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1082 """
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1083 props = self.db.getclass(self.classname).getprops()
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1084 for k in propname_path.split('.'):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1085 try:
3635
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1086 prop = props[k]
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1087 except KeyError, TypeError:
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1088 return default
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1089 cl = getattr(prop, 'classname', None)
3635
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1090 props = None
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1091 if cl:
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1092 props = self.db.getclass(cl).getprops()
3635
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1093 return prop
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1094
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1095 def _sortattr(self, sort=[], group=[]):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1096 """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
1097 with sanity checks (no duplicate properties) included. Always
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1098 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
1099 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1100 seen = {}
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1101 sortattr = []
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1102 for srt in group, sort:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1103 if not isinstance(srt, list):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1104 srt = [srt]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1105 for s in srt:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1106 if s[1] and s[1] not in seen:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1107 sortattr.append((s[0] or '+', s[1]))
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1108 seen[s[1]] = True
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1109 if 'id' not in seen :
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1110 sortattr.append(('+', 'id'))
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1111 return sortattr
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1112
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1113 def filter(self, search_matches, filterspec, sort=[], group=[]):
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1114 """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
1115 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
1116 sort spec.
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1117
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1118 "filterspec" is {propname: value(s)}
1249
6c24a86a12ae Fixes for SourceForge tracker bugs.
Richard Jones <richard@users.sourceforge.net>
parents: 1244
diff changeset
1119
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1120 "sort" and "group" are [(dir, prop), ...] where dir is '+', '-'
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1121 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
1122 backward-compatibility reasons a single (dir, prop) tuple is
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1123 also allowed.
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1124
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1125 "search_matches" is {nodeid: marker}
1249
6c24a86a12ae Fixes for SourceForge tracker bugs.
Richard Jones <richard@users.sourceforge.net>
parents: 1244
diff changeset
1126
3455
e01bc6d65fa9 fixed documentation of filter()...
Richard Jones <richard@users.sourceforge.net>
parents: 3399
diff changeset
1127 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
1128 value to match is a list:
e01bc6d65fa9 fixed documentation of filter()...
Richard Jones <richard@users.sourceforge.net>
parents: 3399
diff changeset
1129
e01bc6d65fa9 fixed documentation of filter()...
Richard Jones <richard@users.sourceforge.net>
parents: 3399
diff changeset
1130 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
1131 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
1132
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1133 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
1134 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
1135 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
1136 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
1137 the last week with a filterspec of
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1138 {'messages.author' : '42', 'messages.creation' : '.-1w;'}
3634
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1139
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1140 Implementation note:
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1141 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
1142 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
1143 version can be implemented in the individual backends -- e.g.,
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1144 an SQL backen will want to create a single SQL statement and
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1145 override the filter method instead of implementing _filter.
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1146 """
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1147 sortattr = self._sortattr(sort = sort, group = group)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1148 proptree = self._proptree(filterspec, sortattr)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1149 proptree.search(search_matches)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1150 return proptree.sort()
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1151
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1152 def count(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1153 """Get the number of nodes in this class.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1154
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1155 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
1156 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
1157 id of the next node to be created in this class.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1158 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1159 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1160
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1161 # Manipulating properties:
262
ab921dc53ccd Added nicer command-line item adding:
Richard Jones <richard@users.sourceforge.net>
parents: 236
diff changeset
1162 def getprops(self, protected=1):
ab921dc53ccd Added nicer command-line item adding:
Richard Jones <richard@users.sourceforge.net>
parents: 236
diff changeset
1163 """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
1164 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
1165 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
1166 """
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1167 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1168
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1169 def get_required_props(self, propnames = []):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1170 """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
1171 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
1172 returned in addition to all properties in the propnames
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1173 parameter.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1174 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1175 props = self.getprops(protected = False)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1176 pdict = dict([(p, props[p]) for p in propnames])
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1177 pdict.update([(k, v) for k, v in props.iteritems() if v.required])
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1178 return pdict
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1179
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1180 def addprop(self, **properties):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1181 """Add properties to this class.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1182
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1183 The keyword arguments in 'properties' must map names to property
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1184 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
1185 may collide with the names of existing properties, or a ValueError
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1186 is raised before any properties have been added.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1187 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1188 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1189
825
0779ea9f1f18 More indexer work:
Richard Jones <richard@users.sourceforge.net>
parents: 805
diff changeset
1190 def index(self, nodeid):
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1191 """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
1192 raise NotImplementedError
825
0779ea9f1f18 More indexer work:
Richard Jones <richard@users.sourceforge.net>
parents: 805
diff changeset
1193
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1194 #
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1195 # Detector interface
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1196 #
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1197 def audit(self, event, detector, priority = 100):
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1198 """Register an auditor detector"""
3743
e754cc14e76a fix unstable ordering of detectors [SF#1585378]
Richard Jones <richard@users.sourceforge.net>
parents: 3695
diff changeset
1199 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
1200
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1201 def fireAuditors(self, event, nodeid, newvalues):
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1202 """Fire all registered auditors"""
3743
e754cc14e76a fix unstable ordering of detectors [SF#1585378]
Richard Jones <richard@users.sourceforge.net>
parents: 3695
diff changeset
1203 for prio, name, audit in self.auditors[event]:
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1204 audit(self.db, self, nodeid, newvalues)
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1205
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1206 def react(self, event, detector, priority = 100):
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1207 """Register a reactor detector"""
3743
e754cc14e76a fix unstable ordering of detectors [SF#1585378]
Richard Jones <richard@users.sourceforge.net>
parents: 3695
diff changeset
1208 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
1209
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1210 def fireReactors(self, event, nodeid, oldvalues):
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1211 """Fire all registered reactors"""
3743
e754cc14e76a fix unstable ordering of detectors [SF#1585378]
Richard Jones <richard@users.sourceforge.net>
parents: 3695
diff changeset
1212 for prio, name, react in self.reactors[event]:
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1213 react(self.db, self, nodeid, oldvalues)
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1214
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1215 #
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1216 # import / export support
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1217 #
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1218 def export_propnames(self):
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1219 """List the property names for export from this Class"""
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1220 propnames = self.getprops().keys()
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1221 propnames.sort()
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1222 return propnames
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1223
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1224
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1225 class HyperdbValueError(ValueError):
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1226 ''' Error converting a raw value into a Hyperdb value '''
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1227 pass
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1228
2244
ac4f295499a4 fixed journal marshalling in RDBMS backends [SF#943627]
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
1229 def convertLinkValue(db, propname, prop, value, idre=re.compile('^\d+$')):
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1230 ''' Convert the link value (may be id or key value) to an id value. '''
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1231 linkcl = db.classes[prop.classname]
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1232 if not idre.match(value):
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1233 if linkcl.getkey():
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1234 try:
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1235 value = linkcl.lookup(value)
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1236 except KeyError, message:
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1237 raise HyperdbValueError, 'property %s: %r is not a %s.'%(
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1238 propname, value, prop.classname)
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1239 else:
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1240 raise HyperdbValueError, 'you may only enter ID values '\
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1241 'for property %s'%propname
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1242 return value
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1243
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1244 def fixNewlines(text):
1928
7c1ddebe7589 Small readability improvements.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1927
diff changeset
1245 """ Homogenise line endings.
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1246
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1247 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
1248 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
1249 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
1250 """
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1251 text = text.replace('\r\n', '\n')
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1252 return text.replace('\r', '\n')
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1253
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
1254 def rawToHyperdb(db, klass, itemid, propname, value, **kw):
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1255 ''' Convert the raw (user-input) value to a hyperdb-storable value. The
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1256 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
1257 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
1258
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1259 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
1260 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
1261 values.
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1262 '''
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1263 properties = klass.getprops()
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1264
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1265 # 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
1266 propname = propname.strip()
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1267 try:
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1268 proptype = properties[propname]
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1269 except KeyError:
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1270 raise HyperdbValueError, '%r is not a property of %s'%(propname,
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1271 klass.classname)
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1272
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1273 # 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
1274 if isinstance(value, type('')):
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1275 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
1276
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1277 # 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
1278 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
1279 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
1280
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1281 return value
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1282
1442
b42fa71754c9 don't attempt to create FileClass items if no content is supplied
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1283 class FileClass:
b42fa71754c9 don't attempt to create FileClass items if no content is supplied
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1284 ''' A class that requires the "content" property and stores it on
b42fa71754c9 don't attempt to create FileClass items if no content is supplied
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1285 disk.
b42fa71754c9 don't attempt to create FileClass items if no content is supplied
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
1286 '''
3601
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3586
diff changeset
1287 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
1288
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3586
diff changeset
1289 def __init__(self, db, classname, **properties):
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3586
diff changeset
1290 '''The newly-created class automatically includes the "content"
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3586
diff changeset
1291 property.
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3586
diff changeset
1292 '''
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3586
diff changeset
1293 if not properties.has_key('content'):
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3586
diff changeset
1294 properties['content'] = hyperdb.String(indexme='yes')
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3586
diff changeset
1295
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1296 def export_propnames(self):
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1297 ''' Don't export the "content" property
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1298 '''
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1299 propnames = self.getprops().keys()
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1300 propnames.remove('content')
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1301 propnames.sort()
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1302 return propnames
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1303
3019
293a17149765 First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 2962
diff changeset
1304 def exportFilename(self, 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
1305 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
1306 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
1307
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1308 def export_files(self, dirname, nodeid):
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1309 ''' Export the "content" property as a file, not csv column
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1310 '''
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1311 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
1312
293a17149765 First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 2962
diff changeset
1313 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
1314 ensureParentsExist(dest)
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1315 shutil.copyfile(source, dest)
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1316
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1317 def import_files(self, dirname, nodeid):
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1318 ''' Import the "content" property as a file
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1319 '''
3019
293a17149765 First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 2962
diff changeset
1320 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
1321
2962
4607f58a007b py2.1 compatibility
Richard Jones <richard@users.sourceforge.net>
parents: 2909
diff changeset
1322 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
1323 ensureParentsExist(dest)
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1324 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
1325
3544
5cd1c83dea50 Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3491
diff changeset
1326 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
1327 props = self.getprops()
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
1328 if props.has_key('type'):
3545
507b2df02956 fixes to import_files
Richard Jones <richard@users.sourceforge.net>
parents: 3544
diff changeset
1329 mime_type = self.get(nodeid, 'type')
3544
5cd1c83dea50 Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3491
diff changeset
1330 if not mime_type:
5cd1c83dea50 Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3491
diff changeset
1331 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
1332 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
1333 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
1334 self.get(nodeid, 'content'), mime_type)
3544
5cd1c83dea50 Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3491
diff changeset
1335
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1336 class Node:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1337 ''' A convenience wrapper for the given node
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1338 '''
475
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 466
diff changeset
1339 def __init__(self, cl, nodeid, cache=1):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1340 self.__dict__['cl'] = cl
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1341 self.__dict__['nodeid'] = nodeid
278
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
1342 def keys(self, protected=1):
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
1343 return self.cl.getprops(protected=protected).keys()
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
1344 def values(self, protected=1):
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
1345 l = []
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
1346 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
1347 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
1348 return l
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
1349 def items(self, protected=1):
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
1350 l = []
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
1351 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
1352 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
1353 return l
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1354 def has_key(self, name):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1355 return self.cl.getprops().has_key(name)
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
1356 def get(self, name, default=None):
1470
9ccd69fbe33e applied patch [SF#688595]
Richard Jones <richard@users.sourceforge.net>
parents: 1442
diff changeset
1357 if self.has_key(name):
9ccd69fbe33e applied patch [SF#688595]
Richard Jones <richard@users.sourceforge.net>
parents: 1442
diff changeset
1358 return self[name]
9ccd69fbe33e applied patch [SF#688595]
Richard Jones <richard@users.sourceforge.net>
parents: 1442
diff changeset
1359 else:
9ccd69fbe33e applied patch [SF#688595]
Richard Jones <richard@users.sourceforge.net>
parents: 1442
diff changeset
1360 return default
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1361 def __getattr__(self, name):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1362 if self.__dict__.has_key(name):
278
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
1363 return self.__dict__[name]
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1364 try:
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
1365 return self.cl.get(self.nodeid, name)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1366 except KeyError, value:
460
9c895b44240a take a copy of the node dict...
Richard Jones <richard@users.sourceforge.net>
parents: 457
diff changeset
1367 # 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
1368 # exceptions should pass through untrapped
9c895b44240a take a copy of the node dict...
Richard Jones <richard@users.sourceforge.net>
parents: 457
diff changeset
1369 pass
9c895b44240a take a copy of the node dict...
Richard Jones <richard@users.sourceforge.net>
parents: 457
diff changeset
1370 # nope, no such attribute
9c895b44240a take a copy of the node dict...
Richard Jones <richard@users.sourceforge.net>
parents: 457
diff changeset
1371 raise AttributeError, str(value)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1372 def __getitem__(self, name):
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
1373 return self.cl.get(self.nodeid, name)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1374 def __setattr__(self, name, value):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1375 try:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1376 return self.cl.set(self.nodeid, **{name: value})
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1377 except KeyError, value:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1378 raise AttributeError, str(value)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1379 def __setitem__(self, name, value):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1380 self.cl.set(self.nodeid, **{name: value})
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1381 def history(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1382 return self.cl.history(self.nodeid)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1383 def retire(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1384 return self.cl.retire(self.nodeid)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1385
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1386
648
07422fe57db2 Ran it through pychecker, made fixes
Richard Jones <richard@users.sourceforge.net>
parents: 628
diff changeset
1387 def Choice(name, db, *options):
07422fe57db2 Ran it through pychecker, made fixes
Richard Jones <richard@users.sourceforge.net>
parents: 628
diff changeset
1388 '''Quick helper to create a simple class with choices
07422fe57db2 Ran it through pychecker, made fixes
Richard Jones <richard@users.sourceforge.net>
parents: 628
diff changeset
1389 '''
07422fe57db2 Ran it through pychecker, made fixes
Richard Jones <richard@users.sourceforge.net>
parents: 628
diff changeset
1390 cl = Class(db, name, name=String(), order=String())
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1391 for i in range(len(options)):
648
07422fe57db2 Ran it through pychecker, made fixes
Richard Jones <richard@users.sourceforge.net>
parents: 628
diff changeset
1392 cl.create(name=options[i], order=i)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1393 return hyperdb.Link(name)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1394
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
1395 # vim: set filetype=python sts=4 sw=4 et si :

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