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