Code

a2248720c61b1ed39ddf551be877582939aae4a0
[roundup.git] / doc / upgrading.txt
1 ======================================
2 Upgrading to newer versions of Roundup
3 ======================================
5 Please read each section carefully and edit your tracker home files
6 accordingly. Note that there is information about upgrade procedures in the
7 `administration guide`_.
9 If a specific version transition isn't mentioned here (eg. 0.6.7 to 0.6.8)
10 then you don't need to do anything. If you're upgrading from 0.5.6 to
11 0.6.8 though, you'll need to check the "0.5 to 0.6" and "0.6.x to 0.6.3"
12 steps.
14 .. contents::
16 Migrating from 1.4.x to 1.4.9
17 =============================
19 Fix the "remove" button in issue files and messages lists
20 ---------------------------------------------------------
22 The "remove" button(s) in the issue messages list needs to be altered. Find
23 the following in your tracker's ``html/issue.item.html`` template::
25   <td>
26    <form style="padding:0" tal:condition="context/is_edit_ok"
27          tal:attributes="action string:issue${context/id}">
28     <input type="hidden" name="@remove@files" tal:attributes="value file/id">
30 and add ``method="POST"`` as shown below::
32   <td>
33    <form style="padding:0" method="POST" tal:condition="context/is_edit_ok"
34          tal:attributes="action string:issue${context/id}">
35     <input type="hidden" name="@remove@files" tal:attributes="value file/id">
37 Then also find::
39   <td>
40    <form style="padding:0" tal:condition="context/is_edit_ok"
41          tal:attributes="action string:issue${context/id}">
42     <input type="hidden" name="@remove@messages" tal:attributes="value msg/id">
44 and add ``method="POST"`` as shown below::
46   <td>
47    <form style="padding:0" method="POST" tal:condition="context/is_edit_ok"
48          tal:attributes="action string:issue${context/id}">
49     <input type="hidden" name="@remove@messages" tal:attributes="value msg/id">
52 Fixing the "retire" button in user management list
53 --------------------------------------------------
55 If you made the change to the "reture" link in the user management list as
56 listed below in `Migrating from 1.4.x to 1.4.7`_ then you'll need to fix that
57 change by adding ``method="POST"`` to the ``<form>`` tag::
59      <form style="padding:0" method="POST"
60            tal:attributes="action string:user${user/id}">
61       <input type="hidden" name="@template" value="index">
62       <input type="hidden" name="@action" value="retire">
63       <input type="submit" value="retire" i18n:attributes="value">
64      </form>
67 Migrating from 1.4.x to 1.4.7
68 =============================
70 Several security issues were addressed in this release. Some aspects of your
71 trackers may no longer function depending on your local customisations. Core
72 functionality that will need to be modified:
74 Grant the "retire" permission to users for their queries
75 --------------------------------------------------------
77 Users will no longer be able to retire their own queries. To remedy this you
78 will need to add the following to your tracker's ``schema.py`` just under the
79 line that grants them permission to edit their own queries::
81    p = db.security.addPermission(name='Edit', klass='query', check=edit_query,
82       description="User is allowed to edit their queries")
83    db.security.addPermissionToRole('User', p)
84  + p = db.security.addPermission(name='Retire', klass='query', check=edit_query,
85  +    description="User is allowed to retire their queries")
86  + db.security.addPermissionToRole('User', p)
87    p = db.security.addPermission(name='Create', klass='query',
88       description="User is allowed to create queries")
89    db.security.addPermissionToRole('User', p)
91 The lines marked "+" should be added, minus the "+" sign.
94 Fix the "retire" link in the users list for admin users
95 -------------------------------------------------------
97 The "retire" link found in the file ``html/users.index.html``::
99   <td tal:condition="context/is_edit_ok">
100    <a tal:attributes="href string:user${user/id}?@action=retire&@template=index"
101     i18n:translate="">retire</a>
103 Should be replaced with::
105   <td tal:condition="context/is_retire_ok">
106      <form style="padding:0" method="POST"
107            tal:attributes="action string:user${user/id}">
108       <input type="hidden" name="@template" value="index">
109       <input type="hidden" name="@action" value="retire">
110       <input type="submit" value="retire" i18n:attributes="value">
111      </form>
114 Fix for Python 2.6+ users
115 -------------------------
117 If you use Python 2.6 you should edit your tracker's
118 ``detectors/nosyreaction.py`` file to change::
120    import sets
122 at the top to::
124    from roundup.anypy.sets_ import set
126 and then all instances of ``sets.Set()`` to ``set()`` in the later code.
130 Trackers currently allowing HTML file uploading
131 -----------------------------------------------
133 Trackers which wish to continue to allow uploading of HTML content against issues
134 will need to set a new configuration variable in the ``[web]`` section of the
135 tracker's ``config.ini`` file:
137    # Setting this option enables Roundup to serve uploaded HTML
138    # file content *as HTML*. This is a potential security risk
139    # and is therefore disabled by default. Set to 'yes' if you
140    # trust *all* users uploading content to your tracker.
141    # Allowed values: yes, no
142    # Default: no
143    allow_html_file = no
147 Migrating from 1.4.2 to 1.4.3
148 =============================
150 If you are using the MySQL backend you will need to replace some indexes
151 that may have been created by version 1.4.2.
153 You should to access your MySQL database directly and remove any indexes
154 with a name ending in "_key_retired_idx". You should then re-add them with
155 the same spec except the key column name needs a size. So an index on
156 "_user (__retired, _name)" should become "_user (__retired, _name(255))".
159 Migrating from 1.4.x to 1.4.2
160 =============================
162 You should run the "roundup-admin migrate" command for your tracker once
163 you've installed the latest codebase. 
165 Do this before you use the web, command-line or mail interface and before
166 any users access the tracker.
168 This command will respond with either "Tracker updated" (if you've not
169 previously run it on an RDBMS backend) or "No migration action required"
170 (if you have run it, or have used another interface to the tracker,
171 or are using anydbm).
173 It's safe to run this even if it's not required, so just get into the
174 habit.
177 Migrating from 1.3.3 to 1.4.0
178 =============================
180 Value of the "refwd_re" tracker configuration option (section "mailgw")
181 is treated as UTF-8 string.  In previous versions, it was ISO8859-1.
183 If you have running trackers based on the classic template, please
184 update the messagesummary detector as follows::
186     --- detectors/messagesummary.py 17 Apr 2003 03:26:38 -0000      1.1
187     +++ detectors/messagesummary.py 3 Apr 2007 06:47:21 -0000       1.2
188     @@ -8,7 +8,7 @@
189      if newvalues.has_key('summary') or not newvalues.has_key('content'):
190          return
192     -    summary, content = parseContent(newvalues['content'], 1, 1)
193     +    summary, content = parseContent(newvalues['content'], config=db.config)
194      newvalues['summary'] = summary
196 In the latest version we have added some database indexes to the
197 SQL-backends (mysql, postgresql, sqlite) for speeding up building the
198 roundup-index for full-text search. We recommend that you create the
199 following database indexes on the database by hand::
201  CREATE INDEX words_by_id ON __words (_textid)
202  CREATE UNIQUE INDEX __textids_by_props ON __textids (_class, _itemid, _prop)
204 Migrating from 1.2.x to 1.3.0
205 =============================
207 1.3.0 Web interface changes
208 ---------------------------
210 Some of the HTML files in the "classic" and "minimal" tracker templates
211 were changed to fix some bugs and clean them up. You may wish to compare
212 them to the HTML files in your tracker and apply any changes.
215 Migrating from 1.1.2 to 1.2.0
216 =============================
218 1.2.0 Sorting and grouping by multiple properties
219 -------------------------------------------------
221 Starting with this version, sorting and grouping by multiple properties
222 is possible. This means that request.sort and request.group are now
223 lists. This is reflected in several places:
225  * ``renderWith`` now has list attributes for ``sort`` and ``group``,
226    where you previously wrote::
227    
228     renderWith(... sort=('-', 'activity'), group=('+', 'priority')
230    you write now::
232     renderWith(... sort=[('-', 'activity')], group=[('+', 'priority')]
234  * In templates that permit to edit sorting/grouping, request.sort and
235    request.group are (possibly empty) lists. You can now sort and group
236    by multiple attributes. For an example, see the classic template. You
237    may want search for the variable ``n_sort`` which can be set to the
238    number of sort/group properties.
240  * Templates that diplay new headlines for each group of items with
241    equal group properties can now use the modified ``batch.propchanged``
242    method that can take several properties which are checked for
243    changes. See the example in the classic template which makes use of
244    ``batch.propchanged``.
246 Migrating from 1.1.0 to 1.1.1
247 =============================
249 1.1.1 "Clear this message"
250 --------------------------
252 In 1.1.1, the standard ``page.html`` template includes a "clear this message"
253 link in the green "ok" message bar that appears after a successful edit
254 (or other) action.
256 To include this in your tracker, change the following in your ``page.html``
257 template::
259  <p tal:condition="options/ok_message | nothing" class="ok-message"
260     tal:repeat="m options/ok_message" tal:content="structure m">error</p>
262 to be::
264  <p tal:condition="options/ok_message | nothing" class="ok-message">
265    <span tal:repeat="m options/ok_message"
266       tal:content="structure string:$m <br/ > " />
267     <a class="form-small" tal:attributes="href request/current_url"
268        i18n:translate="">clear this message</a>
269  </p>
272 If you implemented the "clear this message" in your 1.1.0 tracker, then you
273 should change it to the above and it will work much better!
276 Migrating from 1.0.x to 1.1.0
277 =============================
279 1.1 Login "For Session Only"
280 ----------------------------
282 In 1.1, web logins are alive for the length of a session only, *unless* you
283 add the following to the login form in your tracker's ``page.html``::
285     <input type="checkbox" name="remember" id="remember">
286     <label for="remember" i18n:translate="">Remember me?</label><br>
288 See the classic tracker ``page.html`` if you're unsure where this should
289 go.
292 1.1 Query Display Name
293 ----------------------
295 The ``dispname`` web variable has been renamed ``@dispname`` to avoid
296 clashing with other variables of the same name. If you are using the
297 display name feature, you will need to edit your tracker's ``page.html``
298 and ``issue.index.html`` pages to change ``dispname`` to ``@dispname``.
300 A side-effect of this change is that the renderWith method used in the
301 ``home.html`` page may now take a dispname argument.
304 1.1 "Clear this message"
305 ------------------------
307 In 1.1, the standard ``page.html`` template includes a "clear this message"
308 link in the green "ok" message bar that appears after a successful edit
309 (or other) action.
311 To include this in your tracker, change the following in your ``page.html``
312 template::
314  <p tal:condition="options/ok_message | nothing" class="ok-message"
315     tal:repeat="m options/ok_message" tal:content="structure m">error</p>
317 to be::
319  <p tal:condition="options/ok_message | nothing" class="ok-message">
320    <span tal:repeat="m options/ok_message"
321       tal:content="structure string:$m <br/ > " />
322     <a class="form-small" tal:attributes="href string:issue${context/id}"
323        i18n:translate="">clear this message</a>
324  </p>
327 Migrating from 0.8.x to 1.0
328 ===========================
330 1.0 New Query Permissions
331 -------------------------
333 New permissions are defined for query editing and viewing. To include these
334 in your tracker, you need to add these lines to your tracker's
335 ``schema.py``::
337  # Users should be able to edit and view their own queries. They should also
338  # be able to view any marked as not private. They should not be able to
339  # edit others' queries, even if they're not private
340  def view_query(db, userid, itemid):
341      private_for = db.query.get(itemid, 'private_for')
342      if not private_for: return True
343      return userid == private_for
344  def edit_query(db, userid, itemid):
345      return userid == db.query.get(itemid, 'creator')
346  p = db.security.addPermission(name='View', klass='query', check=view_query,
347      description="User is allowed to view their own and public queries")
348  db.security.addPermissionToRole('User', p)
349  p = db.security.addPermission(name='Edit', klass='query', check=edit_query,
350      description="User is allowed to edit their queries")
351  db.security.addPermissionToRole('User', p)
352  p = db.security.addPermission(name='Create', klass='query',
353      description="User is allowed to create queries")
354  db.security.addPermissionToRole('User', p)
356 and then remove 'query' from the line::
358  # Assign the access and edit Permissions for issue, file and message
359  # to regular users now
360  for cl in 'issue', 'file', 'msg', 'query', 'keyword':
362 so it looks like::
364  for cl in 'issue', 'file', 'msg', 'keyword':
367 Migrating from 0.8.0 to 0.8.3
368 =============================
370 0.8.3 Nosy Handling Changes
371 ---------------------------
373 A change was made to fix a bug in the ``nosyreaction.py`` standard
374 detector. To incorporate this fix in your trackers, you will need to copy
375 the ``nosyreaction.py`` file from the ``templates/classic/detectors``
376 directory of the source to your tracker's ``templates`` directory.
378 If you have modified the ``nosyreaction.py`` file from the standard
379 version, you will need to roll your changes into the new file.
382 Migrating from 0.7.1 to 0.8.0
383 =============================
385 You *must* fully uninstall previous Roundup version before installing
386 Roundup 0.8.0.  If you don't do that, ``roundup-admin install``
387 command may fail to function properly.
389 0.8.0 Backend changes
390 ---------------------
392 Backends 'bsddb' and 'bsddb3' are removed.  If you are using one of these,
393 you *must* migrate to another backend before upgrading.
396 0.8.0 API changes
397 -----------------
399 Class.safeget() was removed from the API. Test your item ids before calling
400 Class.get() instead.
403 0.8.0 New tracker layout
404 ------------------------
406 The ``config.py`` file has been replaced by ``config.ini``. You may use the
407 roundup-admin command "genconfig" to generate a new config file::
409   roundup-admin genconfig <tracker home>/config.ini
411 and modify the values therein based on the contents of your old config.py.
412 In most cases, the names of the config variables are the same.
414 The ``select_db.py`` file has been replaced by a file in the ``db``
415 directory called ``backend_name``. As you might guess, this file contains
416 just the name of the backend. To figure what the contents of yours should
417 be, use the following table:
419   ================================ =========================
420   ``select_db.py`` contents        ``backend_name`` contents
421   ================================ =========================
422   from back_anydbm import ...      anydbm
423   from back_metakit import ...     metakit
424   from back_sqlite import ...      sqlite
425   from back_mysql import ...       mysql
426   from back_postgresql import ...  postgresql
427   ================================ =========================
429 The ``dbinit.py`` file has been split into two new files,
430 ``initial_data.py`` and ``schema.py``. The contents of this file are:
432 ``initial_data.py``
433   You don't need one of these as your tracker is already initialised.
435 ``schema.py``
436   Copy the body of the ``def open(name=None)`` function from your old
437   tracker's ``dbinit.py`` file to this file. As the lines you're copying
438   aren't part of a function definition anymore, one level of indentation
439   needs to be removed (remove only the leading four spaces on each
440   line). 
442   The first few lines -- those starting with ``from roundup.hyperdb
443   import ...`` and the ``db = Database(config, name)`` line -- don't
444   need to be copied. Neither do the last few lines -- those starting
445   with ``import detectors``, down to ``return db`` inclusive.
447 You may remove the ``__init__.py`` module from the "detectors" directory as
448 it is no longer used.
450 There's a new way to write extension code for Roundup. If you have code in
451 an ``interfaces.py`` file you should move it. See the `customisation
452 documentation`_ for information about how extensions are now written.
453 Note that some older trackers may use ``interfaces.py`` to customise the
454 mail gateway behaviour. You will need to keep your ``interfaces.py`` file
455 if this is the case.
458 0.8.0 Permissions Changes
459 -------------------------
461 The creation of a new item in the user interfaces is now controlled by the
462 "Create" Permission. You will need to add an assignment of this Permission
463 to your users who are allowed to create items. The most common form of this
464 is the following in your ``schema.py`` added just under the current
465 assignation of the Edit Permission::
467     for cl in 'issue', 'file', 'msg', 'query', 'keyword':
468         p = db.security.getPermission('Create', cl)
469         db.security.addPermissionToRole('User', p)
471 You will need to explicitly let anonymous users access the web interface so
472 that regular users are able to see the login form. Note that almost all
473 trackers will need this Permission. The only situation where it's not
474 required is in a tracker that uses an HTTP Basic Authenticated front-end.
475 It's enabled by adding to your ``schema.py``::
477     p = db.security.getPermission('Web Access')
478     db.security.addPermissionToRole('Anonymous', p)
480 Finally, you will need to enable permission for your users to edit their
481 own details by adding the following to ``schema.py``::
483     # Users should be able to edit their own details. Note that this
484     # permission is limited to only the situation where the Viewed or
485     # Edited item is their own.
486     def own_record(db, userid, itemid):
487         '''Determine whether the userid matches the item being accessed.'''
488         return userid == itemid
489     p = db.security.addPermission(name='View', klass='user', check=own_record,
490         description="User is allowed to view their own user details")
491     p = db.security.addPermission(name='Edit', klass='user', check=own_record,
492         description="User is allowed to edit their own user details")
493     db.security.addPermissionToRole('User', p)
496 0.8.0 Use of TemplatingUtils
497 ----------------------------
499 If you used custom python functions in TemplatingUtils, they must
500 be moved from interfaces.py to a new file in the ``extensions`` directory. 
502 Each Function that should be available through TAL needs to be defined
503 as a toplevel function in the newly created file. Furthermore you
504 add an inititialization function, that registers the functions with the 
505 tracker.
507 If you find this too tedious, donfu wrote an automatic init function that
508 takes an existing TemplatingUtils class, and registers all class methods
509 that do not start with an underscore. The following hack should be placed
510 in the ``extensions`` directory alongside other extensions::
512     class TemplatingUtils:
513          # copy from interfaces.py
515     def init(tracker):
516          util = TemplatingUtils()
518          def setClient(tu):
519              util.client = tu.client
520              return util
522          def execUtil(name):
523              return lambda tu, *args, **kwargs: \
524                      getattr(setClient(tu), name)(*args, **kwargs)
526          for name in dir(util):
527              if callable(getattr(util, name)) and not name.startswith('_'):
528                   tracker.registerUtil(name, execUtil(name))
531 0.8.0 Logging Configuration
532 ---------------------------
534 See the `administration guide`_ for information about configuring the new
535 logging implemented in 0.8.0.
538 Migrating from 0.7.2 to 0.7.3
539 =============================
541 0.7.3 Configuration
542 -------------------
544 If you choose, you may specify the directory from which static files are
545 served (those which use the URL component ``@@file``). Currently the
546 directory defaults to the ``TEMPLATES`` configuration variable. You may
547 define a new variable, ``STATIC_FILES`` which overrides this value for
548 static files.
551 Migrating from 0.7.0 to 0.7.2
552 =============================
554 0.7.2 DEFAULT_TIMEZONE is now required
555 --------------------------------------
557 The DEFAULT_TIMEZONE configuration variable is now required. Add the
558 following to your tracker's ``config.py`` file::
560     # You may specify a different default timezone, for use when users do not
561     # choose their own in their settings.
562     DEFAULT_TIMEZONE = 0            # specify as numeric hour offest
565 Migrating from 0.7.0 to 0.7.1
566 =============================
568 0.7.1 Permission assignments
569 ----------------------------
571 If you allow anonymous access to your tracker, you might need to assign
572 some additional View (or Edit if your tracker is that open) permissions
573 to the "anonymous" user. To do so, find the code in your ``dbinit.py`` that
574 says::
576     for cl in 'issue', 'file', 'msg', 'query', 'keyword':
577         p = db.security.getPermission('View', cl)
578         db.security.addPermissionToRole('User', p)
579         p = db.security.getPermission('Edit', cl)
580         db.security.addPermissionToRole('User', p)
581     for cl in 'priority', 'status':
582         p = db.security.getPermission('View', cl)
583         db.security.addPermissionToRole('User', p)
585 Add add a line::
587         db.security.addPermissionToRole('Anonymous', p)
589 next to the existing ``'User'`` lines for the Permissions you wish to
590 assign to the anonymous user.
593 Migrating from 0.6 to 0.7
594 =========================
596 0.7.0 Permission assignments
597 ----------------------------
599 Due to a change in the rendering of web widgets, permissions are now
600 checked on Classes where they previously weren't (this is a good thing).
602 You will need to add some additional Permission assignments for your
603 regular users, or some displays will break. After the following in your 
604 tracker's ``dbinit.py``::
606     # Assign the access and edit Permissions for issue, file and message
607     # to regular users now
608     for cl in 'issue', 'file', 'msg', 'query', 'keyword':
609         p = db.security.getPermission('View', cl)
610         db.security.addPermissionToRole('User', p)
611         p = db.security.getPermission('Edit', cl)
612         db.security.addPermissionToRole('User', p)
614 add::
616     for cl in 'priority', 'status':
617         p = db.security.getPermission('View', cl)
618         db.security.addPermissionToRole('User', p)
621 0.7.0 Getting the current user id
622 ---------------------------------
624 The Database.curuserid attribute has been removed.
626 Any code referencing this attribute should be replaced with a
627 call to Database.getuid().
630 0.7.0 ZRoundup changes
631 ----------------------
633 The templates in your tracker's html directory will need updating if you
634 wish to use ZRoundup. If you've not modified those files (or some of them),
635 you may just copy the new versions from the Roundup source in the
636 templates/classic/html directory.
638 If you have modified the html files, then you'll need to manually edit them
639 to change all occurances of special form variables from using the colon ":"
640 special character to the at "@" special character. That is, variables such
641 as::
643   :action :required :template :remove:messages ...
645 should become::
647   @action @required @template @remove@messages ...
649 Note that ``tal:`` statements are unaffected. So are TAL expression type
650 prefixes such as ``python:`` and ``string:``. Please ask on the
651 roundup-users mailing list for help if you're unsure.
654 0.7.0 Edit collision detection
655 ------------------------------
657 Roundup now detects collisions with editing in the web interface (that is,
658 two people editing the same item at the same time).
660 You must copy the ``_generic.collision.html`` file from Roundup source in
661 the ``templates/classic/html`` directory. to your tracker's ``html``
662 directory.
665 Migrating from 0.6.x to 0.6.3
666 =============================
668 0.6.3 Configuration
669 -------------------
671 You will need to copy the file::
673   templates/classic/detectors/__init__.py
675 to your tracker's ``detectors`` directory, replacing the one already there.
676 This fixes a couple of bugs in that file.
680 Migrating from 0.5 to 0.6
681 =========================
684 0.6.0 Configuration
685 -------------------
687 Introduced EMAIL_FROM_TAG config variable. This value is inserted into
688 the From: line of nosy email. If the sending user is "Foo Bar", the
689 From: line is usually::
691      "Foo Bar" <issue_tracker@tracker.example>
693 the EMAIL_FROM_TAG goes inside the "Foo Bar" quotes like so::
695      "Foo Bar EMAIL_FROM_TAG" <issue_tracker@tracker.example>
697 I've altered the mechanism in the detectors __init__.py module so that it
698 doesn't cross-import detectors from other trackers (if you run more than one
699 in a single roundup-server). This change means that you'll need to copy the
700 __init__.py from roundup/templates/classic/detectors/__init__.py to your
701 <tracker home>/detectors/__init__.py. Don't worry, the "classic" __init__ is a
702 one-size-fits-all, so it'll work even if you've added/removed detectors.
704 0.6.0 Templating changes
705 ------------------------
707 The ``user.item`` template (in the tracker home "templates" directory)
708 needs to have the following hidden variable added to its form (between the
709 ``<form...>`` and ``</form>`` tags::
711   <input type="hidden" name=":template" value="item">
714 0.6.0 Form handling changes
715 ---------------------------
717 Roundup's form handling capabilities have been significantly expanded. This
718 should not affect users of 0.5 installations - but if you find you're
719 getting errors from form submissions, please ask for help on the Roundup
720 users mailing list:
722   http://lists.sourceforge.net/lists/listinfo/roundup-users
724 See the customisation doc section on `Form Values`__ for documentation of the
725 new form variables possible.
727 __ customizing.html#form-values
730 0.6.0 Multilingual character set support
731 ----------------------------------------
733 Added internationalization support. This is done via encoding all data
734 stored in roundup database to utf-8 (unicode encoding). To support utf-8 in
735 web interface you should add the folowing line to your tracker's html/page
736 and html/_generic.help files inside <head> tag::
737   
738     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
740 Since latin characters in utf-8 have the same codes as in ASCII table, this
741 modification is optional for users who use only plain latin characters. 
743 After this modification, you will be able to see and enter any world
744 character via web interface. Data received via mail interface also converted
745 to utf-8, however only new messages will be converted. If your roundup
746 database contains some of non-ASCII characters in one of 8-bit encoding,
747 they will not be visible in new unicode environment. Some of such data (e.g.
748 user names, keywords, etc)  can be edited by administrator, the others
749 (e.g. messages' contents) is not editable via web interface. Currently there
750 is no tool for converting such data, the only solution is to close
751 appropriate old issues and create new ones with the same content.
754 0.6.0 User timezone support
755 ---------------------------
757 From version 0.6.0 roundup supports displaying of Date data in user' local
758 timezone if he/she has provided timezone information. To make it possible
759 some modification to tracker's schema and HTML templates are required.
760 First you must add string property 'timezone' to user class in dbinit.py
761 like this::
762   
763     user = Class(db, "user", 
764                     username=String(),   password=Password(),
765                     address=String(),    realname=String(), 
766                     phone=String(),      organisation=String(),
767                     alternate_addresses=String(),
768                     queries=Multilink('query'), roles=String(),
769                     timezone=String())
770   
771 And second - html interface. Add following lines to
772 $TRACKER_HOME/html/user.item template::
773   
774      <tr>
775       <th>Timezone</th>
776       <td tal:content="structure context/timezone/field">timezone</td>
777      </tr>
779 After that all users should be able to provide their timezone information.
780 Timezone should be a positive or negative integer - offset from GMT.
782 After providing timezone, roundup will show all dates values, found in web
783 and mail interfaces in local time. It will also accept any Date info in
784 local time, convert and store it in GMT.
787 0.6.0 Search page structure
788 ---------------------------
790 In order to accomodate query editing the search page has been restructured. If
791 you want to provide your users with query editing, you should update your
792 search page using the macros detailed in the customisation doc section
793 `Searching on categories`__.
795 __ customizing.html#searching-on-categories
797 Also, the url field in the query class no longer starts with a '?'. You'll need
798 to remove this question mark from the url field to support queries. There's
799 a script in the "tools" directory called ``migrate-queries.py`` that should
800 automatically change any existing queries for you. As always, make a backup
801 of your database before running such a script.
804 0.6.0 Notes for metakit backend users
805 -------------------------------------
807 Roundup 0.6.0 introduced searching on ranges of dates and intervals. To
808 support it, some modifications to interval storing routine were made. So if
809 your tracker uses metakit backend and your db schema contains intervals
810 property, searches on that property will not be accurate for db items that
811 was stored before roundup' upgrade. However all new records should be
812 searchable on intervals.
814 It is possible to convert your database to new format: you can export and
815 import back all your data (consult "Migrating backends" in "Maintenance"
816 documentation). After this operation all your interval properties should
817 become searchable.
819 Users of backends others than metakit should not worry about this issue.
822 Migrating from 0.4.x to 0.5.0
823 =============================
825 This has been a fairly major revision of Roundup:
827 1. Brand new, much more powerful, flexible, tasty and nutritious templating.
828    Unfortunately, this means all your current templates are useless. Hopefully
829    the new documentation and examples will be enough to help you make the
830    transition. Please don't hesitate to ask on roundup-users for help (or
831    complete conversions if you're completely stuck)!
832 2. The database backed got a lot more flexible, allowing Metakit and SQL
833    databases! The only decent SQL database implemented at present is sqlite,
834    but others shouldn't be a whole lot more work.
835 3. A brand new, highly flexible and much more robust security system including
836    a system of Permissions, Roles and Role assignments to users. You may now
837    define your own Permissions that may be checked in CGI transactions.
838 4. Journalling has been made less storage-hungry, so has been turned on
839    by default *except* for author, recipient and nosy link/unlink events. You
840    are advised to turn it off in your trackers too.
841 5. We've changed the terminology from "instance" to "tracker", to ease the
842    learning curve/impact for new users.
843 6. Because of the above changes, the tracker configuration has seen some
844    major changes. See below for the details.
846 Please, **back up your database** before you start the migration process. This
847 is as simple as copying the "db" directory and all its contents from your
848 tracker to somewhere safe.
851 0.5.0 Configuration
852 -------------------
854 First up, rename your ``instance_config.py`` file to just ``config.py``.
856 Then edit your tracker's ``__init__.py`` module. It'll currently look
857 like this::
859  from instance_config import *
860  try:
861      from dbinit import *
862  except ImportError:
863      pass # in installdir (probably :)
864  from interfaces import *
866 and it needs to be::
868  import config
869  from dbinit import open, init
870  from interfaces import Client, MailGW
872 Due to the new templating having a top-level ``page`` that defines links for
873 searching, indexes, adding items etc, the following variables are no longer
874 used:
876 - HEADER_INDEX_LINKS
877 - HEADER_ADD_LINKS
878 - HEADER_SEARCH_LINKS
879 - SEARCH_FILTERS
880 - DEFAULT_INDEX
881 - UNASSIGNED_INDEX
882 - USER_INDEX
883 - ISSUE_FILTER
885 The new security implementation will require additions to the dbinit module,
886 but also removes the need for the following tracker config variables:
888 - ANONYMOUS_ACCESS
889 - ANONYMOUS_REGISTER
891 but requires two new variables which define the Roles assigned to users who
892 register through the web and e-mail interfaces:
894 - NEW_WEB_USER_ROLES
895 - NEW_EMAIL_USER_ROLES
897 in both cases, 'User' is a good initial setting. To emulate
898 ``ANONYMOUS_ACCESS='deny'``, remove all "View" Permissions from the
899 "Anonymous" Role. To emulate ``ANONYMOUS_REGISTER='deny'``, remove the "Web
900 Registration" and/or the "Email Registration" Permission from the "Anonymous"
901 Role. See the section on customising security in the `customisation
902 documentation`_ for more information.
904 Finally, the following config variables have been renamed to make more sense:
906 - INSTANCE_HOME -> TRACKER_HOME
907 - INSTANCE_NAME -> TRACKER_NAME
908 - ISSUE_TRACKER_WEB -> TRACKER_WEB
909 - ISSUE_TRACKER_EMAIL -> TRACKER_EMAIL
912 0.5.0 Schema Specification
913 --------------------------
915 0.5.0 Database backend changes
916 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
918 Your select_db module in your tracker has changed a fair bit. Where it used
919 to contain::
921  # WARNING: DO NOT EDIT THIS FILE!!!
922  from roundup.backends.back_anydbm import Database
924 it must now contain::
926  # WARNING: DO NOT EDIT THIS FILE!!!
927  from roundup.backends.back_anydbm import Database, Class, FileClass, IssueClass
929 Yes, I realise the irony of the "DO NOT EDIT THIS FILE" statement :)
930 Note the addition of the Class, FileClass, IssueClass imports. These are very
931 important, as they're going to make the next change work too. You now need to
932 modify the top of the dbinit module in your tracker from::
934  import instance_config
935  from roundup import roundupdb
936  from select_db import Database
938  from roundup.roundupdb import Class, FileClass
940  class Database(roundupdb.Database, select_db.Database):
941      ''' Creates a hybrid database from:
942           . the selected database back-end from select_db
943           . the roundup extensions from roundupdb
944      '''
945      pass
947  class IssueClass(roundupdb.IssueClass):
948      ''' issues need the email information
949      '''
950      pass
952 to::
954  import config
955  from select_db import Database, Class, FileClass, IssueClass
957 Yes, remove the Database and IssueClass definitions and those other imports.
958 They're not needed any more!
960 Look for places in dbinit.py where ``instance_config`` is used too, and
961 rename them ``config``.
964 0.5.0 Journalling changes
965 ~~~~~~~~~~~~~~~~~~~~~~~~~
967 Journalling has been optimised for storage. Journalling of links has been
968 turned back on by default. If your tracker has a large user base, you may wish
969 to turn off journalling of nosy list, message author and message recipient
970 link and unlink events. You do this by adding ``do_journal='no'`` to the Class
971 initialisation in your dbinit. For example, your *msg* class initialisation
972 probably looks like this::
974     msg = FileClass(db, "msg",
975                     author=Link("user"), recipients=Multilink("user"),
976                     date=Date(),         summary=String(),
977                     files=Multilink("file"),
978                     messageid=String(),  inreplyto=String())
980 to turn off journalling of author and recipient link events, add
981 ``do_journal='no'`` to the ``author=Link("user")`` part of the statement,
982 like so::
984     msg = FileClass(db, "msg",
985                     author=Link("user", do_journal='no'),
986                     recipients=Multilink("user", do_journal='no'),
987                     date=Date(),         summary=String(),
988                     files=Multilink("file"),
989                     messageid=String(),  inreplyto=String())
991 Nosy list link event journalling is actually turned off by default now. If you
992 want to turn it on, change to your issue class' nosy list, change its
993 definition from::
995     issue = IssueClass(db, "issue",
996                     assignedto=Link("user"), topic=Multilink("keyword"),
997                     priority=Link("priority"), status=Link("status"))
999 to::
1001     issue = IssueClass(db, "issue", nosy=Multilink("user", do_journal='yes'),
1002                     assignedto=Link("user"), topic=Multilink("keyword"),
1003                     priority=Link("priority"), status=Link("status"))
1005 noting that your definition of the nosy Multilink will override the normal one.
1008 0.5.0 User schema changes
1009 ~~~~~~~~~~~~~~~~~~~~~~~~~
1011 Users have two more properties, "queries" and "roles". You'll have something
1012 like this in your dbinit module now::
1014     user = Class(db, "user",
1015                     username=String(),   password=Password(),
1016                     address=String(),    realname=String(),
1017                     phone=String(),      organisation=String(),
1018                     alternate_addresses=String())
1019     user.setkey("username")
1021 and you'll need to add the new properties and the new "query" class to it
1022 like so::
1024     query = Class(db, "query",
1025                     klass=String(),     name=String(),
1026                     url=String())
1027     query.setkey("name")
1029     # Note: roles is a comma-separated string of Role names
1030     user = Class(db, "user",
1031                     username=String(),   password=Password(),
1032                     address=String(),    realname=String(),
1033                     phone=String(),      organisation=String(),
1034                     alternate_addresses=String(),
1035                     queries=Multilink('query'), roles=String())
1036     user.setkey("username")
1038 The "queries" property is used to store off the user's favourite database
1039 queries. The "roles" property is explained below in `0.5.0 Security
1040 Settings`_.
1043 0.5.0 Security Settings
1044 ~~~~~~~~~~~~~~~~~~~~~~~
1046 See the `security documentation`_ for an explanation of how the new security
1047 system works. In a nutshell though, the security is handled as a four step
1048 process:
1050 1. Permissions are defined as having a name and optionally a hyperdb class
1051    they're specific to,
1052 2. Roles are defined that have one or more Permissions,
1053 3. Users are assigned Roles in their "roles" property, and finally
1054 4. Roundup checks that users have appropriate Permissions at appropriate times
1055    (like editing issues).
1057 Your tracker dbinit module's *open* function now has to define any
1058 Permissions that are specific to your tracker, and also the assignment
1059 of Permissions to Roles. At the moment, your open function
1060 ends with::
1062     import detectors
1063     detectors.init(db)
1065     return db
1067 and what we need to do is insert some commands that will set up the security
1068 parameters. Right above the ``import detectors`` line, you'll want to insert
1069 these lines::
1071     #
1072     # SECURITY SETTINGS
1073     #
1074     # new permissions for this schema
1075     for cl in 'issue', 'file', 'msg', 'user':
1076         db.security.addPermission(name="Edit", klass=cl,
1077             description="User is allowed to edit "+cl)
1078         db.security.addPermission(name="View", klass=cl,
1079             description="User is allowed to access "+cl)
1081     # Assign the access and edit permissions for issue, file and message
1082     # to regular users now
1083     for cl in 'issue', 'file', 'msg':
1084         p = db.security.getPermission('View', cl)
1085         db.security.addPermissionToRole('User', p)
1086         p = db.security.getPermission('Edit', cl)
1087         db.security.addPermissionToRole('User', p)
1088     # and give the regular users access to the web and email interface
1089     p = db.security.getPermission('Web Access')
1090     db.security.addPermissionToRole('User', p)
1091     p = db.security.getPermission('Email Access')
1092     db.security.addPermissionToRole('User', p)
1094     # May users view other user information? Comment these lines out
1095     # if you don't want them to
1096     p = db.security.getPermission('View', 'user')
1097     db.security.addPermissionToRole('User', p)
1099     # Assign the appropriate permissions to the anonymous user's Anonymous
1100     # Role. Choices here are:
1101     # - Allow anonymous users to register through the web
1102     p = db.security.getPermission('Web Registration')
1103     db.security.addPermissionToRole('Anonymous', p)
1104     # - Allow anonymous (new) users to register through the email gateway
1105     p = db.security.getPermission('Email Registration')
1106     db.security.addPermissionToRole('Anonymous', p)
1107     # - Allow anonymous users access to the "issue" class of data
1108     #   Note: this also grants access to related information like files,
1109     #         messages, statuses etc that are linked to issues
1110     #p = db.security.getPermission('View', 'issue')
1111     #db.security.addPermissionToRole('Anonymous', p)
1112     # - Allow anonymous users access to edit the "issue" class of data
1113     #   Note: this also grants access to create related information like
1114     #         files and messages etc that are linked to issues
1115     #p = db.security.getPermission('Edit', 'issue')
1116     #db.security.addPermissionToRole('Anonymous', p)
1118     # oh, g'wan, let anonymous access the web interface too
1119     p = db.security.getPermission('Web Access')
1120     db.security.addPermissionToRole('Anonymous', p)
1122 Note in the comments there the places where you might change the permissions
1123 to restrict users or grant users more access. If you've created additional
1124 classes that users should be able to edit and view, then you should add them
1125 to the "new permissions for this schema" section at the start of the security
1126 block. Then add them to the "Assign the access and edit permissions" section
1127 too, so people actually have the new Permission you've created.
1129 One final change is needed that finishes off the security system's
1130 initialisation. We need to add a call to ``db.post_init()`` at the end of the
1131 dbinit open() function. Add it like this::
1133     import detectors
1134     detectors.init(db)
1136     # schema is set up - run any post-initialisation
1137     db.post_init()
1138     return db
1140 You may verify the setup of Permissions and Roles using the new
1141 "``roundup-admin security``" command.
1144 0.5.0 User changes
1145 ~~~~~~~~~~~~~~~~~~
1147 To support all those schema changes, you'll need to massage your user database
1148 a little too, to:
1150 1. make sure there's an "anonymous" user - this user is mandatory now and is
1151    the one that unknown users are logged in as.
1152 2. make sure all users have at least one Role.
1154 If you don't have the "anonymous" user, create it now with the command::
1156   roundup-admin create user username=anonymous roles=Anonymous
1158 making sure the capitalisation is the same as above. Once you've done that,
1159 you'll need to set the roles property on all users to a reasonable default.
1160 The admin user should get "Admin", the anonymous user "Anonymous"
1161 and all other users "User". The ``fixroles.py`` script in the tools directory
1162 will do this. Run it like so (where python is your python 2+ binary)::
1164   python tools/fixroles.py -i <tracker home> fixroles
1168 0.5.0 CGI interface changes
1169 ---------------------------
1171 The CGI interface code was completely reorganised and largely rewritten. The
1172 end result is that this section of your tracker interfaces module will need
1173 changing from::
1175  from roundup import cgi_client, mailgw
1176  from roundup.i18n import _
1177  
1178  class Client(cgi_client.Client):
1179      ''' derives basic CGI implementation from the standard module,
1180          with any specific extensions
1181      '''
1182      pass
1184 to::
1186  from roundup import mailgw
1187  from roundup.cgi import client
1188  
1189  class Client(client.Client): 
1190      ''' derives basic CGI implementation from the standard module,
1191          with any specific extensions
1192      '''
1193      pass
1195 You will also need to install the new version of roundup.cgi from the source
1196 cgi-bin directory if you're using it.
1199 0.5.0 HTML templating
1200 ---------------------
1202 You'll want to make a backup of your current tracker html directory. You
1203 should then copy the html directory from the Roundup source "classic" template
1204 and modify it according to your local schema changes.
1206 If you need help with the new templating system, please ask questions on the
1207 roundup-users mailing list (available through the roundup project page on
1208 sourceforge, http://roundup.sf.net/)
1211 0.5.0 Detectors
1212 ---------------
1214 The nosy reactor has been updated to handle the tracker not having an
1215 "assignedto" property on issues. You may want to copy it into your tracker's
1216 detectors directory. Chances are you've already fixed it though :)
1219 Migrating from 0.4.1 to 0.4.2
1220 =============================
1222 0.4.2 Configuration
1223 -------------------
1224 The USER_INDEX definition introduced in 0.4.1 was too restrictive in its
1225 allowing replacement of 'assignedto' with the user's userid. Users must change
1226 the None value of 'assignedto' to 'CURRENT USER' (the string, in quotes) for
1227 the replacement behaviour to occur now.
1229 The new configuration variables are:
1231 - EMAIL_KEEP_QUOTED_TEXT 
1232 - EMAIL_LEAVE_BODY_UNCHANGED
1233 - ADD_RECIPIENTS_TO_NOSY
1235 See the sample configuration files in::
1237  <roundup source>/roundup/templates/classic/instance_config.py
1239 and::
1241  <roundup source>/roundup/templates/extended/instance_config.py
1243 and the `customisation documentation`_ for information on how they're used.
1246 0.4.2 Changes to detectors
1247 --------------------------
1248 You will need to copy the detectors from the distribution into your instance
1249 home "detectors" directory. If you used the classic schema, the detectors
1250 are in::
1252  <roundup source>/roundup/templates/classic/detectors/
1254 If you used the extended schema, the detectors are in::
1256  <roundup source>/roundup/templates/extended/detectors/
1258 The change means that schema-specific code has been removed from the
1259 mail gateway and cgi interface and made into auditors:
1261 - nosyreactor.py has now got an updatenosy auditor which updates the nosy
1262   list with author, recipient and assignedto information.
1263 - statusauditor.py makes the unread or resolved -> chatting changes and
1264   presets the status of an issue to unread.
1266 There's also a bug or two fixed in the nosyreactor code.
1268 0.4.2 HTML templating changes
1269 -----------------------------
1270 The link() htmltemplate function now has a "showid" option for links and
1271 multilinks. When true, it only displays the linked item id as the anchor
1272 text. The link value is displayed as a tooltip using the title anchor
1273 attribute. To use in eg. the superseder field, have something like this::
1275    <td>
1276     <display call="field('superseder', showid=1)">
1277     <display call="classhelp('issue', 'id,title', label='list', width=500)">
1278     <property name="superseder">
1279      <br>View: <display call="link('superseder', showid=1)">
1280     </property>
1281    </td>
1283 The stylesheets have been cleaned up too. You may want to use the newer
1284 versions in::
1286  <roundup source>/roundup/templates/<template>/html/default.css
1290 Migrating from 0.4.0 to 0.4.1
1291 =============================
1293 0.4.1 Files storage
1294 -------------------
1296 Messages and files from newly created issues will be put into subdierectories
1297 in thousands e.g. msg123 will be put into files/msg/0/msg123, file2003
1298 will go into files/file/2/file2003. Previous messages are still found, but
1299 could be put into this structure.
1301 0.4.1 Configuration
1302 -------------------
1304 To allow more fine-grained access control, the variable used to check
1305 permission to auto-register users in the mail gateway is now called
1306 ANONYMOUS_REGISTER_MAIL rather than overloading ANONYMOUS_REGISTER. If the
1307 variable doesn't exist, then ANONYMOUS_REGISTER is tested as before.
1309 Configuring the links in the web header is now easier too. The following
1310 variables have been added to the classic instance_config.py::
1312   HEADER_INDEX_LINKS   - defines the "index" links to be made available
1313   HEADER_ADD_LINKS     - defines the "add" links
1314   DEFAULT_INDEX        - specifies the index view for DEFAULT
1315   UNASSIGNED_INDEX     - specifies the index view for UNASSIGNED
1316   USER_INDEX           - specifies the index view for USER
1318 See the <roundup source>/roundup/templates/classic/instance_config.py for more
1319 information - including how the variables are to be set up. Most users will
1320 just be able to copy the variables from the source to their instance home. If
1321 you've modified the header by changing the source of the interfaces.py file in
1322 the instance home, you'll need to remove that customisation and move it into
1323 the appropriate variables in instance_config.py.
1325 The extended schema has similar variables added too - see the source for more
1326 info.
1328 0.4.1 Alternate E-Mail Addresses
1329 --------------------------------
1331 If you add the property "alternate_addresses" to your user class, your users
1332 will be able to register alternate email addresses that they may use to
1333 communicate with roundup as. All email from roundup will continue to be sent
1334 to their primary address.
1336 If you have not edited the dbinit.py file in your instance home directory,
1337 you may simply copy the new dbinit.py file from the core code. If you used
1338 the classic schema, the interfaces file is in::
1340  <roundup source>/roundup/templates/classic/dbinit.py
1342 If you used the extended schema, the file is in::
1344  <roundup source>/roundup/templates/extended/dbinit.py 
1346 If you have modified your dbinit.py file, you need to edit the dbinit.py
1347 file in your instance home directory. Find the lines which define the user
1348 class::
1350     user = Class(db, "msg",
1351                     username=String(),   password=Password(),
1352                     address=String(),    realname=String(), 
1353                     phone=String(),      organisation=String(),
1354                     alternate_addresses=String())
1356 You will also want to add the property to the user's details page. The
1357 template for this is the "user.item" file in your instance home "html"
1358 directory. Similar to above, you may copy the file from the roundup source if
1359 you haven't modified it. Otherwise, add the following to the template::
1361    <display call="multiline('alternate_addresses')">
1363 with appropriate labelling etc. See the standard template for an idea.
1367 Migrating from 0.3.x to 0.4.0
1368 =============================
1370 0.4.0 Message-ID and In-Reply-To addition
1371 -----------------------------------------
1372 0.4.0 adds the tracking of messages by message-id and allows threading
1373 using in-reply-to. Most e-mail clients support threading using this
1374 feature, and we hope to add support for it to the web gateway. If you
1375 have not edited the dbinit.py file in your instance home directory, you may
1376 simply copy the new dbinit.py file from the core code. If you used the
1377 classic schema, the interfaces file is in::
1379  <roundup source>/roundup/templates/classic/dbinit.py
1381 If you used the extended schema, the file is in::
1383  <roundup source>/roundup/templates/extended/dbinit.py 
1385 If you have modified your dbinit.py file, you need to edit the dbinit.py
1386 file in your instance home directory. Find the lines which define the msg
1387 class::
1389     msg = FileClass(db, "msg",
1390                     author=Link("user"), recipients=Multilink("user"),
1391                     date=Date(),         summary=String(),
1392                     files=Multilink("file"))
1394 and add the messageid and inreplyto properties like so::
1396     msg = FileClass(db, "msg",
1397                     author=Link("user"), recipients=Multilink("user"),
1398                     date=Date(),         summary=String(),
1399                     files=Multilink("file"),
1400                     messageid=String(),  inreplyto=String())
1402 Also, configuration is being cleaned up. This means that your dbinit.py will
1403 also need to be changed in the open function. If you haven't changed your
1404 dbinit.py, the above copy will be enough. If you have, you'll need to change
1405 the line (round line 50)::
1407     db = Database(instance_config.DATABASE, name)
1409 to::
1411     db = Database(instance_config, name)
1414 0.4.0 Configuration
1415 --------------------
1416 ``TRACKER_NAME`` and ``EMAIL_SIGNATURE_POSITION`` have been added to the
1417 instance_config.py. The simplest solution is to copy the default values
1418 from template in the core source.
1420 The mail gateway now checks ``ANONYMOUS_REGISTER`` to see if unknown users
1421 are to be automatically registered with the tracker. If it is set to "deny"
1422 then unknown users will not have access. If it is set to "allow" they will be
1423 automatically registered with the tracker.
1426 0.4.0 CGI script roundup.cgi
1427 ----------------------------
1428 The CGI script has been updated with some features and a bugfix, so you should
1429 copy it from the roundup cgi-bin source directory again. Make sure you update
1430 the ROUNDUP_INSTANCE_HOMES after the copy.
1433 0.4.0 Nosy reactor
1434 ------------------
1435 The nosy reactor has also changed - copy the nosyreactor.py file from the core
1436 source::
1438    <roundup source>/roundup/templates/<template>/detectors/nosyreactor.py
1440 to your instance home "detectors" directory.
1443 0.4.0 HTML templating
1444 ---------------------
1445 The field() function was incorrectly implemented - links and multilinks now
1446 display as text fields when rendered using field(). To display a menu (drop-
1447 down or select box) you need to use the menu() function.
1451 Migrating from 0.2.x to 0.3.x
1452 =============================
1454 0.3.x Cookie Authentication changes
1455 -----------------------------------
1456 0.3.0 introduces cookie authentication - you will need to copy the
1457 interfaces.py file from the roundup source to your instance home to enable
1458 authentication. If you used the classic schema, the interfaces file is in::
1460  <roundup source>/roundup/templates/classic/interfaces.py
1462 If you used the extended schema, the file is in::
1464  <roundup source>/roundup/templates/extended/interfaces.py
1466 If you have modified your interfaces.Client class, you will need to take
1467 note of the login/logout functionality provided in roundup.cgi_client.Client
1468 (classic schema) or roundup.cgi_client.ExtendedClient (extended schema) and
1469 modify your instance code apropriately.
1472 0.3.x Password encoding
1473 -----------------------
1474 This release also introduces encoding of passwords in the database. If you
1475 have not edited the dbinit.py file in your instance home directory, you may
1476 simply copy the new dbinit.py file from the core code. If you used the
1477 classic schema, the interfaces file is in::
1479  <roundup source>/roundup/templates/classic/dbinit.py
1481 If you used the extended schema, the file is in::
1483  <roundup source>/roundup/templates/extended/dbinit.py
1486 If you have modified your dbinit.py file, you may use encoded passwords:
1488 1. Edit the dbinit.py file in your instance home directory
1489    a. At the first code line of the open() function::
1491        from roundup.hyperdb import String, Date, Link, Multilink
1493       alter to include Password, as so::
1495        from roundup.hyperdb import String, Password, Date, Link, Multilink
1497    b. Where the password property is defined (around line 66)::
1499        user = Class(db, "user", 
1500                        username=String(),   password=String(),
1501                        address=String(),    realname=String(), 
1502                        phone=String(),      organisation=String())
1503        user.setkey("username")
1505       alter the "password=String()" to "password=Password()"::
1507        user = Class(db, "user", 
1508                        username=String(),   password=Password(),
1509                        address=String(),    realname=String(), 
1510                        phone=String(),      organisation=String())
1511        user.setkey("username")
1513 2. Any existing passwords in the database will remain cleartext until they
1514    are edited. It is recommended that at a minimum the admin password be
1515    changed immediately::
1517       roundup-admin -i <instance home> set user1 password=<new password>
1520 0.3.x Configuration
1521 -------------------
1522 FILTER_POSITION, ANONYMOUS_ACCESS, ANONYMOUS_REGISTER have been added to
1523 the instance_config.py. Simplest solution is to copy the default values from
1524 template in the core source.
1526 MESSAGES_TO_AUTHOR has been added to the IssueClass in dbinit.py. Set to 'yes'
1527 to send nosy messages to the author. Default behaviour is to not send nosy
1528 messages to the author. You will need to add MESSAGES_TO_AUTHOR to your
1529 dbinit.py in your instance home.
1532 0.3.x CGI script roundup.cgi
1533 ----------------------------
1534 There have been some structural changes to the roundup.cgi script - you will
1535 need to install it again from the cgi-bin directory of the source
1536 distribution. Make sure you update the ROUNDUP_INSTANCE_HOMES after the
1537 copy.
1540 .. _`customisation documentation`: customizing.html
1541 .. _`security documentation`: security.html
1542 .. _`administration guide`: admin_guide.html