annotate roundup/hyperdb.py @ 7064:3359dc1dabb0

Add OAuth authentication to the mailgw script Now IMAPS can be used with OAuth as required by several large cloud providers. Move command line processing of the mailgw script to ``argparse``. Note that the command line options of the mailgw have changed, see upgrading.txt for details.
author Ralf Schlatterbeck <rsc@runtux.com>
date Wed, 23 Nov 2022 10:13:48 +0100
parents 9b4bd9bc9bdc
children 33eb82ad26ba
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
213
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
1 #
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
2 # Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/)
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
3 # This module is free software, and you may redistribute it and/or modify
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
4 # under the same terms as Python, so long as this copyright message and
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
5 # disclaimer are retained in their original form.
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
6 #
214
18134bffab37 stupid typo
Richard Jones <richard@users.sourceforge.net>
parents: 213
diff changeset
7 # IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR
213
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
8 # DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
9 # OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
10 # POSSIBILITY OF SUCH DAMAGE.
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
11 #
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
12 # BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
13 # BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
14 # FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS"
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
15 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 188
diff changeset
16 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
17 #
406
bdc2ea127ae9 Added module docstrings to all modules.
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 398
diff changeset
18
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
19 """Hyperdatabase implementation, especially field types.
1244
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1085
diff changeset
20 """
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
21 __docformat__ = 'restructuredtext'
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
22
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23 # standard python modules
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
24 import logging
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
25 import os
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
26 import re
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
27 import shutil
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
28 import sys
5079
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
29 import traceback
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
30 import weakref
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32 # roundup modules
5388
d26921b851c3 Python 3 preparation: make relative imports explicit.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
33 from . import date, password
d26921b851c3 Python 3 preparation: make relative imports explicit.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
34 from .support import ensureParentsExist, PrioList
6401
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
35 from roundup.mlink_expr import Expression
3925
603ec9630b08 i18n for hyperdb and backend errors
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3924
diff changeset
36 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
37 from roundup.cgi.exceptions import DetectorError
5481
9a09719b0d8e helper to allow comparing dicts and None values in Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5466
diff changeset
38 from roundup.anypy.cmp_ import NoneAndDictComparable
5525
bb7865241f8a Make CSV import/export compatible across Python versions (also RDBMS journals) (issue 2550976, issue 2550975).
Joseph Myers <jsm@polyomino.org.uk>
parents: 5481
diff changeset
39 from roundup.anypy.strings import eval_import
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
41 logger = logging.getLogger('roundup.hyperdb')
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
42
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
43
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 #
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 # Types
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46 #
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
47 class _Type(object):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
48 """A roundup property type."""
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
49 def __init__(self, required=False, default_value=None, quiet=False):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
50 self.required = required
4481
9bbf3758c16a Allow default value declaration in DB schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4480
diff changeset
51 self.__default_value = default_value
5112
8901cc4ef0e0 - issue1714899: Feature Request: Optional Change Note. Added a new
John Rouillard <rouilj@ieee.org>
parents: 5101
diff changeset
52 self.quiet = quiet
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
53 # We do not allow updates if self.computed is True
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
54 # For now only Multilinks (using the rev_multilink) can be computed
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
55 self.computed = False
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
56
224
ad2c98faec97 using isinstance(blah, Foo) now instead of isFooType
Richard Jones <richard@users.sourceforge.net>
parents: 214
diff changeset
57 def __repr__(self):
657
e0a1cc7538e9 more pychecker warnings removed
Richard Jones <richard@users.sourceforge.net>
parents: 648
diff changeset
58 ' more useful for dumps '
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
59 return '<%s.%s>' % (self.__class__.__module__, self.__class__.__name__)
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
60
4481
9bbf3758c16a Allow default value declaration in DB schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4480
diff changeset
61 def get_default_value(self):
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
62 """The default value when creating a new instance of this property."""
4481
9bbf3758c16a Allow default value declaration in DB schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4480
diff changeset
63 return self.__default_value
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
64
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
65 def register(self, cls, propname):
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
66 """Register myself to the class of which we are a property
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
67 the given propname is the name we have in our class.
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
68 """
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
69 assert not getattr(self, 'cls', None)
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
70 self.name = propname
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
71 self.cls = cls
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
72
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
73 def sort_repr(self, cls, val, name):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
74 """Representation used for sorting. This should be a python
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
75 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
76 individual backends may chose to use something different for
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
77 sorting as long as the outcome is the same.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
78 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
79 return val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
80
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
81
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
82 class String(_Type):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
83 """An object designating a String property."""
6463
8e06194ff0b0 fix isset() for StringHTMLProperty
John Rouillard <rouilj@ieee.org>
parents: 6413
diff changeset
84 def __init__(self, indexme='no', required=False, default_value=None,
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
85 quiet=False):
5112
8901cc4ef0e0 - issue1714899: Feature Request: Optional Change Note. Added a new
John Rouillard <rouilj@ieee.org>
parents: 5101
diff changeset
86 super(String, self).__init__(required, default_value, quiet)
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
87 self.indexme = indexme == 'yes'
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
88
3992
fe2af84a5ca5 allow binary data for "content" props through rawToHyperdb
Richard Jones <richard@users.sourceforge.net>
parents: 3925
diff changeset
89 def from_raw(self, value, propname='', **kw):
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
90 """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
91 if propname == 'content':
fe2af84a5ca5 allow binary data for "content" props through rawToHyperdb
Richard Jones <richard@users.sourceforge.net>
parents: 3925
diff changeset
92 # 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
93 # type from the beginning?
fe2af84a5ca5 allow binary data for "content" props through rawToHyperdb
Richard Jones <richard@users.sourceforge.net>
parents: 3925
diff changeset
94 return value
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
95 return fixNewlines(value)
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
96
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
97 def sort_repr(self, cls, val, name):
3684
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3682
diff changeset
98 if not val:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3682
diff changeset
99 return val
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
100 if name == 'id':
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
101 return int(val)
3684
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3682
diff changeset
102 return val.lower()
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
103
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
104
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
105 class Password(_Type):
270
a4241ddd22d7 Added the Password property type.
Richard Jones <richard@users.sourceforge.net>
parents: 264
diff changeset
106 """An object designating a Password property."""
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
107 def __init__(self, scheme=None, required=False, default_value=None,
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
108 quiet=False):
5112
8901cc4ef0e0 - issue1714899: Feature Request: Optional Change Note. Added a new
John Rouillard <rouilj@ieee.org>
parents: 5101
diff changeset
109 super(Password, self).__init__(required, default_value, quiet)
5053
9792b18e0b19 issue 2550880: Ability to choose password store scheme and SSHA support.
John Rouillard <rouilj@ieee.org>
parents: 4995
diff changeset
110 self.scheme = scheme
9792b18e0b19 issue 2550880: Ability to choose password store scheme and SSHA support.
John Rouillard <rouilj@ieee.org>
parents: 4995
diff changeset
111
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
112 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
113 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
114 return None
4480
1613754d2646 Fix first part of Password handling security issue2550688
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4472
diff changeset
115 try:
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
116 return password.Password(encrypted=value, scheme=self.scheme,
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
117 strict=True)
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5232
diff changeset
118 except password.PasswordValueError as message:
7056
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
119 raise HyperdbValueError(_('property %(property)s: %(errormsg)s') %
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
120 {'property': kw['propname'],
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
121 'errormsg': message})
4480
1613754d2646 Fix first part of Password handling security issue2550688
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4472
diff changeset
122
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
123 def sort_repr(self, cls, val, name):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
124 if not val:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
125 return val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
126 return str(val)
270
a4241ddd22d7 Added the Password property type.
Richard Jones <richard@users.sourceforge.net>
parents: 264
diff changeset
127
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
128
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
129 class Date(_Type):
224
ad2c98faec97 using isinstance(blah, Foo) now instead of isFooType
Richard Jones <richard@users.sourceforge.net>
parents: 214
diff changeset
130 """An object designating a Date property."""
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
131 def __init__(self, offset=None, required=False, default_value=None,
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
132 quiet=False):
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
133 super(Date, self).__init__(required=required,
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
134 default_value=default_value,
5112
8901cc4ef0e0 - issue1714899: Feature Request: Optional Change Note. Added a new
John Rouillard <rouilj@ieee.org>
parents: 5101
diff changeset
135 quiet=quiet)
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
136 self._offset = offset
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
137
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
138 def offset(self, db):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
139 if self._offset is not None:
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
140 return self._offset
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
141 return db.getUserTimezone()
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
142
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
143 def from_raw(self, value, db, **kw):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
144 try:
3621
77ed6c517793 timezone support (patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3601
diff changeset
145 value = date.Date(value, self.offset(db))
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5232
diff changeset
146 except ValueError as message:
7056
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
147 raise HyperdbValueError(_(
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
148 'property %(property)s: %(value)r is an invalid '
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
149 'date (%(errormsg)s)') % {'property': kw['propname'],
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
150 'value': value,
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
151 'errormsg': message})
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
152 return value
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
153
3586
f47bddab5a49 date spec wasn't allowing week intervals
Richard Jones <richard@users.sourceforge.net>
parents: 3545
diff changeset
154 def range_from_raw(self, value, db):
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
155 """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
156 return date.Range(value, date.Date, offset=self.offset(db))
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
157
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
158 def sort_repr(self, cls, val, name):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
159 if not val:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
160 return val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
161 return str(val)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
162
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
163
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
164 class Interval(_Type):
224
ad2c98faec97 using isinstance(blah, Foo) now instead of isFooType
Richard Jones <richard@users.sourceforge.net>
parents: 214
diff changeset
165 """An object designating an Interval property."""
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
166 def from_raw(self, value, **kw):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
167 try:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
168 value = date.Interval(value)
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5232
diff changeset
169 except ValueError as message:
7056
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
170 raise HyperdbValueError(_(
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
171 'property %(property)s: %(value)r is an invalid '
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
172 'date interval (%(errormsg)s)') %
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
173 {'property': kw['propname'],
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
174 'value': value,
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
175 'errormsg': message})
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
176 return value
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
177
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
178 def sort_repr(self, cls, val, name):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
179 if not val:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
180 return val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
181 return val.as_seconds()
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
182
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
183
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
184 class _Pointer(_Type):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
185 """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
186 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
187 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
188 required=False, default_value=None,
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
189 msg_header_property=None, quiet=False, rev_multilink=None):
4877
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
190 """ 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
191 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
192 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
193 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
194 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
195 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
196 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
197 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
198 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
199 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
200 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
201 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
202 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
203 responsible. In that case setting
2840a9e86ef2 New Link/Multilink attribute 'msg_header_property'
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5053
diff changeset
204 '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
205 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
206 'X-Roundup-issue-assigned_to: joe_user'.
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
207 The rev_multilink is used to inject a reverse multilink into
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
208 the Class linked by a Link or Multilink property. Note that
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
209 the result is always a Multilink. The name given with
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
210 rev_multilink is the name in the class where it is injected.
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
211 """
5112
8901cc4ef0e0 - issue1714899: Feature Request: Optional Change Note. Added a new
John Rouillard <rouilj@ieee.org>
parents: 5101
diff changeset
212 super(_Pointer, self).__init__(required, default_value, quiet)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
213 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
214 self.do_journal = do_journal == 'yes'
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
215 self.try_id_parsing = try_id_parsing == 'yes'
5063
2840a9e86ef2 New Link/Multilink attribute 'msg_header_property'
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5053
diff changeset
216 self.msg_header_property = msg_header_property
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
217 self.rev_multilink = rev_multilink
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
218
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
219 def __repr__(self):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
220 """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
221 storage in SQL backends!
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
222 """
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
223 return '<%s.%s to "%s">' % (self.__class__.__module__,
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
224 self.__class__.__name__, self.classname)
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
225
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
226
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
227 class Link(_Pointer):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
228 """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
229 node in a specified class."""
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
230 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
231 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
232 value = None
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
233 else:
4877
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
234 if self.try_id_parsing:
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
235 value = convertLinkValue(db, propname, self, value)
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
236 else:
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
237 value = convertLinkValue(db, propname, self, value, None)
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
238 return value
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
239
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
240 def sort_repr(self, cls, val, name):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
241 if not val:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
242 return val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
243 op = cls.labelprop()
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
244 if op == 'id':
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
245 return int(cls.get(val, op))
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
246 return cls.get(val, op)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
247
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
248
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
249 class Multilink(_Pointer):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
250 """An object designating a Multilink property that links
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
251 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
252
dfac856502d1 brief docco on the do_journal argument
Richard Jones <richard@users.sourceforge.net>
parents: 555
diff changeset
253 "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
254
dfac856502d1 brief docco on the do_journal argument
Richard Jones <richard@users.sourceforge.net>
parents: 555
diff changeset
255 "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
256 'link' and 'unlink' events placed in their journal
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
257 "rev_property" is used when injecting reverse multilinks. By
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
258 default (for a normal multilink) the table name is
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
259 <name_of_linking_class>_<name_of_link_property>
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
260 e.g. for the messages multilink in issue in the
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
261 classic schema it would be "issue_messages". The
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
262 multilink table in that case has two columns, the
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
263 nodeid contains the ID of the linking class while
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
264 the linkid contains the ID of the linked-to class.
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
265 When injecting backlinks, for a backlink resulting
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
266 from a Link or Multilink the table_name,
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
267 linkid_name, and nodeid_name must be explicitly
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
268 specified. So when specifying a rev_multilink
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
269 property for the messages attribute in the example
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
270 above, we would get 'issue_messages' for the
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
271 table_name, 'nodeid' for the linkid_name and
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
272 'linkid' for the nodeid_name (note the reversal).
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
273 For a rev_multilink resulting, e.g. from the
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
274 standard 'status' Link in the Class 'issue' in the
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
275 classic template we would set table_name to '_issue'
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
276 (table names in the database get a leading
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
277 underscore), the nodeid_name to 'status' and the
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
278 linkid_name to 'id'. With these settings we can use
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
279 the standard query engine (with minor modifications
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
280 for the computed names) to resolve reverse
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
281 multilinks.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
282 """
4481
9bbf3758c16a Allow default value declaration in DB schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4480
diff changeset
283
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
284 def __init__(self, classname, do_journal='yes', required=False,
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
285 quiet=False, try_id_parsing='yes', rev_multilink=None,
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
286 rev_property=None):
4481
9bbf3758c16a Allow default value declaration in DB schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4480
diff changeset
287
9bbf3758c16a Allow default value declaration in DB schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4480
diff changeset
288 super(Multilink, self).__init__(classname,
9bbf3758c16a Allow default value declaration in DB schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4480
diff changeset
289 do_journal,
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
290 required=required,
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
291 default_value=[], quiet=quiet,
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
292 try_id_parsing=try_id_parsing,
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
293 rev_multilink=rev_multilink)
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
294 self.rev_property = rev_property
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
295 self.rev_classname = None
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
296 self.rev_propname = None
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
297 self.table_name = None # computed in 'register' below
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
298 self.linkid_name = 'linkid'
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
299 self.nodeid_name = 'nodeid'
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
300 if self.rev_property:
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
301 # Do not allow updates if this is a reverse multilink
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
302 self.computed = True
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
303 self.rev_classname = rev_property.cls.classname
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
304 self.rev_propname = rev_property.name
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
305 if isinstance(self.rev_property, Link):
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
306 self.table_name = '_' + self.rev_classname
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
307 self.linkid_name = 'id'
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
308 self.nodeid_name = '_' + self.rev_propname
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
309 else:
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
310 self.table_name = self.rev_classname + '_' + self.rev_propname
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
311 self.linkid_name = 'nodeid'
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
312 self.nodeid_name = 'linkid'
4481
9bbf3758c16a Allow default value declaration in DB schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4480
diff changeset
313
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
314 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
315 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
316 return []
a15c15510e99 hyperdb handling of empty raw values for Multilink and Password [SF#1507814]
Richard Jones <richard@users.sourceforge.net>
parents: 3635
diff changeset
317
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
318 # 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
319 if itemid and not itemid.startswith('-'):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
320 curvalue = klass.get(itemid, propname)
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
321 else:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
322 curvalue = []
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
323
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
324 # 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
325 if isinstance(value, type('')):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
326 value = value.split(',')
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
327
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
328 # handle each add/remove in turn
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
329 # keep an extra list for all items that are
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
330 # 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
331 # <propname>=A,+B, which should replace the old
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
332 # 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
333 do_set = 1
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
334 newvalue = []
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
335 for item in value:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
336 item = item.strip()
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
337
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
338 # skip blanks
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
339 if not item: continue # noqa: E701
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
340
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
341 # handle +/-
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
342 remove = 0
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
343 if item.startswith('-'):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
344 remove = 1
5069
2706b66675bf issue2550763 Strip whitespace from Multilink values after + or -.
John Rouillard <rouilj@ieee.org>
parents: 5067
diff changeset
345 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
346 do_set = 0
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
347 elif item.startswith('+'):
5069
2706b66675bf issue2550763 Strip whitespace from Multilink values after + or -.
John Rouillard <rouilj@ieee.org>
parents: 5067
diff changeset
348 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
349 do_set = 0
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
350
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
351 # look up the value
4877
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
352 if self.try_id_parsing:
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
353 itemid = convertLinkValue(db, propname, self, item)
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
354 else:
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
355 itemid = convertLinkValue(db, propname, self, item, None)
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
356
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
357 # perform the add/remove
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
358 if remove:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
359 try:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
360 curvalue.remove(itemid)
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
361 except ValueError:
5548
fea11d05110e Avoid errors from selecting "no selection" on multilink (issue2550722).
Joseph Myers <jsm@polyomino.org.uk>
parents: 5527
diff changeset
362 # This can occur if the edit adding the element
fea11d05110e Avoid errors from selecting "no selection" on multilink (issue2550722).
Joseph Myers <jsm@polyomino.org.uk>
parents: 5527
diff changeset
363 # produced an error, so the form has it in the
fea11d05110e Avoid errors from selecting "no selection" on multilink (issue2550722).
Joseph Myers <jsm@polyomino.org.uk>
parents: 5527
diff changeset
364 # "no selection" choice but it's not set in the
fea11d05110e Avoid errors from selecting "no selection" on multilink (issue2550722).
Joseph Myers <jsm@polyomino.org.uk>
parents: 5527
diff changeset
365 # database.
fea11d05110e Avoid errors from selecting "no selection" on multilink (issue2550722).
Joseph Myers <jsm@polyomino.org.uk>
parents: 5527
diff changeset
366 pass
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
367 else:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
368 newvalue.append(itemid)
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
369 if itemid not in curvalue:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
370 curvalue.append(itemid)
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
371
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
372 # that's it, set the new Multilink property value,
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
373 # 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
374 if do_set:
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
375 value = newvalue
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
376 else:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
377 value = curvalue
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
378
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
379 # 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
380 # unnecessary :(
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
381 value = [int(x) for x in value]
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
382 value.sort()
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
383 value = [str(x) for x in value]
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
384 return value
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
385
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
386 def register(self, cls, propname):
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
387 super(Multilink, self).register(cls, propname)
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
388 if self.table_name is None:
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
389 self.table_name = self.cls.classname + '_' + self.name
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
390
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
391 def sort_repr(self, cls, val, name):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
392 if not val:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
393 return val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
394 op = cls.labelprop()
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
395 if op == 'id':
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
396 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
397 return [cls.get(v, op) for v in val]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
398
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
399
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
400 class Boolean(_Type):
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 858
diff changeset
401 """An object designating a boolean property"""
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
402 def from_raw(self, value, **kw):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
403 value = value.strip()
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
404 # checked is a common HTML checkbox value
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
405 value = value.lower() in ('checked', 'yes', 'true', 'on', '1')
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
406 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
407
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
408
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
409 class Number(_Type):
880
de3da99a7c02 Add Number and Boolean types to hyperdb.
Gordon B. McMillan <gmcm@users.sourceforge.net>
parents: 858
diff changeset
410 """An object designating a numeric property"""
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
411 def __init__(self, use_double=False, **kw):
5175
e1e40674a0bc Implement double-precision Number
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5169
diff changeset
412 """ The value use_double tells the database backend to use a
e1e40674a0bc Implement double-precision Number
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5169
diff changeset
413 floating-point format with more precision than the default.
e1e40674a0bc Implement double-precision Number
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5169
diff changeset
414 Usually implemented by type 'double precision' in the sql
e1e40674a0bc Implement double-precision Number
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5169
diff changeset
415 backend. The default is to use single-precision float (aka
e1e40674a0bc Implement double-precision Number
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5169
diff changeset
416 'real') in the db. Note that sqlite already uses 8-byte for
e1e40674a0bc Implement double-precision Number
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5169
diff changeset
417 floating point numbers.
e1e40674a0bc Implement double-precision Number
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5169
diff changeset
418 """
e1e40674a0bc Implement double-precision Number
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5169
diff changeset
419 self.use_double = use_double
e1e40674a0bc Implement double-precision Number
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5169
diff changeset
420 super(Number, self).__init__(**kw)
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
421
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
422 def from_raw(self, value, **kw):
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
423 value = value.strip()
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
424 try:
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
425 value = float(value)
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
426 except ValueError:
7056
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
427 raise HyperdbValueError(_(
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
428 'property %(property)s: %(value)r is not a number') %
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
429 {'property': kw['propname'],
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
430 'value': value})
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
431 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
432
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
433
5067
e424987d294a Add support for an integer type to join the existing number type.
John Rouillard <rouilj@ieee.org>
parents: 5063
diff changeset
434 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
435 """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
436 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
437 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
438 try:
e424987d294a Add support for an integer type to join the existing number type.
John Rouillard <rouilj@ieee.org>
parents: 5063
diff changeset
439 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
440 except ValueError:
7056
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
441 raise HyperdbValueError(_(
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
442 'property %(property)s: %(value)r is not an integer') % {
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
443 'property': kw['propname'],
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
444 'value': value})
5067
e424987d294a Add support for an integer type to join the existing number type.
John Rouillard <rouilj@ieee.org>
parents: 5063
diff changeset
445 return value
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
446
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
447
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
448 #
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
449 # 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
450 #
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
451 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
452 pass
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
453
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
454
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
455 dre = re.compile(r'^([A-Za-z](?:[A-Za-z_0-9]*[A-Za-z_]+)?)(\d+)$')
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
456
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
457
6238
6834bb5473da Summary: Constrain format of classname and document
John Rouillard <rouilj@ieee.org>
parents: 6228
diff changeset
458 def splitDesignator(designator,
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
459 dre=dre):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
460 """ Take a foo123 and return ('foo', 123)
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
461 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
462 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
463 if m is None:
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
464 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
465 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
466
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
467
5867
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
468 class Exact_Match(object):
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
469 """ Used to encapsulate exact match semantics search values
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
470 """
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
471 def __init__(self, value):
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
472 self.value = value
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
473
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
474
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
475 class Proptree(object):
4935
adb8b787e157 Attempt to clarify hyperdb.Proptree meaning
anatoly techtonik <techtonik@gmail.com>
parents: 4877
diff changeset
476 """ 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
477 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
478 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
479 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
480 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
481 'search', 'retrieve'.
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
482
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
483 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
484 backends that do not support transitive search (e.g. anydbm). The
6403
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
485 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
486 """
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
487
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
488 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
489 self.db = db
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
490 self.name = name
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
491 self.props = props
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
492 self.parent = parent
6403
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
493 self.val = None
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
494 self.has_values = False
6403
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
495 self.has_result = False
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
496 self.cls = cls
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
497 self.classname = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
498 self.uniqname = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
499 self.children = []
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
500 self.sortattr = []
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
501 self.propdict = {}
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
502 self.need_for = {'search': True}
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
503 self.sort_direction = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
504 self.sort_ids = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
505 self.sort_ids_needed = False
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
506 self.sort_result = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
507 self.attr_sort_done = False
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
508 self.tree_sort_done = False
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
509 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
510 self.orderby = []
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
511 self.sql_idx = None # index of retrieved column in sql result
6179
a701c9c81597 Fix rev_multilink properties search/retrieval
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6148
diff changeset
512 self.need_retired = False
a701c9c81597 Fix rev_multilink properties search/retrieval
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6148
diff changeset
513 self.need_child_retired = False
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
514 if parent:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
515 self.root = parent.root
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
516 self.depth = parent.depth + 1
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
517 else:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
518 self.root = self
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
519 self.seqno = 1
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
520 self.depth = 0
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
521 self.need_for['sort'] = True
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
522 self.id = self.root.seqno
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
523 self.root.seqno += 1
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
524 if self.cls:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
525 self.classname = self.cls.classname
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
526 self.uniqname = '%s%s' % (self.cls.classname, self.id)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
527 if not self.parent:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
528 self.uniqname = self.cls.classname
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
529 if retr:
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
530 self.append_retr_props()
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
531
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
532 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
533 """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
534 propclass for the child.
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 if name in self.propdict:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
537 pt = self.propdict[name]
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
538 pt.need_for[need_for] = True
6413
7b1b6dffc7ed Fix searching+sorting for Link properties
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6412
diff changeset
539 # For now we do not recursively retrieve Link properties
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
540 # if retr and isinstance(pt.propclass, Link):
6413
7b1b6dffc7ed Fix searching+sorting for Link properties
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6412
diff changeset
541 # pt.append_retr_props()
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
542 return pt
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
543 propclass = self.props[name]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
544 cls = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
545 props = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
546 if isinstance(propclass, (Link, Multilink)):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
547 cls = self.db.getclass(propclass.classname)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
548 props = cls.getprops()
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
549 child = self.__class__(self.db, cls, name, props, parent=self)
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
550 child.need_for = {need_for: True}
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
551 child.propclass = propclass
6179
a701c9c81597 Fix rev_multilink properties search/retrieval
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6148
diff changeset
552 if isinstance(propclass, Multilink) and self.props[name].computed:
a701c9c81597 Fix rev_multilink properties search/retrieval
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6148
diff changeset
553 if isinstance(self.props[name].rev_property, Link):
a701c9c81597 Fix rev_multilink properties search/retrieval
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6148
diff changeset
554 child.need_retired = True
a701c9c81597 Fix rev_multilink properties search/retrieval
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6148
diff changeset
555 else:
a701c9c81597 Fix rev_multilink properties search/retrieval
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6148
diff changeset
556 child.need_child_retired = True
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
557 self.children.append(child)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
558 self.propdict[name] = child
6413
7b1b6dffc7ed Fix searching+sorting for Link properties
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6412
diff changeset
559 # For now we do not recursively retrieve Link properties
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
560 # if retr and isinstance(child.propclass, Link):
6413
7b1b6dffc7ed Fix searching+sorting for Link properties
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6412
diff changeset
561 # child.append_retr_props()
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
562 return child
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
563
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
564 def append_retr_props(self):
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
565 """Append properties for retrieval."""
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
566 for name, prop in self.cls.getprops(protected=1).items():
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
567 if isinstance(prop, Multilink):
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
568 continue
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
569 self.append(name, need_for='retrieve')
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
570
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
571 def compute_sort_done(self, mlseen=False):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
572 """ Recursively check if attribute is needed for sorting
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
573 ('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
574 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
575 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
576 Multilink that is used for sorting.
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
577 """
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
578 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
579 mlseen = True
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
580 if mlseen:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
581 self.sort_ids_needed = False
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
582 self.tree_sort_done = True
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
583 for p in self.children:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
584 p.compute_sort_done(mlseen)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
585 if not p.tree_sort_done:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
586 self.tree_sort_done = False
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
587 if 'sort' not in self.need_for:
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
588 self.tree_sort_done = True
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
589 if mlseen:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
590 self.tree_sort_done = False
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
591
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
592 def ancestors(self):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
593 p = self
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
594 while p.parent:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
595 yield p
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
596 p = p.parent
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
597
5318
506c7ee9a385 Add a 'retired' parameter to Class.filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5315
diff changeset
598 def search(self, search_matches=None, sort=True, retired=False):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
599 """ Recursively search for the given properties in a proptree.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
600 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
601 simple _filter call which does the real work
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
602 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
603 filterspec = {}
5867
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
604 exact_match_spec = {}
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
605 for p in self.children:
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
606 if 'search' in p.need_for:
6412
a0c0ee3ed8b1 Tests for Link expressions
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6410
diff changeset
607 x = [c for c in p.children if 'search' in c.need_for]
a0c0ee3ed8b1 Tests for Link expressions
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6410
diff changeset
608 if x:
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
609 p.search(sort=False)
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
610 if getattr(p.propclass, 'rev_property', None):
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
611 pn = p.propclass.rev_property.name
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
612 cl = p.propclass.rev_property.cls
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
613 if not isinstance(p.val, type([])):
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
614 p.val = [p.val]
6401
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
615 nval = [int(i) for i in p.val]
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
616 pval = [str(i) for i in nval if i >= 0]
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
617 items = set()
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
618 if not nval or min(nval) >= -1:
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
619 if -1 in nval:
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
620 s1 = set(self.cls.getnodeids(retired=False))
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
621 s2 = set()
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
622 for id in cl.getnodeids(retired=False):
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
623 node = cl.getnode(id)
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
624 if node[pn]:
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
625 if isinstance(node[pn], type([])):
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
626 s2.update(node[pn])
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
627 else:
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
628 s2.add(node[pn])
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
629 items |= s1.difference(s2)
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
630 if isinstance(p.propclass.rev_property, Link):
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
631 items |= set(cl.get(x, pn) for x in pval
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
632 if not cl.is_retired(x))
6401
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
633 else:
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
634 items |= set().union(*(cl.get(x, pn) for x in pval
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
635 if not cl.is_retired(x)))
6401
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
636 else:
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
637 # Expression: materialize rev multilinks and run
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
638 # expression on them
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
639 expr = Expression(nval)
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
640 by_id = {}
6402
619807d9a2df Make rev multilink for Link work
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6401
diff changeset
641 for id in self.cls.getnodeids(retired=False):
6401
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
642 by_id[id] = set()
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
643 items = set()
6402
619807d9a2df Make rev multilink for Link work
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6401
diff changeset
644 for id in cl.getnodeids(retired=False):
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
645 node = cl.getnode(id)
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
646 if node[pn]:
6401
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
647 v = node[pn]
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
648 if not isinstance(v, type([])):
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
649 v = [v]
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
650 for x in v:
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
651 if x not in by_id:
6402
619807d9a2df Make rev multilink for Link work
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6401
diff changeset
652 continue
6401
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
653 by_id[x].add(id)
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
654 for k in by_id:
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
655 if expr.evaluate(by_id[k]):
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
656 items.add(k)
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
657
6403
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
658 # The subquery has found nothing. So it doesn't make
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
659 # sense to search further.
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
660 if not items:
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
661 self.set_val([], force=True)
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
662 return self.val
6401
8bc5faeb7677 Make rev multilink expressions work for anydbm
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6250
diff changeset
663 filterspec[p.name] = list(sorted(items, key=int))
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
664 elif isinstance(p.val, type([])):
5867
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
665 exact = []
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
666 subst = []
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
667 for v in p.val:
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
668 if isinstance(v, Exact_Match):
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
669 exact.append(v.value)
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
670 else:
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
671 subst.append(v)
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
672 if exact:
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
673 exact_match_spec[p.name] = exact
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
674 if subst:
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
675 filterspec[p.name] = subst
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
676 elif not exact: # don't set if we have exact criteria
6403
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
677 if p.has_result:
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
678 # A subquery already has found nothing. So
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
679 # it doesn't make sense to search further.
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
680 self.set_val([], force=True)
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
681 return self.val
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
682 else:
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
683 filterspec[p.name] = ['-1'] # no match was found
5867
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
684 else:
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
685 assert not isinstance(p.val, Exact_Match)
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
686 filterspec[p.name] = p.val
7056
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
687 self.set_val(self.cls._filter(search_matches, filterspec,
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
688 sort and self,
6403
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
689 retired=retired,
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
690 exact_match_spec=exact_match_spec))
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
691 return self.val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
692
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
693 def sort(self, ids=None):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
694 """ 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
695 optimisations: Some order attributes may be precomputed (by the
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
696 backend) and some properties may already be sorted.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
697 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
698 if ids is None:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
699 ids = self.val
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
700 if self.sortattr and [s for s in self.sortattr
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
701 if not s.attr_sort_done]:
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
702 return self._searchsort(ids, True, True)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
703 return ids
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
704
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
705 def sortable_children(self, intermediate=False):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
706 """ All children needed for sorting. If intermediate is True,
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
707 intermediate nodes (not being a sort attribute) are returned,
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
708 too.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
709 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
710 return [p for p in self.children
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
711 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
712
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
713 def __iter__(self):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
714 """ Yield nodes in depth-first order -- visited nodes first """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
715 for p in self.children:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
716 yield p
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
717 for c in p:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
718 yield c
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
719
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
720 def _get(self, ids):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
721 """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
722 we have a list of ids.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
723 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
724 if not ids:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
725 return ids
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
726 if isinstance(ids[0], list):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
727 cids = [self._get(i) for i in ids]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
728 else:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
729 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
730 if self.sortattr:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
731 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
732 return cids
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
733
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
734 def _searchsort(self, ids=None, update=True, dosort=True):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
735 """ Recursively compute the sort attributes. Note that ids
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
736 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
737 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
738 individual attribute. We make sure that everything is properly
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
739 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
740 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
741 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
742 self.sort_ids is available.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
743
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
744 Yech, Multilinks: This gets especially complicated if somebody
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
745 sorts by different attributes of the same multilink (or
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
746 transitively across several multilinks). My use-case is sorting
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
747 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
748 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
749 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
750 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
751 *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
752 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
753 author and one sorted by date for sorting issues.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
754 """
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
755 for pt in self.sortable_children(intermediate=True):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
756 # ids can be an empty list
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
757 if pt.tree_sort_done or not ids:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
758 continue
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
759 if pt.sort_ids: # cached or computed by backend
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
760 cids = pt.sort_ids
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
761 else:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
762 cids = pt._get(ids)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
763 if pt.sort_direction and not pt.sort_result:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
764 sortrep = pt.propclass.sort_repr
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
765 pt.sort_result = pt._sort_repr(sortrep, cids)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
766 pt.sort_ids = cids
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
767 if pt.children:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
768 pt._searchsort(cids, update, False)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
769 if self.sortattr and dosort:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
770 ids = self._sort(ids)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
771 if not update:
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
772 for pt in self.sortable_children(intermediate=True):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
773 pt.sort_ids = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
774 for pt in self.sortattr:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
775 pt.sort_result = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
776 return ids
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
777
6403
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
778 def set_val(self, val, force=False, result=True):
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
779 """ Check if self.val is already defined (it is not None and
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
780 has_values is True). If yes, we compute the
5867
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
781 intersection of the old and the new value(s)
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
782 Note: If self is a Leaf node we need to compute a
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
783 union: Normally we intersect (logical and) different
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
784 subqueries into a Link or Multilink property. But for
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
785 leaves we might have a part of a query in a filterspec and
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
786 in an exact_match_spec. These have to be all there, the
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
787 generated search will ensure a logical and of all tests for
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
788 equality/substring search.
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
789 """
6403
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
790 if force:
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
791 assert val == []
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
792 assert result
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
793 self.val = val
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
794 self.has_values = True
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
795 self.has_result = True
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
796 return
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
797 if self.has_values:
6403
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
798 v = self.val
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
799 if not isinstance(self.val, type([])):
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
800 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
801 vals = set(v)
5867
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
802 if not isinstance(val, type([])):
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
803 val = [val]
6403
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
804 if self.has_result:
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
805 assert result
5867
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
806 # if cls is None we're a leaf
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
807 if self.cls:
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
808 vals.intersection_update(val)
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
809 else:
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
810 vals.update(val)
6403
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
811 self.val = list(vals)
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
812 else:
6403
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
813 # If a subquery found nothing we don't care if there is an
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
814 # expression
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
815 if not self.has_values or not val:
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
816 self.val = val
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
817 if result:
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
818 self.has_result = True
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
819 else:
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
820 if not result:
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
821 assert not self.cls
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
822 vals.update(val)
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
823 self.val = list(vals)
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
824 else:
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
825 assert self.cls
6410
66ccddb034f2 Bug-fix in expression parser
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6409
diff changeset
826 is_expression = \
66ccddb034f2 Bug-fix in expression parser
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6409
diff changeset
827 self.val and min(int(i) for i in self.val) < -1
6403
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
828 if is_expression:
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
829 # Tag on the ORed values with an AND
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
830 l = val
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
831 for _i in range(len(val)-1):
6403
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
832 l.append('-4')
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
833 l.append('-3')
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
834 self.val = self.val + l
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
835 else:
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
836 vals.intersection_update(val)
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
837 self.val = list(vals)
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
838 self.has_result = True
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
839 self.has_values = True
3924
21d3d7eeea8c assorted pyflakes fixes
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3802
diff changeset
840
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
841 def _sort(self, val):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
842 """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
843 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
844 responsible for setting attr_sort_done only for trailing
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
845 attributes (otherwise the sort order is wrong). Since pythons
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
846 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
847 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
848 current sort.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
849
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
850 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
851 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
852 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
853 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
854 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
855 repeated sorting is probably more efficient than using
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
856 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
857 methods.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
858 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
859 if not val:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
860 return val
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
861 sortattr = []
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
862 directions = []
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
863 dir_idx = []
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
864 idx = 0
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
865 curdir = None
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
866 for sa in self.sortattr:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
867 if sa.attr_sort_done:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
868 break
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
869 if sortattr:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
870 assert len(sortattr[0]) == len(sa.sort_result)
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
871 sortattr.append(sa.sort_result)
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
872 if curdir != sa.sort_direction:
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
873 dir_idx.append(idx)
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
874 directions.append(sa.sort_direction)
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
875 curdir = sa.sort_direction
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
876 idx += 1
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
877 sortattr.append(val)
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
878 sortattr = zip(*sortattr)
5397
f2c5e0f6506e Python 3 preparation: use list() around zip() as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5395
diff changeset
879 for dir, i in reversed(list(zip(directions, dir_idx))):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
880 rev = dir == '-'
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
881 sortattr = sorted(sortattr,
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
882 key=lambda x: NoneAndDictComparable(x[i:idx]),
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
883 reverse=rev)
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
884 idx = i
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
885 return [x[-1] for x in sortattr]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
886
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
887 def _sort_repr(self, sortrep, ids):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
888 """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
889 recurse until we have a list of ids.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
890 """
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
891 if not ids:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
892 return ids
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
893 if isinstance(ids[0], list):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
894 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
895 else:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
896 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
897 return res
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
898
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
899 def __repr__(self):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
900 r = ["proptree:" + self.name]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
901 for n in self:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
902 r.append("proptree:" + " " * n.depth + n.name)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
903 return '\n'.join(r)
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
904 __str__ = __repr__
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
905
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
906
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
907 #
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
908 # 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
909 #
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
910 class DatabaseError(ValueError):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
911 """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
912 """
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
913 pass
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
914
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
915
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
916 class Database(object):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
917 """A database for storing records containing flexible data types.
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
918
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
919 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
920 store their data.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
921
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
922
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
923 Transactions
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
924 ------------
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
925 The Database should support transactions through the commit() and
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
926 rollback() methods. All other Database methods should be transaction-aware,
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
927 using data from the current transaction before looking up the database.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
928
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
929 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
930 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
931 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
932 transaction.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
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
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
935 Implementation
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
936 --------------
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
937
1926
3bdd34547fa7 Remove implementations of Class.getnode from back_anydbm and rdbms_common...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1905
diff changeset
938 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
939
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
940 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
941
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
942 # flag to set on retired entries
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
943 RETIRED_FLAG = '__hyperdb_retired'
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
944
3491
0e5f15520e70 fix detection of "missing" existing values in CGI form parser [SF#1414149]
Richard Jones <richard@users.sourceforge.net>
parents: 3488
diff changeset
945 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
946 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
947 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
948
524
dce4c75bef5a changed all config accesses...
Richard Jones <richard@users.sourceforge.net>
parents: 490
diff changeset
949 def __init__(self, config, journaltag=None):
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
950 """Open a hyperdatabase given a specifier to some storage.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
951
524
dce4c75bef5a changed all config accesses...
Richard Jones <richard@users.sourceforge.net>
parents: 490
diff changeset
952 The 'storagelocator' is obtained from config.DATABASE.
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
953 The meaning of 'storagelocator' depends on the particular
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
954 implementation of the hyperdatabase. It could be a file name,
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
955 a directory path, a socket descriptor for a connection to a
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
956 database over the network, etc.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
957
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
958 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
959 entries for any edits done on the database. If 'journaltag' is
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
960 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
961 Class.set(), and Class.retire() methods are disabled.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
962 """
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
963 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
964
825
0779ea9f1f18 More indexer work:
Richard Jones <richard@users.sourceforge.net>
parents: 805
diff changeset
965 def post_init(self):
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
966 """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
967 If 'refresh' is true, we want to rebuild the backend
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
968 structures. Note that post_init can be called multiple times,
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
969 at least during regression testing.
1840
91a4619b1a14 hyperdb grows a refresh_database() method.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1780
diff changeset
970 """
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
971 done = getattr(self, 'post_init_done', None)
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
972 for cn in self.getclasses():
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
973 cl = self.getclass(cn)
6228
f40c6b5de370 Fix reverse multilink iteration
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6183
diff changeset
974 # This will change properties if a back-multilink happens to
6516
3e6c2039d0a8 Fix dict being changed during iteration
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6463
diff changeset
975 # have the same class, so we need to iterate over a list made
3e6c2039d0a8 Fix dict being changed during iteration
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6463
diff changeset
976 # from .keys()
3e6c2039d0a8 Fix dict being changed during iteration
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6463
diff changeset
977 for p in list(cl.properties.keys()):
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
978 prop = cl.properties[p]
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
979 if not isinstance(prop, (Link, Multilink)):
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
980 continue
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
981 if prop.rev_multilink:
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
982 linkcls = self.getclass(prop.classname)
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
983 if prop.rev_multilink in linkcls.properties:
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
984 if not done:
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
985 raise ValueError(
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
986 "%s already a property of class %s" %
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
987 (prop.rev_multilink, linkcls.classname))
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
988 else:
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
989 linkcls.properties[prop.rev_multilink] = Multilink(
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
990 cl.classname, rev_property=prop)
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
991 self.post_init_done = True
1840
91a4619b1a14 hyperdb grows a refresh_database() method.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1780
diff changeset
992
91a4619b1a14 hyperdb grows a refresh_database() method.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1780
diff changeset
993 def refresh_database(self):
91a4619b1a14 hyperdb grows a refresh_database() method.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1780
diff changeset
994 """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
995 and structures. Not called in normal usage."""
825
0779ea9f1f18 More indexer work:
Richard Jones <richard@users.sourceforge.net>
parents: 805
diff changeset
996 raise NotImplementedError
0779ea9f1f18 More indexer work:
Richard Jones <richard@users.sourceforge.net>
parents: 805
diff changeset
997
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
998 def __getattr__(self, classname):
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
999 """A convenient way of calling self.getclass(classname)."""
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1000 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1001
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1002 def addclass(self, cl):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1003 """Add a Class to the hyperdatabase.
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1004 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1005 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1006
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1007 def getclasses(self):
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1008 """Return a list of the names of all existing classes."""
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1009 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1010
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1011 def getclass(self, classname):
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1012 """Get the Class object representing a particular class.
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1013
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1014 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
1015 """
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1016 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1017
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1018 def clear(self):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1019 """Delete all database contents.
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1020 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1021 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1022
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1023 def getclassdb(self, classname, mode='r'):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1024 """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
1025 multiple actions.
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1026 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1027 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1028
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1029 def addnode(self, classname, nodeid, node):
1928
7c1ddebe7589 Small readability improvements.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1927
diff changeset
1030 """Add the specified node to its class's db.
7c1ddebe7589 Small readability improvements.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1927
diff changeset
1031 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1032 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1033
676
bc46480e2a2b Fixed serialisation problem...
Richard Jones <richard@users.sourceforge.net>
parents: 657
diff changeset
1034 def serialise(self, classname, node):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1035 """Copy the node contents, converting non-marshallable data into
676
bc46480e2a2b Fixed serialisation problem...
Richard Jones <richard@users.sourceforge.net>
parents: 657
diff changeset
1036 marshallable data.
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1037 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1038 return node
676
bc46480e2a2b Fixed serialisation problem...
Richard Jones <richard@users.sourceforge.net>
parents: 657
diff changeset
1039
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1040 def setnode(self, classname, nodeid, node):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1041 """Change the specified node.
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1042 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1043 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1044
676
bc46480e2a2b Fixed serialisation problem...
Richard Jones <richard@users.sourceforge.net>
parents: 657
diff changeset
1045 def unserialise(self, classname, node):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1046 """Decode the marshalled node data
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1047 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1048 return node
676
bc46480e2a2b Fixed serialisation problem...
Richard Jones <richard@users.sourceforge.net>
parents: 657
diff changeset
1049
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1050 def getnode(self, classname, nodeid):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1051 """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
1052
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
1053 '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
1054 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1055 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1056
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1057 def hasnode(self, classname, nodeid):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1058 """Determine if the database has a given node.
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1059 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1060 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1061
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1062 def countnodes(self, classname):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1063 """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
1064 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1065 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1066
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1067 def storefile(self, classname, nodeid, property, content):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1068 """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
1069
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1070 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
1071 indicate which property is being saved.
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1072 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1073 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1074
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1075 def getfile(self, classname, nodeid, property):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1076 """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
1077 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1078 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1079
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1080 def addjournal(self, classname, nodeid, action, params):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1081 """ Journal the Action
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1082 'action' may be:
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1083
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1084 'set' -- 'params' is a dictionary of property values
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1085 'create' -- 'params' is an empty dictionary as of
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1086 Wed Nov 06 11:38:43 2002 +0000
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1087 'link' or 'unlink' -- 'params' is (classname, nodeid, propname)
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1088 'retired' or 'restored'-- 'params' is None
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1089 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1090 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1091
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1092 def getjournal(self, classname, nodeid):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1093 """ get the journal for id
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1094 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1095 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1096
562
62febbd7ffec You can now use the roundup-admin tool to pack the database
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 557
diff changeset
1097 def pack(self, pack_before):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1098 """ pack the database
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1099 """
562
62febbd7ffec You can now use the roundup-admin tool to pack the database
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 557
diff changeset
1100 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
1101
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1102 def commit(self):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1103 """ Commit the current transactions.
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1104
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1105 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
1106 last commit() or rollback().
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1107 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1108 raise NotImplementedError
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1109
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1110 def rollback(self):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1111 """ Reverse all actions from the current transaction.
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1112
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1113 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
1114 commit() or rollback() was performed.
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1115 """
477
05a46da7293a hyperdb docstrings
Richard Jones <richard@users.sourceforge.net>
parents: 475
diff changeset
1116 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1117
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
1118 def close(self):
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
1119 """Close the database.
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
1120
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
1121 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
1122
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
1123 """
6621
6f35be77324c Database class close method was not raising NotImplementedError
John Rouillard <rouilj@ieee.org>
parents: 6516
diff changeset
1124 raise NotImplementedError
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1125
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
1126
4306
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1127 def iter_roles(roles):
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1128 ''' 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
1129 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
1130 '''
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1131 if not roles or not roles.strip():
5807
0467d80eaeec Try to deal with this warning/error: DeprecationWarning: generator
John Rouillard <rouilj@ieee.org>
parents: 5697
diff changeset
1132 return
4306
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1133 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
1134 yield role
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1135
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1136
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1137 #
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1138 # The base Class class
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1139 #
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1140 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
1141 """ 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
1142
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1143 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
1144 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
1145 """
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1146
6238
6834bb5473da Summary: Constrain format of classname and document
John Rouillard <rouilj@ieee.org>
parents: 6228
diff changeset
1147 class_re = r'^([A-Za-z](?:[A-Za-z_0-9]*[A-Za-z_]+)?)$'
6834bb5473da Summary: Constrain format of classname and document
John Rouillard <rouilj@ieee.org>
parents: 6228
diff changeset
1148
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1149 def __init__(self, db, classname, **properties):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1150 """Create a new class with a given name and property specification.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1151
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1152 'classname' must not collide with the name of an existing class,
6238
6834bb5473da Summary: Constrain format of classname and document
John Rouillard <rouilj@ieee.org>
parents: 6228
diff changeset
1153 or a ValueError is raised. 'classname' must start with an
6834bb5473da Summary: Constrain format of classname and document
John Rouillard <rouilj@ieee.org>
parents: 6228
diff changeset
1154 alphabetic letter. It must end with an alphabetic letter or '_'.
6834bb5473da Summary: Constrain format of classname and document
John Rouillard <rouilj@ieee.org>
parents: 6228
diff changeset
1155 Internal characters can be alphanumeric or '_'. ValueError is
6834bb5473da Summary: Constrain format of classname and document
John Rouillard <rouilj@ieee.org>
parents: 6228
diff changeset
1156 raised if the classname is not correct.
6834bb5473da Summary: Constrain format of classname and document
John Rouillard <rouilj@ieee.org>
parents: 6228
diff changeset
1157 The keyword arguments in 'properties' must map names to property
6834bb5473da Summary: Constrain format of classname and document
John Rouillard <rouilj@ieee.org>
parents: 6228
diff changeset
1158 objects, or a TypeError is raised.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1159 """
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1160 for name in 'creation activity creator actor'.split():
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
1161 if name in properties:
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1162 raise ValueError('"creation", "activity", "creator" and '
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1163 '"actor" are reserved')
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1164
6238
6834bb5473da Summary: Constrain format of classname and document
John Rouillard <rouilj@ieee.org>
parents: 6228
diff changeset
1165 if not re.match(self.class_re, classname):
6834bb5473da Summary: Constrain format of classname and document
John Rouillard <rouilj@ieee.org>
parents: 6228
diff changeset
1166 raise ValueError('Class name %s is not valid. It must start '
6834bb5473da Summary: Constrain format of classname and document
John Rouillard <rouilj@ieee.org>
parents: 6228
diff changeset
1167 'with a letter, end with a letter or "_", and '
6834bb5473da Summary: Constrain format of classname and document
John Rouillard <rouilj@ieee.org>
parents: 6228
diff changeset
1168 'only have alphanumerics and "_" in the '
6834bb5473da Summary: Constrain format of classname and document
John Rouillard <rouilj@ieee.org>
parents: 6228
diff changeset
1169 'middle.' % (classname,))
6834bb5473da Summary: Constrain format of classname and document
John Rouillard <rouilj@ieee.org>
parents: 6228
diff changeset
1170
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1171 self.classname = classname
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1172 self.properties = properties
6148
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
1173 # Make the class and property name known to the property
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
1174 for p in properties:
8497bf3f23a1 Allow to define reverse Multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6006
diff changeset
1175 properties[p].register(self, p)
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1176 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
1177 self.key = ''
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1178
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1179 # should we journal changes (default yes)
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1180 self.do_journal = 1
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1181
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1182 # do the db-related init stuff
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1183 db.addclass(self)
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1184
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1185 actions = "create set retire restore".split()
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1186 self.auditors = dict([(a, PrioList()) for a in actions])
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1187 self.reactors = dict([(a, PrioList()) for a in actions])
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1188
452
7181efddce66 yuck, a gdbm instance tests false :(
Richard Jones <richard@users.sourceforge.net>
parents: 431
diff changeset
1189 def __repr__(self):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1190 """Slightly more useful representation
6183
bb198596f85c Fix __repr__ of hyperdb.Class
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6179
diff changeset
1191 Note that an error message can be raised at a point
bb198596f85c Fix __repr__ of hyperdb.Class
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6179
diff changeset
1192 where self.classname isn't known yet if the error
bb198596f85c Fix __repr__ of hyperdb.Class
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6179
diff changeset
1193 occurs during schema parsing.
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1194 """
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
1195 cn = getattr(self, 'classname', 'Unknown')
6183
bb198596f85c Fix __repr__ of hyperdb.Class
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6179
diff changeset
1196 return '<hyperdb.Class "%s">' % cn
452
7181efddce66 yuck, a gdbm instance tests false :(
Richard Jones <richard@users.sourceforge.net>
parents: 431
diff changeset
1197
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1198 # Editing nodes:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1199
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1200 def create(self, **propvalues):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1201 """Create a new node of this class and return its id.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1202
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1203 The keyword arguments in 'propvalues' map property names to values.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1204
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1205 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
1206 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
1207
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1208 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
1209 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
1210
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1211 Any other properties on this class that are missing from the
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1212 'propvalues' dictionary are set to None.
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
1213
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1214 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
1215 node, an IndexError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1216 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1217 raise NotImplementedError
775
4409798dfa15 Can debug to stdout now
Richard Jones <richard@users.sourceforge.net>
parents: 764
diff changeset
1218
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1219 _marker = []
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1220
475
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 466
diff changeset
1221 def get(self, nodeid, propname, default=_marker, cache=1):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1222 """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
1223
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1224 '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
1225 IndexError is raised. 'propname' must be the name of a property
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1226 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
1227
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
1228 'cache' exists for backwards compatibility, and is not used.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1229 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1230 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1231
1926
3bdd34547fa7 Remove implementations of Class.getnode from back_anydbm and rdbms_common...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1905
diff changeset
1232 # not in spec
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1233 def getnode(self, nodeid):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1234 """ 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
1235
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 466
diff changeset
1236 '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
1237 IndexError is raised.
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 466
diff changeset
1238
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
1239 '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
1240 """
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
1241 return Node(self, nodeid)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1242
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1243 def getnodeids(self, retired=None):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1244 """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
1245 """
1864
969a14faf707 Fixed "documentation" of getnodeids in roundup.hyperdb
Richard Jones <richard@users.sourceforge.net>
parents: 1840
diff changeset
1246 raise NotImplementedError
969a14faf707 Fixed "documentation" of getnodeids in roundup.hyperdb
Richard Jones <richard@users.sourceforge.net>
parents: 1840
diff changeset
1247
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1248 def set(self, nodeid, **propvalues):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1249 """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
1250
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1251 '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
1252 IndexError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1253
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1254 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
1255 class or a KeyError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1256
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1257 All values in 'propvalues' must be acceptable types for their
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1258 corresponding properties or a TypeError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1259
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1260 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
1261 other key strings or a ValueError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1262
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1263 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
1264 node id, a ValueError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1265 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1266 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1267
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1268 def retire(self, nodeid):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1269 """Retire a node.
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
1270
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1271 The properties on the node remain available from the get() method,
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1272 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
1273
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1274 Retired nodes are not returned by the find(), list(), or lookup()
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1275 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
1276 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1277 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1278
1523
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1470
diff changeset
1279 def restore(self, nodeid):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1280 """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
1281
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1470
diff changeset
1282 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
1283 """
1523
63aa7be52d2c checked to make sure that the restored item doesn't clash...
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1470
diff changeset
1284 raise NotImplementedError
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
1285
940
301a02ea6020 added is_retired query to Class
Richard Jones <richard@users.sourceforge.net>
parents: 910
diff changeset
1286 def is_retired(self, nodeid):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1287 """Return true if the node is rerired
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1288 """
940
301a02ea6020 added is_retired query to Class
Richard Jones <richard@users.sourceforge.net>
parents: 910
diff changeset
1289 raise NotImplementedError
301a02ea6020 added is_retired query to Class
Richard Jones <richard@users.sourceforge.net>
parents: 910
diff changeset
1290
894
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
1291 def destroy(self, nodeid):
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
1292 """Destroy a node.
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
1293
894
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
1294 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
1295 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
1296 deleted
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1297
894
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
1298 WARNING: use retire() instead
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1299
894
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
1300 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
1301
894
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
1302 WARNING: really, use retire() instead
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
1303
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
1304 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
1305 support the session storage of the cgi interface.
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
1306
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
1307 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
1308 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
1309 if there are any references to the node.
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
1310 """
cbefecea6c74 Gordon, does this help?
Richard Jones <richard@users.sourceforge.net>
parents: 883
diff changeset
1311
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1312 def history(self, nodeid, enforceperm=True, skipquiet=True):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1313 """Retrieve the journal of edits on a particular node.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1314
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1315 '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
1316 IndexError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1317
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1318 The returned list contains tuples of the form
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1319
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1320 (date, tag, action, params)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1321
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1322 '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
1323 'tag' is the journaltag specified when the database was opened.
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1324
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1325 If the property to be displayed is a quiet property, it will
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1326 not be shown. This can be disabled by setting skipquiet=False.
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1327
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1328 If the user requesting the history does not have View access
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1329 to the property, the journal entry will not be shown. This can
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1330 be disabled by setting enforceperm=False.
5315
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1331
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1332 Note that there is a check for obsolete properties and classes
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1333 resulting from history changes. These are also only checked if
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1334 enforceperm is True.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1335 """
4483
22bc0426e348 Second patch from issue2550688 -- with some changes:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4481
diff changeset
1336 if not self.do_journal:
22bc0426e348 Second patch from issue2550688 -- with some changes:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4481
diff changeset
1337 raise ValueError('Journalling is disabled for this class')
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1338
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1339 perm = self.db.security.hasPermission
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1340 journal = []
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1341
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1342 uid = self.db.getuid() # id of the person requesting the history
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1343
5315
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1344 # Roles of the user and the configured obsolete_history_roles
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1345 hr = set(iter_roles(self.db.config.OBSOLETE_HISTORY_ROLES))
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1346 ur = set(self.db.user.get_roles(uid))
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1347 allow_obsolete = bool(hr & ur)
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1348
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1349 for j in self.db.getjournal(self.classname, nodeid):
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1350 # hide/remove journal entry if:
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1351 # property is quiet
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1352 # property is not (viewable or editable)
5315
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1353 # property is obsolete and not allow_obsolete
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1354 id, evt_date, user, action, args = j
5261
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1355 if logger.isEnabledFor(logging.DEBUG):
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1356 j_repr = "%s" % (j,)
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1357 else:
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1358 j_repr = ''
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1359 if args and isinstance(args, type({})):
5460
87f22a5d65ca container modification while iterating over it
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5397
diff changeset
1360 for key in list(args.keys()):
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1361 if key not in self.properties:
5315
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1362 if enforceperm and not allow_obsolete:
5460
87f22a5d65ca container modification while iterating over it
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5397
diff changeset
1363 del args[key]
5315
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1364 continue
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1365 if skipquiet and self.properties[key].quiet:
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1366 logger.debug("skipping quiet property"
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1367 " %s::%s in %s",
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1368 self.classname, key, j_repr)
5460
87f22a5d65ca container modification while iterating over it
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5397
diff changeset
1369 del args[key]
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1370 continue
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1371 if enforceperm and not (perm("View",
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1372 uid,
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1373 self.classname,
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1374 property=key) or
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1375 perm("Edit",
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1376 uid,
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1377 self.classname,
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1378 property=key)):
5315
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1379 logger.debug("skipping unaccessible property "
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1380 "%s::%s seen by user%s in %s",
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1381 self.classname, key, uid, j_repr)
5460
87f22a5d65ca container modification while iterating over it
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5397
diff changeset
1382 del args[key]
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1383 continue
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1384 if not args:
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1385 logger.debug("Omitting journal entry for %s%s"
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1386 " all props removed in: %s",
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1387 self.classname, nodeid, j_repr)
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1388 continue
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1389 journal.append(j)
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1390 elif action in ['link', 'unlink'] and isinstance(args, type(())):
5261
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1391 # definitions:
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1392 # myself - object whose history is being filtered
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1393 # linkee - object/class whose property is changing to
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1394 # include/remove myself
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1395 # link property - property of the linkee class that is changing
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1396 #
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1397 # Remove the history item if
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1398 # linkee.link property (key) is quiet
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1399 # linkee class.link property is not (viewable or editable)
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1400 # to user
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1401 # [ should linkee object.link property is not
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1402 # (viewable or editable) to user be included?? ]
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1403 # linkee object (linkcl, linkid) is not
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1404 # (viewable or editable) to user
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1405 if len(args) == 3:
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1406 # e.g. for issue3 blockedby adds link to issue5 with:
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1407 # j = id, evt_date, user, action, args
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1408 # 3|20170528045201.484|5|link|('issue', '5', 'blockedby')
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1409 linkcl, linkid, key = args
5315
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1410 cls = None
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1411 try:
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1412 cls = self.db.getclass(linkcl)
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1413 except KeyError:
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1414 pass
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1415 # obsolete property or class
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1416 if not cls or key not in cls.properties:
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1417 if not enforceperm or allow_obsolete:
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1418 journal.append(j)
5a014410f254 Fix issue2550954: History display breaks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5309
diff changeset
1419 continue
5527
a7c3cd2edf51 No traceback for non-existent items in history
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5525
diff changeset
1420 # obsolete linked-to item
a7c3cd2edf51 No traceback for non-existent items in history
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5525
diff changeset
1421 try:
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1422 cls.get(linkid, key) # does linkid exist
5527
a7c3cd2edf51 No traceback for non-existent items in history
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5525
diff changeset
1423 except IndexError:
a7c3cd2edf51 No traceback for non-existent items in history
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5525
diff changeset
1424 if not enforceperm or allow_obsolete:
a7c3cd2edf51 No traceback for non-existent items in history
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5525
diff changeset
1425 journal.append(j)
a7c3cd2edf51 No traceback for non-existent items in history
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5525
diff changeset
1426 continue
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1427 # is the updated property quiet?
5261
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1428 if skipquiet and cls.properties[key].quiet:
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1429 logger.debug("skipping quiet property: "
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1430 "%s %sed %s%s",
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1431 j_repr, action, self.classname, nodeid)
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1432 continue
5261
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1433 # can user view the property in linkee class
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1434 if enforceperm and not (perm("View",
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1435 uid,
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1436 linkcl,
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1437 property=key) or
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1438 perm("Edit",
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1439 uid,
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1440 linkcl,
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1441 property=key)):
5261
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1442 logger.debug("skipping unaccessible property: "
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1443 "%s with uid %s %sed %s%s",
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1444 j_repr, uid, action,
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1445 self.classname, nodeid)
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1446 continue
5261
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1447 # check access to linkee object
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1448 if enforceperm and not (perm("View",
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1449 uid,
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1450 cls.classname,
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1451 itemid=linkid) or
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1452 perm("Edit",
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1453 uid,
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1454 cls.classname,
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1455 itemid=linkid)):
5261
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1456 logger.debug("skipping unaccessible object: "
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1457 "%s uid %s %sed %s%s",
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1458 j_repr, uid, action,
53a853c06e9a Fixed quiet history filter for linked items. Test for same fixed.
John Rouillard <rouilj@ieee.org>
parents: 5260
diff changeset
1459 self.classname, nodeid)
5257
928512faf565 - issue2550864: Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
1460 continue
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1461 journal.append(j)
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1462 else:
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1463 logger.error("Invalid %s journal entry for %s%s: %s",
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1464 action, self.classname, nodeid, j)
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1465 elif action in ['create', 'retired', 'restored']:
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1466 journal.append(j)
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1467 else:
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1468 logger.warning("Possibly malformed journal for %s%s %s",
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1469 self.classname, nodeid, j)
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
1470 return journal
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1471
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1472 # 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
1473 def hasnode(self, nodeid):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1474 """Determine if the given nodeid actually exists
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1475 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1476 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1477
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1478 def setkey(self, propname):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1479 """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
1480
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1481 '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
1482 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
1483 all existing nodes must be unique or a ValueError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1484 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1485 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1486
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1487 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
1488 """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
1489 resolution order.
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1490 """
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1491 if labelprop not in self.getprops():
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
1492 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
1493 self._labelprop = labelprop
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1494
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1495 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
1496 """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
1497 resolution order
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1498 """
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1499 if orderprop not in self.getprops():
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
1500 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
1501 self._orderprop = orderprop
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1502
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1503 def getkey(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1504 """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
1505 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1506
188
1536be43d2fa Roundupdb now appends "mailing list" information to its messages...
Richard Jones <richard@users.sourceforge.net>
parents: 172
diff changeset
1507 def labelprop(self, default_to_id=0):
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1508 """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
1509
51cce9671db0 Cleanup of the link label generation.
Richard Jones <richard@users.sourceforge.net>
parents: 118
diff changeset
1510 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
1511 It tries the following in order:
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1512
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1513 0. self._labelprop if set
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1514 1. key property
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1515 2. "name" property
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1516 3. "title" property
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1517 4. first property from the sorted property name list
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1518 """
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1519 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
1520 return self._labelprop
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1521 k = self.getkey()
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1522 if k:
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1523 return k
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1524 props = self.getprops()
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
1525 if 'name' in props:
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1526 return 'name'
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
1527 elif 'title' in props:
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1528 return 'title'
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1529 if default_to_id:
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1530 return 'id'
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
1531 props = sorted(props.keys())
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1532 return props[0]
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1533
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1534 def orderprop(self):
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1535 """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
1536
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1537 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
1538 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
1539
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1540 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
1541 1. "order" property
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1542 2. self.labelprop()
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1543 """
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1544
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1545 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
1546 return self._orderprop
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1547 props = self.getprops()
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
1548 if 'order' in props:
3476
1142dafe0d7f added setorderprop() and setlabelprop() to Class (lots of patches)
Richard Jones <richard@users.sourceforge.net>
parents: 3455
diff changeset
1549 return 'order'
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1550 return self.labelprop()
123
51cce9671db0 Cleanup of the link label generation.
Richard Jones <richard@users.sourceforge.net>
parents: 118
diff changeset
1551
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1552 def lookup(self, keyvalue):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1553 """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
1554
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1555 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
1556 'keyvalue' matches one of the values for the key property among
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1557 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
1558 otherwise a KeyError is raised.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1559 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1560 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1561
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1562 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
1563 """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
1564
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
1565 'propspec' consists of keyword args propname={nodeid:1,}
883
Richard Jones <richard@users.sourceforge.net>
parents: 880
diff changeset
1566 'propname' must be the name of a property in this class, or a
Richard Jones <richard@users.sourceforge.net>
parents: 880
diff changeset
1567 KeyError is raised. That property must be a Link or Multilink
Richard Jones <richard@users.sourceforge.net>
parents: 880
diff changeset
1568 property, or a TypeError is raised.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1569
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
1570 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
1571 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
1572 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
1573 issues:
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1574
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
1575 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
1576 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1577 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1578
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1579 def _filter(self, search_matches, filterspec, sort=(None, None),
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1580 group=(None, None), retired=False, exact_match_spec={}):
3634
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1581 """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
1582 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
1583 """
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1584 raise NotImplementedError
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1585
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
1586 def _proptree(self, filterspec, exact_match_spec=None, sortattr=None,
5871
acc4a128ab9b Backwards-compatible signature of _proptree method
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5869
diff changeset
1587 retr=False):
3634
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1588 """Build a tree of all transitive properties in the given
5867
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1589 exact_match_spec/filterspec.
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1590 If we retrieve (retr is True) linked items we don't follow
6413
7b1b6dffc7ed Fix searching+sorting for Link properties
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6412
diff changeset
1591 across multilinks or links.
3634
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1592 """
6677
8ab98de22df0 issue2551159 - cl.filter fails if filterspec is None ...
John Rouillard <rouilj@ieee.org>
parents: 6621
diff changeset
1593 if filterspec is None:
8ab98de22df0 issue2551159 - cl.filter fails if filterspec is None ...
John Rouillard <rouilj@ieee.org>
parents: 6621
diff changeset
1594 filterspec = {}
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
1595 if exact_match_spec is None:
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
1596 exact_match_spec = {}
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
1597 if sortattr is None:
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
1598 sortattr = []
6677
8ab98de22df0 issue2551159 - cl.filter fails if filterspec is None ...
John Rouillard <rouilj@ieee.org>
parents: 6621
diff changeset
1599
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1600 proptree = Proptree(self.db, self, '', self.getprops(), retr=retr)
5867
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1601 for exact, spec in enumerate((filterspec, exact_match_spec)):
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1602 for key, v in spec.items():
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1603 keys = key.split('.')
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1604 p = proptree
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1605 mlseen = False
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1606 for k in keys:
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1607 if isinstance(p.propclass, Multilink):
5867
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1608 mlseen = True
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1609 isnull = v == '-1' or v is None
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1610 islist = isinstance(v, type([]))
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1611 nullin = islist and ('-1' in v or None in v)
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1612 r = retr and not mlseen and not isnull and not nullin
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1613 p = p.append(k, retr=r)
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1614 if exact:
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1615 if isinstance(v, type([])):
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1616 vv = []
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1617 for x in v:
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1618 vv.append(Exact_Match(x))
6403
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
1619 p.set_val(vv, result=False)
5867
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1620 else:
6403
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
1621 p.set_val([Exact_Match(v)], result=False)
5867
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1622 else:
6403
9957d8d10783 Tests and bug-fix for issue2551119
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6402
diff changeset
1623 p.set_val(v, result=False)
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1624 multilinks = {}
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1625 for s in sortattr:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1626 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
1627 p = proptree
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1628 mlseen = False
3635
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1629 for k in keys:
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1630 if isinstance(p.propclass, Multilink):
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1631 mlseen = True
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1632 r = retr and not mlseen
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1633 p = p.append(k, need_for='sort', retr=r)
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1634 if isinstance(p.propclass, Multilink):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1635 multilinks[p] = True
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1636 if p.cls:
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1637 p = p.append(p.cls.orderprop(), need_for='sort')
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1638 if p.sort_direction: # if orderprop is also specified explicitly
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1639 continue
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1640 p.sort_direction = s[0]
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1641 proptree.sortattr.append(p)
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
1642 for p in multilinks.keys():
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1643 sattr = {}
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1644 for c in p:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1645 if c.sort_direction:
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1646 sattr[c] = True
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1647 for sa in proptree.sortattr:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1648 if sa in sattr:
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1649 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
1650 return proptree
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1651
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1652 def get_transitive_prop(self, propname_path, default=None):
3635
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1653 """Expand a transitive property (individual property names
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1654 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
1655 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
1656 None.
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1657 Example propname_path (for class issue): "messages.author"
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1658 """
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1659 props = self.db.getclass(self.classname).getprops()
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1660 for k in propname_path.split('.'):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1661 try:
3635
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1662 prop = props[k]
4408
06af6d5bedbe fix for incorrect except: syntax, issue2550661
Richard Jones <richard@users.sourceforge.net>
parents: 4306
diff changeset
1663 except (KeyError, TypeError):
3635
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1664 return default
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1665 cl = getattr(prop, 'classname', None)
3635
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1666 props = None
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1667 if cl:
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1668 props = self.db.getclass(cl).getprops()
3635
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1669 return prop
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3634
diff changeset
1670
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1671 def _sortattr(self, sort=[], group=[]):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1672 """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
1673 with sanity checks (no duplicate properties) included. Always
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1674 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
1675 """
6677
8ab98de22df0 issue2551159 - cl.filter fails if filterspec is None ...
John Rouillard <rouilj@ieee.org>
parents: 6621
diff changeset
1676 if sort is None:
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
1677 sort = [(None, None)]
6677
8ab98de22df0 issue2551159 - cl.filter fails if filterspec is None ...
John Rouillard <rouilj@ieee.org>
parents: 6621
diff changeset
1678 if group is None:
8ab98de22df0 issue2551159 - cl.filter fails if filterspec is None ...
John Rouillard <rouilj@ieee.org>
parents: 6621
diff changeset
1679 group = [(None, None)]
8ab98de22df0 issue2551159 - cl.filter fails if filterspec is None ...
John Rouillard <rouilj@ieee.org>
parents: 6621
diff changeset
1680
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1681 seen = {}
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1682 sortattr = []
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1683 for srt in group, sort:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1684 if not isinstance(srt, list):
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1685 srt = [srt]
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1686 for s in srt:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1687 if s[1] and s[1] not in seen:
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1688 sortattr.append((s[0] or '+', s[1]))
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1689 seen[s[1]] = True
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1690 if 'id' not in seen:
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1691 sortattr.append(('+', 'id'))
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1692 return sortattr
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1693
5318
506c7ee9a385 Add a 'retired' parameter to Class.filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5315
diff changeset
1694 def filter(self, search_matches, filterspec, sort=[], group=[],
5869
16e1255b16cf Implement limit and offset for filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5867
diff changeset
1695 retired=False, exact_match_spec={}, limit=None, offset=None):
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1696 """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
1697 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
1698 sort spec.
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1699
5867
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1700 "search_matches" is a container type which by default is None
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1701 and optionally contains IDs of items to match. If non-empty only
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1702 IDs of the initial set are returned.
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1703
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1704 "filterspec" is {propname: value(s)}
5867
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1705 "exact_match_spec" is the same format as "filterspec" but
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1706 specifies exact match for the given propnames. This only makes a
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1707 difference for String properties, these specify case insensitive
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1708 substring search when in "filterspec" and exact match when in
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1709 exact_match_spec.
1249
6c24a86a12ae Fixes for SourceForge tracker bugs.
Richard Jones <richard@users.sourceforge.net>
parents: 1244
diff changeset
1710
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1711 "sort" and "group" are [(dir, prop), ...] where dir is '+', '-'
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1712 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
1713 backward-compatibility reasons a single (dir, prop) tuple is
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1714 also allowed.
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1715
5867
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1716 The parameter retired when set to False, returns only live
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1717 (un-retired) results. When setting it to True, only retired
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1718 items are returned. If None, both retired and unretired items
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1719 are returned. The default is False, i.e. only live items are
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1720 returned by default.
1249
6c24a86a12ae Fixes for SourceForge tracker bugs.
Richard Jones <richard@users.sourceforge.net>
parents: 1244
diff changeset
1721
5869
16e1255b16cf Implement limit and offset for filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5867
diff changeset
1722 The "limit" and "offset" parameters define a limit on the number
16e1255b16cf Implement limit and offset for filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5867
diff changeset
1723 of results returned and an offset before returning any results,
16e1255b16cf Implement limit and offset for filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5867
diff changeset
1724 respectively. These can be used when displaying a number of
16e1255b16cf Implement limit and offset for filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5867
diff changeset
1725 items in a pagination application or similar. A common use-case
16e1255b16cf Implement limit and offset for filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5867
diff changeset
1726 is returning the first item of a sorted search by specifying
16e1255b16cf Implement limit and offset for filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5867
diff changeset
1727 limit=1 (i.e. the maximum or minimum depending on sort order).
16e1255b16cf Implement limit and offset for filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5867
diff changeset
1728
6677
8ab98de22df0 issue2551159 - cl.filter fails if filterspec is None ...
John Rouillard <rouilj@ieee.org>
parents: 6621
diff changeset
1729 The filter must match all properties specified. If the property
3455
e01bc6d65fa9 fixed documentation of filter()...
Richard Jones <richard@users.sourceforge.net>
parents: 3399
diff changeset
1730 value to match is a list:
e01bc6d65fa9 fixed documentation of filter()...
Richard Jones <richard@users.sourceforge.net>
parents: 3399
diff changeset
1731
e01bc6d65fa9 fixed documentation of filter()...
Richard Jones <richard@users.sourceforge.net>
parents: 3399
diff changeset
1732 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
1733 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
1734
5867
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1735 This also means that for strings in exact_match_spec it doesn't
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1736 make sense to specify multiple values because those cannot all
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1737 be matched exactly.
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1738
6409
ce99e0d39262 Add documentation for multilink expression syntax
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6403
diff changeset
1739 For Link and Multilink properties the special ID value '-1'
ce99e0d39262 Add documentation for multilink expression syntax
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6403
diff changeset
1740 matches empty Link or Multilink fields. For Multilinks a postfix
ce99e0d39262 Add documentation for multilink expression syntax
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6403
diff changeset
1741 expression syntax using negative ID numbers (as strings) as
ce99e0d39262 Add documentation for multilink expression syntax
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6403
diff changeset
1742 operators is supported. Each non-negative number (or '-1') is
ce99e0d39262 Add documentation for multilink expression syntax
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6403
diff changeset
1743 pushed on an operand stack. A negative number pops the required
ce99e0d39262 Add documentation for multilink expression syntax
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6403
diff changeset
1744 number of arguments from the stack, applies the operator, and
ce99e0d39262 Add documentation for multilink expression syntax
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6403
diff changeset
1745 pushes the result. The following operators are supported:
ce99e0d39262 Add documentation for multilink expression syntax
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6403
diff changeset
1746 - -2 stands for 'NOT' and takes one argument
ce99e0d39262 Add documentation for multilink expression syntax
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6403
diff changeset
1747 - -3 stands for 'AND' and takes two arguments
ce99e0d39262 Add documentation for multilink expression syntax
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6403
diff changeset
1748 - -4 stands for 'OR' and takes two arguments
ce99e0d39262 Add documentation for multilink expression syntax
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6403
diff changeset
1749 Note that this special handling of ID arguments is applied only
ce99e0d39262 Add documentation for multilink expression syntax
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6403
diff changeset
1750 when a negative number smaller than -1 is encountered as an ID
ce99e0d39262 Add documentation for multilink expression syntax
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6403
diff changeset
1751 in the filter call. Otherwise the implicit OR default applies.
ce99e0d39262 Add documentation for multilink expression syntax
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6403
diff changeset
1752 Examples of using Multilink expressions would be
ce99e0d39262 Add documentation for multilink expression syntax
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6403
diff changeset
1753 - '1', '2', '-4', '3', '4', '-4', '-3'
ce99e0d39262 Add documentation for multilink expression syntax
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6403
diff changeset
1754 would search for IDs (1 or 2) and (3 or 4)
ce99e0d39262 Add documentation for multilink expression syntax
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6403
diff changeset
1755 - '-1' '-2' would search for all non-empty Multilinks
ce99e0d39262 Add documentation for multilink expression syntax
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6403
diff changeset
1756
ce99e0d39262 Add documentation for multilink expression syntax
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6403
diff changeset
1757
5867
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1758 The propname in filterspec and prop in a sort/group spec may be
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1759 transitive, i.e., it may contain properties of the form
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1760 link.link.link.name, e.g. you can search for all issues where a
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1761 message was added by a certain user in the last week with a
ee2e8f8d6648 Implement exact string search
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5809
diff changeset
1762 filterspec of
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1763 {'messages.author' : '42', 'messages.creation' : '.-1w;'}
3924
21d3d7eeea8c assorted pyflakes fixes
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3802
diff changeset
1764
3634
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1765 Implementation note:
57c66056ffe4 Implemented what I'll call for now "transitive searching"...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3621
diff changeset
1766 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
1767 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
1768 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
1769 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
1770 override the filter method instead of implementing _filter.
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1929
diff changeset
1771 """
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1772 sortattr = self._sortattr(sort=sort, group=group)
5871
acc4a128ab9b Backwards-compatible signature of _proptree method
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5869
diff changeset
1773 proptree = self._proptree(filterspec, exact_match_spec, sortattr)
5318
506c7ee9a385 Add a 'retired' parameter to Class.filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5315
diff changeset
1774 proptree.search(search_matches, retired=retired)
5869
16e1255b16cf Implement limit and offset for filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5867
diff changeset
1775 if offset is not None or limit is not None:
16e1255b16cf Implement limit and offset for filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5867
diff changeset
1776 items = proptree.sort()
16e1255b16cf Implement limit and offset for filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5867
diff changeset
1777 if limit and offset:
16e1255b16cf Implement limit and offset for filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5867
diff changeset
1778 return items[offset:offset+limit]
16e1255b16cf Implement limit and offset for filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5867
diff changeset
1779 elif offset is not None:
16e1255b16cf Implement limit and offset for filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5867
diff changeset
1780 return items[offset:]
16e1255b16cf Implement limit and offset for filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5867
diff changeset
1781 else:
16e1255b16cf Implement limit and offset for filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5867
diff changeset
1782 return items[:limit]
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1783 return proptree.sort()
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1784
4472
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1785 # 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
1786 # 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
1787 # 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
1788 # 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
1789 # anyway).
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1790 filter_iter = filter
34dce76bb202 Multilink fixes and optimizations:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4431
diff changeset
1791
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1792 def count(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1793 """Get the number of nodes in this class.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1794
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1795 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
1796 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
1797 id of the next node to be created in this class.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1798 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1799 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1800
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1801 # Manipulating properties:
262
ab921dc53ccd Added nicer command-line item adding:
Richard Jones <richard@users.sourceforge.net>
parents: 236
diff changeset
1802 def getprops(self, protected=1):
ab921dc53ccd Added nicer command-line item adding:
Richard Jones <richard@users.sourceforge.net>
parents: 236
diff changeset
1803 """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
1804 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
1805 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
1806 """
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1807 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1808
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
1809 def get_required_props(self, propnames=None):
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1810 """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
1811 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
1812 returned in addition to all properties in the propnames
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1813 parameter.
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1814 """
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
1815 if propnames is None:
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
1816 propnames = []
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1817 props = self.getprops(protected=False)
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1818 pdict = dict([(p, props[p]) for p in propnames])
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
1819 pdict.update([(k, v) for k, v in props.items() if v.required])
3682
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1820 return pdict
193f316dbbe9 More transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3668
diff changeset
1821
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1822 def addprop(self, **properties):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1823 """Add properties to this class.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1824
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1825 The keyword arguments in 'properties' must map names to property
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1826 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
1827 may collide with the names of existing properties, or a ValueError
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1828 is raised before any properties have been added.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1829 """
858
2dd862af72ee all storage-specific code (ie. backend) is now implemented by the backends
Richard Jones <richard@users.sourceforge.net>
parents: 841
diff changeset
1830 raise NotImplementedError
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1831
825
0779ea9f1f18 More indexer work:
Richard Jones <richard@users.sourceforge.net>
parents: 805
diff changeset
1832 def index(self, nodeid):
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1833 """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
1834 raise NotImplementedError
825
0779ea9f1f18 More indexer work:
Richard Jones <richard@users.sourceforge.net>
parents: 805
diff changeset
1835
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1836 #
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1837 # Detector interface
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1838 #
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1839 def audit(self, event, detector, priority=100):
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1840 """Register an auditor detector"""
3743
e754cc14e76a fix unstable ordering of detectors [SF#1585378]
Richard Jones <richard@users.sourceforge.net>
parents: 3695
diff changeset
1841 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
1842
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1843 def fireAuditors(self, event, nodeid, newvalues):
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1844 """Fire all registered auditors"""
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1845 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
1846 try:
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1847 audit(self.db, self, nodeid, newvalues)
5084
675b3b3d88f0 Fix issue2550826 third try. This limits the capture of exceptions to
John Rouillard <rouilj@ieee.org>
parents: 5080
diff changeset
1848 except (EnvironmentError, ArithmeticError) as e:
5079
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1849 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
1850 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
1851 replace(' ', '&nbsp;'))
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1852 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
1853 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
1854 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
1855 raise DetectorError(subject, html, txt)
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1856
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1857 def react(self, event, detector, priority=100):
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1858 """Register a reactor detector"""
3743
e754cc14e76a fix unstable ordering of detectors [SF#1585378]
Richard Jones <richard@users.sourceforge.net>
parents: 3695
diff changeset
1859 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
1860
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1861 def fireReactors(self, event, nodeid, oldvalues):
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1862 """Fire all registered reactors"""
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1863 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
1864 try:
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1865 react(self.db, self, nodeid, oldvalues)
5084
675b3b3d88f0 Fix issue2550826 third try. This limits the capture of exceptions to
John Rouillard <rouilj@ieee.org>
parents: 5080
diff changeset
1866 except (EnvironmentError, ArithmeticError) as e:
5079
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1867 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
1868 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
1869 replace(' ', '&nbsp;'))
65fef7858606 issue2550826 IOError in detector causes apache 'premature end of script headers' error
John Rouillard <rouilj@ieee.org>
parents: 5069
diff changeset
1870 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
1871 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
1872 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
1873 raise DetectorError(subject, html, txt)
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1874
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1875 #
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1876 # import / export support
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1877 #
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1878 def export_propnames(self):
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
1879 """List the property names for export from this Class"""
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
1880 propnames = sorted(self.getprops().keys())
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1881 return propnames
4430
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1882
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1883 def import_journals(self, entries):
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1884 """Import a class's journal.
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1885
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1886 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
1887 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
1888 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
1889 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
1890 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
1891 properties = self.getprops()
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1892 a = []
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
1893 for entry in entries:
4430
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1894 # 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
1895 # in python2.4 and up we would use sorted with a key...
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
1896 a.append((int(entry[0].strip("'")), entry))
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1897 a.sort()
4430
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1898
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1899 last = 0
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1900 r = []
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1901 for n, l in a:
5525
bb7865241f8a Make CSV import/export compatible across Python versions (also RDBMS journals) (issue 2550976, issue 2550975).
Joseph Myers <jsm@polyomino.org.uk>
parents: 5481
diff changeset
1902 nodeid, jdate, user, action, params = map(eval_import, l)
4430
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1903 assert (str(n) == nodeid)
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1904 if n != last:
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1905 if r:
4431
9b619dcb030a - fix import (now passes for memorydb, too)
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4430
diff changeset
1906 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
1907 last = n
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1908 r = []
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1909
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1910 if action == 'set':
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
1911 for propname, value in params.items():
4430
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1912 prop = properties[propname]
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1913 if value is None:
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1914 pass
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1915 elif isinstance(prop, Date):
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1916 value = date.Date(value)
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1917 elif isinstance(prop, Interval):
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1918 value = date.Interval(value)
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1919 elif isinstance(prop, Password):
4483
22bc0426e348 Second patch from issue2550688 -- with some changes:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4481
diff changeset
1920 value = password.JournalPassword(encrypted=value)
4430
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1921 params[propname] = value
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1922 elif action == 'create' and params:
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1923 # 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
1924 params = {}
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1925 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
1926 if r:
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1927 self.db.setjournal(self.classname, nodeid, r)
f2f2904fe6ce - refactor: move import_journal to hyperdb
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4408
diff changeset
1928
4306
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1929 #
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1930 # convenience methods
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1931 #
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1932 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
1933 """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
1934
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1935 Yields string-processed roles.
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1936 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
1937 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
1938 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
1939 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
1940 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
1941 processing happens!
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1942 """
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1943 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
1944 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
1945
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1946 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
1947 '''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
1948
4306
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1949 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
1950 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
1951 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
1952 '''
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1953 roles = dict.fromkeys([r.strip().lower() for r in roles])
4306
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1954 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
1955 if role in roles:
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1956 return True
966592263fb8 Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4089
diff changeset
1957 return False
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1958
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
1959
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1960 class HyperdbValueError(ValueError):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1961 """ 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
1962 pass
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1963
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1964
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
1965 id_regex = re.compile(r'^\d+$')
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
1966
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
1967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
1968 def convertLinkValue(db, propname, prop, value, idre=id_regex):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
1969 """ 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
1970 linkcl = db.classes[prop.classname]
4877
2ba982dcdf2c New Link / Multilink option "try_id_parsing"
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4850
diff changeset
1971 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
1972 if linkcl.getkey():
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1973 try:
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1974 value = linkcl.lookup(value)
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1975 except KeyError:
7056
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
1976 raise HyperdbValueError(_(
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
1977 'property %(property)s: %(value)r '
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
1978 'is not a %(classname)s.') % {
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
1979 'property': propname,
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
1980 'value': value,
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
1981 'classname': prop.classname})
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1982 else:
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1983 raise HyperdbValueError(_('you may only enter ID values '
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1984 '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
1985 return value
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1986
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
1987
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1988 def fixNewlines(text):
1928
7c1ddebe7589 Small readability improvements.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1927
diff changeset
1989 """ Homogenise line endings.
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1990
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1991 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
1992 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
1993 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
1994 """
5309
20084e2b48c3 Fix bug where unsetting a text value triggered an exception because
John Rouillard <rouilj@ieee.org>
parents: 5261
diff changeset
1995 if text is not None:
20084e2b48c3 Fix bug where unsetting a text value triggered an exception because
John Rouillard <rouilj@ieee.org>
parents: 5261
diff changeset
1996 text = text.replace('\r\n', '\n')
20084e2b48c3 Fix bug where unsetting a text value triggered an exception because
John Rouillard <rouilj@ieee.org>
parents: 5261
diff changeset
1997 return text.replace('\r', '\n')
20084e2b48c3 Fix bug where unsetting a text value triggered an exception because
John Rouillard <rouilj@ieee.org>
parents: 5261
diff changeset
1998 return text
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
1999
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
2000
3383
c1c67c62b699 applied patch [SF#236087]
Richard Jones <richard@users.sourceforge.net>
parents: 3019
diff changeset
2001 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
2002 """ 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
2003 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
2004 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
2005
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
2006 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
2007 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
2008 values.
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
2009 """
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
2010 properties = klass.getprops()
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
2011
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
2012 # 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
2013 propname = propname.strip()
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
2014 try:
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
2015 proptype = properties[propname]
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
2016 except KeyError:
7056
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
2017 raise HyperdbValueError(_(
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
2018 '%(property)r is not a property of %(classname)s') % {
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
2019 'property': propname,
9b4bd9bc9bdc Fix internationalized strings with multiple unlabeled % replacements.
John Rouillard <rouilj@ieee.org>
parents: 6967
diff changeset
2020 'classname': klass.classname})
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
2021
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
2022 # 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
2023 if isinstance(value, type('')):
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
2024 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
2025
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
2026 # 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
2027 value = proptype.from_raw(value, db=db, klass=klass,
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
2028 propname=propname, itemid=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
2029
1905
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
2030 return value
dc43e339e607 Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents: 1864
diff changeset
2031
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
2032
1442
b42fa71754c9 don't attempt to create FileClass items if no content is supplied
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
2033 class FileClass:
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
2034 """ 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
2035 disk.
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
2036 """
3601
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3586
diff changeset
2037 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
2038
7b25567f0f54 indexing may be turned off for FileClass "content" now
Richard Jones <richard@users.sourceforge.net>
parents: 3586
diff changeset
2039 def __init__(self, db, classname, **properties):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
2040 """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
2041 property.
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
2042 """
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
2043 if 'content' not in properties:
3924
21d3d7eeea8c assorted pyflakes fixes
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3802
diff changeset
2044 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
2045
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
2046 def export_propnames(self):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
2047 """ Don't export the "content" property
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
2048 """
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
2049 propnames = list(self.getprops().keys())
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
2050 propnames.remove('content')
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
2051 propnames.sort()
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
2052 return propnames
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
2053
3019
293a17149765 First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 2962
diff changeset
2054 def exportFilename(self, dirname, nodeid):
5101
d043a09952db Tried to explain the use of hyperdb's exportFilename
John Rouillard <rouilj@ieee.org>
parents: 5084
diff changeset
2055 """ Returns destination filename for a exported file
d043a09952db Tried to explain the use of hyperdb's exportFilename
John Rouillard <rouilj@ieee.org>
parents: 5084
diff changeset
2056
d043a09952db Tried to explain the use of hyperdb's exportFilename
John Rouillard <rouilj@ieee.org>
parents: 5084
diff changeset
2057 Called by export function in roundup admin to generate
d043a09952db Tried to explain the use of hyperdb's exportFilename
John Rouillard <rouilj@ieee.org>
parents: 5084
diff changeset
2058 the <class>-files subdirectory
d043a09952db Tried to explain the use of hyperdb's exportFilename
John Rouillard <rouilj@ieee.org>
parents: 5084
diff changeset
2059 """
3019
293a17149765 First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 2962
diff changeset
2060 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
2061 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
2062
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
2063 def export_files(self, dirname, nodeid):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
2064 """ 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
2065 """
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
2066 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
2067
293a17149765 First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 2962
diff changeset
2068 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
2069 ensureParentsExist(dest)
3488
e4177cf4d30d common initialization code and detectors interface...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3476
diff changeset
2070 shutil.copyfile(source, dest)
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
2071
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
2072 def import_files(self, dirname, nodeid):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
2073 """ Import the "content" property as a file
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
2074 """
3019
293a17149765 First cut at exporting/importing file content from and to the hyperdb.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 2962
diff changeset
2075 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
2076
2962
4607f58a007b py2.1 compatibility
Richard Jones <richard@users.sourceforge.net>
parents: 2909
diff changeset
2077 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
2078 ensureParentsExist(dest)
2496
Richard Jones <richard@users.sourceforge.net>
parents: 2334
diff changeset
2079 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
2080
3544
5cd1c83dea50 Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3491
diff changeset
2081 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
2082 props = self.getprops()
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
2083 if 'type' in props:
3545
507b2df02956 fixes to import_files
Richard Jones <richard@users.sourceforge.net>
parents: 3544
diff changeset
2084 mime_type = self.get(nodeid, 'type')
3544
5cd1c83dea50 Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3491
diff changeset
2085 if not mime_type:
5cd1c83dea50 Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3491
diff changeset
2086 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
2087 if props['content'].indexme:
5648
a4514df51ded Python3: fix crash bug when importing binary file (like jpeg). The
John Rouillard <rouilj@ieee.org>
parents: 5548
diff changeset
2088 index_content = self.get(nodeid, 'binary_content')
a4514df51ded Python3: fix crash bug when importing binary file (like jpeg). The
John Rouillard <rouilj@ieee.org>
parents: 5548
diff changeset
2089 if bytes != str and isinstance(index_content, bytes):
a4514df51ded Python3: fix crash bug when importing binary file (like jpeg). The
John Rouillard <rouilj@ieee.org>
parents: 5548
diff changeset
2090 index_content = index_content.decode('utf-8', errors='ignore')
a4514df51ded Python3: fix crash bug when importing binary file (like jpeg). The
John Rouillard <rouilj@ieee.org>
parents: 5548
diff changeset
2091 # indexer will only index text mime type. It will skip
a4514df51ded Python3: fix crash bug when importing binary file (like jpeg). The
John Rouillard <rouilj@ieee.org>
parents: 5548
diff changeset
2092 # other types. So if mime type of file is correct, we
a4514df51ded Python3: fix crash bug when importing binary file (like jpeg). The
John Rouillard <rouilj@ieee.org>
parents: 5548
diff changeset
2093 # call add_text on content.
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
2094 self.db.indexer.add_text((self.classname, nodeid, 'content'),
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
2095 index_content, mime_type)
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
2096
3544
5cd1c83dea50 Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3491
diff changeset
2097
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2098 class Node:
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
2099 """ A convenience wrapper for the given node
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
2100 """
475
a1a44636bace Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents: 466
diff changeset
2101 def __init__(self, cl, nodeid, cache=1):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2102 self.__dict__['cl'] = cl
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2103 self.__dict__['nodeid'] = nodeid
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
2104
278
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
2105 def keys(self, protected=1):
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5388
diff changeset
2106 return list(self.cl.getprops(protected=protected).keys())
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
2107
278
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
2108 def values(self, protected=1):
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
2109 value_list = []
278
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
2110 for name in self.cl.getprops(protected=protected).keys():
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
2111 value_list.append(self.cl.get(self.nodeid, name))
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
2112 return value_list
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
2113
278
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
2114 def items(self, protected=1):
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
2115 item_list = []
278
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
2116 for name in self.cl.getprops(protected=protected).keys():
6967
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
2117 item_list.append((name, self.cl.get(self.nodeid, name)))
8473039648da inital flake8 cleanups
John Rouillard <rouilj@ieee.org>
parents: 6677
diff changeset
2118 return item_list
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
2119
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2120 def has_key(self, name):
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
2121 return name in self.cl.getprops()
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
2122
2909
2fc6c508b537 Database instances must have method close()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2906
diff changeset
2123 def get(self, name, default=None):
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
2124 if name in self:
1470
9ccd69fbe33e applied patch [SF#688595]
Richard Jones <richard@users.sourceforge.net>
parents: 1442
diff changeset
2125 return self[name]
9ccd69fbe33e applied patch [SF#688595]
Richard Jones <richard@users.sourceforge.net>
parents: 1442
diff changeset
2126 else:
9ccd69fbe33e applied patch [SF#688595]
Richard Jones <richard@users.sourceforge.net>
parents: 1442
diff changeset
2127 return default
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
2128
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2129 def __getattr__(self, name):
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
2130 if name in self.__dict__:
278
a5dabf2430c5 Added database importing and exporting through CSV files.
Richard Jones <richard@users.sourceforge.net>
parents: 275
diff changeset
2131 return self.__dict__[name]
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2132 try:
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
2133 return self.cl.get(self.nodeid, name)
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5232
diff changeset
2134 except KeyError as value:
460
9c895b44240a take a copy of the node dict...
Richard Jones <richard@users.sourceforge.net>
parents: 457
diff changeset
2135 # 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
2136 # exceptions should pass through untrapped
5697
5a9159ad773f Properly handle mapping of KeyError to AttributeError in __getattr__
John Rouillard <rouilj@ieee.org>
parents: 5648
diff changeset
2137 raise AttributeError(str(value))
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
2138
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2139 def __getitem__(self, name):
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1523
diff changeset
2140 return self.cl.get(self.nodeid, name)
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
2141
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2142 def __setattr__(self, name, value):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2143 try:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2144 return self.cl.set(self.nodeid, **{name: value})
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5232
diff changeset
2145 except KeyError as value:
5697
5a9159ad773f Properly handle mapping of KeyError to AttributeError in __getattr__
John Rouillard <rouilj@ieee.org>
parents: 5648
diff changeset
2146 # we trap this but re-raise it as AttributeError - all other
5a9159ad773f Properly handle mapping of KeyError to AttributeError in __getattr__
John Rouillard <rouilj@ieee.org>
parents: 5648
diff changeset
2147 # exceptions should pass through untrapped
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5327
diff changeset
2148 raise AttributeError(str(value))
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
2149
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2150 def __setitem__(self, name, value):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2151 self.cl.set(self.nodeid, **{name: value})
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
2152
5232
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
2153 def history(self, enforceperm=True, skipquiet=True):
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
2154 return self.cl.history(self.nodeid,
462b0f76fce8 issue2550864 - Potential information leakage via journal/history
John Rouillard <rouilj@ieee.org>
parents: 5175
diff changeset
2155 enforceperm=enforceperm,
6006
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
2156 skipquiet=skipquiet)
cf800f1febe6 Flake8 fixes; use isinstance rather than type equality.
John Rouillard <rouilj@ieee.org>
parents: 5871
diff changeset
2157
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2158 def retire(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2159 return self.cl.retire(self.nodeid)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2160
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2161
648
07422fe57db2 Ran it through pychecker, made fixes
Richard Jones <richard@users.sourceforge.net>
parents: 628
diff changeset
2162 def Choice(name, db, *options):
4063
625915ce35b8 Uniformly use """...""" instead of '''...''' for comments.
Stefan Seefeld <stefan@seefeld.name>
parents: 4048
diff changeset
2163 """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
2164 """
648
07422fe57db2 Ran it through pychecker, made fixes
Richard Jones <richard@users.sourceforge.net>
parents: 628
diff changeset
2165 cl = Class(db, name, name=String(), order=String())
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2166 for i in range(len(options)):
648
07422fe57db2 Ran it through pychecker, made fixes
Richard Jones <richard@users.sourceforge.net>
parents: 628
diff changeset
2167 cl.create(name=options[i], order=i)
3924
21d3d7eeea8c assorted pyflakes fixes
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3802
diff changeset
2168 return Link(name)

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