aboutsummaryrefslogtreecommitdiffstats
path: root/docs/running
diff options
context:
space:
mode:
Diffstat (limited to 'docs/running')
-rw-r--r--docs/running/admin_manual.md399
-rw-r--r--docs/running/categories_and_tags.md196
2 files changed, 548 insertions, 47 deletions
diff --git a/docs/running/admin_manual.md b/docs/running/admin_manual.md
index a846732f3..dbe8be3d1 100644
--- a/docs/running/admin_manual.md
+++ b/docs/running/admin_manual.md
@@ -7,23 +7,12 @@ title: Administrator's guide
<p class="lead">
What is it like running an Alaveteli site? This guide explains what you can
- expect, and the types of problem that you might encounter. At mySociety,
- we've been running our own <a href="/docs/glossary/#foi"
+ expect, and the types of problem that you might encounter. It includes
+ examples of how mySociety manages their own <a href="/docs/glossary/#foi"
class="glossary__link">Freedom of Information</a> site, <a
- href="https://www.whatdotheyknow.com">whatdotheyknow.com</a>, since 2008,
- so we've included lots of examples from our own experience.
-
+ href="https://www.whatdotheyknow.com">whatdotheyknow.com</a>.
</p>
-<div class="attention-box helpful-hint">
- <p>
- <b>Before you start...</b>
- This admin guide assumes your Alaveteli site is already up and running.
- If it's not, you need to follow the steps for
- <a href="{{ site.baseurl }}docs/getting_started/">getting started with Alaveteli</a>.
- </p>
-</div>
-
In this guide:
<ul class="toc">
@@ -42,7 +31,8 @@ In this guide:
<ul>
<li><a href="#administrator-privileges-and-accessing-the-admin-interface">Administrator privileges and accessing the admin interface</a></li>
<li><a href="#removing-a-message-from-the-holding-pen">Removing a message from the 'Holding Pen'</a></li>
- <li><a href="#editing-and-uploading-public-body-email-addresses">Editing and uploading public body email addresses</a></li>
+ <li><a href="#rejecting-spam-that-arrives-in-the-holding-pen">Rejecting spam that arrives in the holding pen</a></li>
+ <li><a href="#creating-changing-and-uploading-public-authority-data">Creating, changing and uploading public authority data</a></li>
<li><a href="#banning-a-user">Banning a user</a></li>
<li><a href="#deleting-a-request">Deleting a request</a></li>
<li><a href="#hiding-a-request">Hiding a request</a></li>
@@ -66,8 +56,7 @@ times.
Administration tasks can be split into [**maintenance**]({{ site.baseurl }}docs/running/admin_manual/#maintenance) and [**user support**]({{ site.baseurl }}docs/running/admin_manual/#user-support).
The boundaries of these tasks is in fact quite blurred; the main distinction is
-that the former happen exclusively through the web
-<a href="{{ site.baseurl }}docs/glossary/#admin" class="glossary__link">admin interface</a>, whereas the
+that the former happen exclusively through the web admin interface, whereas the
latter are mediated by email directly with end users (but often result in
actions through the web admin interface).
@@ -320,48 +309,365 @@ line, and piping the contents of that file into the mail handling script. e.g.
### Administrator privileges and accessing the admin interface
-The
-<a href="{{ site.baseurl }}docs/glossary/#admin" class="glossary__link">administrative interface</a>
-is at the URL `/admin`.
+The <a href="{{ site.baseurl }}docs/glossary/#admin" class="glossary__link">administrative interface</a>
+is at the URL `/admin`. Only users who are
+<a href="{{ site.baseurl }}docs/glossary/#admin" class="glossary__link">administrators</a>
+can access the admin interface.
+
+To make a user an administrator on a brand new site,
+[follow these steps]({{ site.baseurl }}docs/installing/next_steps/#create-a-superuser-admin-account).
+
+If you're already an administrator, you can grant other users administrator
+privilege too. Go to `/admin/users` or click on **Users** at the top of
+the admin. Find the user in the list, and click on the name to see the user
+details. On that page, click **Edit**. Change the *Admin level* to “super” and
+click **Save**.
+
+As well having access to the admin interface, users who are administrators also
+have extra privileges in the main website front end. Administrators can:
+
+ * categorise any request
+ * view items that have been hidden from the search
+ * follow "admin" links that appear next to individual requests and comments
+
+<div class="attention-box warning">
+ It is possible completely to override the administrator authentication by
+ setting
+ <code><a href="{{ site.baseurl }}docs/customising/config/#skip_admin_auth">SKIP_ADMIN_AUTH</a></code>
+ to <code>true</code> in <code>general.yml</code>. Never do this, unless you
+ are working on a <a href="{{ site.baseurl }}docs/glossary/#development"
+ class="glossary__link">development</a> server.
+</div>
-Only users with the
-<a href="{{ site.baseurl }}docs/glossary/#super" class="glossary__link">super</a>
-admin level can access the admin interface. To make a new administrator,
-create a user account in the usual way (signing in using the web front-end),
-and then have an existing administrator to grant them *super* privileges.
+### Removing a message from the holding pen
-Obviously, you can't do this for the very first administrator on a brand
-new Alavetlei installation. So there is an emergency user account which can be
-accessed via `/admin?emergency=1`, using the credentials `ADMIN_USERNAME` and
-`ADMIN_PASSWORD`, which are set in `general.yml`. To bootstrap the
-first `super` level accounts, you will need to log in as the emergency
-user. When you have granted *super* privileges to at least one existing user,
-you can disable the emergency user account by setting `DISABLE_EMERGENCY_USER`
-to `true` in `general.yml`.
+Alaveteli puts incoming messages (that is,
+<a href="{{ site.baseurl }}docs/glossary/#reponse" class="glossary__link">responses</a>)
+into the
+<a href="{{ site.baseurl }}docs/glossary/#holding_pen" class="glossary__link">holding pen</a>
+if their `To:` email addresses can't automatically be associated with a
+<a href="{{ site.baseurl }}docs/glossary/#reponse" class="glossary__link">request</a>.
-Users with the superuser role also have extra privileges in the website
-front end, such as being able to categorise any request, being able to view
-items that have been hidden from the search, and being presented with "admin"
-links next to individual requests and comments in the front end.
+The two most common reasons for this are:
-It is possible completely to override the administrator authentication by
-setting `SKIP_ADMIN_AUTH` to `true` in `general.yml`.
+ * the request has closed
+ * the email address was wrongly spelled (for example, the sender missed the last
+ character off the email address when they copied it)
-### Removing a message from the 'Holding Pen'
+When this happens, the messages wait in the holding pen until an administrator
+redelivers them to the correct request, or else deletes them.
-The reason a message is in the holding pen is because the email can't be automatically associated with the request it is responding to. The email needs to be moved from the holding pen to the request it belongs with.
+To do this, log into the
+The <a href="{{ site.baseurl }}docs/glossary/#admin" class="glossary__link">admin interface</a>
+at `/admin`. If there are any messages in the holding pen, you'll see this
+message under the title *Things to do*:
-First, log into the admin interface at `/admin`. You will see messages that are in the 'holding pen' under the title ‘Put misdelivered responses with the right request’. Click on the chevron to see the individual messages.
+> Put misdelivered responses with the right request
-If you click on a message in the holding pen, you may see a guess made by Alaveteli as to which request the message belongs to. Check this request. If it isn't the right one, or if Alaveteli hasn't made any guesses, you will need to look at the `To:` address of the raw email and the contents of the mail in order to figure out which request it belongs to. You can browse and search requests in the admin interface under the 'Requests' menu item.
+Click on that message &mdash; you'll see a list of all the messages that need
+your attention. Click on any one of them to see the details.
-Once you have identified the request the message belongs to, you need to go back to the holding pen message page. Paste the request `id` or `url_title` into the box under 'Actions' in 'Incoming Message'. The request `id` can be found in the request URL in the admin interface - it is the part after `/show/`. In the admin request URL `/admin/request/show/118`, the request `id` is `118`. The `url_title` can be found in the request URL in the main interface - it is the part after `/request/`. In the URL `/request/documents_relating_to_meeting`, it is `documents_relating_to_meeting`. Then click on 'Redeliver to another request'.
+When you inspect a message, you may see a guess made by Alaveteli as to which
+request the message belongs to. Check this request. If the guess is right
+&mdash; the incoming email really is a response to that request &mdash;
+the request's *title_url* will already be in the input box: click the
+**Redeliver to another request** button.
-The message will now be associated with the correct request and will appear on the public request page.
+If there is not a guess, or Alaveteli's guess is wrong, look at the `To:`
+address of the raw email and the contents of the message itself. You need
+to figure out which request it belongs to. You can browse and search
+requests in the admin interface by clicking **Requests** at the top of the
+admin. When you have found the correct request, copy either its *id* or
+its *url_title*.
-### Editing and uploading public body email addresses
+<div class="attention-box info">
+ <p><strong>How to find a request's <em>id</em> or <em>url_title</em></strong></p>
+ <p>
+ A request's <em>id</em> is the number after <code>/show/</code> in the
+ admin interface's URL when you are looking at that request.
+ For example, if the URL is <code>/admin/request/show/118</code>, then the
+ <em>id</em> is <code>118</code>.
+ </p>
+ <p>
+ A request's <em>url_title</em> is the part after <code>/request/</code>
+ in your Alaveteli site's URL when you are looking at that request.
+ In the URL <code>/request/how_many_vehicles</code>, the
+ <em>url_title</em> is <code>how_many_vehicles</code>.
+ </p>
+</div>
+Once you have identified the request the message belongs to, return to the
+holding pen message page. Find the incoming message's "Actions" and paste the
+request *id* or *url_title* into the text input. Click on the **Redeliver to
+another request** button.
+
+The message will now be associated with the correct request. It is no longer
+in the holding pen, and is shown instead on the public request page.
+
+### Rejecting spam that arrives in the holding pen
+
+Alaveteli maintains a
+<a href="{{ site.baseurl }}docs/glossary/#spam-address-list" class="glossary__link">spam address list</a>.
+Any incoming message to an email address on that list
+*that would otherwise be put in the holding pen* will be rejected and won't
+appear in the admin.
+
+If you see spam messages in the
+<a href="{{ site.baseurl }}docs/glossary/#holding_pen" class="glossary__link">holding pen</a>,
+check if they are being sent to a *specific* email address. If they are, that
+email address has become a "spam-target" and you should add it to the spam
+address list. Thereafter, Alaveteli will automatically reject any messages that
+come to that address.
+
+An email address that is not associated with a request (that is, one whose
+messages end up in the holding pen) becomes a spam-target once it's been
+harvested by spammers. There are several reasons why such an invalid address
+might exist &mdash; perhaps it was mis-spelled in a manual reply, for example.
+Our experience from running
+<a href="{{ site.baseurl }}docs/glossary/#wdtk" class="glossary__link">WhatDoTheyKnow</a>
+is that you can safely dismiss incoming email to such addresses once they have
+been targeted in this way. Legitimate emails that arrive in the holding pen
+tend to be unique errors (for example, missing the last character of the email
+address due to a cut-and-paste mistake) and the nature of the lifecycle of
+requests means they don't typically get used for spam until they are
+effectively dead.
+
+To add an email address to the spam address list you need to copy it from an
+incoming message and paste it into the spam addresss list. The easiest way to
+do this is to click on **Summary** at the top of any admin page, and then click
+on **Put misdelivered responses with the right requests** to see the contents
+of the holding pen.
+
+<div class="attention-box info">
+ If there are no messages in the holding pen, Alaveteli won't show you this
+ link. Great &mdash; there are no misdelivered responses needing your
+ attention right now!
+</div>
+Inside the holding pen, you'll see the list of emails awaiting attention
+&mdash; click on an email's subject line to see the whole message and its
+details. Copy the `To:` email address, then click on the **Spam Addresses**
+link under *Actions*. Paste the email address into the text input and click the
+**Add Spam Address** button.
+
+You can see the spam address list (that is, all known spam-target email
+addresses) at any time by going to the admin interface at `/admin/spam_addresses`.
+
+You can remove any address from the list by clicking the **Remove** button
+next to it. Of course, this won't restore any messages that have been
+rejected, but Alaveteli will not reject any new messages that are sent to
+this address.
+
+Note that if you are seeing consistent spam email in your holding pen, you
+should also consider implementing (or increasing) the anti-spam measures
+running in your
+<a href="{{ site.baseurl }}docs/glossary/#mta" class="glossary__link">MTA</a>.
+
+### Creating, changing and uploading public authority data
+
+There are three ways to change public authority data on your site:
+
+ * *Create* &mdash;
+ You can create a new public authority in the admin interface. Go to **Authorities**, and click the **New Public Authority** button.
+
+ * *Edit* &mdash;
+ Once an authority is created, you can update its email address or other
+ details by editing it in the admin interface. Go to **Authorities**, find
+ the authority you want to update, and click on **edit**.
+
+ * *Upload* &mdash;
+ You can also create or edit more than one authority at the same time by
+ uploading a file containing the data in comma-separated values (CSV)
+ format. This works for new authorities as well as those that already exist
+ on your site. Go to **Authorities** and click the **Import from CSV** button. See the rest of this section for more about uploading.
+
+The upload feature is useful &mdash; especially when an Alaveteli site is first
+set up &mdash; because it's common to collect data such as the contact details
+for the public authorities in a spreadsheet. Alaveteli's upload feature makes it
+easy to initially load this data onto the site. It also lets you update the
+data if it changes after it's already been loaded.
+
+To use the data in the spreadsheet to update the bodies on your site, export
+("save as") the spreadsheet as a CSV file. This is the file you can upload.
+
+The first line of your CSV file should start with `#` (this indicates that this
+line does not contain data) and must list the column names for the data that
+follows on the subsequent lines. Column names must:
+
+ * be on the first line
+ * match expected names *exactly*, and include `name` and `request_email`
+ (see table below)
+ * appear in the same order as corresponding items in the lines of data that follow
+
+Most spreadsheet programs will produce a suitable CSV file for you, provided
+that you carefully specify correct titles at the top of each column. Be sure to
+use names exactly as shown &mdash; if Alaveteli encounters an
+unrecognised column name, the import will fail.
+
+<table class="table">
+ <tr>
+ <th>column name</th>
+ <th>i18n suffix?</th>
+ <th>notes</th>
+ </tr>
+ <tr>
+ <td><code>name</code></td>
+ <td><em>yes</em></td>
+ <td>
+ <em>This column <strong>must</strong> be present.</em><br>
+ The full name of the authority.<br>
+ If it matches an existing authority's name, that authority will be
+ updated &mdash; otherwise, this will be added as a new authority.
+ </td>
+ </tr>
+ <tr>
+ <td><code>request_email</code></td>
+ <td><em>yes</em></td>
+ <td>
+ <em>This column <strong>must</strong> be present,
+ but can be left empty.</em><br>
+ The email to which requests are sent
+ </td>
+ </tr>
+ <tr>
+ <td><code>short_name</code></td>
+ <td><em>yes</em></td>
+ <td>Some authorities are known by a shorter name</td>
+ </tr>
+ <tr>
+ <td><code>notes</code></td>
+ <td><em>yes</em></td>
+ <td>Notes, displayed publicly (may contain HTML)</td>
+ </tr>
+ <tr>
+ <td><code>publication_scheme</code></td>
+ <td><em>yes</em></td>
+ <td>
+ The URL of the authority's
+ <a href="{{ site.baseurl }}docs/glossary/#publication-scheme" class="glossary__link">publication scheme</a>,
+ if they have one
+ </td>
+ </tr>
+ <tr>
+ <td><code>disclosure_log</code></td>
+ <td><em>yes</em></td>
+ <td>
+ The URL of the authority's
+ <a href="{{ site.baseurl }}docs/glossary/#disclosure-log" class="glossary__link">disclosure log</a>,
+ if they have one
+ </td>
+ </tr>
+ <tr>
+ <td><code>home_page</code></td>
+ <td>no</td>
+ <td>The URL of the authority's home page</td>
+ </tr>
+ <tr>
+ <td><code>tag_string</code></td>
+ <td>no</td>
+ <td>separated tags with spaces</td>
+ </tr>
+</table>
+
+ * Existing authorities cannot be renamed by uploading: if you need to do
+ this, use the admin interface to edit the existing record first, and
+ change its name in the web interface.
+ * If the authority already exists (the `name` matches an existing authority's
+ name exactly), a blank entry leaves the existing value for that column
+ unchanged &mdash; that is, that item of data on your site will not be
+ changed. This means you only really need to include data you want to
+ update.
+ * Columns with "i18n suffix" can accept
+ <a href="{{ site.baseurl }}docs/glossary/#i18n" class="glossary__link">internationalised</a>
+ names. Add a full stop followed by the language code, for example:
+ `name.es` for Spanish (`es`). This *must* be a locale you've declared in
+ [`AVAILABLE_LOCALES`]({{ site.baseurl }}docs/customising/config/#available_locales).
+ If you don't specify an i18n suffix, the default language for your site is
+ assumed.
+ * You can specify a blank entry in the CSV file by having no character
+ between commas.
+ * If an entry contains a comma, enclose it in double quotes like this:
+ `"Comma, Inc"`.
+ * If an entry contains any double quotes, you must replace each of
+ them with two (so `"` becomes `""`) and also enclose the whole entry in
+ double quotes like this: `"In ""quotes"""` (which will be imported as `In
+ "quotes"`).
+
+For example, here's data for three authorities in CSV format ready for upload.
+The first line defines the column names, then the next three lines contain the
+data (one line for each authority):
+
+ #name,short_name,short_name.es,request_email,notes
+ XYZ Library Inc.,XYZ Library,XYX Biblioteca,info@xyz.example.com,
+ Ejemplo Town Council,,Ayuntamiento de Ejemplo,etc@example.com,Lorem ipsum.
+ "Comma, Inc.",Comma,,comma@example.com,"e.g. <a href=""x"">link</a>"
+
+Note that, if Ejemplo Town Council already exists on the site, the blank entry
+for `short_name` will leave the existing value for that column unchanged.
+
+To upload a CSV file, log into the admin and click on **Authorities**. Click on
+**Import from CSV file**, and choose the file you've prepared.
+
+Specify **What to do with existing tags?** with one of these options:
+
+ * *Replace existing tags with new ones* <br/>
+ For each authority being updated, all existing tags will be removed, and
+ replaced with the ones in your CSV file.
+
+ * *Add new tags to existing ones* <br/>
+ Existing tags will be left unchanged, and the tags in your CSV file will
+ be added to them.
+
+You can add a **Tag to add entries to / alter entries for**. This tag will
+be applied to every body that is imported from your CSV file.
+
+We always recommend you click **Dry run** first -- this will run through the
+file and report the changes it will make in the database, *without actually
+changing the data*. Check the report: it shows what changes would be made if
+you really uploaded this data, followed by a message like this:
+
+ Dry run was successful, real run would do as above.
+
+If you see nothing above that line, it means the dry run has resulted in no
+proposed changes.
+
+If everything was OK when you ran the dry run, click **Upload** instead. This
+will repeat the process, but this time it will make the changes to your
+site's database.
+
+If you see an error like `invalid email`, either you really have mistyped an
+email address, or (more likely) your CSV file does not have a `request_email`
+column.
+
+#### Creating a spreadsheet of existing authorities
+
+You can easily create a spreadsheet containing the authorities that <em>already
+exist</em> on your site. Combined with the upload feature described above, this
+may be a more convenient way to update your data than editing it in the admin
+interface.
+
+To export the existing authorities' data, go to your site's home page (not the
+admin) and click <strong>View Authorities</strong>. Then click <strong>List of
+all authorities (CSV)</strong> to get a CSV file. You can then make changes to
+this file using a spreadsheet program and upload it as described above.
+
+You'll need to remove some columns that are not accepted by the import feature
+and possibly rename some that are &mdash; see the column names above.
+Also, note that by default the exported spreadsheet does not contain a
+`request_email` column. If you want to update email addresses, you should
+manually add a column to your spreadsheet with the heading `request_email` and
+fill in a new email address for each authority you want to update. Authorities
+with blank values in any column will keep their existing value for that
+attribute.
+
+<div class="attention-box info">
+Alaveteli never includes authorities which have the tag <code>site_administration</code> when it exports authorities in CSV format.
+If you're running a development server with the sample data, the single example
+body called "Internal admin authority" has this tag, so if you click
+<strong>List of all authorities (CSV)</strong>, you'll get a CSV file which
+contains no data. You need to add your own authorities (without the
+<code>site_administration</code> tag) before you can export them.
+</div>
### Banning a user
@@ -473,4 +779,3 @@ text you wish to replace it with e.g. '[personal information has been
hidden]', and a comment letting other admins know why you have hidden
the information.
-
diff --git a/docs/running/categories_and_tags.md b/docs/running/categories_and_tags.md
new file mode 100644
index 000000000..f34c8fec3
--- /dev/null
+++ b/docs/running/categories_and_tags.md
@@ -0,0 +1,196 @@
+---
+layout: page
+title: Categories & tags
+---
+
+# Categories and tags for authorities
+
+<p class="lead">
+
+ Use tags to arrange
+ <a href="{{ site.baseurl }}docs/glossary/#authority"
+ class="glossary__link">authorities</a> into categories, or to associate
+ related authorities with each other. This helps your users find the right
+ authority for the
+ <a href="{{ site.baseurl }}docs/glossary/#request" class="glossary__link">request</a>
+ (or <a href="{{ site.baseurl }}docs/glossary/#response" class="glossary__link">response</a>)
+ they are interested in.
+</p>
+
+## Categories & category headings
+
+Alaveteli lets you organise your authorities into *categories*. Categories can
+themselves belong to *category headings*. For example, some of the categories
+and headings on
+<a href="{{ site.baseurl }}docs/glossary/#wdtk" class="glossary__link">WhatDoTheyKnow</a>'s
+<a href="https://www.whatdotheyknow.com/body/list/all">View authorities</a> page look like this:
+
+> * **Media and culture**
+> * Media
+> * Museums and galleries
+> * **Military and security services**
+> * Armed Forces
+> * Military colleges
+> * Security services
+> * **Emergency services**
+> * Police forces
+> * Fire & rescue services
+
+
+In this example, "Emergency services" is a heading which contains the categories
+"Police forces" and "Fire & rescue services".
+
+Tags are simply searchable words that you can add to an authority. Nominate a
+tag for each category: any authority which has that tag is automatically
+assigned to the category. For example, if the tag `police` is associated with
+the category "Police forces", any authority which has the tag `police` will
+appear in that category.
+
+Make sure you choose good category headings and names, because they help your
+users find the specific authorities they are looking for.
+
+<div class="attention-box info">
+ Try to use simple but descriptive words for tags. Tags cannot contain spaces
+ (use an underscore if you need to, <code>like_this</code>).
+ Remember that tags will be seen and used by the public (for example, in the
+ <a href="{{ site.baseurl }}docs/glossary/#advanced-search" class="glossary__link">advanced search</a>).
+</div>
+
+### Adding a new category
+
+In the admin interface, click on **Categories**. It's a good idea to create
+category headings first (but don't worry if you don't &mdash; you can change
+them later).
+
+Click on **New category heading**, enter a name (for example, "Emergency
+services") and click **Create**.
+
+To create a category, click on **New category**. As well as providing a title
+and a description, you must enter a category tag. Any authority with this tag
+will be assigned to this category.
+
+Select the checkbox next to the category heading under which you want this
+category to be listed. It's common for a category to be under just one heading.
+But sometimes it makes sense for a category to go under more than one, so you
+can select multiple checkboxes if you need to.
+
+Click **Save** to create the category.
+
+### Editing or deleting a category
+
+Click on **Categories** then find the category in the list (if the category is
+under a heading, you may need to click on the heading's chevron to expand the
+list to show it). Click the name of the category to select it. You can edit it
+and click **Save**.
+
+If you want to destroy a category, go to edit it but instead of saving it,
+click on the **Destroy** button at the bottom of the page. This does not
+delete any authorities in that category &mdash; they simply no longer belong to
+it.
+
+## Special tags
+
+Some tags are special. Alaveteli behaves differently when an authority has one
+of these tags.
+
+<table class="table">
+ <tr>
+ <th>
+ Tag
+ </th>
+ <th>
+ Effect
+ </th>
+ </tr>
+ <tr>
+ <td>
+ <code>site_administration</code>
+ </td>
+ <td>
+ This is a test/dummy authority. It is not displayed to the public on your
+ main site, and it is not included when you
+ <a href="{{ site.baseurl }}docs/running/admin_manual/#creating-changing-and-uploading-public-authority-data">export authorities in CSV format</a>.
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <code>defunct</code>
+ </td>
+ <td>
+ This authority no longer operates: new requests cannot be sent to an
+ authority with this tag.
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <code>not_apply</code>
+ </td>
+ <td>
+ <a href="{{ site.baseurl }}docs/glossary/#foi" class="glossary__link">Freedom of Information</a>
+ law does not apply to this authority: new requests cannot be sent to an
+ authority with this tag.
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <code>eir_only</code>
+ </td>
+ <td>
+ <em>Custom example:</em> (see below)<br>
+ On our UK installation of Alaveteli,
+ <a href="{{ site.baseurl }}docs/glossary/#wdtk" class="glossary__link">WhatDoTheyKnow</a>,
+ this tag indicates that the authority is subject to an alternative law
+ (Environment Information Regulations, rather than the Freedom of
+ Information), which means Alaveteli must change the wording of these
+ requests appropriately.
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <code>school</code>
+ </td>
+ <td>
+ <em>Custom example:</em> (see below)<br>
+ <a href="{{ site.baseurl }}docs/glossary/#wdtk" class="glossary__link">WhatDoTheyKnow</a>
+ applies a different definition of "late" if an authority has the <code>school</code> tag.
+ </td>
+ </tr>
+</table>
+
+## Custom tags and custom behaviour
+
+You can add any tag you want &mdash; they don't have to be associated with
+categories.
+
+If you are a developer, and you want to add special behaviour to your site
+based on your own tags, you need to add custom code, which should probably go
+in your own
+<a href="{{ site.baseurl}}docs/glossary/#theme" class="glossary__link">theme</a>.
+For example, in the UK, schools are granted special concession in the law to allow for
+requests that are made out of term-time. Alaveteli handles this by using the
+[`SPECIAL_REPLY_VERY_LATE_AFTER_DAYS`]({{ site.baseurl }}docs/customising/config/#special_reply_very_late_after_days)
+config value if the authority has the `school` tag.
+See
+[`is_school?`](https://github.com/mysociety/alaveteli/blob/f0bbeb4abf4bf07e5cfb46668f39bbff72ed7210/app/models/public_body.rb#L391)
+and
+[`date_very_overdue_after`](https://github.com/mysociety/alaveteli/blob/81b778622ed47e24a2dea59c0529d1f928c68a58/app/models/info_request.rb#L752)
+for the source code.
+
+## Searching with tags
+
+Alaveteli's
+<a href="{{ site.baseurl }}docs/glossary/#advanced-search" class="glossary__link">advanced search</a>
+feature (which is available to all your users) can search for specific tags. So
+if you add useful tags and publicise them, your users can use them to find
+related authorities. For example, see the <a
+href="https://www.whatdotheyknow.com/advancedsearch">advanced search on
+WhatDoTheyKnow</a> to see this at work.
+
+You can add reference numbers or specific values to tags using a colon. On
+<a href="{{ site.baseurl }}docs/glossary/#wdtk" class="glossary__link">WhatDoTheyKnow</a>
+we tag all authorities that are charities with the tag `charity:123456` (where
+123456 is the authority's registered charity number).
+
+
+
+