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