annotate roundup/instance.py @ 5937:5d0873a4de4a

fix rate limit headers - were ints/floats need to be strings Running under gunicorn rest requests were crashing. Not all of the values for the rate limit headers were strings. Some were numbers. This caused the header generation for wsgi to fail. Now the values are all strings.
author John Rouillard <rouilj@ieee.org>
date Sun, 20 Oct 2019 20:56:56 -0400
parents 5258e89e896a
children 8ccb41b477d1
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: 204
diff changeset
1 #
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 204
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: 204
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: 204
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: 204
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: 204
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: 204
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: 204
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: 204
diff changeset
10 # POSSIBILITY OF SUCH DAMAGE.
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 204
diff changeset
11 #
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 204
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: 204
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: 204
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: 204
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: 204
diff changeset
16 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
2621
d344419d599d use new style config;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2584
diff changeset
17 #
204
c1461733cbf9 Instances are now opened by a special function...
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
18
4388
72db88cb68b0 doc tweak
Richard Jones <richard@users.sourceforge.net>
parents: 4366
diff changeset
19 """Top-level tracker interface.
72db88cb68b0 doc tweak
Richard Jones <richard@users.sourceforge.net>
parents: 4366
diff changeset
20
72db88cb68b0 doc tweak
Richard Jones <richard@users.sourceforge.net>
parents: 4366
diff changeset
21 Open a tracker with:
406
bdc2ea127ae9 Added module docstrings to all modules.
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 380
diff changeset
22
4388
72db88cb68b0 doc tweak
Richard Jones <richard@users.sourceforge.net>
parents: 4366
diff changeset
23 >>> from roundup import instance
72db88cb68b0 doc tweak
Richard Jones <richard@users.sourceforge.net>
parents: 4366
diff changeset
24 >>> db = instance.open('path to tracker home')
72db88cb68b0 doc tweak
Richard Jones <richard@users.sourceforge.net>
parents: 4366
diff changeset
25
72db88cb68b0 doc tweak
Richard Jones <richard@users.sourceforge.net>
parents: 4366
diff changeset
26 The "db" handle you get back is the tracker's hyperdb which has the interface
4395
Richard Jones <richard@users.sourceforge.net>
parents: 4388
diff changeset
27 described in `roundup.hyperdb.Database`.
4083
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 3777
diff changeset
28 """
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1953
diff changeset
29 __docformat__ = 'restructuredtext'
204
c1461733cbf9 Instances are now opened by a special function...
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
30
5383
6fbb7d52e38f Python 3 preparation: use open() instead of file().
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
31 try:
6fbb7d52e38f Python 3 preparation: use open() instead of file().
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
32 import builtins
6fbb7d52e38f Python 3 preparation: use open() instead of file().
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
33 except ImportError:
6fbb7d52e38f Python 3 preparation: use open() instead of file().
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
34 import __builtin__ as builtins
6fbb7d52e38f Python 3 preparation: use open() instead of file().
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
35
5810
5258e89e896a Fix: DeprecationWarning: Using or importing the ABCs from 'collections'
John Rouillard <rouilj@ieee.org>
parents: 5406
diff changeset
36 try:
5258e89e896a Fix: DeprecationWarning: Using or importing the ABCs from 'collections'
John Rouillard <rouilj@ieee.org>
parents: 5406
diff changeset
37 from collections.abc import Callable
5258e89e896a Fix: DeprecationWarning: Using or importing the ABCs from 'collections'
John Rouillard <rouilj@ieee.org>
parents: 5406
diff changeset
38 except ImportError:
5258e89e896a Fix: DeprecationWarning: Using or importing the ABCs from 'collections'
John Rouillard <rouilj@ieee.org>
parents: 5406
diff changeset
39 from collections import Callable
5258e89e896a Fix: DeprecationWarning: Using or importing the ABCs from 'collections'
John Rouillard <rouilj@ieee.org>
parents: 5406
diff changeset
40
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1174
diff changeset
41 import os
3771
bf660e65ba45 Directory structure changes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 2977
diff changeset
42 import sys
5041
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
43 import warnings
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
44
2977
9c8de04a76b1 unit test fixes
Richard Jones <richard@users.sourceforge.net>
parents: 2933
diff changeset
45 from roundup import configuration, mailgw
4083
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 3777
diff changeset
46 from roundup import hyperdb, backends, actions
2851
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
47 from roundup.cgi import client, templating
4083
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 3777
diff changeset
48 from roundup.cgi import actions as cgi_actions
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1174
diff changeset
49
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1174
diff changeset
50 class Tracker:
2851
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
51 def __init__(self, tracker_home, optimize=0):
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
52 """New-style tracker instance constructor
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
53
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
54 Parameters:
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
55 tracker_home:
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
56 tracker home directory
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
57 optimize:
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
58 if set, precompile html templates
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
59
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
60 """
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1174
diff changeset
61 self.tracker_home = tracker_home
2851
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
62 self.optimize = optimize
4211
61cf00ca920a Process each message through the mail gateway as a separate transaction.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4083
diff changeset
63 # if set, call schema_hook after executing schema.py will get
61cf00ca920a Process each message through the mail gateway as a separate transaction.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4083
diff changeset
64 # same variables (in particular db) as schema.py main purpose is
61cf00ca920a Process each message through the mail gateway as a separate transaction.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4083
diff changeset
65 # for regression tests
61cf00ca920a Process each message through the mail gateway as a separate transaction.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4083
diff changeset
66 self.schema_hook = None
2647
8c46091c36d0 Main Roundup configuration class renamed to CoreConfig.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2638
diff changeset
67 self.config = configuration.CoreConfig(tracker_home)
4083
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 3777
diff changeset
68 self.actions = {}
2633
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
69 self.cgi_actions = {}
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
70 self.templating_utils = {}
4588
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
71
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
72 libdir = os.path.join(self.tracker_home, 'lib')
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
73 self.libdir = os.path.isdir(libdir) and libdir or ''
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
74
4592
7b7cfb4b00eb Fix improvements on instance.py.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4588
diff changeset
75 self.load_interfaces()
4721
ec359e7c6c95 Rename templating.get_templates to get_loader
anatoly techtonik <techtonik@gmail.com>
parents: 4720
diff changeset
76 self.templates = templating.get_loader(self.config["TEMPLATES"],
4592
7b7cfb4b00eb Fix improvements on instance.py.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4588
diff changeset
77 self.config["TEMPLATE_ENGINE"])
5041
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
78
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
79 rdbms_backend = self.config.RDBMS_BACKEND
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
80
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
81 # TODO: Remove in v1.7
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
82 # Provide some backwards compatability for existing Roundup instances
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
83 # that still define the backend type in 'db/backend_name' and warn the
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
84 # users they need to update their config.ini
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
85 if rdbms_backend == '':
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
86 filename = os.path.join(self.config.DATABASE, 'backend_name')
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
87 msg = """\n
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
88 The 'backend_name' file is no longer used to configure the database backend
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
89 used for the tracker. Please read 'doc/upgrading.txt' to find out how to
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
90 update your config.ini
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
91 """
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
92 try:
5383
6fbb7d52e38f Python 3 preparation: use open() instead of file().
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
93 with open(filename) as backend_file:
5041
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
94 rdbms_backend = backend_file.readline().strip()
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
95
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
96 with warnings.catch_warnings():
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
97 warnings.simplefilter("once", DeprecationWarning)
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
98 warnings.warn(msg, DeprecationWarning, stacklevel=2)
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
99 except IOError:
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
100 pass
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
101
5251e97b1de0 Configure the database backend in the config.ini
John Kristensen <john@jerrykan.com>
parents: 4781
diff changeset
102 self.backend = backends.get_backend(rdbms_backend)
4592
7b7cfb4b00eb Fix improvements on instance.py.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4588
diff changeset
103
2851
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
104 if self.optimize:
4748
e339583eae8e templating: rename precompileTemplates to precompile
anatoly techtonik <techtonik@gmail.com>
parents: 4722
diff changeset
105 self.templates.precompile()
2891
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
106 # initialize tracker extensions
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
107 for extension in self.get_extensions('extensions'):
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
108 extension(self)
2902
f50b867747c9 if optimize is set, load the schema file in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2891
diff changeset
109 # load database schema
4588
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
110 self.schema = self._compile('schema.py')
2891
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
111 # load database detectors
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
112 self.detectors = self.get_extensions('detectors')
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
113 # db_open is set to True after first open()
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
114 self.db_open = 0
2633
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
115
2796
7f1e17aeca1b journaltag is optional
Richard Jones <richard@users.sourceforge.net>
parents: 2736
diff changeset
116 def open(self, name=None):
2891
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
117 # load the database schema
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
118 # we cannot skip this part even if self.optimize is set
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
119 # because the schema has security settings that must be
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
120 # applied to each database instance
2890
938915fbcb49 get_backend_name() is a lengthy thing (file I/O).
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2856
diff changeset
121 backend = self.backend
4588
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
122 env = {
2633
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
123 'Class': backend.Class,
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
124 'FileClass': backend.FileClass,
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
125 'IssueClass': backend.IssueClass,
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
126 'String': hyperdb.String,
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
127 'Password': hyperdb.Password,
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
128 'Date': hyperdb.Date,
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
129 'Link': hyperdb.Link,
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
130 'Multilink': hyperdb.Multilink,
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
131 'Interval': hyperdb.Interval,
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
132 'Boolean': hyperdb.Boolean,
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
133 'Number': hyperdb.Number,
5067
e424987d294a Add support for an integer type to join the existing number type.
John Rouillard <rouilj@ieee.org>
parents: 5041
diff changeset
134 'Integer': hyperdb.Integer,
2633
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
135 'db': backend.Database(self.config, name)
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
136 }
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1174
diff changeset
137
2891
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
138 if self.optimize:
2902
f50b867747c9 if optimize is set, load the schema file in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2891
diff changeset
139 # execute preloaded schema object
4606
48b73776601c More fix for improvements on instance.py.
Cheer Xiao <xiaqqaix@gmail.com>
parents: 4592
diff changeset
140 self._exec(self.schema, env)
5810
5258e89e896a Fix: DeprecationWarning: Using or importing the ABCs from 'collections'
John Rouillard <rouilj@ieee.org>
parents: 5406
diff changeset
141 if isinstance(self.schema_hook, Callable):
4588
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
142 self.schema_hook(**env)
2891
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
143 # use preloaded detectors
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
144 detectors = self.detectors
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
145 else:
2902
f50b867747c9 if optimize is set, load the schema file in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2891
diff changeset
146 # execute the schema file
4588
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
147 self._execfile('schema.py', env)
5810
5258e89e896a Fix: DeprecationWarning: Using or importing the ABCs from 'collections'
John Rouillard <rouilj@ieee.org>
parents: 5406
diff changeset
148 if isinstance(self.schema_hook, Callable):
4588
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
149 self.schema_hook(**env)
2891
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
150 # reload extensions and detectors
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
151 for extension in self.get_extensions('extensions'):
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
152 extension(self)
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
153 detectors = self.get_extensions('detectors')
4588
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
154 db = env['db']
4781
6e9b9743de89 Implementation for:
John Rouillard <rouilj@ieee.org>
parents: 4748
diff changeset
155 db.tx_Source = None
6e9b9743de89 Implementation for:
John Rouillard <rouilj@ieee.org>
parents: 4748
diff changeset
156
2891
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
157 # apply the detectors
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
158 for detector in detectors:
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
159 detector(db)
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
160 # if we are running in debug mode
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
161 # or this is the first time the database is opened,
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
162 # do database upgrade checks
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
163 if not (self.optimize and self.db_open):
4266
2b75274936bc Add schema consistency checks.
Stefan Seefeld <stefan@seefeld.name>
parents: 4211
diff changeset
164 # As a consistency check, ensure that every link property is
2b75274936bc Add schema consistency checks.
Stefan Seefeld <stefan@seefeld.name>
parents: 4211
diff changeset
165 # pointing at a defined class. Otherwise, the schema is
2b75274936bc Add schema consistency checks.
Stefan Seefeld <stefan@seefeld.name>
parents: 4211
diff changeset
166 # internally inconsistent. This is an important safety
2b75274936bc Add schema consistency checks.
Stefan Seefeld <stefan@seefeld.name>
parents: 4211
diff changeset
167 # measure as it protects against an accidental schema change
2b75274936bc Add schema consistency checks.
Stefan Seefeld <stefan@seefeld.name>
parents: 4211
diff changeset
168 # dropping a table while there are still links to the table;
2b75274936bc Add schema consistency checks.
Stefan Seefeld <stefan@seefeld.name>
parents: 4211
diff changeset
169 # once the table has been dropped, there is no way to get it
2b75274936bc Add schema consistency checks.
Stefan Seefeld <stefan@seefeld.name>
parents: 4211
diff changeset
170 # back, so it is important to drop it only if we are as sure
2b75274936bc Add schema consistency checks.
Stefan Seefeld <stefan@seefeld.name>
parents: 4211
diff changeset
171 # as possible that it is no longer needed.
2b75274936bc Add schema consistency checks.
Stefan Seefeld <stefan@seefeld.name>
parents: 4211
diff changeset
172 classes = db.getclasses()
2b75274936bc Add schema consistency checks.
Stefan Seefeld <stefan@seefeld.name>
parents: 4211
diff changeset
173 for classname in classes:
2b75274936bc Add schema consistency checks.
Stefan Seefeld <stefan@seefeld.name>
parents: 4211
diff changeset
174 cl = db.getclass(classname)
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5383
diff changeset
175 for propname, prop in cl.getprops().items():
4266
2b75274936bc Add schema consistency checks.
Stefan Seefeld <stefan@seefeld.name>
parents: 4211
diff changeset
176 if not isinstance(prop, (hyperdb.Link,
2b75274936bc Add schema consistency checks.
Stefan Seefeld <stefan@seefeld.name>
parents: 4211
diff changeset
177 hyperdb.Multilink)):
2b75274936bc Add schema consistency checks.
Stefan Seefeld <stefan@seefeld.name>
parents: 4211
diff changeset
178 continue
2b75274936bc Add schema consistency checks.
Stefan Seefeld <stefan@seefeld.name>
parents: 4211
diff changeset
179 linkto = prop.classname
2b75274936bc Add schema consistency checks.
Stefan Seefeld <stefan@seefeld.name>
parents: 4211
diff changeset
180 if linkto not in classes:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5264
diff changeset
181 raise ValueError("property %s.%s links to non-existent class %s"
4266
2b75274936bc Add schema consistency checks.
Stefan Seefeld <stefan@seefeld.name>
parents: 4211
diff changeset
182 % (classname, propname, linkto))
2b75274936bc Add schema consistency checks.
Stefan Seefeld <stefan@seefeld.name>
parents: 4211
diff changeset
183
2891
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
184 db.post_init()
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
185 self.db_open = 1
2633
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
186 return db
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
187
2697
d138df58b0c3 load user interfaces
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2688
diff changeset
188 def load_interfaces(self):
d138df58b0c3 load user interfaces
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2688
diff changeset
189 """load interfaces.py (if any), initialize Client and MailGW attrs"""
4588
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
190 env = {}
2697
d138df58b0c3 load user interfaces
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2688
diff changeset
191 if os.path.isfile(os.path.join(self.tracker_home, 'interfaces.py')):
4588
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
192 self._execfile('interfaces.py', env)
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
193 self.Client = env.get('Client', client.Client)
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
194 self.MailGW = env.get('MailGW', mailgw.MailGW)
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
195 self.TemplatingUtils = env.get('TemplatingUtils', templating.TemplatingUtils)
2697
d138df58b0c3 load user interfaces
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2688
diff changeset
196
2891
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
197 def get_extensions(self, dirname):
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
198 """Load python extensions
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
199
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
200 Parameters:
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
201 dirname:
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
202 extension directory name relative to tracker home
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
203
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
204 Return value:
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
205 list of init() functions for each extension
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
206
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
207 """
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
208 extensions = []
2688
eb14c12813a0 fix load_extensions():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2677
diff changeset
209 dirpath = os.path.join(self.tracker_home, dirname)
eb14c12813a0 fix load_extensions():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2677
diff changeset
210 if os.path.isdir(dirpath):
3771
bf660e65ba45 Directory structure changes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 2977
diff changeset
211 sys.path.insert(1, dirpath)
2688
eb14c12813a0 fix load_extensions():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2677
diff changeset
212 for name in os.listdir(dirpath):
2677
1f0143b53bee fix .load_extensions():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2647
diff changeset
213 if not name.endswith('.py'):
1f0143b53bee fix .load_extensions():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2647
diff changeset
214 continue
4588
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
215 env = {}
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
216 self._execfile(os.path.join(dirname, name), env)
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
217 extensions.append(env['init'])
3773
21ff756e4549 Fixes for directory handling.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3771
diff changeset
218 sys.path.remove(dirpath)
2891
bc72b1c7319b if optimize is set, load all extension modules in __init__()...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2890
diff changeset
219 return extensions
2638
18e86941c950 Load up extensions in the tracker "extensions" directory.
Richard Jones <richard@users.sourceforge.net>
parents: 2633
diff changeset
220
5216
6a4317738a90 make roundup-admin init function set the transaction source. Otherwise when initial_data.py is loaded as part of init, db.tx_Source is set to None and thus checks like db.tx_Source in [ 'cli' ] will fail.
John Rouillard <rouilj@ieee.org>
parents: 5067
diff changeset
221 def init(self, adminpw, tx_Source=None):
2633
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
222 db = self.open('admin')
5216
6a4317738a90 make roundup-admin init function set the transaction source. Otherwise when initial_data.py is loaded as part of init, db.tx_Source is set to None and thus checks like db.tx_Source in [ 'cli' ] will fail.
John Rouillard <rouilj@ieee.org>
parents: 5067
diff changeset
223 db.tx_Source = tx_Source
4588
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
224 self._execfile('initial_data.py', {'db': db, 'adminpw': adminpw,
2633
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
225 'admin_email': self.config['ADMIN_EMAIL']})
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
226 db.commit()
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
227 db.close()
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
228
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
229 def exists(self):
2890
938915fbcb49 get_backend_name() is a lengthy thing (file I/O).
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2856
diff changeset
230 return self.backend.db_exists(self.config)
2633
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
231
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
232 def nuke(self):
2890
938915fbcb49 get_backend_name() is a lengthy thing (file I/O).
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2856
diff changeset
233 self.backend.db_nuke(self.config)
2633
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
234
4588
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
235 def _compile(self, fname):
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
236 fname = os.path.join(self.tracker_home, fname)
5383
6fbb7d52e38f Python 3 preparation: use open() instead of file().
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
237 return compile(builtins.open(fname).read(), fname, 'exec')
4588
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
238
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
239 def _exec(self, obj, env):
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
240 if self.libdir:
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
241 sys.path.insert(1, self.libdir)
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
242 exec(obj, env)
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
243 if self.libdir:
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
244 sys.path.remove(self.libdir)
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
245 return env
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
246
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
247 def _execfile(self, fname, env):
7017c8dd704c Small improvements on instance.py by Cheer Xiao.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4587
diff changeset
248 self._exec(self._compile(fname), env)
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1174
diff changeset
249
2633
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
250 def registerAction(self, name, action):
4083
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 3777
diff changeset
251
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 3777
diff changeset
252 # The logic here is this:
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 3777
diff changeset
253 # * if `action` derives from actions.Action,
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 3777
diff changeset
254 # it is executable as a generic action.
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 3777
diff changeset
255 # * if, moreover, it also derives from cgi.actions.Bridge,
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 3777
diff changeset
256 # it may in addition be called via CGI
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 3777
diff changeset
257 # * in all other cases we register it as a CGI action, without
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 3777
diff changeset
258 # any check (for backward compatibility).
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 3777
diff changeset
259 if issubclass(action, actions.Action):
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 3777
diff changeset
260 self.actions[name] = action
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 3777
diff changeset
261 if issubclass(action, cgi_actions.Bridge):
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 3777
diff changeset
262 self.cgi_actions[name] = action
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 3777
diff changeset
263 else:
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 3777
diff changeset
264 self.cgi_actions[name] = action
2633
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
265
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
266 def registerUtil(self, name, function):
a9e1fff1e793 I thought I committed this last night. Ho hum.
Richard Jones <richard@users.sourceforge.net>
parents: 2621
diff changeset
267 self.templating_utils[name] = function
204
c1461733cbf9 Instances are now opened by a special function...
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
268
5264
32f95ec6bd8e Python 2 and 3 support. Convert Exception into BaseException in core code.
John Rouillard <rouilj@ieee.org>
parents: 5216
diff changeset
269 class TrackerError(BaseException):
1158
30db4a11d700 sanity check instance attributes on open
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
270 pass
30db4a11d700 sanity check instance attributes on open
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
271
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1174
diff changeset
272
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1174
diff changeset
273 class OldStyleTrackers:
204
c1461733cbf9 Instances are now opened by a special function...
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
274 def __init__(self):
c1461733cbf9 Instances are now opened by a special function...
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
275 self.number = 0
1158
30db4a11d700 sanity check instance attributes on open
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
276 self.trackers = {}
204
c1461733cbf9 Instances are now opened by a special function...
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
277
2851
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
278 def open(self, tracker_home, optimize=0):
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
279 """Open the tracker.
380
a1331423eb93 Fixed issues with nosy reaction and author copies.
Richard Jones <richard@users.sourceforge.net>
parents: 214
diff changeset
280
2851
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
281 Parameters:
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
282 tracker_home:
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
283 tracker home directory
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
284 optimize:
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
285 if set, precompile html templates
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
286
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
287 Raise ValueError if the tracker home doesn't exist.
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
288
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
289 """
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1174
diff changeset
290 import imp
1174
8e318dfaf479 Verify contents of tracker module when the tracker is opened
Richard Jones <richard@users.sourceforge.net>
parents: 1162
diff changeset
291 # sanity check existence of tracker home
1158
30db4a11d700 sanity check instance attributes on open
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
292 if not os.path.exists(tracker_home):
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5264
diff changeset
293 raise ValueError('no such directory: "%s"'%tracker_home)
1174
8e318dfaf479 Verify contents of tracker module when the tracker is opened
Richard Jones <richard@users.sourceforge.net>
parents: 1162
diff changeset
294
8e318dfaf479 Verify contents of tracker module when the tracker is opened
Richard Jones <richard@users.sourceforge.net>
parents: 1162
diff changeset
295 # sanity check tracker home contents
8e318dfaf479 Verify contents of tracker module when the tracker is opened
Richard Jones <richard@users.sourceforge.net>
parents: 1162
diff changeset
296 for reqd in 'config dbinit select_db interfaces'.split():
8e318dfaf479 Verify contents of tracker module when the tracker is opened
Richard Jones <richard@users.sourceforge.net>
parents: 1162
diff changeset
297 if not os.path.exists(os.path.join(tracker_home, '%s.py'%reqd)):
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5264
diff changeset
298 raise TrackerError('File "%s.py" missing from tracker '\
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5264
diff changeset
299 'home "%s"'%(reqd, tracker_home))
1174
8e318dfaf479 Verify contents of tracker module when the tracker is opened
Richard Jones <richard@users.sourceforge.net>
parents: 1162
diff changeset
300
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
301 if tracker_home in self.trackers:
1158
30db4a11d700 sanity check instance attributes on open
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
302 return imp.load_package(self.trackers[tracker_home],
30db4a11d700 sanity check instance attributes on open
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
303 tracker_home)
2933
6574d6736b57 register all backend modules for old-style trackers
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2902
diff changeset
304 # register all available backend modules
6574d6736b57 register all backend modules for old-style trackers
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2902
diff changeset
305 backends.list_backends()
204
c1461733cbf9 Instances are now opened by a special function...
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
306 self.number = self.number + 1
1158
30db4a11d700 sanity check instance attributes on open
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
307 modname = '_roundup_tracker_%s'%self.number
30db4a11d700 sanity check instance attributes on open
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
308 self.trackers[tracker_home] = modname
30db4a11d700 sanity check instance attributes on open
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
309
30db4a11d700 sanity check instance attributes on open
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
310 # load the tracker
30db4a11d700 sanity check instance attributes on open
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
311 tracker = imp.load_package(modname, tracker_home)
30db4a11d700 sanity check instance attributes on open
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
312
30db4a11d700 sanity check instance attributes on open
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
313 # ensure the tracker has all the required bits
2621
d344419d599d use new style config;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2584
diff changeset
314 for required in 'open init Client MailGW'.split():
1158
30db4a11d700 sanity check instance attributes on open
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
315 if not hasattr(tracker, required):
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5264
diff changeset
316 raise TrackerError('Required tracker attribute "%s" missing'%required)
1158
30db4a11d700 sanity check instance attributes on open
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
317
2621
d344419d599d use new style config;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2584
diff changeset
318 # load and apply the config
2647
8c46091c36d0 Main Roundup configuration class renamed to CoreConfig.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2638
diff changeset
319 tracker.config = configuration.CoreConfig(tracker_home)
2621
d344419d599d use new style config;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2584
diff changeset
320 tracker.dbinit.config = tracker.config
2397
fa50e1347397 added basic logging support
Richard Jones <richard@users.sourceforge.net>
parents: 2273
diff changeset
321
2851
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
322 tracker.optimize = optimize
4722
f7e68ae4926c Restore compatibility with an old style trackers (not sure if
anatoly techtonik <techtonik@gmail.com>
parents: 4721
diff changeset
323 tracker.templates = templating.get_loader(tracker.config["TEMPLATES"])
2851
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
324 if optimize:
4748
e339583eae8e templating: rename precompileTemplates to precompile
anatoly techtonik <techtonik@gmail.com>
parents: 4722
diff changeset
325 tracker.templates.precompile()
2851
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
326
1158
30db4a11d700 sanity check instance attributes on open
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
327 return tracker
204
c1461733cbf9 Instances are now opened by a special function...
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
328
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1174
diff changeset
329 OldStyleTrackers = OldStyleTrackers()
2851
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
330 def open(tracker_home, optimize=0):
1780
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1174
diff changeset
331 if os.path.exists(os.path.join(tracker_home, 'dbinit.py')):
d2801a2b0a77 Initial implementation (half-baked) at new Tracker instance.
Richard Jones <richard@users.sourceforge.net>
parents: 1174
diff changeset
332 # user should upgrade...
2851
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
333 return OldStyleTrackers.open(tracker_home, optimize=optimize)
204
c1461733cbf9 Instances are now opened by a special function...
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
334
2851
96626831def1 trackers got a 'templates' attribute, containing html templates collection...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2836
diff changeset
335 return Tracker(tracker_home, optimize=optimize)
204
c1461733cbf9 Instances are now opened by a special function...
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
336
2621
d344419d599d use new style config;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2584
diff changeset
337 # vim: set filetype=python sts=4 sw=4 et si :

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