annotate roundup/hyperdb.py @ 7052:4b6a6b794dfa

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

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