1 #
2 # Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/)
3 # This module is free software, and you may redistribute it and/or modify
4 # under the same terms as Python, so long as this copyright message and
5 # disclaimer are retained in their original form.
6 #
7 # IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR
8 # DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING
9 # OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE
10 # POSSIBILITY OF SUCH DAMAGE.
11 #
12 # BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
13 # BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14 # FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS"
15 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
16 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
17 #
18 # $Id: dbinit.py,v 1.6 2004-03-15 05:51:23 richard Exp $
20 import os
22 import config
23 from select_db import Database, Class, FileClass, IssueClass
25 def open(name=None):
26 ''' as from the roundupdb method openDB
27 '''
28 from roundup.hyperdb import String, Password, Date, Link, Multilink
29 from roundup.hyperdb import Interval, Boolean, Number
31 # open the database
32 db = Database(config, name)
34 #
35 # Now initialise the schema. Must do this each time the database is
36 # opened.
37 #
39 # Class automatically gets these properties:
40 # creation = Date()
41 # activity = Date()
42 # creator = Link('user')
43 pri = Class(db, "priority",
44 name=String(), order=String())
45 pri.setkey("name")
47 stat = Class(db, "status",
48 name=String(), order=String())
49 stat.setkey("name")
51 keyword = Class(db, "keyword",
52 name=String())
53 keyword.setkey("name")
55 query = Class(db, "query",
56 klass=String(), name=String(),
57 url=String())
58 query.setkey("name")
60 # add any additional database schema configuration here
62 # Note: roles is a comma-separated string of Role names
63 user = Class(db, "user",
64 username=String(), password=Password(),
65 address=String(), realname=String(),
66 phone=String(), organisation=String(),
67 alternate_addresses=String(),
68 queries=Multilink('query'), roles=String(),
69 timezone=String())
70 user.setkey("username")
72 # FileClass automatically gets these properties:
73 # content = String() [saved to disk in <tracker home>/db/files/]
74 # (it also gets the Class properties creation, activity and creator)
75 msg = FileClass(db, "msg",
76 author=Link("user", do_journal='no'),
77 recipients=Multilink("user", do_journal='no'),
78 date=Date(), summary=String(),
79 files=Multilink("file"),
80 messageid=String(), inreplyto=String())
82 file = FileClass(db, "file",
83 name=String(), type=String())
85 # IssueClass automatically gets these properties:
86 # title = String()
87 # messages = Multilink("msg")
88 # files = Multilink("file")
89 # nosy = Multilink("user")
90 # superseder = Multilink("issue")
91 # (it also gets the Class properties creation, activity and creator)
92 issue = IssueClass(db, "issue",
93 assignedto=Link("user"), topic=Multilink("keyword"),
94 priority=Link("priority"), status=Link("status"))
96 #
97 # SECURITY SETTINGS
98 #
99 # See the configuration and customisation document for information
100 # about security setup.
101 # Assign the access and edit Permissions for issue, file and message
102 # to regular users now
103 for cl in 'issue', 'file', 'msg', 'query', 'keyword':
104 p = db.security.getPermission('View', cl)
105 db.security.addPermissionToRole('User', p)
106 p = db.security.getPermission('Edit', cl)
107 db.security.addPermissionToRole('User', p)
108 for cl in 'priority', 'status':
109 p = db.security.getPermission('View', cl)
110 db.security.addPermissionToRole('User', p)
112 # and give the regular users access to the web and email interface
113 p = db.security.getPermission('Web Access')
114 db.security.addPermissionToRole('User', p)
115 p = db.security.getPermission('Email Access')
116 db.security.addPermissionToRole('User', p)
118 # May users view other user information? Comment these lines out
119 # if you don't want them to
120 p = db.security.getPermission('View', 'user')
121 db.security.addPermissionToRole('User', p)
123 # Assign the appropriate permissions to the anonymous user's Anonymous
124 # Role. Choices here are:
125 # - Allow anonymous users to register through the web
126 p = db.security.getPermission('Web Registration')
127 db.security.addPermissionToRole('Anonymous', p)
128 # - Allow anonymous (new) users to register through the email gateway
129 p = db.security.getPermission('Email Registration')
130 db.security.addPermissionToRole('Anonymous', p)
131 # - Allow anonymous users access to view issues (which implies being
132 # able to view all linked information too
133 for cl in 'issue', 'file', 'msg', 'keyword', 'priority', 'status':
134 p = db.security.getPermission('View', cl)
135 db.security.addPermissionToRole('Anonymous', p)
136 # - Allow anonymous users access to edit the "issue" class of data
137 # Note: this also grants access to create related information like
138 # files and messages etc that are linked to issues
139 #p = db.security.getPermission('Edit', 'issue')
140 #db.security.addPermissionToRole('Anonymous', p)
142 # oh, g'wan, let anonymous access the web interface too
143 p = db.security.getPermission('Web Access')
144 db.security.addPermissionToRole('Anonymous', p)
146 import detectors
147 detectors.init(db)
149 # schema is set up - run any post-initialisation
150 db.post_init()
151 return db
153 def init(adminpw):
154 ''' as from the roundupdb method initDB
156 Open the new database, and add new nodes - used for initialisation. You
157 can edit this before running the "roundup-admin initialise" command to
158 change the initial database entries.
159 '''
160 dbdir = os.path.join(config.DATABASE, 'files')
161 if not os.path.isdir(dbdir):
162 os.makedirs(dbdir)
164 db = open("admin")
165 db.clear()
167 #
168 # INITIAL PRIORITY AND STATUS VALUES
169 #
170 pri = db.getclass('priority')
171 pri.create(name="critical", order="1")
172 pri.create(name="urgent", order="2")
173 pri.create(name="bug", order="3")
174 pri.create(name="feature", order="4")
175 pri.create(name="wish", order="5")
177 stat = db.getclass('status')
178 stat.create(name="unread", order="1")
179 stat.create(name="deferred", order="2")
180 stat.create(name="chatting", order="3")
181 stat.create(name="need-eg", order="4")
182 stat.create(name="in-progress", order="5")
183 stat.create(name="testing", order="6")
184 stat.create(name="done-cbb", order="7")
185 stat.create(name="resolved", order="8")
187 # create the two default users
188 user = db.getclass('user')
189 user.create(username="admin", password=adminpw,
190 address=config.ADMIN_EMAIL, roles='Admin')
191 user.create(username="anonymous", roles='Anonymous')
193 # add any additional database create steps here - but only if you
194 # haven't initialised the database with the admin "initialise" command
196 db.commit()
197 db.close()
199 # vim: set filetype=python ts=4 sw=4 et si
201 #SHA: 92c54c05ba9f59453dc74fa9fdbbae34f7a9c077