diff doc/upgrading.txt @ 7281:194093011cb7

Move upgrade directions for version < 1.5.0 to history document The upgrading doc is huge. Most people don't need docs more than 10 years old. Move docs for versions less than 1.5.0 (July 2013) to upgrading-history.txt. Probably could cut this back to 5 years (1.6.0 release in 2018) but lets go with 10 for now.
author John Rouillard <rouilj@ieee.org>
date Tue, 25 Apr 2023 17:24:32 -0400
parents 41b2a0e12899
children c3b0fd62b0b8
line wrap: on
line diff
--- a/doc/upgrading.txt	Tue Apr 25 17:20:37 2023 -0400
+++ b/doc/upgrading.txt	Tue Apr 25 17:24:32 2023 -0400
@@ -1969,1842 +1969,6 @@
 The new calls escape the passed string by default and avoid XSS security
 issues.
 
-.. index:: Upgrading; 1.4.20 to 1.4.21
-
-Migrating from 1.4.20 to 1.4.21
-===============================
-
-The ``_generic.calendar.html`` page of the instance has been updated to include
-``<meta name="robots" content="noindex, nofollow" />``.  This prevents
-robots to follow all the links in the calendar.  If you haven't modified the
-page on your local instance, you can simply replace it with the one in
-``share/roundup/templates/classic/html/_generic.calendar.html``; if you did,
-you can add the tag manually.  See issue2550765 and changeset a099ff2ceff3.
-
-If you are using the xml-rpc interface, there is a change
-  in accessing it. You can not send text/xml data to any
-  roundup url and get a response, you must use the /xmlrpc
-  url. For example, if you used to send your xmlrpc request to:
-
-   \http://myroundup.com/roundup
-
-  you need to change the url to read:
-
-   \http://myroundup.com/roundup/xmlrpc
-
-  to invoke the xmlrpc handler. This allows us to send xml
-  data to roundup for other handlers (e.g. REST, SOAP ...)
-  in the future.
-
-
-.. index:: upgrading; 1.4.19 to 1.4.20
-
-Migrating from 1.4.19 to 1.4.20
-===============================
-
-Roundup used to allow certain HTML-Tags in OK- and Error-messages. Since
-these messages are passed via the URL (due to roundup redirecting after
-an edit), we did have security-issues (see issue2550724).
-
-If you have customized the OK or Error messages in your
-roundup-installation and you were using features like bold or italic
-in the message, you will have to do without this highlighting and
-remove HTML tags from messages.
-
-If you were using <br> tags for multi-line messages, you now should use
-newlines instead, these will be replaced with <br/> during formatting.
-
-Note that the previous implementation also allowed links inside
-messages. Since these links could be set by an attacker, no links in
-roundup messages are supported anymore. This does *not* affect the
-"clear this message" link in OK-messages as it is generated by the
-template and is not part of the OK-message.
-
-If you have not modified any roundup messages, you need not do anything,
-the templates shipped with roundup did not use HTML tags in messages for
-highlighting.
-
-
-.. index:: upgrading; 1.4.17 to 1.4.18
-
-Migrating from 1.4.17 to 1.4.18
-===============================
-
-There was a bug in 1.4.17 where files were unlinked from issues if a
-mail without attachment was received via the mail interface. The
-following script will list likely issues being affected by the bug.
-The date in the script is the date of the 1.4.17 release. If you have
-installed 1.4.17 later than this date, you can change the date
-appropriately to your installation date. Run the script in the directory
-of your tracker::
-
-  #!/usr/bin/python
-  import os
-  from roundup import instance
-  from roundup.date import Date
-  dir     = os.getcwd ()
-  tracker = instance.open (dir)
-  db      = tracker.open ('admin')
-  # you may want to change this to your install date to find less candidates
-  last_release = Date('2011-05-13')
-  affected = {}
-  for i in db.issue.getnodeids():
-      for j in db.issue.history(i):
-          if i in affected:
-              break
-          if j[1] < last_release or j[3] != 'set' or 'files' not in j[4]:
-              continue
-          for op, p in j[4]['files']:
-              if op == '-':
-                  affected [i] = 1
-                  break
-  print(', '.join(sorted(affected.keys())))
-
-To find out which files where attached before you can look in the
-history of the affected issue.  For fixing issues you can re-attach the
-files in question using the "set" command of roundup-admin, e.g., if the
-list of files attached to an issue should be files 5, 17, 23 for issue42
-you will set this using
-
-roundup-admin -i /path/to/your/tracker set issue42 files=5,17,23
-
-.. index:: upgrading; 1.4.x to 1.4.17
-
-Migrating from 1.4.x to 1.4.17
-==============================
-
-There is a new config-option `migrate_passwords` in section `web` to
-auto-migrate passwords at web-login time to a more secure storage
-scheme. Default for the new option is "yes" so if you don't want that
-passwords are auto-migrated to a more secure password scheme on user
-login, set this to "no" before running your tracker(s) after the
-upgrade.
-
-The standalone roundup-server now defaults to listening on localhost (no
-longer on all network interfaces). This will not affect you if you're
-already using a configuration file for roundup-server. If you are using
-an empty setting for the `host` parameter in the config-file you should
-explicitly put 0.0.0.0 there as the use of an empty string to specify
-listening to all interfaces is deprecated and will go away in a future
-version.  If you are starting the server without a configuration file
-and want to explicitly listen to all network interface, you should
-specify the -n option with the address `0.0.0.0`.
-
-.. _new search permissions for query in 1.4.17:
-
-Searching now requires either read-permission without a check method, or
-you will have to add a "Search" permission for a class or a list of
-properties for a class (if you want to allow searching). For the classic
-template (or other templates derived from it) you want to add the
-following lines to your `schema.py` file::
-
-  p = db.security.addPermission(name='Search', klass='query')
-  db.security.addPermissionToRole('User', p)
-
-This is needed, because for the `query` class users may view only their
-own queries (or public queries). This is implemented with a `check`
-method, therefore the default search permissions will not allow
-searching and you'll have to add an explicit search permission.
-If you have modified your schema, you can check if you're missing any
-search permissions with the following script, run it in your tracker
-directory, it will list for each Class and Property the roles that may
-search for this property::
-
-    #!/usr/bin/python
-    from __future__ import print_function
-    import os
-    from roundup import instance
-
-    tracker = instance.open(os.getcwd ())
-    db = tracker.open('admin')
-
-    for cl in sorted(db.getclasses()):
-        print("Class:", cl)
-        for p in sorted(db.getclass(cl).getprops(protected=True).keys()):
-            print("    Property:", p)
-            roles = []
-            for role in sorted(db.security.role.keys()):
-                if db.security.roleHasSearchPermission(cl,p,role):
-                    roles.append(role)
-            print("        roles may search:", ', '.join(roles))
-
-
-.. index:: upgrading; 1.4.x to 1.4.12
-
-Migrating from 1.4.x to 1.4.12
-==============================
-
-Item creation now checks the "Create" permission instead of the "Edit"
-permission for individual properties. If you have modified your tracker
-permissions from the default distribution, you should check that
-"Create" permissions exist for all properties you want users to be able
-to create.
-
-
-Fixing some potential security holes
-------------------------------------
-
-Enhanced checking was added to the user registration auditor. If you
-run a public tracker you should update your tracker's
-``detectors/userauditor.py`` using the new code from
-``share/roundup/templates/classic/detectors/userauditor.py``. In most
-cases you may just copy the file over, but if you've made changes to
-the auditor in your tracker then you'll need to manually integrate
-the new code.
-
-Some HTML templates were found to have formatting security problems:
-
-``html/page.html``::
-
-  -tal:replace="request/user/username">username</span></b><br>
-  +tal:replace="python:request.user.username.plain(escape=1)">username</span></b><br>
-
-``html/_generic.help-list.html``::
-
-  -tal:content="structure python:item[prop]"></label>
-  +tal:content="python:item[prop]"></label>
-
-The lines marked "+" should be added and lines marked "-" should be
-deleted (minus the "+"/"-" signs).
-
-
-Some HTML interface tweaks
---------------------------
-
-You may wish to copy the ``user_utils.js`` and ``style.css` files from the
-source distribution ``share/roundup/templates/classic/html/`` directory to the
-``html`` directory of your trackers as it includes a small improvement.
-
-If you have made local changes to those files you'll need to manually work
-the differences in to your versions or ignore the changes.
-
-
-.. index:: upgrading; 1.4.x to 1.4.11
-
-Migrating from 1.4.x to 1.4.11
-==============================
-
-Close potential security hole
------------------------------
-
-If your tracker has untrusted users you should examine its ``schema.py``
-file and look for the section granting the "Edit" permission to your users.
-This should look something like::
-
-    p = db.security.addPermission(name='Edit', klass='user', check=own_record,
-        description="User is allowed to edit their own user details")
-
-and should be modified to restrict the list of properties they are allowed
-to edit by adding the ``properties=`` section like::
-
-    p = db.security.addPermission(name='Edit', klass='user', check=own_record,
-        properties=('username', 'password', 'address', 'realname', 'phone',
-            'organisation', 'alternate_addresses', 'queries', 'timezone'),
-        description="User is allowed to edit their own user details")
-
-Most importantly the "roles" property should not be editable - thus not
-appear in that list of properties.
-
-
-Grant the "Register" permission to the Anonymous role
------------------------------------------------------
-
-A separate "Register" permission has been introduced to allow
-anonymous users to register. This means you will need to add the
-following to your tracker's ``schema.py`` to add the permission and
-assign it to the Anonymous role (replacing any previously assigned
-"Create user" permission for the Anonymous role)::
-
-  +db.security.addPermission(name='Register', klass='user',
-  +     description='User is allowed to register new user')
-
-   # Assign the appropriate permissions to the anonymous user's Anonymous
-   # Role. Choices here are:
-   # - Allow anonymous users to register
-  -db.security.addPermissionToRole('Anonymous', 'Create', 'user')
-  +db.security.addPermissionToRole('Anonymous', 'Register', 'user')
-
-The lines marked "+" should be added and lines marked "-" should be
-deleted (minus the "+"/"-" signs).
-
-You should also modify the ``html/page.html`` template to change the
-permission tested there::
-
-   -tal:condition="python:request.user.hasPermission('Create', 'user')"
-   +tal:condition="python:request.user.hasPermission('Register', 'user')"
-
-
-Generic class editor may now restore retired items
---------------------------------------------------
-
-The instructions for doing so won't be present in your tracker unless you copy
-the ``_generic.index.html`` template from the roundup distribution in
-``share/roundup/templates/classic/html`` to your tracker's ``html`` directory.
-
-
-.. index:: upgrading; 1.4.x to 1.4.9
-
-Migrating from 1.4.x to 1.4.9
-=============================
-
-Customized MailGW Class
------------------------
-
-If you have customized the MailGW class in your tracker: The new MailGW
-class opens the database for each message in the method handle_message
-(instance.open) instead of passing the opened database as a parameter to
-the MailGW constructor. The old handle_message has been renamed to
-_handle_message. The new method opens the database and wraps the call to
-the old method into a try/finally.
-
-Your customized MailGW class needs to mirror this behavior.
-
-Fix the "remove" button in issue files and messages lists
----------------------------------------------------------
-
-The "remove" button(s) in the issue messages list needs to be altered. Find
-the following in your tracker's ``html/issue.item.html`` template::
-
-  <td>
-   <form style="padding:0" tal:condition="context/is_edit_ok"
-         tal:attributes="action string:issue${context/id}">
-    <input type="hidden" name="@remove@files" tal:attributes="value file/id">
-
-and add ``method="POST"`` as shown below::
-
-  <td>
-   <form style="padding:0" method="POST" tal:condition="context/is_edit_ok"
-         tal:attributes="action string:issue${context/id}">
-    <input type="hidden" name="@remove@files" tal:attributes="value file/id">
-
-Then also find::
-
-  <td>
-   <form style="padding:0" tal:condition="context/is_edit_ok"
-         tal:attributes="action string:issue${context/id}">
-    <input type="hidden" name="@remove@messages" tal:attributes="value msg/id">
-
-and add ``method="POST"`` as shown below::
-
-  <td>
-   <form style="padding:0" method="POST" tal:condition="context/is_edit_ok"
-         tal:attributes="action string:issue${context/id}">
-    <input type="hidden" name="@remove@messages" tal:attributes="value msg/id">
-
-
-Fixing the "retire" button in user management list
---------------------------------------------------
-
-Some previous versions of this upgrading document missed ``method="POST"``
-in the change to the "retire" link in the user management list
-in section `Migrating from 1.4.x to 1.4.7`_.
-Make sure the change is done as listed below in this document.
-
-
-.. index:: upgrading; 1.4.x to 1.4.7
-
-Migrating from 1.4.x to 1.4.7
-=============================
-
-Several security issues were addressed in this release. Some aspects of your
-trackers may no longer function depending on your local customisations. Core
-functionality that will need to be modified:
-
-Grant the "retire" permission to users for their queries
---------------------------------------------------------
-
-Users will no longer be able to retire their own queries. To remedy this you
-will need to add the following to your tracker's ``schema.py`` just under the
-line that grants them permission to edit their own queries::
-
-   p = db.security.addPermission(name='Edit', klass='query', check=edit_query,
-      description="User is allowed to edit their queries")
-   db.security.addPermissionToRole('User', p)
- + p = db.security.addPermission(name='Retire', klass='query', check=edit_query,
- +    description="User is allowed to retire their queries")
- + db.security.addPermissionToRole('User', p)
-   p = db.security.addPermission(name='Create', klass='query',
-      description="User is allowed to create queries")
-   db.security.addPermissionToRole('User', p)
-
-The lines marked "+" should be added, minus the "+" sign.
-
-
-Fix the "retire" link in the users list for admin users
--------------------------------------------------------
-
-The "retire" link found in the file ``html/user.index.html``::
-
-  <td tal:condition="context/is_edit_ok">
-   <a tal:attributes="href string:user${user/id}?@action=retire&@template=index"
-    i18n:translate="">retire</a>
-
-Should be replaced with::
-
-  <td tal:condition="context/is_retire_ok">
-     <form style="padding:0" method="POST"
-           tal:attributes="action string:user${user/id}">
-      <input type="hidden" name="@template" value="index">
-      <input type="hidden" name="@action" value="retire">
-      <input type="submit" value="retire" i18n:attributes="value">
-     </form>
-
-
-Fix for Python 2.6+ users
--------------------------
-
-If you use Python 2.6 you should edit your tracker's
-``detectors/nosyreaction.py`` file to change::
-
-   import sets
-
-at the top to::
-
-   from roundup.anypy.sets_ import set
-
-and then all instances of ``sets.Set()`` to ``set()`` in the later code.
-
-
-
-Trackers currently allowing HTML file uploading
------------------------------------------------
-
-Trackers which wish to continue to allow uploading of HTML content against issues
-will need to set a new configuration variable in the ``[web]`` section of the
-tracker's ``config.ini`` file:
-
-   # Setting this option enables Roundup to serve uploaded HTML
-   # file content *as HTML*. This is a potential security risk
-   # and is therefore disabled by default. Set to 'yes' if you
-   # trust *all* users uploading content to your tracker.
-   # Allowed values: yes, no
-   # Default: no
-   allow_html_file = no
-
-
-
-.. index:: upgrading; 1.4.2 to 1.4.3
-
-Migrating from 1.4.2 to 1.4.3
-=============================
-
-If you are using the MySQL backend you will need to replace some indexes
-that may have been created by version 1.4.2.
-
-You should to access your MySQL database directly and remove any indexes
-with a name ending in "_key_retired_idx". You should then re-add them with
-the same spec except the key column name needs a size. So an index on
-"_user (__retired, _name)" should become "_user (__retired, _name(255))".
-
-
-.. index:: upgrading; 1.4.x to 1.4.2
-
-Migrating from 1.4.x to 1.4.2
-=============================
-
-.. index:: roundup-admin; migrate subcommand
-
-You should run the "roundup-admin migrate" command for your tracker once
-you've installed the latest codebase.
-
-Do this before you use the web, command-line or mail interface and before
-any users access the tracker.
-
-This command will respond with either "Tracker updated" (if you've not
-previously run it on an RDBMS backend) or "No migration action required"
-(if you have run it, or have used another interface to the tracker,
-or are using anydbm).
-
-It's safe to run this even if it's not required, so just get into the
-habit.
-
-
-.. index:: upgrading; 1.3.3 to 1.4.0
-
-Migrating from 1.3.3 to 1.4.0
-=============================
-
-Value of the "refwd_re" tracker configuration option (section "mailgw")
-is treated as UTF-8 string.  In previous versions, it was ISO8859-1.
-
-If you have running trackers based on the classic template, please
-update the messagesummary detector as follows::
-
-    --- detectors/messagesummary.py 17 Apr 2003 03:26:38 -0000      1.1
-    +++ detectors/messagesummary.py 3 Apr 2007 06:47:21 -0000       1.2
-    @@ -8,7 +8,7 @@
-     if newvalues.has_key('summary') or not newvalues.has_key('content'):
-         return
-
-    -    summary, content = parseContent(newvalues['content'], 1, 1)
-    +    summary, content = parseContent(newvalues['content'], config=db.config)
-     newvalues['summary'] = summary
-
-In the latest version we have added some database indexes to the
-SQL-backends (mysql, postgresql, sqlite) for speeding up building the
-roundup-index for full-text search. We recommend that you create the
-following database indexes on the database by hand::
-
- CREATE INDEX words_by_id ON __words (_textid);
- CREATE UNIQUE INDEX __textids_by_props ON __textids (_class, _itemid, _prop);
-
-.. index:: upgrading; 1.2.x to 1.3.0
-
-Migrating from 1.2.x to 1.3.0
-=============================
-
-1.3.0 Web interface changes
----------------------------
-
-Some of the HTML files in the "classic" and "minimal" tracker templates
-were changed to fix some bugs and clean them up. You may wish to compare
-them to the HTML files in your tracker and apply any changes.
-
-
-.. index:: upgrading; 1.1.2 to 1.2.0
-
-Migrating from 1.1.2 to 1.2.0
-=============================
-
-1.2.0 Sorting and grouping by multiple properties
--------------------------------------------------
-
-Starting with this version, sorting and grouping by multiple properties
-is possible. This means that request.sort and request.group are now
-lists. This is reflected in several places:
-
- * ``renderWith`` now has list attributes for ``sort`` and ``group``,
-   where you previously wrote::
-
-    renderWith(... sort=('-', 'activity'), group=('+', 'priority')
-
-   you write now::
-
-    renderWith(... sort=[('-', 'activity')], group=[('+', 'priority')]
-
- * In templates that permit to edit sorting/grouping, request.sort and
-   request.group are (possibly empty) lists. You can now sort and group
-   by multiple attributes. For an example, see the classic template. You
-   may want search for the variable ``n_sort`` which can be set to the
-   number of sort/group properties.
-
- * Templates that diplay new headlines for each group of items with
-   equal group properties can now use the modified ``batch.propchanged``
-   method that can take several properties which are checked for
-   changes. See the example in the classic template which makes use of
-   ``batch.propchanged``.
-
-.. index:: upgrading; 1.1.0 to 1.1.1
-
-Migrating from 1.1.0 to 1.1.1
-=============================
-
-1.1.1 "Clear this message"
---------------------------
-
-In 1.1.1, the standard ``page.html`` template includes a "clear this message"
-link in the green "ok" message bar that appears after a successful edit
-(or other) action.
-
-To include this in your tracker, change the following in your ``page.html``
-template::
-
- <p tal:condition="options/ok_message | nothing" class="ok-message"
-    tal:repeat="m options/ok_message" tal:content="structure m">error</p>
-
-to be::
-
- <p tal:condition="options/ok_message | nothing" class="ok-message">
-   <span tal:repeat="m options/ok_message"
-      tal:content="structure string:$m <br/ > " />
-    <a class="form-small" tal:attributes="href request/current_url"
-       i18n:translate="">clear this message</a>
- </p>
-
-
-If you implemented the "clear this message" in your 1.1.0 tracker, then you
-should change it to the above and it will work much better!
-
-
-.. index:: upgrading; 1.0.x to 1.1.0
-
-Migrating from 1.0.x to 1.1.0
-=============================
-
-1.1 Login "For Session Only"
-----------------------------
-
-In 1.1, web logins are alive for the length of a session only, *unless* you
-add the following to the login form in your tracker's ``page.html``::
-
-    <input type="checkbox" name="remember" id="remember">
-    <label for="remember" i18n:translate="">Remember me?</label><br>
-
-See the classic tracker ``page.html`` if you're unsure where this should
-go.
-
-
-1.1 Query Display Name
-----------------------
-
-The ``dispname`` web variable has been renamed ``@dispname`` to avoid
-clashing with other variables of the same name. If you are using the
-display name feature, you will need to edit your tracker's ``page.html``
-and ``issue.index.html`` pages to change ``dispname`` to ``@dispname``.
-
-A side-effect of this change is that the renderWith method used in the
-``home.html`` page may now take a dispname argument.
-
-
-1.1 "Clear this message"
-------------------------
-
-In 1.1, the standard ``page.html`` template includes a "clear this message"
-link in the green "ok" message bar that appears after a successful edit
-(or other) action.
-
-To include this in your tracker, change the following in your ``page.html``
-template::
-
- <p tal:condition="options/ok_message | nothing" class="ok-message"
-    tal:repeat="m options/ok_message" tal:content="structure m">error</p>
-
-to be::
-
- <p tal:condition="options/ok_message | nothing" class="ok-message">
-   <span tal:repeat="m options/ok_message"
-      tal:content="structure string:$m <br/ > " />
-    <a class="form-small" tal:attributes="href string:issue${context/id}"
-       i18n:translate="">clear this message</a>
- </p>
-
-
-.. index:: upgrading; 0.8.x to 1.0
-
-Migrating from 0.8.x to 1.0
-===========================
-
-1.0 New Query Permissions
--------------------------
-
-New permissions are defined for query editing and viewing. To include these
-in your tracker, you need to add these lines to your tracker's
-``schema.py``::
-
- # Users should be able to edit and view their own queries. They should also
- # be able to view any marked as not private. They should not be able to
- # edit others' queries, even if they're not private
- def view_query(db, userid, itemid):
-     private_for = db.query.get(itemid, 'private_for')
-     if not private_for: return True
-     return userid == private_for
- def edit_query(db, userid, itemid):
-     return userid == db.query.get(itemid, 'creator')
- p = db.security.addPermission(name='View', klass='query', check=view_query,
-     description="User is allowed to view their own and public queries")
- db.security.addPermissionToRole('User', p)
- p = db.security.addPermission(name='Edit', klass='query', check=edit_query,
-     description="User is allowed to edit their queries")
- db.security.addPermissionToRole('User', p)
- p = db.security.addPermission(name='Create', klass='query',
-     description="User is allowed to create queries")
- db.security.addPermissionToRole('User', p)
-
-and then remove 'query' from the line::
-
- # Assign the access and edit Permissions for issue, file and message
- # to regular users now
- for cl in 'issue', 'file', 'msg', 'query', 'keyword':
-
-so it looks like::
-
- for cl in 'issue', 'file', 'msg', 'keyword':
-
-
-.. index:: upgrading; 0.8.0 to 0.8.3
-
-Migrating from 0.8.0 to 0.8.3
-=============================
-
-0.8.3 Nosy Handling Changes
----------------------------
-
-A change was made to fix a bug in the ``nosyreaction.py`` standard
-detector. To incorporate this fix in your trackers, you will need to copy
-the ``nosyreaction.py`` file from the ``templates/classic/detectors``
-directory of the source to your tracker's ``templates`` directory.
-
-If you have modified the ``nosyreaction.py`` file from the standard
-version, you will need to roll your changes into the new file.
-
-
-.. index:: upgrading; 0.7.1 to 0.8.0
-
-Migrating from 0.7.1 to 0.8.0
-=============================
-
-You *must* fully uninstall previous Roundup version before installing
-Roundup 0.8.0.  If you don't do that, ``roundup-admin install``
-command may fail to function properly.
-
-0.8.0 Backend changes
----------------------
-
-Backends 'bsddb' and 'bsddb3' are removed.  If you are using one of these,
-you *must* migrate to another backend before upgrading.
-
-
-0.8.0 API changes
------------------
-
-Class.safeget() was removed from the API. Test your item ids before calling
-Class.get() instead.
-
-
-0.8.0 New tracker layout
-------------------------
-
-The ``config.py`` file has been replaced by ``config.ini``. You may use the
-roundup-admin command "genconfig" to generate a new config file::
-
-  roundup-admin genconfig <tracker home>/config.ini
-
-and modify the values therein based on the contents of your old config.py.
-In most cases, the names of the config variables are the same.
-
-The ``select_db.py`` file has been replaced by a file in the ``db``
-directory called ``backend_name``. As you might guess, this file contains
-just the name of the backend. To figure what the contents of yours should
-be, use the following table:
-
-  ================================ =========================
-  ``select_db.py`` contents        ``backend_name`` contents
-  ================================ =========================
-  from back_anydbm import ...      anydbm
-  from back_metakit import ...     metakit
-  from back_sqlite import ...      sqlite
-  from back_mysql import ...       mysql
-  from back_postgresql import ...  postgresql
-  ================================ =========================
-
-The ``dbinit.py`` file has been split into two new files,
-``initial_data.py`` and ``schema.py``. The contents of this file are:
-
-``initial_data.py``
-  You don't need one of these as your tracker is already initialised.
-
-``schema.py``
-  Copy the body of the ``def open(name=None)`` function from your old
-  tracker's ``dbinit.py`` file to this file. As the lines you're copying
-  aren't part of a function definition anymore, one level of indentation
-  needs to be removed (remove only the leading four spaces on each
-  line).
-
-  The first few lines -- those starting with ``from roundup.hyperdb
-  import ...`` and the ``db = Database(config, name)`` line -- don't
-  need to be copied. Neither do the last few lines -- those starting
-  with ``import detectors``, down to ``return db`` inclusive.
-
-You may remove the ``__init__.py`` module from the "detectors" directory as
-it is no longer used.
-
-There's a new way to write extension code for Roundup. If you have code in
-an ``interfaces.py`` file you should move it. See the `customisation
-documentation`_ for information about how extensions are now written.
-Note that some older trackers may use ``interfaces.py`` to customise the
-mail gateway behaviour. You will need to keep your ``interfaces.py`` file
-if this is the case.
-
-
-0.8.0 Permissions Changes
--------------------------
-
-The creation of a new item in the user interfaces is now controlled by the
-"Create" Permission. You will need to add an assignment of this Permission
-to your users who are allowed to create items. The most common form of this
-is the following in your ``schema.py`` added just under the current
-assignation of the Edit Permission::
-
-    for cl in 'issue', 'file', 'msg', 'query', 'keyword':
-        p = db.security.getPermission('Create', cl)
-        db.security.addPermissionToRole('User', p)
-
-You will need to explicitly let anonymous users access the web interface so
-that regular users are able to see the login form. Note that almost all
-trackers will need this Permission. The only situation where it's not
-required is in a tracker that uses an HTTP Basic Authenticated front-end.
-It's enabled by adding to your ``schema.py``::
-
-    p = db.security.getPermission('Web Access')
-    db.security.addPermissionToRole('Anonymous', p)
-
-Finally, you will need to enable permission for your users to edit their
-own details by adding the following to ``schema.py``::
-
-    # Users should be able to edit their own details. Note that this
-    # permission is limited to only the situation where the Viewed or
-    # Edited item is their own.
-    def own_record(db, userid, itemid):
-        '''Determine whether the userid matches the item being accessed.'''
-        return userid == itemid
-    p = db.security.addPermission(name='View', klass='user', check=own_record,
-        description="User is allowed to view their own user details")
-    p = db.security.addPermission(name='Edit', klass='user', check=own_record,
-        description="User is allowed to edit their own user details")
-    db.security.addPermissionToRole('User', p)
-
-
-0.8.0 Use of TemplatingUtils
-----------------------------
-
-If you used custom python functions in TemplatingUtils, they must
-be moved from interfaces.py to a new file in the ``extensions`` directory.
-
-Each Function that should be available through TAL needs to be defined
-as a toplevel function in the newly created file. Furthermore you
-add an inititialization function, that registers the functions with the
-tracker.
-
-If you find this too tedious, donfu wrote an automatic init function that
-takes an existing TemplatingUtils class, and registers all class methods
-that do not start with an underscore. The following hack should be placed
-in the ``extensions`` directory alongside other extensions::
-
-    class TemplatingUtils:
-         # copy from interfaces.py
-
-    def init(tracker):
-         util = TemplatingUtils()
-
-         def setClient(tu):
-             util.client = tu.client
-             return util
-
-         def execUtil(name):
-             return lambda tu, *args, **kwargs: \
-                     getattr(setClient(tu), name)(*args, **kwargs)
-
-         for name in dir(util):
-             if callable(getattr(util, name)) and not name.startswith('_'):
-                  tracker.registerUtil(name, execUtil(name))
-
-
-0.8.0 Logging Configuration
----------------------------
-
-See the `administration guide`_ for information about configuring the new
-logging implemented in 0.8.0.
-
-
-.. index:: upgrading; 0.7.2 to 0.7.3
-
-Migrating from 0.7.2 to 0.7.3
-=============================
-
-0.7.3 Configuration
--------------------
-
-If you choose, you may specify the directory from which static files are
-served (those which use the URL component ``@@file``). Currently the
-directory defaults to the ``TEMPLATES`` configuration variable. You may
-define a new variable, ``STATIC_FILES`` which overrides this value for
-static files.
-
-
-.. index:: upgrading; 0.7.0 to 0.7.2
-
-Migrating from 0.7.0 to 0.7.2
-=============================
-
-0.7.2 DEFAULT_TIMEZONE is now required
---------------------------------------
-
-The DEFAULT_TIMEZONE configuration variable is now required. Add the
-following to your tracker's ``config.py`` file::
-
-    # You may specify a different default timezone, for use when users do not
-    # choose their own in their settings.
-    DEFAULT_TIMEZONE = 0            # specify as numeric hour offest
-
-.. index:: upgrading; 0.7.0 to 0.7.1
-
-Migrating from 0.7.0 to 0.7.1
-=============================
-
-0.7.1 Permission assignments
-----------------------------
-
-If you allow anonymous access to your tracker, you might need to assign
-some additional View (or Edit if your tracker is that open) permissions
-to the "anonymous" user. To do so, find the code in your ``dbinit.py`` that
-says::
-
-    for cl in 'issue', 'file', 'msg', 'query', 'keyword':
-        p = db.security.getPermission('View', cl)
-        db.security.addPermissionToRole('User', p)
-        p = db.security.getPermission('Edit', cl)
-        db.security.addPermissionToRole('User', p)
-    for cl in 'priority', 'status':
-        p = db.security.getPermission('View', cl)
-        db.security.addPermissionToRole('User', p)
-
-Add add a line::
-
-        db.security.addPermissionToRole('Anonymous', p)
-
-next to the existing ``'User'`` lines for the Permissions you wish to
-assign to the anonymous user.
-
-
-.. index:: upgrading; versions earlier than 0.7
-
-Migrating from 0.6 to 0.7
-=========================
-
-0.7.0 Permission assignments
-----------------------------
-
-Due to a change in the rendering of web widgets, permissions are now
-checked on Classes where they previously weren't (this is a good thing).
-
-You will need to add some additional Permission assignments for your
-regular users, or some displays will break. After the following in your
-tracker's ``dbinit.py``::
-
-    # Assign the access and edit Permissions for issue, file and message
-    # to regular users now
-    for cl in 'issue', 'file', 'msg', 'query', 'keyword':
-        p = db.security.getPermission('View', cl)
-        db.security.addPermissionToRole('User', p)
-        p = db.security.getPermission('Edit', cl)
-        db.security.addPermissionToRole('User', p)
-
-add::
-
-    for cl in 'priority', 'status':
-        p = db.security.getPermission('View', cl)
-        db.security.addPermissionToRole('User', p)
-
-
-0.7.0 Getting the current user id
----------------------------------
-
-The Database.curuserid attribute has been removed.
-
-Any code referencing this attribute should be replaced with a
-call to Database.getuid().
-
-
-0.7.0 ZRoundup changes
-----------------------
-
-The templates in your tracker's html directory will need updating if you
-wish to use ZRoundup. If you've not modified those files (or some of them),
-you may just copy the new versions from the Roundup source in the
-templates/classic/html directory.
-
-If you have modified the html files, then you'll need to manually edit them
-to change all occurances of special form variables from using the colon ":"
-special character to the at "@" special character. That is, variables such
-as::
-
-  :action :required :template :remove:messages ...
-
-should become::
-
-  @action @required @template @remove@messages ...
-
-Note that ``tal:`` statements are unaffected. So are TAL expression type
-prefixes such as ``python:`` and ``string:``. Please ask on the
-roundup-users mailing list for help if you're unsure.
-
-
-0.7.0 Edit collision detection
-------------------------------
-
-Roundup now detects collisions with editing in the web interface (that is,
-two people editing the same item at the same time).
-
-You must copy the ``_generic.collision.html`` file from Roundup source in
-the ``templates/classic/html`` directory. to your tracker's ``html``
-directory.
-
-
-Migrating from 0.6.x to 0.6.3
-=============================
-
-0.6.3 Configuration
--------------------
-
-You will need to copy the file::
-
-  templates/classic/detectors/__init__.py
-
-to your tracker's ``detectors`` directory, replacing the one already there.
-This fixes a couple of bugs in that file.
-
-
-
-Migrating from 0.5 to 0.6
-=========================
-
-
-0.6.0 Configuration
--------------------
-
-Introduced EMAIL_FROM_TAG config variable. This value is inserted into
-the From: line of nosy email. If the sending user is "Foo Bar", the
-From: line is usually::
-
-     "Foo Bar" <issue_tracker@tracker.example>
-
-the EMAIL_FROM_TAG goes inside the "Foo Bar" quotes like so::
-
-     "Foo Bar EMAIL_FROM_TAG" <issue_tracker@tracker.example>
-
-I've altered the mechanism in the detectors __init__.py module so that it
-doesn't cross-import detectors from other trackers (if you run more than one
-in a single roundup-server). This change means that you'll need to copy the
-__init__.py from roundup/templates/classic/detectors/__init__.py to your
-<tracker home>/detectors/__init__.py. Don't worry, the "classic" __init__ is a
-one-size-fits-all, so it'll work even if you've added/removed detectors.
-
-0.6.0 Templating changes
-------------------------
-
-The ``user.item`` template (in the tracker home "templates" directory)
-needs to have the following hidden variable added to its form (between the
-``<form...>`` and ``</form>`` tags::
-
-  <input type="hidden" name=":template" value="item">
-
-
-0.6.0 Form handling changes
----------------------------
-
-Roundup's form handling capabilities have been significantly expanded. This
-should not affect users of 0.5 installations - but if you find you're
-getting errors from form submissions, please ask for help on the Roundup
-users mailing list:
-
-  https://sourceforge.net/projects/roundup/lists/roundup-users
-
-See the customisation doc section on `Form Values`__ for documentation of the
-new form variables possible.
-
-__ customizing.html#form-values
-
-
-0.6.0 Multilingual character set support
-----------------------------------------
-
-Added internationalization support. This is done via encoding all data
-stored in roundup database to utf-8 (unicode encoding). To support utf-8 in
-web interface you should add the folowing line to your tracker's html/page
-and html/_generic.help files inside <head> tag::
-
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-
-Since latin characters in utf-8 have the same codes as in ASCII table, this
-modification is optional for users who use only plain latin characters.
-
-After this modification, you will be able to see and enter any world
-character via web interface. Data received via mail interface also converted
-to utf-8, however only new messages will be converted. If your roundup
-database contains some of non-ASCII characters in one of 8-bit encoding,
-they will not be visible in new unicode environment. Some of such data (e.g.
-user names, keywords, etc)  can be edited by administrator, the others
-(e.g. messages' contents) is not editable via web interface. Currently there
-is no tool for converting such data, the only solution is to close
-appropriate old issues and create new ones with the same content.
-
-
-0.6.0 User timezone support
----------------------------
-
-From version 0.6.0 roundup supports displaying of Date data in user' local
-timezone if he/she has provided timezone information. To make it possible
-some modification to tracker's schema and HTML templates are required.
-First you must add string property 'timezone' to user class in dbinit.py
-like this::
-
-    user = Class(db, "user",
-                    username=String(),   password=Password(),
-                    address=String(),    realname=String(),
-                    phone=String(),      organisation=String(),
-                    alternate_addresses=String(),
-                    queries=Multilink('query'), roles=String(),
-                    timezone=String())
-
-And second - html interface. Add following lines to
-$TRACKER_HOME/html/user.item template::
-
-     <tr>
-      <th>Timezone</th>
-      <td tal:content="structure context/timezone/field">timezone</td>
-     </tr>
-
-After that all users should be able to provide their timezone information.
-Timezone should be a positive or negative integer - offset from GMT.
-
-After providing timezone, roundup will show all dates values, found in web
-and mail interfaces in local time. It will also accept any Date info in
-local time, convert and store it in GMT.
-
-
-0.6.0 Search page structure
----------------------------
-
-In order to accomodate query editing the search page has been restructured. If
-you want to provide your users with query editing, you should update your
-search page using the macros detailed in the customisation doc section
-`Searching on categories`__.
-
-__ customizing.html#searching-on-categories
-
-Also, the url field in the query class no longer starts with a '?'. You'll need
-to remove this question mark from the url field to support queries. There's
-a script in the "tools" directory called ``migrate-queries.py`` that should
-automatically change any existing queries for you. As always, make a backup
-of your database before running such a script.
-
-
-0.6.0 Notes for metakit backend users
--------------------------------------
-
-Roundup 0.6.0 introduced searching on ranges of dates and intervals. To
-support it, some modifications to interval storing routine were made. So if
-your tracker uses metakit backend and your db schema contains intervals
-property, searches on that property will not be accurate for db items that
-was stored before roundup' upgrade. However all new records should be
-searchable on intervals.
-
-It is possible to convert your database to new format: you can export and
-import back all your data (consult "Migrating backends" in "Maintenance"
-documentation). After this operation all your interval properties should
-become searchable.
-
-Users of backends others than metakit should not worry about this issue.
-
-
-Migrating from 0.4.x to 0.5.0
-=============================
-
-This has been a fairly major revision of Roundup:
-
-1. Brand new, much more powerful, flexible, tasty and nutritious templating.
-   Unfortunately, this means all your current templates are useless. Hopefully
-   the new documentation and examples will be enough to help you make the
-   transition. Please don't hesitate to ask on roundup-users for help (or
-   complete conversions if you're completely stuck)!
-2. The database backed got a lot more flexible, allowing Metakit and SQL
-   databases! The only decent SQL database implemented at present is sqlite,
-   but others shouldn't be a whole lot more work.
-3. A brand new, highly flexible and much more robust security system including
-   a system of Permissions, Roles and Role assignments to users. You may now
-   define your own Permissions that may be checked in CGI transactions.
-4. Journalling has been made less storage-hungry, so has been turned on
-   by default *except* for author, recipient and nosy link/unlink events. You
-   are advised to turn it off in your trackers too.
-5. We've changed the terminology from "instance" to "tracker", to ease the
-   learning curve/impact for new users.
-6. Because of the above changes, the tracker configuration has seen some
-   major changes. See below for the details.
-
-Please, **back up your database** before you start the migration process. This
-is as simple as copying the "db" directory and all its contents from your
-tracker to somewhere safe.
-
-
-0.5.0 Configuration
--------------------
-
-First up, rename your ``instance_config.py`` file to just ``config.py``.
-
-Then edit your tracker's ``__init__.py`` module. It'll currently look
-like this::
-
- from instance_config import *
- try:
-     from dbinit import *
- except ImportError:
-     pass # in installdir (probably :)
- from interfaces import *
-
-and it needs to be::
-
- import config
- from dbinit import open, init
- from interfaces import Client, MailGW
-
-Due to the new templating having a top-level ``page`` that defines links for
-searching, indexes, adding items etc, the following variables are no longer
-used:
-
-- HEADER_INDEX_LINKS
-- HEADER_ADD_LINKS
-- HEADER_SEARCH_LINKS
-- SEARCH_FILTERS
-- DEFAULT_INDEX
-- UNASSIGNED_INDEX
-- USER_INDEX
-- ISSUE_FILTER
-
-The new security implementation will require additions to the dbinit module,
-but also removes the need for the following tracker config variables:
-
-- ANONYMOUS_ACCESS
-- ANONYMOUS_REGISTER
-
-but requires two new variables which define the Roles assigned to users who
-register through the web and e-mail interfaces:
-
-- NEW_WEB_USER_ROLES
-- NEW_EMAIL_USER_ROLES
-
-in both cases, 'User' is a good initial setting. To emulate
-``ANONYMOUS_ACCESS='deny'``, remove all "View" Permissions from the
-"Anonymous" Role. To emulate ``ANONYMOUS_REGISTER='deny'``, remove the "Web
-Registration" and/or the "Email Registration" Permission from the "Anonymous"
-Role. See the section on customising security in the `customisation
-documentation`_ for more information.
-
-Finally, the following config variables have been renamed to make more sense:
-
-- INSTANCE_HOME -> TRACKER_HOME
-- INSTANCE_NAME -> TRACKER_NAME
-- ISSUE_TRACKER_WEB -> TRACKER_WEB
-- ISSUE_TRACKER_EMAIL -> TRACKER_EMAIL
-
-
-0.5.0 Schema Specification
---------------------------
-
-0.5.0 Database backend changes
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Your select_db module in your tracker has changed a fair bit. Where it used
-to contain::
-
- # WARNING: DO NOT EDIT THIS FILE!!!
- from roundup.backends.back_anydbm import Database
-
-it must now contain::
-
- # WARNING: DO NOT EDIT THIS FILE!!!
- from roundup.backends.back_anydbm import Database, Class, FileClass, IssueClass
-
-Yes, I realise the irony of the "DO NOT EDIT THIS FILE" statement :)
-Note the addition of the Class, FileClass, IssueClass imports. These are very
-important, as they're going to make the next change work too. You now need to
-modify the top of the dbinit module in your tracker from::
-
- import instance_config
- from roundup import roundupdb
- from select_db import Database
-
- from roundup.roundupdb import Class, FileClass
-
- class Database(roundupdb.Database, select_db.Database):
-     ''' Creates a hybrid database from:
-          . the selected database back-end from select_db
-          . the roundup extensions from roundupdb
-     '''
-     pass
-
- class IssueClass(roundupdb.IssueClass):
-     ''' issues need the email information
-     '''
-     pass
-
-to::
-
- import config
- from select_db import Database, Class, FileClass, IssueClass
-
-Yes, remove the Database and IssueClass definitions and those other imports.
-They're not needed any more!
-
-Look for places in dbinit.py where ``instance_config`` is used too, and
-rename them ``config``.
-
-
-0.5.0 Journalling changes
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Journalling has been optimised for storage. Journalling of links has been
-turned back on by default. If your tracker has a large user base, you may wish
-to turn off journalling of nosy list, message author and message recipient
-link and unlink events. You do this by adding ``do_journal='no'`` to the Class
-initialisation in your dbinit. For example, your *msg* class initialisation
-probably looks like this::
-
-    msg = FileClass(db, "msg",
-                    author=Link("user"), recipients=Multilink("user"),
-                    date=Date(),         summary=String(),
-                    files=Multilink("file"),
-                    messageid=String(),  inreplyto=String())
-
-to turn off journalling of author and recipient link events, add
-``do_journal='no'`` to the ``author=Link("user")`` part of the statement,
-like so::
-
-    msg = FileClass(db, "msg",
-                    author=Link("user", do_journal='no'),
-                    recipients=Multilink("user", do_journal='no'),
-                    date=Date(),         summary=String(),
-                    files=Multilink("file"),
-                    messageid=String(),  inreplyto=String())
-
-Nosy list link event journalling is actually turned off by default now. If you
-want to turn it on, change to your issue class' nosy list, change its
-definition from::
-
-    issue = IssueClass(db, "issue",
-                    assignedto=Link("user"), topic=Multilink("keyword"),
-                    priority=Link("priority"), status=Link("status"))
-
-to::
-
-    issue = IssueClass(db, "issue", nosy=Multilink("user", do_journal='yes'),
-                    assignedto=Link("user"), topic=Multilink("keyword"),
-                    priority=Link("priority"), status=Link("status"))
-
-noting that your definition of the nosy Multilink will override the normal one.
-
-
-0.5.0 User schema changes
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Users have two more properties, "queries" and "roles". You'll have something
-like this in your dbinit module now::
-
-    user = Class(db, "user",
-                    username=String(),   password=Password(),
-                    address=String(),    realname=String(),
-                    phone=String(),      organisation=String(),
-                    alternate_addresses=String())
-    user.setkey("username")
-
-and you'll need to add the new properties and the new "query" class to it
-like so::
-
-    query = Class(db, "query",
-                    klass=String(),     name=String(),
-                    url=String())
-    query.setkey("name")
-
-    # Note: roles is a comma-separated string of Role names
-    user = Class(db, "user",
-                    username=String(),   password=Password(),
-                    address=String(),    realname=String(),
-                    phone=String(),      organisation=String(),
-                    alternate_addresses=String(),
-                    queries=Multilink('query'), roles=String())
-    user.setkey("username")
-
-The "queries" property is used to store off the user's favourite database
-queries. The "roles" property is explained below in `0.5.0 Security
-Settings`_.
-
-
-0.5.0 Security Settings
-~~~~~~~~~~~~~~~~~~~~~~~
-
-See the `security documentation`_ for an explanation of how the new security
-system works. In a nutshell though, the security is handled as a four step
-process:
-
-1. Permissions are defined as having a name and optionally a hyperdb class
-   they're specific to,
-2. Roles are defined that have one or more Permissions,
-3. Users are assigned Roles in their "roles" property, and finally
-4. Roundup checks that users have appropriate Permissions at appropriate times
-   (like editing issues).
-
-Your tracker dbinit module's *open* function now has to define any
-Permissions that are specific to your tracker, and also the assignment
-of Permissions to Roles. At the moment, your open function
-ends with::
-
-    import detectors
-    detectors.init(db)
-
-    return db
-
-and what we need to do is insert some commands that will set up the security
-parameters. Right above the ``import detectors`` line, you'll want to insert
-these lines::
-
-    #
-    # SECURITY SETTINGS
-    #
-    # new permissions for this schema
-    for cl in 'issue', 'file', 'msg', 'user':
-        db.security.addPermission(name="Edit", klass=cl,
-            description="User is allowed to edit "+cl)
-        db.security.addPermission(name="View", klass=cl,
-            description="User is allowed to access "+cl)
-
-    # Assign the access and edit permissions for issue, file and message
-    # to regular users now
-    for cl in 'issue', 'file', 'msg':
-        p = db.security.getPermission('View', cl)
-        db.security.addPermissionToRole('User', p)
-        p = db.security.getPermission('Edit', cl)
-        db.security.addPermissionToRole('User', p)
-    # and give the regular users access to the web and email interface
-    p = db.security.getPermission('Web Access')
-    db.security.addPermissionToRole('User', p)
-    p = db.security.getPermission('Email Access')
-    db.security.addPermissionToRole('User', p)
-
-    # May users view other user information? Comment these lines out
-    # if you don't want them to
-    p = db.security.getPermission('View', 'user')
-    db.security.addPermissionToRole('User', p)
-
-    # Assign the appropriate permissions to the anonymous user's Anonymous
-    # Role. Choices here are:
-    # - Allow anonymous users to register through the web
-    p = db.security.getPermission('Web Registration')
-    db.security.addPermissionToRole('Anonymous', p)
-    # - Allow anonymous (new) users to register through the email gateway
-    p = db.security.getPermission('Email Registration')
-    db.security.addPermissionToRole('Anonymous', p)
-    # - Allow anonymous users access to the "issue" class of data
-    #   Note: this also grants access to related information like files,
-    #         messages, statuses etc that are linked to issues
-    #p = db.security.getPermission('View', 'issue')
-    #db.security.addPermissionToRole('Anonymous', p)
-    # - Allow anonymous users access to edit the "issue" class of data
-    #   Note: this also grants access to create related information like
-    #         files and messages etc that are linked to issues
-    #p = db.security.getPermission('Edit', 'issue')
-    #db.security.addPermissionToRole('Anonymous', p)
-
-    # oh, g'wan, let anonymous access the web interface too
-    p = db.security.getPermission('Web Access')
-    db.security.addPermissionToRole('Anonymous', p)
-
-Note in the comments there the places where you might change the permissions
-to restrict users or grant users more access. If you've created additional
-classes that users should be able to edit and view, then you should add them
-to the "new permissions for this schema" section at the start of the security
-block. Then add them to the "Assign the access and edit permissions" section
-too, so people actually have the new Permission you've created.
-
-One final change is needed that finishes off the security system's
-initialisation. We need to add a call to ``db.post_init()`` at the end of the
-dbinit open() function. Add it like this::
-
-    import detectors
-    detectors.init(db)
-
-    # schema is set up - run any post-initialisation
-    db.post_init()
-    return db
-
-You may verify the setup of Permissions and Roles using the new
-"``roundup-admin security``" command.
-
-
-0.5.0 User changes
-~~~~~~~~~~~~~~~~~~
-
-To support all those schema changes, you'll need to massage your user database
-a little too, to:
-
-1. make sure there's an "anonymous" user - this user is mandatory now and is
-   the one that unknown users are logged in as.
-2. make sure all users have at least one Role.
-
-If you don't have the "anonymous" user, create it now with the command::
-
-  roundup-admin create user username=anonymous roles=Anonymous
-
-making sure the capitalisation is the same as above. Once you've done that,
-you'll need to set the roles property on all users to a reasonable default.
-The admin user should get "Admin", the anonymous user "Anonymous"
-and all other users "User". The ``fixroles.py`` script in the tools directory
-will do this. Run it like so (where python is your python 2+ binary)::
-
-  python tools/fixroles.py -i <tracker home> fixroles
-
-
-
-0.5.0 CGI interface changes
----------------------------
-
-The CGI interface code was completely reorganised and largely rewritten. The
-end result is that this section of your tracker interfaces module will need
-changing from::
-
- from roundup import cgi_client, mailgw
- from roundup.i18n import _
-
- class Client(cgi_client.Client):
-     ''' derives basic CGI implementation from the standard module,
-         with any specific extensions
-     '''
-     pass
-
-to::
-
- from roundup import mailgw
- from roundup.cgi import client
-
- class Client(client.Client):
-     ''' derives basic CGI implementation from the standard module,
-         with any specific extensions
-     '''
-     pass
-
-You will also need to install the new version of roundup.cgi from the source
-cgi-bin directory if you're using it.
-
-
-0.5.0 HTML templating
----------------------
-
-You'll want to make a backup of your current tracker html directory. You
-should then copy the html directory from the Roundup source "classic" template
-and modify it according to your local schema changes.
-
-If you need help with the new templating system, please ask questions on the
-roundup-users mailing list (available through the roundup web page on
-sourceforge, https://www.roundup-tracker.org/.
-
-
-0.5.0 Detectors
----------------
-
-The nosy reactor has been updated to handle the tracker not having an
-"assignedto" property on issues. You may want to copy it into your tracker's
-detectors directory. Chances are you've already fixed it though :)
-
-
-Migrating from 0.4.1 to 0.4.2
-=============================
-
-0.4.2 Configuration
--------------------
-The USER_INDEX definition introduced in 0.4.1 was too restrictive in its
-allowing replacement of 'assignedto' with the user's userid. Users must change
-the None value of 'assignedto' to 'CURRENT USER' (the string, in quotes) for
-the replacement behaviour to occur now.
-
-The new configuration variables are:
-
-- EMAIL_KEEP_QUOTED_TEXT
-- EMAIL_LEAVE_BODY_UNCHANGED
-- ADD_RECIPIENTS_TO_NOSY
-
-See the sample configuration files in::
-
- <roundup source>/roundup/templates/classic/instance_config.py
-
-and::
-
- <roundup source>/roundup/templates/extended/instance_config.py
-
-and the `customisation documentation`_ for information on how they're used.
-
-
-0.4.2 Changes to detectors
---------------------------
-You will need to copy the detectors from the distribution into your instance
-home "detectors" directory. If you used the classic schema, the detectors
-are in::
-
- <roundup source>/roundup/templates/classic/detectors/
-
-If you used the extended schema, the detectors are in::
-
- <roundup source>/roundup/templates/extended/detectors/
-
-The change means that schema-specific code has been removed from the
-mail gateway and cgi interface and made into auditors:
-
-- nosyreactor.py has now got an updatenosy auditor which updates the nosy
-  list with author, recipient and assignedto information.
-- statusauditor.py makes the unread or resolved -> chatting changes and
-  presets the status of an issue to unread.
-
-There's also a bug or two fixed in the nosyreactor code.
-
-0.4.2 HTML templating changes
------------------------------
-The link() htmltemplate function now has a "showid" option for links and
-multilinks. When true, it only displays the linked item id as the anchor
-text. The link value is displayed as a tooltip using the title anchor
-attribute. To use in eg. the superseder field, have something like this::
-
-   <td>
-    <display call="field('superseder', showid=1)">
-    <display call="classhelp('issue', 'id,title', label='list', width=500)">
-    <property name="superseder">
-     <br>View: <display call="link('superseder', showid=1)">
-    </property>
-   </td>
-
-The stylesheets have been cleaned up too. You may want to use the newer
-versions in::
-
- <roundup source>/roundup/templates/<template>/html/default.css
-
-
-
-Migrating from 0.4.0 to 0.4.1
-=============================
-
-0.4.1 Files storage
--------------------
-
-Messages and files from newly created issues will be put into subdierectories
-in thousands e.g. msg123 will be put into files/msg/0/msg123, file2003
-will go into files/file/2/file2003. Previous messages are still found, but
-could be put into this structure.
-
-0.4.1 Configuration
--------------------
-
-To allow more fine-grained access control, the variable used to check
-permission to auto-register users in the mail gateway is now called
-ANONYMOUS_REGISTER_MAIL rather than overloading ANONYMOUS_REGISTER. If the
-variable doesn't exist, then ANONYMOUS_REGISTER is tested as before.
-
-Configuring the links in the web header is now easier too. The following
-variables have been added to the classic instance_config.py::
-
-  HEADER_INDEX_LINKS   - defines the "index" links to be made available
-  HEADER_ADD_LINKS     - defines the "add" links
-  DEFAULT_INDEX        - specifies the index view for DEFAULT
-  UNASSIGNED_INDEX     - specifies the index view for UNASSIGNED
-  USER_INDEX           - specifies the index view for USER
-
-See the <roundup source>/roundup/templates/classic/instance_config.py for more
-information - including how the variables are to be set up. Most users will
-just be able to copy the variables from the source to their instance home. If
-you've modified the header by changing the source of the interfaces.py file in
-the instance home, you'll need to remove that customisation and move it into
-the appropriate variables in instance_config.py.
-
-The extended schema has similar variables added too - see the source for more
-info.
-
-0.4.1 Alternate E-Mail Addresses
---------------------------------
-
-If you add the property "alternate_addresses" to your user class, your users
-will be able to register alternate email addresses that they may use to
-communicate with roundup as. All email from roundup will continue to be sent
-to their primary address.
-
-If you have not edited the dbinit.py file in your instance home directory,
-you may simply copy the new dbinit.py file from the core code. If you used
-the classic schema, the interfaces file is in::
-
- <roundup source>/roundup/templates/classic/dbinit.py
-
-If you used the extended schema, the file is in::
-
- <roundup source>/roundup/templates/extended/dbinit.py
-
-If you have modified your dbinit.py file, you need to edit the dbinit.py
-file in your instance home directory. Find the lines which define the user
-class::
-
-    user = Class(db, "msg",
-                    username=String(),   password=Password(),
-                    address=String(),    realname=String(),
-                    phone=String(),      organisation=String(),
-                    alternate_addresses=String())
-
-You will also want to add the property to the user's details page. The
-template for this is the "user.item" file in your instance home "html"
-directory. Similar to above, you may copy the file from the roundup source if
-you haven't modified it. Otherwise, add the following to the template::
-
-   <display call="multiline('alternate_addresses')">
-
-with appropriate labelling etc. See the standard template for an idea.
-
-
-
-Migrating from 0.3.x to 0.4.0
-=============================
-
-0.4.0 Message-ID and In-Reply-To addition
------------------------------------------
-0.4.0 adds the tracking of messages by message-id and allows threading
-using in-reply-to. Most e-mail clients support threading using this
-feature, and we hope to add support for it to the web gateway. If you
-have not edited the dbinit.py file in your instance home directory, you may
-simply copy the new dbinit.py file from the core code. If you used the
-classic schema, the interfaces file is in::
-
- <roundup source>/roundup/templates/classic/dbinit.py
-
-If you used the extended schema, the file is in::
-
- <roundup source>/roundup/templates/extended/dbinit.py
-
-If you have modified your dbinit.py file, you need to edit the dbinit.py
-file in your instance home directory. Find the lines which define the msg
-class::
-
-    msg = FileClass(db, "msg",
-                    author=Link("user"), recipients=Multilink("user"),
-                    date=Date(),         summary=String(),
-                    files=Multilink("file"))
-
-and add the messageid and inreplyto properties like so::
-
-    msg = FileClass(db, "msg",
-                    author=Link("user"), recipients=Multilink("user"),
-                    date=Date(),         summary=String(),
-                    files=Multilink("file"),
-                    messageid=String(),  inreplyto=String())
-
-Also, configuration is being cleaned up. This means that your dbinit.py will
-also need to be changed in the open function. If you haven't changed your
-dbinit.py, the above copy will be enough. If you have, you'll need to change
-the line (round line 50)::
-
-    db = Database(instance_config.DATABASE, name)
-
-to::
-
-    db = Database(instance_config, name)
-
-
-0.4.0 Configuration
---------------------
-``TRACKER_NAME`` and ``EMAIL_SIGNATURE_POSITION`` have been added to the
-instance_config.py. The simplest solution is to copy the default values
-from template in the core source.
-
-The mail gateway now checks ``ANONYMOUS_REGISTER`` to see if unknown users
-are to be automatically registered with the tracker. If it is set to "deny"
-then unknown users will not have access. If it is set to "allow" they will be
-automatically registered with the tracker.
-
-
-0.4.0 CGI script roundup.cgi
-----------------------------
-The CGI script has been updated with some features and a bugfix, so you should
-copy it from the roundup cgi-bin source directory again. Make sure you update
-the ROUNDUP_INSTANCE_HOMES after the copy.
-
-
-0.4.0 Nosy reactor
-------------------
-The nosy reactor has also changed - copy the nosyreactor.py file from the core
-source::
-
-   <roundup source>/roundup/templates/<template>/detectors/nosyreactor.py
-
-to your instance home "detectors" directory.
-
-
-0.4.0 HTML templating
----------------------
-The field() function was incorrectly implemented - links and multilinks now
-display as text fields when rendered using field(). To display a menu (drop-
-down or select box) you need to use the menu() function.
-
-
-
-Migrating from 0.2.x to 0.3.x
-=============================
-
-0.3.x Cookie Authentication changes
------------------------------------
-0.3.0 introduces cookie authentication - you will need to copy the
-interfaces.py file from the roundup source to your instance home to enable
-authentication. If you used the classic schema, the interfaces file is in::
-
- <roundup source>/roundup/templates/classic/interfaces.py
-
-If you used the extended schema, the file is in::
-
- <roundup source>/roundup/templates/extended/interfaces.py
-
-If you have modified your interfaces.Client class, you will need to take
-note of the login/logout functionality provided in roundup.cgi_client.Client
-(classic schema) or roundup.cgi_client.ExtendedClient (extended schema) and
-modify your instance code apropriately.
-
-
-0.3.x Password encoding
------------------------
-This release also introduces encoding of passwords in the database. If you
-have not edited the dbinit.py file in your instance home directory, you may
-simply copy the new dbinit.py file from the core code. If you used the
-classic schema, the interfaces file is in::
-
- <roundup source>/roundup/templates/classic/dbinit.py
-
-If you used the extended schema, the file is in::
-
- <roundup source>/roundup/templates/extended/dbinit.py
-
-
-If you have modified your dbinit.py file, you may use encoded passwords:
-
-1. Edit the dbinit.py file in your instance home directory
-   a. At the first code line of the open() function::
-
-       from roundup.hyperdb import String, Date, Link, Multilink
-
-      alter to include Password, as so::
-
-       from roundup.hyperdb import String, Password, Date, Link, Multilink
-
-   b. Where the password property is defined (around line 66)::
-
-       user = Class(db, "user",
-                       username=String(),   password=String(),
-                       address=String(),    realname=String(),
-                       phone=String(),      organisation=String())
-       user.setkey("username")
-
-      alter the "password=String()" to "password=Password()"::
-
-       user = Class(db, "user",
-                       username=String(),   password=Password(),
-                       address=String(),    realname=String(),
-                       phone=String(),      organisation=String())
-       user.setkey("username")
-
-2. Any existing passwords in the database will remain cleartext until they
-   are edited. It is recommended that at a minimum the admin password be
-   changed immediately::
-
-      roundup-admin -i <instance home> set user1 password=<new password>
-
-
-0.3.x Configuration
--------------------
-FILTER_POSITION, ANONYMOUS_ACCESS, ANONYMOUS_REGISTER have been added to
-the instance_config.py. Simplest solution is to copy the default values from
-template in the core source.
-
-MESSAGES_TO_AUTHOR has been added to the IssueClass in dbinit.py. Set to 'yes'
-to send nosy messages to the author. Default behaviour is to not send nosy
-messages to the author. You will need to add MESSAGES_TO_AUTHOR to your
-dbinit.py in your instance home.
-
-
-0.3.x CGI script roundup.cgi
-----------------------------
-There have been some structural changes to the roundup.cgi script - you will
-need to install it again from the cgi-bin directory of the source
-distribution. Make sure you update the ROUNDUP_INSTANCE_HOMES after the
-copy.
-
-
 .. _`customisation documentation`: customizing.html
 .. _`security documentation`: security-history.html
 .. _`administration guide`: admin_guide.html
@@ -3814,3 +1978,5 @@
 .. _`administration guide notes on native-fts`: admin_guide.html#configuring-native-fts-full-text-search
 .. _Configuring Compression: admin_guide.html#configuring-compression
 .. _Software Upgrade: admin_guide.html#software-upgrade
+.. _new search permissions for query in 1.4.17:
+   upgrading-history.html#new-search-permissions-for-query-in-1-4-17

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