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